From e3326dea9f698bcdd5365d31db17d839cc17414f Mon Sep 17 00:00:00 2001 From: Brandon Rozek Date: Sat, 6 Jan 2024 13:58:48 -0500 Subject: [PATCH] Fixed authentication issues --- pubnix.py | 35 +++++++++++++++++++++++++++-------- server.py | 15 +++++++++------ 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/pubnix.py b/pubnix.py index 4ae521b..afa3019 100644 --- a/pubnix.py +++ b/pubnix.py @@ -69,10 +69,13 @@ def run_simple_server(address, fn, force_auth=True): print("Stopping server...") @contextmanager -def start_server(address): +def start_server(address, allow_other=True): """ Opens up a unix domain socket at the specified address and listens for connections. + + allow_other: Allow other users on the system to connect + to the unix domain socket """ if os.path.exists(address): print(f"{address} exists -- server already running") @@ -84,6 +87,11 @@ def start_server(address): sock.bind(address) sock.listen() + if allow_other: + # 33279 = '-rwxrwxrwx.' + os.chmod("game.sock", 33279) + os.chmod("challenges", 33279) + try: yield sock finally: @@ -106,10 +114,12 @@ def client_connection(sock): connection.close() def generate_challenge(user): + SERVER_FOLDER = Path(__file__).parent.absolute() + Path(f"{SERVER_FOLDER}/challenges").mkdir(mode=33279, exist_ok=True) return ChallengeMessage( username=user, token=generate_token(TOKEN_LENGTH), - location=f"/home/{user}/.pubnix_challenge" + location=f"{SERVER_FOLDER}/challenges/.{user}_challenge" ) def authenticate(connection): @@ -126,7 +136,7 @@ def authenticate(connection): # Check that challenge file exists if not os.path.exists(challenge.location): - close_with_error(connection, "Challange file doesn't exist") + close_with_error(connection, f"Authentication Error: Challange file doesn't exist at {challenge.location}") # Check if user owns the file if find_owner(challenge.location) != user: @@ -175,9 +185,10 @@ def run_simple_client(address, fn, force_auth=True): """ with start_client(address) as client: if force_auth: - user = login(client) - send_message(client, StartMessage()) - fn(client, user) + user, success = login(client) + if not force_auth or success: + send_message(client, StartMessage()) + fn(client, user) @contextmanager def start_client(address): @@ -213,12 +224,16 @@ def login(connection): send_message(connection, ValidationMessage()) # On success, delete challenge file + success = True try: message = receive_message(connection, AuthSuccessMessage) + except ProtocolException as e: + print(e) + success = False finally: os.unlink(challenge.location) - return user + return user, success ## # Messages @@ -244,7 +259,11 @@ def receive_message(connection, cls=None): try: message = cls(**message) except (TypeError, AssertionError): - close_with_error(connection, "Expected message of type") + if "type" in message and message['type'] == "error": + raise ProtocolException(message.get("message")) + else: + print("Received:", message, flush=True) + close_with_error(connection, f"Expected message of type {cls}") return message diff --git a/server.py b/server.py index fe1b114..357e0c7 100644 --- a/server.py +++ b/server.py @@ -41,11 +41,12 @@ class WordGuessServer: """ # 33152 = '-rw-------.' # 33188 = '-rw-r--r--.' + SERVER_FOLDER = Path(__file__).parent.absolute() os.chmod(__file__, 33152) - os.chmod("pubnix.py", 33188) - os.chmod("wordguess.py", 33188) - os.chmod("words.txt", 33188) - os.chmod("client.py", 33188) + os.chmod(f"{SERVER_FOLDER}/pubnix.py", 33188) + os.chmod(f"{SERVER_FOLDER}/wordguess.py", 33188) + os.chmod(f"{SERVER_FOLDER}/words.txt", 33188) + os.chmod(f"{SERVER_FOLDER}/client.py", 33188) Path(WordGuess.RESULTS_LOCATION).touch(33188) Path(SAVE_LOCATION).touch(33152) @@ -219,13 +220,13 @@ def make_default_dict_false(): def make_default_dict_set(): return defaultdict(set) -SAVE_LOCATION = "state.pickle" +SERVER_FOLDER = Path(__file__).parent.absolute() +SAVE_LOCATION = f"{SERVER_FOLDER}/state.pickle" if __name__ == "__main__": # NOTE: The seed must be kept secret otherwise # players can cheat! SEED = random.randint(3, 1000000) - print("Seed: ", SEED) w = WordGuessServer(SEED) @@ -235,6 +236,8 @@ if __name__ == "__main__": w = pickle.load(file) print("Successfully loaded game state") + print("Seed: ", w.seed) + # Make sure permissions are correct # to prevent cheating... w.fix_permissions()