Source code for LifeLogServer.auth

import flask as f
import functools

from . import database

from http import HTTPStatus

AUTH_HEADER="token"

__PERM_ROOT='ultimate'

[docs]def requireAuth(func=None, /, permissions=["ultimate"], userid_keyword="userid"): """In order to authenticated a particular user, you must provide one of that user's tokens in the 'token' header. **Example**: .. sourcecode:: bash curl --header 'token: XXX' --request GET --url 'https://lifelog.ivanjohnson.net/api/v1/weight/get?since=0&before=2000000000&limit=3000&offset=0' At present there is no automatic way of obtaining an API token. """ if not func: return functools.partial(requireAuth, permissions=permissions, userid_keyword=userid_keyword) @functools.wraps(func) def wrapper(*args, **kwargs): try: givenToken = f.request.headers[AUTH_HEADER] except KeyError: return (f'You must use the \"{AUTH_HEADER}\" header to authenticate\n', HTTPStatus.UNAUTHORIZED) db = database.get_db() rows = db.execute('SELECT userid FROM tokens WHERE token = ?', (givenToken,)).fetchone() if rows is None or len(rows) == 0: return ("The provided auth token is invalid\n", HTTPStatus.UNAUTHORIZED) userid = rows['userid'] rows = db.execute('SELECT permission FROM token_perms WHERE token = ?', (givenToken,)).fetchall() token_perms = list(map(lambda row: row['permission'], rows)) missing_permissions = [] if __PERM_ROOT not in token_perms: for req in permissions: if req not in token_perms: missing_permissions.append(req) if len(missing_permissions) > 0: return (f"The provided auth token is missing the following permissions: {missing_permissions}\n", HTTPStatus.FORBIDDEN) kwargs[userid_keyword] = userid return func(*args, **kwargs) return wrapper