From eba6af3b1e63988a29dbebf955fa7e4d453b12c4 Mon Sep 17 00:00:00 2001
From: Patrick Jentsch <pjentsch@sfb1288inf-Laptop.fritz.box>
Date: Thu, 26 Mar 2020 16:14:09 +0100
Subject: [PATCH] Replace the default function decorators with new socketio
 specific ones

---
 app/corpora/events.py | 11 ++++++-----
 app/decorators.py     | 35 +++++++++++++++++++++++++----------
 app/events.py         | 12 +++++-------
 3 files changed, 36 insertions(+), 22 deletions(-)

diff --git a/app/corpora/events.py b/app/corpora/events.py
index 0f3828ec..88af8fb7 100644
--- a/app/corpora/events.py
+++ b/app/corpora/events.py
@@ -1,9 +1,10 @@
 from app import db, logger, socketio
+from app.decorators import socketio_login_required
 from app.events import connected_sessions
 from app.models import Corpus, User
 from .cqi import CQiClient
 from flask import current_app, request
-from flask_login import current_user, login_required
+from flask_login import current_user
 import math
 
 
@@ -23,13 +24,13 @@ corpus_analysis_clients_status = {}
 
 
 @socketio.on('send_analysis_status_cli')
-@login_required
+@socketio_login_required
 def update_status(response):
     update_analysis_status(response['status'])
 
 
 @socketio.on('corpus_analysis_init')
-@login_required
+@socketio_login_required
 def init_corpus_analysis(corpus_id):
     logger.warning('Initiating corpus analysis.')
     socketio.start_background_task(corpus_analysis_session_handler,
@@ -39,7 +40,7 @@ def init_corpus_analysis(corpus_id):
 
 
 @socketio.on('corpus_analysis_query')
-@login_required
+@socketio_login_required
 def corpus_analysis_query(query):
     update_analysis_status('running')
     logger.warning('Recieved a query.')
@@ -113,7 +114,7 @@ def get_analysis_status():
 
 
 @socketio.on('inspect_match')
-@login_required
+@socketio_login_required
 def inspect_match(message):
     client = corpus_analysis_clients.get(request.sid)
     if client is None:
diff --git a/app/decorators.py b/app/decorators.py
index 14ddc034..c45f6d29 100644
--- a/app/decorators.py
+++ b/app/decorators.py
@@ -1,19 +1,34 @@
 from functools import wraps
 from flask import abort
 from flask_login import current_user
+from flask_socketio import disconnect
 from .models import Permission
 
 
-def permission_required(permission):
-    def decorator(f):
-        @wraps(f)
-        def decorated_function(*args, **kwargs):
-            if not current_user.can(permission):
-                abort(403)
+def admin_required(f):
+    @wraps(f)
+    def wrapped(*args, **kwargs):
+        if not current_user.can(Permission.ADMIN):
+            abort(403)
+        return f(*args, **kwargs)
+    return wrapped
+
+
+def socketio_login_required(f):
+    @wraps(f)
+    def wrapped(*args, **kwargs):
+        if not current_user.is_authenticated:
+            disconnect()
+        else:
             return f(*args, **kwargs)
-        return decorated_function
-    return decorator
+    return wrapped
 
 
-def admin_required(f):
-    return permission_required(Permission.ADMIN)(f)
+def socketio_admin_required(f):
+    @wraps(f)
+    def wrapped(*args, **kwargs):
+        if not current_user.can(Permission.ADMIN):
+            disconnect()
+        else:
+            return f(*args, **kwargs)
+    return wrapped
diff --git a/app/events.py b/app/events.py
index c292ce7a..31484705 100644
--- a/app/events.py
+++ b/app/events.py
@@ -1,7 +1,7 @@
 from flask import current_app, request
-from flask_login import current_user, login_required
+from flask_login import current_user
 from . import socketio
-from .decorators import admin_required
+from .decorators import socketio_admin_required, socketio_login_required
 from .models import User
 import json
 import jsonpatch
@@ -16,7 +16,6 @@ connected_sessions = []
 
 
 @socketio.on('connect')
-@login_required
 def connect():
     '''
     ' The Socket.IO module creates a session id (sid) for each request.
@@ -26,7 +25,6 @@ def connect():
 
 
 @socketio.on('disconnect')
-@login_required
 def disconnect():
     '''
     ' On disconnect the session id gets removed from the connected sessions
@@ -36,7 +34,7 @@ def disconnect():
 
 
 @socketio.on('user_ressources_init')
-@login_required
+@socketio_login_required
 def subscribe_user_ressources():
     socketio.start_background_task(user_ressource_session_handler,
                                    current_app._get_current_object(),
@@ -44,8 +42,8 @@ def subscribe_user_ressources():
 
 
 @socketio.on('foreign_user_ressources_init')
-@login_required
-@admin_required
+@socketio_login_required
+@socketio_admin_required
 def subscribe_foreign_user_ressources(user_id):
     socketio.start_background_task(user_ressource_session_handler,
                                    current_app._get_current_object(),
-- 
GitLab