Merge branch 'omit-mongo-object-id' into 2255-mongo-node-repository

This commit is contained in:
Mike Salvatore 2022-09-14 09:10:12 -04:00
commit 617a3273cd
5 changed files with 25 additions and 32 deletions

View File

@ -1,4 +1,4 @@
from typing import Any, MutableMapping, Sequence from typing import Sequence
from pymongo import MongoClient from pymongo import MongoClient
@ -40,27 +40,24 @@ class MongoAgentRepository(IAgentRepository):
def get_agent_by_id(self, agent_id: AgentID) -> Agent: def get_agent_by_id(self, agent_id: AgentID) -> Agent:
try: try:
agent_dict = self._agents_collection.find_one({"id": str(agent_id)}) agent_dict = self._agents_collection.find_one(
{"id": str(agent_id)}, {MONGO_OBJECT_ID_KEY: False}
)
except Exception as err: except Exception as err:
raise RetrievalError(f'Error retrieving agent with "id == {agent_id}": {err}') raise RetrievalError(f'Error retrieving agent with "id == {agent_id}": {err}')
if agent_dict is None: if agent_dict is None:
raise UnknownRecordError(f'Unknown ID "{agent_id}"') raise UnknownRecordError(f'Unknown ID "{agent_id}"')
return MongoAgentRepository._mongo_record_to_agent(agent_dict) return Agent(**agent_dict)
def get_running_agents(self) -> Sequence[Agent]: def get_running_agents(self) -> Sequence[Agent]:
try: try:
cursor = self._agents_collection.find({"stop_time": None}) cursor = self._agents_collection.find({"stop_time": None}, {MONGO_OBJECT_ID_KEY: False})
return list(map(MongoAgentRepository._mongo_record_to_agent, cursor)) return list(map(lambda a: Agent(**a), cursor))
except Exception as err: except Exception as err:
raise RetrievalError(f"Error retrieving running agents: {err}") raise RetrievalError(f"Error retrieving running agents: {err}")
@staticmethod
def _mongo_record_to_agent(mongo_record: MutableMapping[str, Any]) -> Agent:
del mongo_record[MONGO_OBJECT_ID_KEY]
return Agent(**mongo_record)
def reset(self): def reset(self):
try: try:
self._agents_collection.drop() self._agents_collection.drop()

View File

@ -55,9 +55,8 @@ class MongoCredentialsRepository(ICredentialsRepository):
def _get_credentials_from_collection(self, collection) -> Sequence[Credentials]: def _get_credentials_from_collection(self, collection) -> Sequence[Credentials]:
try: try:
collection_result = [] collection_result = []
list_collection_result = list(collection.find({})) list_collection_result = list(collection.find({}, {MONGO_OBJECT_ID_KEY: False}))
for encrypted_credentials in list_collection_result: for encrypted_credentials in list_collection_result:
del encrypted_credentials[MONGO_OBJECT_ID_KEY]
plaintext_credentials = self._decrypt_credentials_mapping(encrypted_credentials) plaintext_credentials = self._decrypt_credentials_mapping(encrypted_credentials)
collection_result.append(Credentials(**plaintext_credentials)) collection_result.append(Credentials(**plaintext_credentials))

View File

@ -1,6 +1,6 @@
from ipaddress import IPv4Address from ipaddress import IPv4Address
from threading import Lock from threading import Lock
from typing import Any, MutableMapping, Sequence from typing import Any, Sequence
from pymongo import MongoClient from pymongo import MongoClient
@ -58,36 +58,33 @@ class MongoMachineRepository(IMachineRepository):
def _find_one(self, key: str, search_value: Any) -> Machine: def _find_one(self, key: str, search_value: Any) -> Machine:
try: try:
machine_dict = self._machines_collection.find_one({key: search_value}) machine_dict = self._machines_collection.find_one(
{key: search_value}, {MONGO_OBJECT_ID_KEY: False}
)
except Exception as err: except Exception as err:
raise RetrievalError(f'Error retrieving machine with "{key} == {search_value}": {err}') raise RetrievalError(f'Error retrieving machine with "{key} == {search_value}": {err}')
if machine_dict is None: if machine_dict is None:
raise UnknownRecordError(f'Unknown machine with "{key} == {search_value}"') raise UnknownRecordError(f'Unknown machine with "{key} == {search_value}"')
return MongoMachineRepository._mongo_record_to_machine(machine_dict) return Machine(**machine_dict)
def get_machines_by_ip(self, ip: IPv4Address) -> Sequence[Machine]: def get_machines_by_ip(self, ip: IPv4Address) -> Sequence[Machine]:
ip_regex = "^" + str(ip).replace(".", "\\.") + "\\/.*$" ip_regex = "^" + str(ip).replace(".", "\\.") + "\\/.*$"
query = {"network_interfaces": {"$elemMatch": {"$regex": ip_regex}}} query = {"network_interfaces": {"$elemMatch": {"$regex": ip_regex}}}
try: try:
cursor = self._machines_collection.find(query) cursor = self._machines_collection.find(query, {MONGO_OBJECT_ID_KEY: False})
except Exception as err: except Exception as err:
raise RetrievalError(f'Error retrieving machines with ip "{ip}": {err}') raise RetrievalError(f'Error retrieving machines with ip "{ip}": {err}')
machines = list(map(MongoMachineRepository._mongo_record_to_machine, cursor)) machines = list(map(lambda m: Machine(**m), cursor))
if len(machines) == 0: if len(machines) == 0:
raise UnknownRecordError(f'No machines found with IP "{ip}"') raise UnknownRecordError(f'No machines found with IP "{ip}"')
return machines return machines
@staticmethod
def _mongo_record_to_machine(mongo_record: MutableMapping[str, Any]) -> Machine:
del mongo_record[MONGO_OBJECT_ID_KEY]
return Machine(**mongo_record)
def reset(self): def reset(self):
try: try:
self._machines_collection.drop() self._machines_collection.drop()

View File

@ -1,5 +1,5 @@
from copy import deepcopy from copy import deepcopy
from typing import Any, MutableMapping, Sequence from typing import Sequence
from pymongo import MongoClient from pymongo import MongoClient
@ -20,25 +20,22 @@ class MongoNodeRepository(INodeRepository):
self, src: MachineID, dst: MachineID, communication_type: CommunicationType self, src: MachineID, dst: MachineID, communication_type: CommunicationType
): ):
try: try:
node_dict = self._nodes_collection.find_one({SRC_FIELD_NAME: src}) node_dict = self._nodes_collection.find_one(
{SRC_FIELD_NAME: src}, {MONGO_OBJECT_ID_KEY: False}
)
except Exception as err: except Exception as err:
raise StorageError(f"{UPSERT_ERROR_MESSAGE}: {err}") raise StorageError(f"{UPSERT_ERROR_MESSAGE}: {err}")
if node_dict is None: if node_dict is None:
updated_node = Node(machine_id=src, connections={dst: frozenset((communication_type,))}) updated_node = Node(machine_id=src, connections={dst: frozenset((communication_type,))})
else: else:
node = MongoNodeRepository._mongo_record_to_node(node_dict) node = Node(**node_dict)
updated_node = MongoNodeRepository._add_connection_to_node( updated_node = MongoNodeRepository._add_connection_to_node(
node, dst, communication_type node, dst, communication_type
) )
self._upsert_node(updated_node) self._upsert_node(updated_node)
@staticmethod
def _mongo_record_to_node(mongo_record: MutableMapping[str, Any]) -> Node:
del mongo_record[MONGO_OBJECT_ID_KEY]
return Node(**mongo_record)
@staticmethod @staticmethod
def _add_connection_to_node( def _add_connection_to_node(
node: Node, dst: MachineID, communication_type: CommunicationType node: Node, dst: MachineID, communication_type: CommunicationType
@ -75,8 +72,8 @@ class MongoNodeRepository(INodeRepository):
def get_nodes(self) -> Sequence[Node]: def get_nodes(self) -> Sequence[Node]:
try: try:
cursor = self._nodes_collection.find() cursor = self._nodes_collection.find({}, {MONGO_OBJECT_ID_KEY: False})
return list(map(MongoNodeRepository._mongo_record_to_node, cursor)) return list(map(lambda n: Node(**n), cursor))
except Exception as err: except Exception as err:
raise RetrievalError(f"Error retrieving nodes from the repository: {err}") raise RetrievalError(f"Error retrieving nodes from the repository: {err}")

View File

@ -12,6 +12,7 @@ from infection_monkey.exploit.log4shell_utils.ldap_server import LDAPServerFacto
from monkey_island.cc.event_queue import IslandEventTopic, PyPubSubIslandEventQueue from monkey_island.cc.event_queue import IslandEventTopic, PyPubSubIslandEventQueue
from monkey_island.cc.models import Report from monkey_island.cc.models import Report
from monkey_island.cc.models.networkmap import Arc, NetworkMap from monkey_island.cc.models.networkmap import Arc, NetworkMap
from monkey_island.cc.repository import MongoAgentRepository, MongoMachineRepository
from monkey_island.cc.repository.attack.IMitigationsRepository import IMitigationsRepository from monkey_island.cc.repository.attack.IMitigationsRepository import IMitigationsRepository
from monkey_island.cc.repository.i_agent_repository import IAgentRepository from monkey_island.cc.repository.i_agent_repository import IAgentRepository
from monkey_island.cc.repository.i_attack_repository import IAttackRepository from monkey_island.cc.repository.i_attack_repository import IAttackRepository
@ -277,6 +278,8 @@ ICredentialsRepository.save_configured_credentials
ITelemetryRepository.get_telemetries ITelemetryRepository.get_telemetries
IEventRepository.get_events IEventRepository.get_events
IFindingRepository.get_findings IFindingRepository.get_findings
MongoAgentRepository
MongoMachineRepository
key_list key_list
simulation simulation
netmap netmap