#2735 - Initial work done around User, UserManager, and UserSessionManager

This commit is contained in:
Chris McCarthy
2024-07-08 15:10:06 +01:00
parent 20e5e40d0d
commit 47a1daa580
7 changed files with 308 additions and 12 deletions

View File

@@ -6,7 +6,7 @@ import secrets
from abc import ABC, abstractmethod
from ipaddress import IPv4Address, IPv4Network
from pathlib import Path
from typing import Any, Dict, Optional, TypeVar, Union
from typing import Any, ClassVar, Dict, Optional, TypeVar, Union
from prettytable import MARKDOWN, PrettyTable
from pydantic import BaseModel, Field
@@ -37,6 +37,8 @@ from primaite.simulator.system.core.session_manager import SessionManager
from primaite.simulator.system.core.software_manager import SoftwareManager
from primaite.simulator.system.core.sys_log import SysLog
from primaite.simulator.system.processes.process import Process
from primaite.simulator.system.services.access.user_manager import UserManager
from primaite.simulator.system.services.access.user_session_manager import UserSessionManager
from primaite.simulator.system.services.service import Service
from primaite.simulator.system.software import IOSoftware
from primaite.utils.converters import convert_dict_enum_keys_to_enum_values
@@ -821,7 +823,16 @@ class Node(SimComponent):
super().__init__(**kwargs)
self.session_manager.node = self
self.session_manager.software_manager = self.software_manager
self._install_system_software()
self.software_manager.install(UserSessionManager)
self.software_manager.install(UserManager)
# @property
# def user_manager(self) -> UserManager:
# return self.software_manager.software["UserManager"] # noqa
#
# @property
# def _user_session_manager(self) -> UserSessionManager:
# return self.software_manager.software["UserSessionManager"] # noqa
def ip_is_network_interface(self, ip_address: IPv4Address, enabled_only: bool = False) -> bool:
"""
@@ -876,7 +887,7 @@ class Node(SimComponent):
@property
def fail_message(self) -> str:
"""Message that is reported when a request is rejected by this validator."""
return f"Cannot perform request on node '{self.node.hostname}' because it is not turned on."
return f"Cannot perform request on node '{self.node.hostname}' because it is not powered on."
def _init_request_manager(self) -> RequestManager:
"""
@@ -1000,10 +1011,6 @@ class Node(SimComponent):
return rm
def _install_system_software(self):
"""Install System Software - software that is usually provided with the OS."""
pass
def describe_state(self) -> Dict:
"""
Produce a dictionary describing the current state of this object.
@@ -1184,6 +1191,7 @@ class Node(SimComponent):
def pre_timestep(self, timestep: int) -> None:
"""Apply pre-timestep logic."""
super().pre_timestep(timestep)
self._
for network_interface in self.network_interfaces.values():
network_interface.pre_timestep(timestep=timestep)

View File

@@ -11,6 +11,8 @@ from primaite.simulator.network.transmission.data_link_layer import Frame
from primaite.simulator.system.applications.application import ApplicationOperatingState
from primaite.simulator.system.applications.nmap import NMAP
from primaite.simulator.system.applications.web_browser import WebBrowser
from primaite.simulator.system.services.access.user_manager import UserManager
from primaite.simulator.system.services.access.user_session_manager import UserSessionManager
from primaite.simulator.system.services.arp.arp import ARP, ARPPacket
from primaite.simulator.system.services.dns.dns_client import DNSClient
from primaite.simulator.system.services.icmp.icmp import ICMP
@@ -306,6 +308,8 @@ class HostNode(Node):
"NTPClient": NTPClient,
"WebBrowser": WebBrowser,
"NMAP": NMAP,
# "UserSessionManager": UserSessionManager,
# "UserManager": UserManager,
}
"""List of system software that is automatically installed on nodes."""
@@ -314,9 +318,10 @@ class HostNode(Node):
network_interface: Dict[int, NIC] = {}
"The NICs on the node by port id."
def __init__(self, ip_address: IPV4Address, subnet_mask: IPV4Address, **kwargs):
def __init__(self, ip_address: IPV4Address, subnet_mask: IPV4Address, username: str, password: str, **kwargs):
super().__init__(**kwargs)
self.connect_nic(NIC(ip_address=ip_address, subnet_mask=subnet_mask))
self.user_manager.add_user(username=username, password=password, is_admin=True, bypass_can_perform_action=True)
@property
def nmap(self) -> Optional[NMAP]:
@@ -348,8 +353,6 @@ class HostNode(Node):
for _, software_class in self.SYSTEM_SOFTWARE.items():
self.software_manager.install(software_class)
super()._install_system_software()
def default_gateway_hello(self):
"""
Sends a hello message to the default gateway to establish connectivity and resolve the gateway's MAC address.