From 02e1bcf33139c37c1d78aa6547b62d434aa8cb85 Mon Sep 17 00:00:00 2001 From: darta Date: Fri, 27 May 2022 16:52:35 +0200 Subject: [PATCH] fix(api,admin): refactor and events websocket fixed --- admin/src/admin/auth/tokens.py | 2 +- admin/src/admin/lib/admin.py | 19 ++++++++++++ admin/src/admin/schemas/mails.yml | 37 +++++++++++++++++++++++ admin/src/admin/views/ApiViews.py | 5 ++- admin/src/start.py | 22 ++++++++------ docker/api/src/api/views/AvatarsViews.py | 11 +++++-- docker/api/src/api/views/InternalViews.py | 3 +- docker/api/src/api/views/MenuViews.py | 3 +- 8 files changed, 85 insertions(+), 17 deletions(-) create mode 100644 admin/src/admin/schemas/mails.yml diff --git a/admin/src/admin/auth/tokens.py b/admin/src/admin/auth/tokens.py index a220b1f..bb8c345 100644 --- a/admin/src/admin/auth/tokens.py +++ b/admin/src/admin/auth/tokens.py @@ -56,7 +56,7 @@ def get_token_auth_header(): def get_token_payload(token): - log.warning("The received token in get_token_payload is: " + str(token)) + # log.warning("The received token in get_token_payload is: " + str(token)) try: claims = jwt.get_unverified_claims(token) secret = app.config["API_SECRET"] diff --git a/admin/src/admin/lib/admin.py b/admin/src/admin/lib/admin.py index 990faa0..64cbaa7 100644 --- a/admin/src/admin/lib/admin.py +++ b/admin/src/admin/lib/admin.py @@ -1906,3 +1906,22 @@ class Admin: self.moodle.delete_cohorts(cohort) self.nextcloud.delete_group(gid) self.resync_data() + + def set_nextcloud_user_mail(self, data): + self.pg.update( + """INSERT INTO "oc_appconfig" ("user_id","name","email","inbound_host","inbound_port","inbound_ssl_mode","inbound_user","outbound_host","outbound_port","outbound_ssl_mode","outbound_user") VALUES +(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s),""" + % ( + data["user_id"], + data["name"], + data["email"], + data["inbound_host"], + data["inbound_port"], + data["inbound_ssl_mode"], + data["inbound_user"], + data["outbound_host"], + data["outbound_port"], + data["outbound_ssl_mode"], + data["outbound_user"], + ) + ) diff --git a/admin/src/admin/schemas/mails.yml b/admin/src/admin/schemas/mails.yml new file mode 100644 index 0000000..779ccf0 --- /dev/null +++ b/admin/src/admin/schemas/mails.yml @@ -0,0 +1,37 @@ +mails: + type: list + schema: + user_id: + type: string + required: true + name: + type: string + required: false + email: + type: string + required: true + regex: ^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$ + inbound_host: + type: string + required: true + inbound_port: + type: integer + required: true + inbound_ssl_mode: + type: string + default: ssl + inbound_user: + type: string + required: true + outbound_host: + type: string + required: true + outbound_port: + type: integer + required: true + outbound_ssl_mode: + type: string + default: ssl + outbound_user: + type: string + required: true \ No newline at end of file diff --git a/admin/src/admin/views/ApiViews.py b/admin/src/admin/views/ApiViews.py index e31a899..624cd90 100644 --- a/admin/src/admin/views/ApiViews.py +++ b/admin/src/admin/views/ApiViews.py @@ -280,13 +280,16 @@ def ddapi_user_mail(id=None): if request.method == "POST": data = request.get_json(force=True) - if not app.validators["mail"].validate(data): + if not app.validators["mails"].validate(data): raise Error( "bad_request", "Data validation for mail failed: " + str(app.validators["mail"].errors), traceback.format_exc(), ) + for user in data: + log.info("Added user email") + app.admin.set_nextcloud_user_mail(user) return ( json.dumps("Not implemented yet"), 200, diff --git a/admin/src/start.py b/admin/src/start.py index 2651b92..78219df 100644 --- a/admin/src/start.py +++ b/admin/src/start.py @@ -7,6 +7,11 @@ monkey_patch() import json from flask_login import login_required +from admin import app +from admin.auth.tokens import get_token_payload +from admin.lib.api_exceptions import Error +from flask import request +from flask_login import current_user from flask_socketio import ( SocketIO, close_room, @@ -18,10 +23,6 @@ from flask_socketio import ( send, ) -from admin import app -from admin.auth.tokens import get_token_payload -from admin.lib.api_exceptions import Error -from flask import request app.socketio = SocketIO(app) @@ -29,15 +30,18 @@ app.socketio = SocketIO(app) @app.socketio.on("connect", namespace="/sio") @login_required def socketio_connect(): - join_room("admin") - app.socketio.emit( - "update", json.dumps("Joined admins room"), namespace="/sio", room="admin" - ) + if current_user.id: + join_room("admin") + app.socketio.emit( + "update", json.dumps("Joined admins room"), namespace="/sio", room="admin" + ) + else: + None @app.socketio.on("disconnect", namespace="/sio") def socketio_disconnect(): - None + leave_room("admin") @app.socketio.on("connect", namespace="/sio/events") diff --git a/docker/api/src/api/views/AvatarsViews.py b/docker/api/src/api/views/AvatarsViews.py index a0c481b..56e1654 100644 --- a/docker/api/src/api/views/AvatarsViews.py +++ b/docker/api/src/api/views/AvatarsViews.py @@ -9,8 +9,15 @@ import traceback from uuid import uuid4 from api import app -from flask import (Response, jsonify, redirect, render_template, request, - send_from_directory, url_for) +from flask import ( + Response, + jsonify, + redirect, + render_template, + request, + send_from_directory, + url_for, +) from ..lib.avatars import Avatars diff --git a/docker/api/src/api/views/InternalViews.py b/docker/api/src/api/views/InternalViews.py index 5a63843..6a2ad46 100644 --- a/docker/api/src/api/views/InternalViews.py +++ b/docker/api/src/api/views/InternalViews.py @@ -3,8 +3,7 @@ import os from api import app -from flask import (Response, jsonify, redirect, render_template, request, - url_for) +from flask import Response, jsonify, redirect, render_template, request, url_for from .decorators import is_internal diff --git a/docker/api/src/api/views/MenuViews.py b/docker/api/src/api/views/MenuViews.py index 30eb261..2ba9a7f 100644 --- a/docker/api/src/api/views/MenuViews.py +++ b/docker/api/src/api/views/MenuViews.py @@ -9,8 +9,7 @@ import traceback from uuid import uuid4 from api import app -from flask import (Response, jsonify, redirect, render_template, request, - url_for) +from flask import Response, jsonify, redirect, render_template, request, url_for from ..lib.menu import Menu