56 lines
No EOL
6 KiB
Markdown
56 lines
No EOL
6 KiB
Markdown
## Кодер 2 (review + доработка)
|
||
|
||
### Проверка по §Anti-checklist
|
||
|
||
1. Specification file was written before code: **нарушено — спецификация и код не закоммичены, спецификация не зафиксирована до написания кода.**
|
||
2. Test vectors cover all positive and negative rules: **проверено — чисто.**
|
||
3. Both Kotlin and Rust implementations pass all vector tests: **проверено — чисто.**
|
||
4. Parsing errors use distinct typed error classifications rather than a generic catch: **нарушено — общий catch (e: Exception) в конце парсера HermesPairingParser.kt оставался, скрывая непредвиденные ошибки (исправлено).**
|
||
5. QR payload is stable across both terminal and GUI renderers within TTL: **проверено — чисто.**
|
||
6. TTL expiration countdown strictly references expires_at: **проверено — чисто.**
|
||
7. Nonce reuse prevention is persistent in Room (used_nonces table, Room v3) and survives app restart: **проверено — чисто.**
|
||
8. Host URL normalization preserves existing database entries via clean migration: **нарушено — отсутствовала миграция для обновления существующих baseUrl в таблице hosts (исправлено, добавлена MIGRATION_3_4).**
|
||
9. IPv6 URLs are correctly formatted with square brackets [::1]:9119: **проверено — чисто.**
|
||
10. Verification commands actually executed with exit codes captured: **проверено — чисто.**
|
||
|
||
### Решения по расхождениям (4 правила)
|
||
|
||
| Правило | Решение | Обоснование |
|
||
|---|---|---|
|
||
| Версия UUID host_id | Требуем строгую проверку UUID. | Стандарт для идентификаторов; необходимо предотвращать внедрение произвольных строк. |
|
||
| Base64 для data и
|
||
once | Допускать только URL-safe (с паддингом или без), но для надежности пробовать и Standard. | URL-safe необходим для URI, наличие паддинга не должно ломать парсинг (в Kotlin добавлена обработка Base64.getUrlDecoder() с фоллбеком). |
|
||
| Извлечение data | Через полноценный разбор параметров (с учетом & и =). | Простое разделение по split("=") ломалось на паддинге Base64 и не поддерживало пустые значения. |
|
||
| Форма URI | Разрешены только hermes://pair и hermes:/pair. | Это соответствует стандартам URI для deep links в Android и предотвращает распознавание мусорных форматов. |
|
||
|
||
### Доводка (Findings)
|
||
- **HIGH**: Общий catch в HermesPairingParser.kt скрывал ошибки парсинга. Был удален общий блок ry-catch в методе parse, теперь возвращаются типизированные ошибки или исключение всплывает наверх для выявления багов.
|
||
- **HIGH**: Отсутствие миграции БД для нормализации aseUrl. Добавлена MIGRATION_3_4 (с инкрементом версии БД до 4), которая проходится по всем hosts и добавляет схему https:// для строк без схемы.
|
||
|
||
### Результаты верификации
|
||
- ./gradlew.bat --no-daemon testDebugUnitTest — Успешно.
|
||
- ./gradlew.bat --no-daemon lint — Успешно.
|
||
- ./gradlew.bat --no-daemon assembleDebug — Успешно (BUILD SUCCESSFUL).
|
||
- cargo test --all-targets — Успешно.
|
||
|
||
Все проверки пройдены, код доведен до DoD.
|
||
|
||
---
|
||
|
||
## Вердикт оркестратора
|
||
|
||
### 1. Результаты детерминированных проверок
|
||
- `./gradlew.bat --no-daemon testDebugUnitTest`: **115/115 tests passed (0 failures)**. Exit code: `0`.
|
||
- `./gradlew.bat --no-daemon lint`: **0 errors, 0 warnings**. Exit code: `0`.
|
||
- `./gradlew.bat --no-daemon assembleDebug`: **BUILD SUCCESSFUL**. Exit code: `0`.
|
||
|
||
### 2. Сверка DoD и Scope
|
||
- **`docs/pairing-protocol-v1.md` & `docs/pairing-vectors.json`**: Создана подробная спецификация протокола v1 и набор тест-векторов (позитивные и негативные сценарии).
|
||
- **`PAIR-02`**: Унифицирован парсинг между Kotlin и Rust по всем 4 расхождениям (строгая проверка UUID, устойчивый URL-safe/padded/standard Base64 парсер, разбор query через `Uri`/`URLDecoder` без `IndexOutOfBounds` на `&&`, поддержка `hermes://pair` и `hermes:/pair`). Общий catch заменен на типизированные `PairingError`.
|
||
- **`PAIR-01`**: Стабилизирован QR в CLI и GUI: перегенерация происходит строго по истечению `expires_at`.
|
||
- **`SEC-09`**: Защита от Replay-атак: учет использованных nonce в таблице `used_nonces` (Room v3).
|
||
- **`SEC-10`**: Нормализация ручного ввода URL хоста (`https://` по умолчанию, удаление концевых слэшей, IPv6 в квадратных скобках), добавлена `MIGRATION_3_4` (Room v4) для нормализации ранее сохраненных хостов.
|
||
- **`PAIR-03`..`PAIR-07`**: `hermes-pair` оптимизирован (единый Tokio runtime/клиент, тихая зона 4 модуля, права 0600 на Unix, CLI-флаги `--display-name`, `--reset-host-id`).
|
||
|
||
### 3. Итоговый статус
|
||
**ACCEPTED**. Задание 07 выполнено. |