forked from p15670423/monkey
Island: Add new agent to repository on agent registration
This commit is contained in:
parent
c95c2ffdf9
commit
1e8a60c890
|
@ -2,8 +2,8 @@ from contextlib import suppress
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from common import AgentRegistrationData
|
from common import AgentRegistrationData
|
||||||
from monkey_island.cc.models import Machine
|
from monkey_island.cc.models import Agent, Machine
|
||||||
from monkey_island.cc.repository import IMachineRepository, UnknownRecordError
|
from monkey_island.cc.repository import IAgentRepository, IMachineRepository, UnknownRecordError
|
||||||
|
|
||||||
|
|
||||||
class handle_agent_registration:
|
class handle_agent_registration:
|
||||||
|
@ -11,13 +11,15 @@ class handle_agent_registration:
|
||||||
Update repositories when a new agent registers
|
Update repositories when a new agent registers
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, machine_repository: IMachineRepository):
|
def __init__(self, machine_repository: IMachineRepository, agent_repository: IAgentRepository):
|
||||||
self._machine_repository = machine_repository
|
self._machine_repository = machine_repository
|
||||||
|
self._agent_repository = agent_repository
|
||||||
|
|
||||||
def __call__(self, agent_registration_data: AgentRegistrationData):
|
def __call__(self, agent_registration_data: AgentRegistrationData):
|
||||||
self._update_machine_repository(agent_registration_data)
|
machine = self._update_machine_repository(agent_registration_data)
|
||||||
|
self._add_agent(agent_registration_data, machine)
|
||||||
|
|
||||||
def _update_machine_repository(self, agent_registration_data: AgentRegistrationData):
|
def _update_machine_repository(self, agent_registration_data: AgentRegistrationData) -> Machine:
|
||||||
machine = self._find_existing_machine_to_update(agent_registration_data)
|
machine = self._find_existing_machine_to_update(agent_registration_data)
|
||||||
|
|
||||||
if machine is None:
|
if machine is None:
|
||||||
|
@ -25,6 +27,8 @@ class handle_agent_registration:
|
||||||
|
|
||||||
self._upsert_machine(machine, agent_registration_data)
|
self._upsert_machine(machine, agent_registration_data)
|
||||||
|
|
||||||
|
return machine
|
||||||
|
|
||||||
def _find_existing_machine_to_update(
|
def _find_existing_machine_to_update(
|
||||||
self, agent_registration_data: AgentRegistrationData
|
self, agent_registration_data: AgentRegistrationData
|
||||||
) -> Optional[Machine]:
|
) -> Optional[Machine]:
|
||||||
|
@ -72,3 +76,13 @@ class handle_agent_registration:
|
||||||
)
|
)
|
||||||
|
|
||||||
machine.network_interfaces = sorted(updated_network_interfaces)
|
machine.network_interfaces = sorted(updated_network_interfaces)
|
||||||
|
|
||||||
|
def _add_agent(self, agent_registration_data: AgentRegistrationData, machine: Machine):
|
||||||
|
new_agent = Agent(
|
||||||
|
id=agent_registration_data.id,
|
||||||
|
machine_id=machine.id,
|
||||||
|
start_time=agent_registration_data.start_time,
|
||||||
|
parent_id=agent_registration_data.parent_id,
|
||||||
|
cc_server=agent_registration_data.cc_server,
|
||||||
|
)
|
||||||
|
self._agent_repository.upsert_agent(new_agent)
|
||||||
|
|
|
@ -8,8 +8,8 @@ import pytest
|
||||||
|
|
||||||
from common import AgentRegistrationData
|
from common import AgentRegistrationData
|
||||||
from monkey_island.cc.island_event_handlers import handle_agent_registration
|
from monkey_island.cc.island_event_handlers import handle_agent_registration
|
||||||
from monkey_island.cc.models import Machine
|
from monkey_island.cc.models import Agent, Machine
|
||||||
from monkey_island.cc.repository import IMachineRepository, UnknownRecordError
|
from monkey_island.cc.repository import IAgentRepository, IMachineRepository, UnknownRecordError
|
||||||
|
|
||||||
AGENT_ID = UUID("860aff5b-d2af-43ea-afb5-62bac3d30b7e")
|
AGENT_ID = UUID("860aff5b-d2af-43ea-afb5-62bac3d30b7e")
|
||||||
|
|
||||||
|
@ -36,12 +36,21 @@ def machine_repository() -> IMachineRepository:
|
||||||
machine_repository = MagicMock(spec=IMachineRepository)
|
machine_repository = MagicMock(spec=IMachineRepository)
|
||||||
machine_repository.get_new_id = MagicMock(side_effect=count(SEED_ID))
|
machine_repository.get_new_id = MagicMock(side_effect=count(SEED_ID))
|
||||||
machine_repository.upsert_machine = MagicMock()
|
machine_repository.upsert_machine = MagicMock()
|
||||||
|
machine_repository.get_machine_by_hardware_id = MagicMock(side_effect=UnknownRecordError)
|
||||||
|
machine_repository.get_machines_by_ip = MagicMock(side_effect=UnknownRecordError)
|
||||||
return machine_repository
|
return machine_repository
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def handler(machine_repository) -> handle_agent_registration:
|
def agent_repository() -> IAgentRepository:
|
||||||
return handle_agent_registration(machine_repository)
|
agent_repository = MagicMock(spec=IAgentRepository)
|
||||||
|
agent_repository.upsert_agent = MagicMock()
|
||||||
|
return agent_repository
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def handler(machine_repository, agent_repository) -> handle_agent_registration:
|
||||||
|
return handle_agent_registration(machine_repository, agent_repository)
|
||||||
|
|
||||||
|
|
||||||
def test_new_machine_added(handler, machine_repository):
|
def test_new_machine_added(handler, machine_repository):
|
||||||
|
@ -126,3 +135,16 @@ def test_hardware_id_mismatch(handler, machine_repository):
|
||||||
|
|
||||||
with pytest.raises(Exception):
|
with pytest.raises(Exception):
|
||||||
handler(AGENT_REGISTRATION_DATA)
|
handler(AGENT_REGISTRATION_DATA)
|
||||||
|
|
||||||
|
|
||||||
|
def test_add_agent(handler, agent_repository):
|
||||||
|
expected_agent = Agent(
|
||||||
|
id=AGENT_REGISTRATION_DATA.id,
|
||||||
|
machine_id=SEED_ID,
|
||||||
|
start_time=AGENT_REGISTRATION_DATA.start_time,
|
||||||
|
parent_id=AGENT_REGISTRATION_DATA.parent_id,
|
||||||
|
cc_server=AGENT_REGISTRATION_DATA.cc_server,
|
||||||
|
)
|
||||||
|
handler(AGENT_REGISTRATION_DATA)
|
||||||
|
|
||||||
|
agent_repository.upsert_agent.assert_called_with(expected_agent)
|
||||||
|
|
Loading…
Reference in New Issue