Skip to content

Commit 3f0cc32

Browse files
committed
Merge branch '3078-invalidate-tokens-on-startup' into develop
Issue #3078 PR #3208
2 parents 5138733 + 0527897 commit 3f0cc32

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

monkey/monkey_island/cc/services/authentication_service/authentication_facade.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,12 @@ def authorize_otp(self, otp: OTP) -> bool:
126126
except UnknownRecordError:
127127
return False
128128

129+
def _otp_ttl_elapsed(self, otp: OTP) -> bool:
130+
return self._otp_repository.get_expiration(otp) < time.monotonic()
131+
132+
def revoke_all_otps(self):
133+
self._otp_repository.reset()
134+
129135
def create_user(
130136
self, username: str, password: str, roles: Sequence[str], email: str = "dummy@dummy.com"
131137
) -> User:
@@ -136,9 +142,6 @@ def create_user(
136142
email=email,
137143
)
138144

139-
def _otp_ttl_elapsed(self, otp: OTP) -> bool:
140-
return self._otp_repository.get_expiration(otp) < time.monotonic()
141-
142145
def handle_successful_registration(self, username: str, password: str):
143146
self._reset_island_data()
144147
self._reset_repository_encryptor(username, password)

monkey/monkey_island/cc/services/authentication_service/setup.py

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def setup_authentication(api, app: Flask, container: DIContainer, data_dir: Path
2929

3030
# revoke all old tokens so that the user has to log in again on startup
3131
authentication_facade.revoke_all_tokens_for_all_users()
32+
authentication_facade.revoke_all_otps()
3233

3334

3435
def _build_authentication_facade(container: DIContainer, security: Security):

monkey/tests/unit_tests/monkey_island/cc/services/authentication_service/test_authentication_service.py

+28
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
AuthenticationFacade,
1818
)
1919
from monkey_island.cc.services.authentication_service.i_otp_repository import IOTPRepository
20+
from monkey_island.cc.services.authentication_service.mongo_otp_repository import MongoOTPRepository
2021
from monkey_island.cc.services.authentication_service.setup import setup_authentication
2122
from monkey_island.cc.services.authentication_service.user import User
2223

@@ -261,3 +262,30 @@ def test_setup_authentication__revokes_tokens(
261262
assert mock_user_datastore.set_uniquifier.call_count == len(USERS)
262263
for user in USERS:
263264
mock_user_datastore.set_uniquifier.assert_any_call(user)
265+
266+
267+
def test_setup_authentication__invalidates_otps(
268+
monkeypatch,
269+
mock_flask_app,
270+
mock_agent_event_queue: IAgentEventQueue,
271+
mock_island_event_queue: IIslandEventQueue,
272+
mock_repository_encryptor: ILockableEncryptor,
273+
):
274+
mock_otp_repository = MagicMock(spec=MongoOTPRepository)
275+
mock_security = MagicMock()
276+
mock_security.datastore = mock_user_datastore
277+
monkeypatch.setattr(
278+
"monkey_island.cc.services.authentication_service.setup.configure_flask_security",
279+
lambda *args: mock_security,
280+
)
281+
282+
container = StubDIContainer()
283+
container.register_instance(MongoOTPRepository, mock_otp_repository)
284+
container.register_instance(ILockableEncryptor, mock_repository_encryptor)
285+
container.register_instance(IIslandEventQueue, mock_island_event_queue)
286+
container.register_instance(IAgentEventQueue, mock_agent_event_queue)
287+
container.register_instance(pymongo.MongoClient, MockMongoClient())
288+
289+
setup_authentication(MagicMock(), MagicMock(), container, Path("data_dir"), MagicMock())
290+
291+
assert mock_otp_repository.reset.called

0 commit comments

Comments
 (0)