Первоначальная версия VidConf
This commit is contained in:
37
backend/services/conference_ids.py
Normal file
37
backend/services/conference_ids.py
Normal file
@@ -0,0 +1,37 @@
|
||||
"""Генерация номера и постоянной ссылки конференции (ADR-001, п.4).
|
||||
|
||||
Оба идентификатора неизменны всё время жизни конференции и не переиспользуются;
|
||||
уникальность в БД обеспечивают constraint'ы `conferences.number`/`conferences.slug`,
|
||||
коллизии (крайне маловероятные при выбранной энтропии) обрабатываются повторной
|
||||
генерацией на уровне репозитория/сервиса, создающего конференцию.
|
||||
"""
|
||||
|
||||
import secrets
|
||||
|
||||
# Длина номера конференции в десятичных цифрах.
|
||||
NUMBER_LENGTH = 9
|
||||
|
||||
# Длина slug в байтах энтропии (до base64url-кодирования); 8 байт = 64 бита,
|
||||
# что даёт 11 символов base64url без padding.
|
||||
SLUG_ENTROPY_BYTES = 8
|
||||
|
||||
|
||||
def generate_number() -> str:
|
||||
"""Сгенерировать 9-значный номер конференции.
|
||||
|
||||
Первая цифра — 1..9 (число не начинается с нуля), остальные 8 — 0..9.
|
||||
Используется `secrets.randbelow` — криптографически стойкий генератор,
|
||||
подбор номера должен быть неугадываем (оценка энтропии — ADR-001, п.4).
|
||||
"""
|
||||
first_digit = str(secrets.randbelow(9) + 1)
|
||||
rest_digits = "".join(str(secrets.randbelow(10)) for _ in range(NUMBER_LENGTH - 1))
|
||||
return first_digit + rest_digits
|
||||
|
||||
|
||||
def generate_slug() -> str:
|
||||
"""Сгенерировать slug постоянной ссылки конференции (`/j/{slug}`).
|
||||
|
||||
`secrets.token_urlsafe(8)` — 8 байт (64 бита) энтропии, 11 символов
|
||||
base64url; также используется как имя LiveKit-комнаты.
|
||||
"""
|
||||
return secrets.token_urlsafe(SLUG_ENTROPY_BYTES)
|
||||
Reference in New Issue
Block a user