Skip to content

Commit

Permalink
Merge branch '3122-test-logout-on-restart' into develop
Browse files Browse the repository at this point in the history
Issue #3122
PR #3179
  • Loading branch information
mssalvatore committed Mar 30, 2023
2 parents 278247e + 7d9350b commit b3b995a
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 19 deletions.
19 changes: 18 additions & 1 deletion monkey/monkey_island/cc/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@

import flask_restful
from flask import Flask, Response, send_from_directory
from flask_security import UserDatastore
from werkzeug.exceptions import NotFound

from common import DIContainer
from monkey_island.cc.event_queue import IIslandEventQueue
from monkey_island.cc.flask_utils import FlaskDIWrapper
from monkey_island.cc.resources import (
AgentBinaries,
Expand Down Expand Up @@ -34,7 +36,14 @@
from monkey_island.cc.resources.security_report import SecurityReport
from monkey_island.cc.resources.version import Version
from monkey_island.cc.server_utils.consts import MONKEY_ISLAND_ABS_PATH
from monkey_island.cc.server_utils.encryption import ILockableEncryptor
from monkey_island.cc.services import register_agent_configuration_resources, setup_authentication
from monkey_island.cc.services.authentication_service.authentication_facade import (
AuthenticationFacade,
)
from monkey_island.cc.services.authentication_service.configure_flask_security import (
configure_flask_security,
)
from monkey_island.cc.services.representations import output_json

HOME_FILE = "index.html"
Expand Down Expand Up @@ -141,7 +150,15 @@ def init_app(
init_app_url_rules(app)

flask_resource_manager = FlaskDIWrapper(api, container)
setup_authentication(app, api, data_dir, container)
datastore = configure_flask_security(app, data_dir)
authentication_facade = _build_authentication_facade(container, datastore)
setup_authentication(api, authentication_facade)
init_api_resources(flask_resource_manager)

return app


def _build_authentication_facade(container: DIContainer, user_datastore: UserDatastore):
repository_encryptor = container.resolve(ILockableEncryptor)
island_event_queue = container.resolve(IIslandEventQueue)
return AuthenticationFacade(repository_encryptor, island_event_queue, user_datastore)
19 changes: 1 addition & 18 deletions monkey/monkey_island/cc/services/authentication_service/setup.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,8 @@
from pathlib import Path

from flask_security import UserDatastore

from common import DIContainer
from monkey_island.cc.event_queue import IIslandEventQueue
from monkey_island.cc.server_utils.encryption import ILockableEncryptor

from . import register_resources
from .authentication_facade import AuthenticationFacade
from .configure_flask_security import configure_flask_security


def setup_authentication(app, api, data_dir: Path, container: DIContainer):
datastore = configure_flask_security(app, data_dir)
authentication_facade = _build_authentication_facade(container, datastore)
def setup_authentication(api, authentication_facade: AuthenticationFacade):
register_resources(api, authentication_facade)
# revoke all old tokens so that the user has to log in again on startup
authentication_facade.revoke_all_tokens_for_all_users()


def _build_authentication_facade(container: DIContainer, user_datastore: UserDatastore):
repository_encryptor = container.resolve(ILockableEncryptor)
island_event_queue = container.resolve(IIslandEventQueue)
return AuthenticationFacade(repository_encryptor, island_event_queue, user_datastore)
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,25 @@

import pytest
from flask_security import UserDatastore
from tests.common import StubDIContainer

from monkey_island.cc.event_queue import IIslandEventQueue, IslandEventTopic
from monkey_island.cc.models import IslandMode
from monkey_island.cc.server_utils.encryption import ILockableEncryptor
from monkey_island.cc.services.authentication_service.authentication_facade import (
AuthenticationFacade,
)
from monkey_island.cc.services.authentication_service.setup import setup_authentication
from monkey_island.cc.services.authentication_service.user import User

USERNAME = "user1"
PASSWORD = "test"
PASSWORD_HASH = "$2b$12$yQzymz55fRvm8rApg7erluIvIAKSFSDrNIOIrOlxC4sXsDSkeu9z2"
USERS = [
User(username="user1", password="test1", fs_uniquifier="a"),
User(username="user2", password="test2", fs_uniquifier="b"),
User(username="user3", password="test3", fs_uniquifier="c"),
]


# Some tests have these fixtures as arguments even though `autouse=True`, because
Expand Down Expand Up @@ -41,6 +48,7 @@ def authentication_facade(
mock_flask_app,
mock_repository_encryptor: ILockableEncryptor,
mock_island_event_queue: IIslandEventQueue,
mock_user_datastore: UserDatastore,
) -> AuthenticationFacade:
return AuthenticationFacade(
mock_repository_encryptor, mock_island_event_queue, mock_user_datastore
Expand Down Expand Up @@ -89,3 +97,27 @@ def test_handle_sucessful_login(
mock_repository_encryptor.unlock.assert_called_once()
assert mock_repository_encryptor.unlock.call_args[0][0] != USERNAME
assert mock_repository_encryptor.unlock.call_args[0][0] != PASSWORD


def test_revoke_all_tokens_for_all_users(
mock_user_datastore: UserDatastore,
authentication_facade: AuthenticationFacade,
):
[user.save() for user in USERS]
authentication_facade.revoke_all_tokens_for_all_users()

assert mock_user_datastore.set_uniquifier.call_count == len(USERS)
[mock_user_datastore.set_uniquifier.assert_any_call(user) for user in USERS]


def test_setup_authentication__revokes_tokens(
mock_island_event_queue: IIslandEventQueue,
mock_repository_encryptor: ILockableEncryptor,
mock_authentication_facade: AuthenticationFacade,
):
container = StubDIContainer()
container.register_instance(ILockableEncryptor, mock_repository_encryptor)
container.register_instance(IIslandEventQueue, mock_island_event_queue)
setup_authentication(MagicMock(), mock_authentication_facade)

assert mock_authentication_facade.revoke_all_tokens_for_all_users.called

0 comments on commit b3b995a

Please sign in to comment.