Files
kbcrm/App_Server/root/auth/routes.py
T

236 lines
6.1 KiB
Python

from approot import login_manager
from auth.model import (
APP_ADMIN,
APP_DOZENT,
APP_USER,
SYS_ADMIN,
Application,
Role,
User,
applications,
roles,
users,
)
from flask import current_app as app
from flask import jsonify, request
from flask_login import login_required, login_user, logout_user
from .model.errors import ApplicationError, AutorisationError
print("auth-routes")
@login_manager.user_loader
def user_loader(userid):
user: User | None = User.query.filter(User.userid == userid).first()
return user
@app.post("/auth/checklogin")
def checklogin():
"""
Hier wird nur die Authentifizierung überprüft.
Evtl. Autorisierungen anhand der User-Rollen und App-Berechtigungen müssen später bei den
Funktionsaufrufen erfolgen
"""
data = request.json
user: User = users.check_login(data["userid"], data["password"])
if user is None:
error = ApplicationError(
"Login oder Kennwort stimmen nicht!",
"Anmeldung wurde verweigert",
htmlstatus=403,
)
return jsonify(error.error), error.htmlstatus
if not user.has_roles([SYS_ADMIN, APP_ADMIN, APP_USER, APP_DOZENT]):
error = ApplicationError(
"Sie haben nicht die passende Rolle zur Nutzung dieser Anwendung.",
"Der Zugang wird verweigert",
htmlstatus=403,
)
return jsonify(error.error), error.htmlstatus
login_user(user)
result = user.to_dict()
result["isSysAdmin"] = user.is_SysAdmin()
return jsonify(result), 200
@app.post("/auth/changepassword")
@login_required
def changepassword():
data = request.json
status = 200
result = {"Message": "", "Success": True}
try:
users.changepassword(
data["Userid"],
data["OldPassword"],
data["NewPassword1"],
data["NewPassword2"],
)
except Exception as ex:
error = ApplicationError(str(ex), htmlstatus=400)
return error.error, error.htmlstatus
return jsonify(result), status
@app.get("/auth/logout")
def logout():
logout_user()
return jsonify({"logout": True}), 200
@app.get("/auth/getusers")
@login_required
def getusers():
"""
Die Rückgabe wird in 'users.get_users()' (s.u.) anhand er App-Berechtigung und der
Rollen gefiltert.
"""
userquery = users.get_users()
result = []
user: User
for user in userquery:
result.append(user.to_relationaldict())
return jsonify(result), 200
@app.get("/auth/getapplications")
@login_required
def getapplications():
"""
Die Rückgabe wird in 'applications.get_applications()' (s.u.) anhand er App-Berechtigung und der
Rollen gefiltert.
"""
appquery = applications.get_applications()
result = []
app: Application
for app in appquery:
result.append(app.to_dict())
return jsonify(result), 200
@app.get("/auth/getroles")
@login_required
def getroles():
rolelist = roles.get_roles()
result = []
role: Role
for role in rolelist:
result.append(role.to_dict())
return jsonify(result), 200
@app.post("/auth/updaterole")
@login_required
def updaterole():
data = request.json
try:
roles.updaterole(data)
except AutorisationError as ex:
return jsonify(ex.error), ex.htmlstatus
except Exception as ex:
if str(ex) == "404":
return jsonify("Rolle nicht gefunden"), 404
else:
return jsonify(str(ex)), 400
return jsonify({}), 200
@app.post("/auth/deleteroles")
@login_required
def deleteroles():
data = request.json
try:
roles.deleteroles(data)
except AutorisationError as ex:
return jsonify(ex.error), ex.htmlstatus
except Exception as ex:
return jsonify(str(ex)), 400
return jsonify({}), 200
@app.post("/auth/updateapplication")
@login_required
def updateapplication():
data = request.json
try:
applications.updateapplication(data)
except AutorisationError as ex:
return jsonify(ex.error), ex.htmlstatus
except Exception as ex:
return jsonify(str(ex)), 400
return jsonify({}), 200
@app.post("/auth/deleteapplications")
@login_required
def deleteapplications():
data = request.json
try:
applications.deleteapplications(data)
except AutorisationError as ex:
return jsonify(ex.error), ex.htmlstatus
except Exception as ex:
return str(ex), 400
return {}, 200
@app.post("/auth/updateapplicationroles")
@login_required
def updateapplicationroles():
data = request.json
try:
applications.updateapplicationroles(data)
except AutorisationError as ex:
return jsonify(ex.error), ex.htmlstatus
except Exception as ex:
return jsonify(str(ex)), 400
return jsonify({}), 200
@app.post("/auth/updateuser")
@login_required
def updateuser():
data = request.json
try:
users.updateuser(data)
except AutorisationError as ex:
return jsonify(ex.error), ex.htmlstatus
except Exception as ex:
if str(ex) == "404":
return jsonify("Benutzer nicht gefunden"), 404
else:
return jsonify(str(ex)), 400
return jsonify({}), 200
@app.post("/auth/applyuserapprole")
@login_required
def applyuserapprole():
data = request.json
try:
users.applyuserapprole(data)
except AutorisationError as ex:
return jsonify(ex.error), ex.htmlstatus
except Exception as ex:
return jsonify(str(ex)), 400
return jsonify({}), 200
@app.post("/auth/deleteusers")
@login_required
def deleteusers():
data = request.json
try:
users.deleteusers(data)
except ApplicationError as ex:
return jsonify(ex.error), ex.htmlstatus
except Exception as ex:
return jsonify(str(ex)), 400
return {}, 200
print("########## auth.routes importiert")