321f81bffe
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>
81 lines
6.4 KiB
Markdown
81 lines
6.4 KiB
Markdown
# 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`.
|