1
0
mirror of https://github.com/Mailu/Mailu.git synced 2025-02-15 13:33:21 +02:00
Mailu/core/admin/mailu/api/common.py

35 lines
1.5 KiB
Python
Raw Normal View History

from .. import models, utils
from . import v1
from flask import request
import flask
import hmac
from functools import wraps
from flask_restx import abort
2022-11-25 11:21:33 +00:00
from sqlalchemy.sql.expression import label
2022-11-25 11:21:33 +00:00
def fqdn_in_use(name):
d = models.db.session.query(label('name', models.Domain.name))
a = models.db.session.query(label('name', models.Alternative.name))
r = models.db.session.query(label('name', models.Relay.name))
2022-11-27 11:15:40 +00:00
u = d.union_all(a).union_all(r).filter_by(name=name)
if models.db.session.query(u.exists()).scalar():
2022-11-25 11:21:33 +00:00
return True
return False
""" Decorator for validating api token for authentication """
def api_token_authorization(func):
@wraps(func)
def decorated_function(*args, **kwds):
client_ip = flask.request.headers.get('X-Real-IP', flask.request.remote_addr)
if utils.limiter.should_rate_limit_ip(client_ip):
abort(429, 'Too many attempts from your IP (rate-limit)' )
2022-11-25 11:21:33 +00:00
if not request.headers.get('Authorization'):
2024-04-18 18:50:13 +02:00
abort(401, 'A valid Authorization header is mandatory')
2024-04-20 08:46:47 +02:00
if len(v1.api_token) < 4 or not hmac.compare_digest(request.headers.get('Authorization').removeprefix('Bearer '), v1.api_token):
utils.limiter.rate_limit_ip(client_ip)
flask.current_app.logger.warn(f'Invalid API token provided by {client_ip}.')
2024-04-18 18:50:13 +02:00
abort(403, 'Invalid API token')
2022-11-25 11:21:33 +00:00
flask.current_app.logger.info(f'Valid API token provided by {client_ip}.')
return func(*args, **kwds)
return decorated_function