|
1 | 1 | import re |
2 | | -from enum import Enum |
3 | | - |
4 | | -from fastapi import HTTPException, Request, status |
5 | | - |
6 | | -import auth |
7 | | -import auth.crud |
8 | | -import database |
9 | | -from permission.types import ElectionOfficer, WebsiteAdmin |
10 | | - |
11 | | - |
12 | | -class AdminTypeEnum(Enum): |
13 | | - Full = 1 |
14 | | - Election = 2 |
15 | 2 |
|
16 | 3 |
|
17 | 4 | # TODO: move other utils into this module |
18 | 5 | def slugify(text: str) -> str: |
19 | 6 | """Creates a unique slug based on text passed in. Assumes non-unicode text.""" |
20 | 7 | return re.sub(r"[\W_]+", "-", text.strip().replace("/", "").replace("&", "")) |
21 | | - |
22 | | - |
23 | | -async def logged_in_or_raise(request: Request, db_session: database.DBSession) -> tuple[str, str]: |
24 | | - """gets the user's computing_id, or raises an exception if the current request is not logged in""" |
25 | | - session_id = request.cookies.get("session_id", None) |
26 | | - if session_id is None: |
27 | | - raise HTTPException(status_code=401, detail="no session id") |
28 | | - |
29 | | - session_computing_id = await auth.crud.get_computing_id(db_session, session_id) |
30 | | - if session_computing_id is None: |
31 | | - raise HTTPException(status_code=401, detail="no computing id") |
32 | | - |
33 | | - return session_id, session_computing_id |
34 | | - |
35 | | - |
36 | | -async def get_current_user(request: Request, db_session: database.DBSession) -> tuple[str, str] | tuple[None, None]: |
37 | | - """ |
38 | | - Gets information about the currently logged in user. |
39 | | -
|
40 | | - Args: |
41 | | - request: The request being checked |
42 | | - db_session: The current database session |
43 | | -
|
44 | | - Returns: |
45 | | - A tuple of either (None, None) if there is no logged in user or a tuple (session ID, computing ID) |
46 | | - """ |
47 | | - session_id = request.cookies.get("session_id", None) |
48 | | - if session_id is None: |
49 | | - return None, None |
50 | | - |
51 | | - session_computing_id = await auth.crud.get_computing_id(db_session, session_id) |
52 | | - if session_computing_id is None: |
53 | | - return None, None |
54 | | - |
55 | | - return session_id, session_computing_id |
56 | | - |
57 | | - |
58 | | -# TODO: Add an election admin version that checks the election attempting to be modified as well |
59 | | -async def admin_or_raise( |
60 | | - request: Request, db_session: database.DBSession, admintype: AdminTypeEnum = AdminTypeEnum.Full |
61 | | -) -> tuple[str, str]: |
62 | | - session_id, computing_id = await get_current_user(request, db_session) |
63 | | - if not session_id or not computing_id: |
64 | | - raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="must be logged in") |
65 | | - |
66 | | - # where valid means election officer or website admin |
67 | | - if (await WebsiteAdmin.has_permission(db_session, computing_id)) or ( |
68 | | - admintype is AdminTypeEnum.Election and await ElectionOfficer.has_permission(db_session, computing_id) |
69 | | - ): |
70 | | - return session_id, computing_id |
71 | | - |
72 | | - raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="must be an admin") |
73 | | - |
74 | | - |
75 | | -async def is_website_admin(request: Request, db_session: database.DBSession) -> tuple[bool, str | None, str | None]: |
76 | | - session_id, computing_id = await get_current_user(request, db_session) |
77 | | - if session_id is None or computing_id is None: |
78 | | - return False, session_id, computing_id |
79 | | - |
80 | | - if await WebsiteAdmin.has_permission(db_session, computing_id): |
81 | | - return True, session_id, computing_id |
82 | | - |
83 | | - return False, session_id, computing_id |
0 commit comments