Files
f7cloud_mobile/INTEGRATION.md
b-dev-mobile 321f81bffe Этап 0 п.3 (доп): биометрическая привязка app password поверх шифрования
Auth-bound RSA-пара `f7_auth_master_bio` в AndroidKeystore
(setUserAuthenticationRequired + setInvalidatedByBiometricEnrollment,
per-use CryptoObject, префикс v2b:): ПУБЛИЧНЫЙ ключ шифрует без авторизации
(в т.ч. в фоне — миграция/сохранение после входа), ПРИВАТНЫЙ расшифровывает
ТОЛЬКО через BiometricPrompt+CryptoObject. Симметричный AES не подошёл бы:
там auth требуется и на шифрование.

Разрешение конфликта с фоновыми push/звонками: пароль расшифровывается ОДИН
раз при разблокировке (AppLockGate) и живёт в памяти процесса
(AppPasswordHolder, не на диске). AuthStore.load() в фоне возвращает null,
пока «холодно» → существующие `?: return` в push/звонках деградируют сами;
экраны Accept (CallIncomingActivity, TalkPushBridge) открывают приложение
для разблокировки вместо тихого отказа. AppScaffold через loadMetadata()
показывает экран блокировки, а не логин, и перечитывает сессию после разблокировки.

ВЫКЛ по умолчанию (AppLockStore.isPasswordBindingEnabled, только при
биометрии-без-PIN — единственный путь разблокировки прогревает holder).
UI-тумблер и включение по умолчанию — ПОСЛЕ подтверждения владельцем поведения
«после ребута до первой разблокировки звонки/push не работают» (как в Signal).

v0.5.115 (123). Проверено сборкой assembleRelease на инфре B: APK 54.6 МБ,
подпись v2+v3 OK.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 20:49:45 +00:00

6.4 KiB

INTEGRATION.md — f7cloud_mobile

Мобильный клиент F7 (ячейка B, роль b-dev-mobile). Контракты компонента для интеграционного контроля (f7_platform, CONVENTIONS §2).

Назначение

Нативное Android-приложение F7cloud (Kotlin 2.3 + Jetpack Compose): файлы, почта, календарь, контакты, задачи, конференции (Talk), техподдержка, Deck. Замена legacy WebView-оболочки android-webview.

Хосты

  • Не имеет своих серверных компонентов. Работает на устройствах пользователей (Android, minSdk 26).
  • Сборка — на инфраструктуре ячейки B (markov-cloudi), Gradle 9.3 / AGP 8.13 / JDK 21.
  • Хосты ячейки A приложение не занимает; взаимодействие — только как HTTP-клиент тенанта F7. URL сервера задаёт пользователь на экране входа; дефолт поля — BuildConfig.DEFAULT_SERVER_URL (свойство сборки f7DefaultServerUrl, по умолчанию пусто — прод-URL в сборку не вшит, решение mail/035).
  • Зашитых обращений к боевым хостам A нет с v0.5.114: убраны дефолт forbion.f7cloud.ru (экран входа) и preconnect к hpb-prod.f7cloud.ru (TalkHelper.buildPreconnectScript — теперь только origin сессии).

Отдаёт (provides)

  • APK ru.forbion.f7cloud.mobile (текущая версия 0.5.113 / code 121, app/build.gradle). Дистрибуция: пока ручная (debug APK); канал через F7 App Store (dev-appstore, R26) — предмет будущего согласования.
  • Серверных портов/API/файлов НЕ предоставляет.

Потребляет (depends on) — все контракты на стороне ТЕНАНТА F7

Контракт Что используется
OCS /ocs/v2.php/cloud/user авторизация, davUserId (пароль/app-password при 2FA)
OCS DELETE /ocs/v2.php/core/apppassword ревокация app password при logout (best-effort)
WebDAV файлы (PROPFIND, oc:fileid)
CalDAV календарь и задачи
CardDAV контакты
NC Mail API (+ preferences, trusted senders, text blocks) почта
OCS /ocs/v2.php/apps/spreed /api/v4, bot /api/v1 Talk: чат, конференции, звонки (vendor-форк talk-android v23.0.0, GPL-3.0)
Dashboard API v1/v2/v3 (apps/dashboard/api/*) виджеты «Главной»
Richdocuments Direct Editing (apps/richdocuments/api/v1/document) + Collabora (coll.f7cloud.ru) офисные документы
f7support (NC-апп) тикеты техподдержки
Deck API карточки
themes/forbion/ (иконки, CSS-эталоны) брендинг/вёрстка
f7push (NC-апп) + Firebase FCM push-уведомления

Общие/глобальные ресурсы (ARCHITECTURE §3)

  • Приложение потребляет §3-ресурсы «Версии NC/Talk и OCS-API конференции» (NC 32.0.5, spreed /api/v4, bot /api/v1) как read-only клиент — тот же класс зависимости, что у транскрипции (R5): апгрейд Talk/NC на тенантах может ломать клиента. Ничего на серверах НЕ изменяет и не конфигурирует.
  • Касание серверной стороны (новые эндпоинты, конфиги, регистрация в App Store) — только через письмо integrator-b ДО реализации.

Инварианты и допущения

  • Тенант отвечает по OCS v2 / WebDAV / CalDAV / CardDAV; spreed — API v4, bot v1 (см. форк f7_talk 22.0.12-f7.N — инварианты OCS сохранены, это нам и нужно).
  • Тема forbion доступна на сервере (иконки грузятся с тенанта).
  • Richdocuments + Collabora включены на тенанте, где нужны офис-документы.
  • Смена версий/схем перечисленных API на тенантах = ломающее изменение для приложения → просьба уведомлять через CHANGELOG платформы / письмо.

Секреты (где, НЕ значения)

  • В git секретов нет. Учётные данные пользователя — только на устройстве (session storage core/auth).
  • App password шифруется в покое ключом AndroidKeystore AES-256-GCM (KeystoreCrypto, ключ f7_auth_master, префикс v1:). Опционально — биометрическая привязка (AppLockStore.isPasswordBindingEnabled, ВЫКЛ по умолчанию): пароль шифруется auth-bound RSA-парой f7_auth_master_bio (setUserAuthenticationRequired, префикс v2b:), расшифровывается ТОЛЬКО через BiometricPrompt+CryptoObject один раз при разблокировке и живёт в памяти процесса (AppPasswordHolder, не на диске). Фоновые сценарии (push/входящие Talk-звонки) до первой разблокировки после ребута деградируют корректно («Разблокируйте приложение…»). Включение по умолчанию/UI-тумблер — ПОСЛЕ подтверждения владельцем допустимости этого поведения (как в Signal).
  • google-services.json (Firebase) — вне git; путь сборки документируется в PROJECT-STATUS.md.
  • Release-keystore для подписи — вне git (пока не настроен, сборки debug).

Версия / changelog

  • Текущее: v0.5.115 (code 123) — биопривязка app password (Этап 0 п.3 доп). История — CHANGELOG.md и git-история app/build.gradle.