1
0
Fork 0
canaille-globuzma/canaille/flaskutils.py

94 lines
2.1 KiB
Python
Raw Normal View History

import datetime
import logging
2020-08-19 14:20:57 +00:00
from functools import wraps
2021-12-20 22:57:27 +00:00
import ldap
2020-10-21 12:04:40 +00:00
from canaille.models import User
2021-12-20 22:57:27 +00:00
from flask import abort
from flask import current_app
from flask import render_template
from flask import session
from flask_babel import gettext as _
2020-08-19 14:20:57 +00:00
def current_user():
if not session.get("user_dn"):
return None
if not isinstance(session.get("user_dn"), list):
del session["user_dn"]
return None
dn = session["user_dn"][-1]
try:
user = User.get(dn=dn)
except ldap.LDAPError:
return None
if not user:
try:
session["user_dn"] = session["user_dn"][:-1]
except IndexError:
del session["user_dn"]
return user
2020-08-19 14:20:57 +00:00
def user_needed():
def wrapper(view_function):
@wraps(view_function)
def decorator(*args, **kwargs):
2020-08-27 08:50:50 +00:00
user = current_user()
if not user:
2020-08-19 14:20:57 +00:00
abort(403)
2020-08-27 08:50:50 +00:00
return view_function(*args, user=user, **kwargs)
2020-08-19 14:20:57 +00:00
return decorator
return wrapper
2021-12-02 17:23:14 +00:00
def permissions_needed(*args):
permissions = set(args)
2020-11-02 11:13:03 +00:00
2020-08-19 14:20:57 +00:00
def wrapper(view_function):
@wraps(view_function)
def decorator(*args, **kwargs):
user = current_user()
2021-12-02 17:23:14 +00:00
if not user or not permissions.issubset(user.permissions):
2020-08-19 14:20:57 +00:00
abort(403)
2020-10-29 10:09:31 +00:00
return view_function(*args, user=user, **kwargs)
2020-08-19 14:20:57 +00:00
return decorator
return wrapper
def smtp_needed():
def wrapper(view_function):
@wraps(view_function)
def decorator(*args, **kwargs):
if "SMTP" in current_app.config:
return view_function(*args, **kwargs)
message = _("No SMTP server has been configured")
logging.warning(message)
return (
render_template(
"error.html",
error=500,
icon="tools",
debug=current_app.config.get("DEBUG", False),
description=message,
),
500,
)
return decorator
return wrapper
def timestamp(dt):
return datetime.datetime.timestamp(dt)