Files
vidconf/backend/services/conference_ids.py

38 lines
2.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Генерация номера и постоянной ссылки конференции (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)