blob: 52baa61084b5465e8b8b7840299f72a0c5c120c7 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
import typing as t
import jwt
from starlette.authentication import BaseUser
from starlette.requests import Request
from backend.constants import SECRET_KEY
from backend.discord import fetch_user_details
class User(BaseUser):
"""Starlette BaseUser implementation for JWT authentication."""
def __init__(self, token: str, payload: dict[str, t.Any]) -> None:
self.token = token
self.payload = payload
self.admin = False
@property
def is_authenticated(self) -> bool:
"""Returns True because user is always authenticated at this stage."""
return True
@property
def display_name(self) -> str:
"""Return username and discriminator as display name."""
return f"{self.payload['username']}#{self.payload['discriminator']}"
@property
def discord_mention(self) -> str:
return f"<@{self.payload['id']}>"
@property
def decoded_token(self) -> dict[str, any]:
return jwt.decode(self.token, SECRET_KEY, algorithms=["HS256"])
def fetch_admin_status(self, request: Request) -> bool:
self.admin = request.state.db.admins.find_one(
{"_id": self.payload["id"]}
) is not None
return self.admin
async def refresh_data(self) -> None:
"""Fetches user data from discord, and updates the instance."""
self.payload = await fetch_user_details(self.decoded_token.get("token"))
updated_info = self.decoded_token
updated_info["user_details"] = self.payload
self.token = jwt.encode(updated_info, SECRET_KEY, algorithm="HS256")
|