From ba14e19e44e0346c4b4d76df9974ec0cc461ef31 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B6rn=20K=C3=BCnsem=C3=B6ller?=
 <jkuensem@physik.uni-bielefeld.de>
Date: Tue, 29 Aug 2023 16:41:52 +0200
Subject: [PATCH] TMSS-2658: process review comments

---
 .../websocket/lib/websocket_service.py        | 78 +++++++++----------
 1 file changed, 39 insertions(+), 39 deletions(-)

diff --git a/SAS/TMSS/backend/services/websocket/lib/websocket_service.py b/SAS/TMSS/backend/services/websocket/lib/websocket_service.py
index 1c772d9b9ec..adcab4dbc3d 100644
--- a/SAS/TMSS/backend/services/websocket/lib/websocket_service.py
+++ b/SAS/TMSS/backend/services/websocket/lib/websocket_service.py
@@ -56,21 +56,20 @@ class TMSSWebSocket(WebSocket):
         self.user = None
 
     def handleMessage(self):
+        if self.authenticated:
+            logger.debug('Client already authenticated, ignoring incoming message. User: %s from IP: %s' % (self.user, self.address[0]))
+            return
         try:
-            if not self.authenticated:  # Not (yet) authenticated
-                token_key = JSONloads(self.data).get('token', '')
-                from rest_framework.authtoken.models import Token
-                token_obj = Token.objects.filter(key=token_key).first()
-                if token_obj:
-                    self.user = token_obj.user
-                    self.authenticated = True
-                    logger.info('Client authenticated. User: %s from IP: %s' % (self.user, self.address[0]))
-                else:
-                    logger.info('Client not authenticated. IP: %s' % (self.address[0]))
-                    self.close(1011, u'Please login, so you have a token, and please submit the token in the 1st message after the connection was made.')
+            token_key = JSONloads(self.data).get('token', '')
+            from rest_framework.authtoken.models import Token
+            token_obj = Token.objects.filter(key=token_key).first()
+            if token_obj:
+                self.user = token_obj.user
+                self.authenticated = True
+                logger.info('Client authenticated. User: %s from IP: %s' % (self.user, self.address[0]))
             else:
-                logger.debug('Client already authenticated, ignoring incoming message. User: %s from IP: %s' % (self.user, self.address[0]))
-                # NOTE: We just ignore incoming messages as we treat the communication as one-way only, except for the auth msg.
+                logger.info('Client not authenticated. IP: %s' % (self.address[0]))
+                self.close(1011, u'Please login, so you have a token, and please submit the token in the 1st message after the connection was made.')
         except Exception as e:
             logger.exception('Error when handling websocket message of User: %s from IP: %s' % (self.user, self.address[0]))
             raise
@@ -139,33 +138,34 @@ class TMSSEventMessageHandlerForWebsocket(TMSSEventMessageHandler):
         auth_clients = []
         logger.info('Checking which of these users should receive websocket update for obj=%s: %s' % (obj, [ws.user for ws in list(self._ws_server.connections.values())]))
         for ws in list(self._ws_server.connections.values()):
-            if ws.authenticated:    # Check user permissions for the object
-                user = User.objects.filter(username=ws.user).first()
-                if user is None:
-                    logger.info('User=%s does not exist in TMSS and will not receive websocket update for obj=%s' % (ws.user, obj))
-                    continue
-                if user.is_superuser:
-                    logger.info('User=%s is superuser and will receive websocket update for obj=%s' % (user, obj))
-                    auth_clients.append(ws)
-                elif user.has_perm("tmssapp.view_%s" % type(obj).__name__.lower()):
-                    logger.info('User=%s has permission=%s and will receive websocket update for obj=%s' % (user, "tmssapp.view_%s" % type(obj).__name__.lower(), obj))
-                    auth_clients.append(ws)
-                else:
-                    logger.info('User=%s has no permission=%s, checking for project-based permission to receive websocket update for obj=%s' % (user, "tmssapp.view_%s" % type(obj).__name__.lower(), obj))
-                    # project-based permission
-                    permitted_project_roles = get_project_roles_with_permission(type(obj).__name__.lower(), 'GET')
-                    user_project_roles = get_project_roles_for_user(user)
-                    related_project = getattr(obj, 'project', None)
-                    for project_role in user_project_roles:
-                        if related_project:
-                            if project_role['project'].lower() == related_project.name.lower() and \
-                                    ProjectRole.objects.get(value=project_role['role']) in permitted_project_roles:
-                                auth_clients.append(ws)
-                                logger.info("User=%s has project-based permission for project=%s and will receive websocket update for obj=%s" % (user, project_role['project'].lower(), obj))
-                                break
-            else:
+            if not ws.authenticated:
                 logger.info("%s websocket is not authenticated and will not receive websocket update for obj=%s" % (ws.user, obj))
-
+                continue
+            user = User.objects.filter(username=ws.user).first()
+            if user is None:
+                logger.info('User=%s does not exist in TMSS and will not receive websocket update for obj=%s' % (ws.user, obj))
+                continue
+            if user.is_superuser:
+                logger.info('User=%s is superuser and will receive websocket update for obj=%s' % (user, obj))
+                auth_clients.append(ws)
+                continue
+            if user.has_perm("tmssapp.view_%s" % type(obj).__name__.lower()):
+                logger.info('User=%s has permission=%s and will receive websocket update for obj=%s' % (user, "tmssapp.view_%s" % type(obj).__name__.lower(), obj))
+                auth_clients.append(ws)
+                continue
+            logger.info('User=%s has no permission=%s, checking for project-based permission to receive websocket update for obj=%s' % (user, "tmssapp.view_%s" % type(obj).__name__.lower(), obj))
+            # project-based permission
+            permitted_project_roles = get_project_roles_with_permission(type(obj).__name__.lower(), 'GET')
+            user_project_roles = get_project_roles_for_user(user)
+            related_project = getattr(obj, 'project', None)
+            if related_project:
+                related_project_name = related_project.name.lower()
+                for project_role in user_project_roles:
+                    if project_role['project'].lower() == related_project_name and \
+                            ProjectRole.objects.get(value=project_role['role']) in permitted_project_roles:
+                        auth_clients.append(ws)
+                        logger.info("User=%s has project-based permission for project=%s and will receive websocket update for obj=%s" % (user, project_role['project'].lower(), obj))
+                        break
         return auth_clients
 
     def _broadcast_notify_to_clients_websocket(self, msg, clients):
-- 
GitLab