# © Crown-owned copyright 2025, Defence Science and Technology Laboratory UK from typing import Tuple from uuid import uuid4 import pytest from primaite.simulator.network.container import Network from primaite.simulator.network.hardware.base import User from primaite.simulator.network.hardware.nodes.host.computer import Computer from primaite.simulator.network.hardware.nodes.host.server import Server @pytest.fixture(scope="function") def client_server_network() -> Tuple[Computer, Server, Network]: network = Network() client = Computer( hostname="client", ip_address="192.168.1.2", subnet_mask="255.255.255.0", default_gateway="192.168.1.1", start_up_duration=0, ) client.power_on() server = Server( hostname="server", ip_address="192.168.1.3", subnet_mask="255.255.255.0", default_gateway="192.168.1.1", start_up_duration=0, ) server.power_on() network.connect(client.network_interface[1], server.network_interface[1]) return client, server, network def test_local_login_success(client_server_network): client, server, network = client_server_network assert not client.user_session_manager.local_user_logged_in client.user_session_manager.local_login(username="admin", password="admin") assert client.user_session_manager.local_user_logged_in def test_login_count_increases(client_server_network): client, server, network = client_server_network admin_user: User = client.user_manager.users["admin"] assert admin_user.num_of_logins == 0 client.user_session_manager.local_login(username="admin", password="admin") assert admin_user.num_of_logins == 1 client.user_session_manager.local_login(username="admin", password="admin") # shouldn't change as user is already logged in assert admin_user.num_of_logins == 1 client.user_session_manager.local_logout() client.user_session_manager.local_login(username="admin", password="admin") assert admin_user.num_of_logins == 2 def test_local_login_failure(client_server_network): client, server, network = client_server_network assert not client.user_session_manager.local_user_logged_in client.user_session_manager.local_login(username="jane.doe", password="12345") assert not client.user_session_manager.local_user_logged_in def test_new_user_local_login_success(client_server_network): client, server, network = client_server_network assert not client.user_session_manager.local_user_logged_in client.user_manager.add_user(username="jane.doe", password="12345") client.user_session_manager.local_login(username="jane.doe", password="12345") assert client.user_session_manager.local_user_logged_in def test_new_local_login_clears_previous_login(client_server_network): client, server, network = client_server_network assert not client.user_session_manager.local_user_logged_in current_session_id = client.user_session_manager.local_login(username="admin", password="admin") assert client.user_session_manager.local_user_logged_in assert client.user_session_manager.local_session.user.username == "admin" client.user_manager.add_user(username="jane.doe", password="12345") new_session_id = client.user_session_manager.local_login(username="jane.doe", password="12345") assert client.user_session_manager.local_user_logged_in assert client.user_session_manager.local_session.user.username == "jane.doe" assert new_session_id != current_session_id def test_new_local_login_attempt_same_uses_persists(client_server_network): client, server, network = client_server_network assert not client.user_session_manager.local_user_logged_in current_session_id = client.user_session_manager.local_login(username="admin", password="admin") assert client.user_session_manager.local_user_logged_in assert client.user_session_manager.local_session.user.username == "admin" new_session_id = client.user_session_manager.local_login(username="admin", password="admin") assert client.user_session_manager.local_user_logged_in assert client.user_session_manager.local_session.user.username == "admin" assert new_session_id == current_session_id def test_remote_login_success(client_server_network): # partial test for now until we get the terminal application in so that amn actual remote connection can be made client, server, network = client_server_network assert not server.user_session_manager.remote_sessions remote_session_id = server.user_session_manager.remote_login( username="admin", password="admin", remote_ip_address="192.168.1.10" ) assert server.user_session_manager.validate_remote_session_uuid(remote_session_id) server.user_session_manager.remote_logout(remote_session_id) assert not server.user_session_manager.validate_remote_session_uuid(remote_session_id) def test_remote_login_failure(client_server_network): # partial test for now until we get the terminal application in so that amn actual remote connection can be made client, server, network = client_server_network assert not server.user_session_manager.remote_sessions remote_session_id = server.user_session_manager.remote_login( username="jane.doe", password="12345", remote_ip_address="192.168.1.10" ) assert not server.user_session_manager.validate_remote_session_uuid(remote_session_id) def test_new_user_remote_login_success(client_server_network): client, server, network = client_server_network server.user_manager.add_user(username="jane.doe", password="12345") remote_session_id = server.user_session_manager.remote_login( username="jane.doe", password="12345", remote_ip_address="192.168.1.10" ) assert server.user_session_manager.validate_remote_session_uuid(remote_session_id) server.user_session_manager.remote_logout(remote_session_id) assert not server.user_session_manager.validate_remote_session_uuid(remote_session_id) def test_max_remote_sessions_same_user(client_server_network): client, server, network = client_server_network remote_session_ids = [ server.user_session_manager.remote_login(username="admin", password="admin", remote_ip_address="192.168.1.10") for _ in range(server.user_session_manager.max_remote_sessions) ] assert all([server.user_session_manager.validate_remote_session_uuid(id) for id in remote_session_ids]) def test_max_remote_sessions_different_users(client_server_network): client, server, network = client_server_network remote_session_ids = [] for i in range(server.user_session_manager.max_remote_sessions): username = str(uuid4()) password = "12345" server.user_manager.add_user(username=username, password=password) remote_session_ids.append( server.user_session_manager.remote_login( username=username, password=password, remote_ip_address="192.168.1.10" ) ) assert all([server.user_session_manager.validate_remote_session_uuid(id) for id in remote_session_ids]) def test_max_remote_sessions_limit_reached(client_server_network): client, server, network = client_server_network remote_session_ids = [ server.user_session_manager.remote_login(username="admin", password="admin", remote_ip_address="192.168.1.10") for _ in range(server.user_session_manager.max_remote_sessions) ] assert all([server.user_session_manager.validate_remote_session_uuid(id) for id in remote_session_ids]) assert len(server.user_session_manager.remote_sessions) == server.user_session_manager.max_remote_sessions fourth_attempt_session_id = server.user_session_manager.remote_login( username="admin", password="admin", remote_ip_address="192.168.1.10" ) assert not server.user_session_manager.validate_remote_session_uuid(fourth_attempt_session_id) assert all([server.user_session_manager.validate_remote_session_uuid(id) for id in remote_session_ids]) def test_single_remote_logout_others_persist(client_server_network): client, server, network = client_server_network server.user_manager.add_user(username="jane.doe", password="12345") server.user_manager.add_user(username="john.doe", password="12345") admin_session_id = server.user_session_manager.remote_login( username="admin", password="admin", remote_ip_address="192.168.1.10" ) jane_session_id = server.user_session_manager.remote_login( username="jane.doe", password="12345", remote_ip_address="192.168.1.10" ) john_session_id = server.user_session_manager.remote_login( username="john.doe", password="12345", remote_ip_address="192.168.1.10" ) server.user_session_manager.remote_logout(admin_session_id) assert not server.user_session_manager.validate_remote_session_uuid(admin_session_id) assert server.user_session_manager.validate_remote_session_uuid(jane_session_id) assert server.user_session_manager.validate_remote_session_uuid(john_session_id) server.user_session_manager.remote_logout(jane_session_id) assert not server.user_session_manager.validate_remote_session_uuid(admin_session_id) assert not server.user_session_manager.validate_remote_session_uuid(jane_session_id) assert server.user_session_manager.validate_remote_session_uuid(john_session_id) server.user_session_manager.remote_logout(john_session_id) assert not server.user_session_manager.validate_remote_session_uuid(admin_session_id) assert not server.user_session_manager.validate_remote_session_uuid(jane_session_id) assert not server.user_session_manager.validate_remote_session_uuid(john_session_id)