#2712 - Commit before merging in changes on dev
This commit is contained in:
@@ -56,6 +56,15 @@ class SSHConnectionMessage(IntEnum):
|
|||||||
SSH_MSG_CHANNEL_CLOSE = 87
|
SSH_MSG_CHANNEL_CLOSE = 87
|
||||||
"""Closes the channel."""
|
"""Closes the channel."""
|
||||||
|
|
||||||
|
class SSHUserCredentials(DataPacket):
|
||||||
|
"""Hold Username and Password in SSH Packets"""
|
||||||
|
|
||||||
|
username: str = None
|
||||||
|
"""Username for login"""
|
||||||
|
|
||||||
|
password: str = None
|
||||||
|
"""Password for login"""
|
||||||
|
|
||||||
|
|
||||||
class SSHPacket(DataPacket):
|
class SSHPacket(DataPacket):
|
||||||
"""Represents an SSHPacket."""
|
"""Represents an SSHPacket."""
|
||||||
@@ -64,8 +73,8 @@ class SSHPacket(DataPacket):
|
|||||||
|
|
||||||
connection_message: SSHConnectionMessage = None
|
connection_message: SSHConnectionMessage = None
|
||||||
|
|
||||||
ssh_command: Optional[str] = None # This is the request string
|
connection_uuid: Optional[str] = None # The connection uuid used to validate the session
|
||||||
|
|
||||||
ssh_output: Optional[RequestResponse] = None # The Request Manager's returned RequestResponse
|
ssh_output: Optional[RequestResponse] = None # The Request Manager's returned RequestResponse
|
||||||
|
|
||||||
user_account: Optional[Dict] = None # The user account we will use to login if we do not have a current connection.
|
ssh_command: Optional[str] = None # This is the request string
|
||||||
@@ -7,8 +7,8 @@ from uuid import uuid4
|
|||||||
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
from primaite.interface.request import RequestResponse
|
from primaite.interface.request import RequestFormat, RequestResponse
|
||||||
from primaite.simulator.core import RequestManager
|
from primaite.simulator.core import RequestManager, RequestPermissionValidator, RequestType
|
||||||
from primaite.simulator.network.hardware.base import Node
|
from primaite.simulator.network.hardware.base import Node
|
||||||
from primaite.simulator.network.protocols.ssh import SSHConnectionMessage, SSHPacket, SSHTransportMessage
|
from primaite.simulator.network.protocols.ssh import SSHConnectionMessage, SSHPacket, SSHTransportMessage
|
||||||
from primaite.simulator.network.transmission.network_layer import IPProtocol
|
from primaite.simulator.network.transmission.network_layer import IPProtocol
|
||||||
@@ -96,7 +96,11 @@ class Terminal(Service):
|
|||||||
def _init_request_manager(self) -> RequestManager:
|
def _init_request_manager(self) -> RequestManager:
|
||||||
"""Initialise Request manager."""
|
"""Initialise Request manager."""
|
||||||
# TODO: Expand with a login validator?
|
# TODO: Expand with a login validator?
|
||||||
|
|
||||||
|
_login_valid = Terminal._LoginValidator(terminal=self)
|
||||||
|
|
||||||
rm = super()._init_request_manager()
|
rm = super()._init_request_manager()
|
||||||
|
rm.add_request("login", request_type=RequestType(func=lambda request, context: RequestResponse.from_bool(self._validate_login()), validator=_login_valid))
|
||||||
return rm
|
return rm
|
||||||
|
|
||||||
def _validate_login(self, user_account: Optional[str]) -> bool:
|
def _validate_login(self, user_account: Optional[str]) -> bool:
|
||||||
@@ -109,10 +113,32 @@ class Terminal(Service):
|
|||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
class _LoginValidator(RequestPermissionValidator):
|
||||||
|
"""
|
||||||
|
When requests come in, this validator will only allow them through if the
|
||||||
|
User is logged into the Terminal.
|
||||||
|
|
||||||
|
Login is required before making use of the Terminal.
|
||||||
|
"""
|
||||||
|
|
||||||
|
terminal: Terminal
|
||||||
|
"""Save a reference to the Terminal instance."""
|
||||||
|
|
||||||
|
def __call__(self, request: RequestFormat, context: Dict) -> bool:
|
||||||
|
"""Return whether the Terminal has valid login credentials"""
|
||||||
|
return self.terminal.login_status
|
||||||
|
|
||||||
|
@property
|
||||||
|
def fail_message(self) -> str:
|
||||||
|
"""Message that is reported when a request is rejected by this validator"""
|
||||||
|
return ("Cannot perform request on terminal as not logged in.")
|
||||||
|
|
||||||
|
|
||||||
# %% Inbound
|
# %% Inbound
|
||||||
|
|
||||||
def _generate_connection_uuid(self) -> str:
|
def _generate_connection_uuid(self) -> str:
|
||||||
"""Generate a unique connection ID."""
|
"""Generate a unique connection ID."""
|
||||||
|
# This might not be needed given user_manager.login() returns a UUID.
|
||||||
return str(uuid4())
|
return str(uuid4())
|
||||||
|
|
||||||
def login(self, dest_ip_address: IPv4Address, **kwargs) -> bool:
|
def login(self, dest_ip_address: IPv4Address, **kwargs) -> bool:
|
||||||
@@ -136,7 +162,7 @@ class Terminal(Service):
|
|||||||
payload="login", transport_message=transport_message, connection_message=connection_message
|
payload="login", transport_message=transport_message, connection_message=connection_message
|
||||||
)
|
)
|
||||||
|
|
||||||
self.sys_log.debug(f"Sending login request to {dest_ip_address}")
|
self.sys_log.info(f"Sending login request to {dest_ip_address}")
|
||||||
self.send(payload=payload, dest_ip_address=dest_ip_address)
|
self.send(payload=payload, dest_ip_address=dest_ip_address)
|
||||||
|
|
||||||
def _ssh_process_login(self, dest_ip_address: IPv4Address, user_account: dict, **kwargs) -> bool:
|
def _ssh_process_login(self, dest_ip_address: IPv4Address, user_account: dict, **kwargs) -> bool:
|
||||||
|
|||||||
Reference in New Issue
Block a user