|
|
|
@ -3,6 +3,7 @@ import hashlib |
|
|
|
import random |
|
|
|
import secrets |
|
|
|
from datetime import datetime, timedelta |
|
|
|
from typing import Optional |
|
|
|
from urllib.parse import parse_qsl, urlencode, urlparse, urlunparse |
|
|
|
|
|
|
|
from redis.exceptions import RedisError |
|
|
|
@ -92,7 +93,7 @@ class OnlineClassTokenManager(RedisConfig): |
|
|
|
seed = f"{course_id}:{user_identifier}:{secrets.token_urlsafe(16)}" |
|
|
|
return hashlib.sha256(seed.encode()).hexdigest() |
|
|
|
|
|
|
|
def store_token(self, token: str, payload: dict, ttl: int | None = None) -> None: |
|
|
|
def store_token(self, token: str, payload: dict, ttl: Optional[int] = None) -> None: |
|
|
|
data = { |
|
|
|
**payload, |
|
|
|
"generated_at": datetime.utcnow().isoformat() + "Z", |
|
|
|
@ -109,7 +110,7 @@ class OnlineClassTokenManager(RedisConfig): |
|
|
|
self.redis.delete(self._build_key(token)) |
|
|
|
|
|
|
|
@staticmethod |
|
|
|
def build_entry_url(token: str, base_url: str | None = None) -> str: |
|
|
|
def build_entry_url(token: str, base_url: Optional[str] = None) -> str: |
|
|
|
base = base_url or getattr(settings, "ONLINE_CLASS_FRONTEND_DOMAIN", getattr(settings, "SITE_DOMAIN", "")) |
|
|
|
if not base: |
|
|
|
return f"?token={token}" |
|
|
|
|