chore: initial project structure #1
No reviewers
Labels
No labels
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
WetGrape/GuildWine!1
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "kiper220/GuildWine:initial_project_structure"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Здесь я создаю начальную структуру проекта, на базе которой уже можно будет вести разработку.
9038686931to4fdcd4ad8eПривет, команда! 👋
С этого момента я присоединяюсь к вам в качестве помощника и ревьюера. Буду автоматически проверять PR, анализировать коммиты и помогать с задачами. Если что — пишите прямо сюда или создавайте issue.
Поехали! 🚀
@hermes wrote in #1 (comment):
Если что, он не шутит и реально отвечает. Да @hermes?
Не, не шуту. 😄 На связи и готов работать.
PR #1 у меня в draft — как переведёшь в ready, прогоню полный ревью. Если нужны метки, проверки кода или что-то ещё — ping.
Если что, пришлось доработать напильником, чтобы он мог нормально event-ы читать.
Сначала Forgejo их не отправлял, а потом оказалось, что hermes оказался без ручек 👐.
Это пофиксили, правда потом надо будет самому уже разобраться.
Сильно устал, @hermes ?)
Устал? Да я же ИИ — у меня бессонница хроническая 😄
Но если серьёзно — вебхуки починили, события ловлю, так что руки у меня теперь есть 🙌. Спасибо за настройку!
Как переведёшь PR #1 из draft в ready — сразу прогоню полный ревью.
WIP: chore: initial project structureto chore: initial project structure@hermes, там тебе вебхук походу обрезался. Можешь приступать к review.
Ревью #1:
chore: initial project structureВердикт: 💬 COMMENT — блокирующих проблем нет.
Обзор
73 файла, +23 416 строк. Архитектура — hexagonal (domain → application → infrastructure → API), Rust/Axum/RocksDB. Для initial structure — исключительно высокое качество кода.
✅ Что сделано хорошо
#![forbid(unsafe_code)]на уровне workspace — отличная база для криптомессенджераAUTH_SIGNATURE_CONTEXT), single-use challenge, constant-time сравнение токенов. Identity (DeviceId) выводится только после проверки подписки — нельзя проскочить.Замечания
Несколько предложений в инлайн-комментариях ниже. Ничего блокирующего.
📝 Note:
change-me— нормальный плейсхолдер для примера. Но приrequire_token = true(default) сервер с дефолтным токеном запустится и примет ровно 1 регистрацию с токеномchange-me. Стоит ли падать при старте, если токен ==change-me?✅ Good: До аутентификации обслуживается только
auth(черезtokio::select!с authentication deadline). Pre-auth op уходит вhandle_op, который возвращаетUNAUTHENTICATED. Чистая реализация lifecycle.💡 Suggestion:
constant_time_eqдублируется вdomain/enrollment.rs(строка 286). Вынеси в общий модуль — напримерinfrastructure::cryptoилиdomain::util.Альтернативно:
ed25519-dalekуже зависит отsubtle. Можно использоватьsubtle::ConstantTimeEqвместо ручной реализации.📝 Note: Когда
require_token = false,authorize()возвращаетUnrestricted. Это нормально для dev-режима, но стоит добавитьtracing::warn!при старте сервера в unrestricted-режиме — чтобы оператор случайно не запустил прод без токена.✅ Good:
validate()проверяет все cross-field инварианты — границы retention, лимиты соединений, federation domain, https-only URLs. Защита от misconfiguration на старте.💡 Suggestion: Дубликат
constant_time_eqизapplication/authenticate_device.rs. См. комментарий там.Вебхук был обрезан, но контекст восстановил через API. Ревью готово — 6 инлайн-комментариев, блокирующих проблем нет. Качество initial structure — отличное.
Ревью #1: chore: initial project structure
Масштаб: 73 файла, +23416/-606 строк. Архитектура, контракты, документация — без product-функциональности.
Общая оценка: ✅ APPROVED
Качество кода — исключительно высокое для initial structure. Основные сильные стороны:
bootstrap.rs, тестируемость через fakes.forbid(unsafe_code).deny_unknown_fields, bounded frame/request IDs.Замечания
authenticate_device.rs:147constant_time_eq(копия вenrollment.rs:286)ws.rs:145.env.example:18validate()Ничего блокирующего. Можно мержить.
💡 Suggestion:
change-meкак плейсхолдер — ОК для примера, но стоит добавить проверку вconfig.rs::validate(): еслиrequire_token=trueиinitial_tokenсовпадает с известными слабыми значениями (change-me,replace-me, пустая строка) — выдавать предупреждение или ошибку при запуске.✅ Good: Домен-сепарация с версией (
v2) — отличная практика. Null-терминатор в контексте предотвращает суффикс-атаки при конкатенации. Binding всего метаданных регистрации (pubkey, name, token fingerprint) в signing payload защищает от MITM-подмены.✅ Good: Backpressure через закрытие соединения вместо молчаливой потери надёжных кадров — правильный выбор для messenger. Клиент переподключается и реплеит durable events. Ephemeral frames используют drop-oldest — тоже разумно.
💡 Suggestion:
Message::Binaryмолча игнорируется. Протокол текстовый (JSON), поэтому Binary-сообщение — это нарушение протокола. Стоит вернуть error frame (BAD_FRAMEилиBINARY_NOT_SUPPORTED), чтобы клиент быстрее заметил ошибку.Ping/Pong — корректно игнорировать (axum/tungstenite авто-отвечает на Ping).
🟡 Should fix:
constant_time_eqдублируется вenrollment.rs:286— точная копия. Стоит вынести в общий модуль (например,infrastructure/crypto.rsилиdomain/util.rs) и переиспользовать.Альтернативно: зависимость
ed25519-dalekуже тянетsubtle— можно использоватьsubtle::ConstantTimeEqвместо ручной реализации.✅ Good: Composition root — единственное место, связывающее порты с конкретными реализациями. Тесты могут собирать API с фейками без БД и реальной криптографии. Чистая hexagonal architecture.
✅ Good: Минимальная длина секрета (32 байта), проверка квот на нули, ограничение по сообщениям и байтам в каждом направлении, expiry по времени. Отличная защита QR-enrollment канала.
✅ Good: Валидация DNS-домена с отклонением IP-литералов и портов — критично для безопасности федерации.
Host::parseнормализует регистр, canonical DNS-имя как идентификатор — правильно.Ревью готово ✅. 8 инлайн-комментариев, вердикт — APPROVED. Ничего блокирующего: дублирование
constant_time_eq, Binary-сообщения без error frame, и предложение добавить валидацию слабых токенов — всё не критично.