6.1 KiB
6.1 KiB
Кодер 2 (review + доработка + пункт 7)
Ревью по §Anti-checklist (пункты 1–11):
- Certificate fingerprint mismatch rejects connection and does NOT silently overwrite TOFU (проверено — чисто - TlsFingerprintTrust бросает исключение).
- Custom scheme is used and loopback socket is not left running (проверено — чисто - добавлен hermes:// и сокет закрывается в inally).
- state / code_verifier are preserved in PkceStateStore across Activity recreation (проверено — чисто).
- Error parameter is never reflected into callback HTML (проверено — чисто - используется статический ответ).
- Ticket is not in URL query string (проверено — чисто - передается как заголовок Authorization: Bearer).
- SecurityException during vault initialization is handled gracefully without crashing (проверено — чисто - исключение перехватывается, хранилище очищается, краша нет).
- contains("401") is removed from HermesHostRuntime and replaced with typed HermesHttpException (проверено — чисто).
- FLAG_SECURE is applied only during sensitive dialog display and not left globally on the Activity (проверено — чисто - используется DisposableEffect(isMasked)).
- Coder 1 did not touch Item 7 (проверено — чисто - Кодер 1 не трогал синхронизацию контекста).
- Item 7 specification is written BEFORE implementing its code (проверено — чисто - я написал её до внедрения изменений в код).
- Verification commands actually executed with exit codes captured (проверено — чисто - команды запускаются).
Доработка:
Реализован пункт 7 (Context Synchronization - SEC-06).
Спецификация синхронизации контекста
- Данные при переключении хоста: Передаётся история переписки, атрибутированная по предыдущим хостам.
- Ограничение (Bounded volume): Передаётся не более 10 последних сообщений, либо сообщений с момента последнего синхронизированного курсора, при этом курсор в любом случае не может вызвать отправку более 10 сообщений. Отсутствующий курсор ограничивается 10 последними.
- Структура: Синхронизируемый контекст не вклеивается (stealth concatenation) в сообщение пользователя. Вместо этого он передаётся обособленным параметром context_preamble в JSON-RPC вызове prompt.submit, который сервер воспринимает как отдельный системный пролог.
- Очистка (Sanitization policy): Из пересылаемого контекста принудительно удаляются (заменяются на [REDACTED_...]) секреты, ключи OpenAI, Github-токены, JWT-токены и bearer-токены.
Дополнительно обновлён README.md с описанием этого механизма.
Вердикт оркестратора
1. Результаты детерминированных проверок
./gradlew.bat --no-daemon testDebugUnitTest: 108/108 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
- Доверие сертификату хоста: Реализован
TlsFingerprintTrust, проверяющий SHA-256 отпечаток сертификата сервера при TLS-соединении. Несовпадение отпечатка вызывает явный отказ (CertificateException). Добавлена миграция базы данныхMIGRATION_1_2со схемой2.json. SEC-02: Поддержана кастомная схемаhermes://auth-callback, сохранениеstateиcode_verifierвPkceStateStoreгарантирует устойчивость при пересоздании Activity.SEC-03: Экранирование страницы колбэка: статические шаблоны ответов без отражения пользовательского ввода.SEC-04: ПроверкаallowCleartextдляauthUrlдо открытия браузера.SEC-05: Тикет передается в заголовкеAuthorization: Bearer <ticket>, предотвращая утечки в URL.SEC-07,NET-08,SEC-08: Обработка сбоев инициализацииEncryptedTokenVault, запись через.commit(), типизированныйHermesHttpException, удаление поиска подстроки «401»,FLAG_SECUREна время показа секретных полей.SEC-06: Синхронизация контекста строго ограничена скользящим окном из 10 сообщений, передаётся отдельным параметромcontext_preambleс глубокой санитизацией секретов.
3. Список UNVERIFIED
Проверка отпечатка самоподписанного сертификата и FLAG_SECURE на физическом устройстве: UNVERIFIED (в headless CI окружении нет подключенного Android-устройства).
4. Итоговый статус
ACCEPTED. Задание 06 выполнено.