Первоначальная версия VidConf

This commit is contained in:
2026-07-23 01:04:01 +03:00
commit 896455381a
335 changed files with 61527 additions and 0 deletions

View 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)