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

F7cloud Mobile (native)

Нативное Android-приложение F7cloud на Kotlin + Jetpack Compose.

Лицензия

Приложение распространяется под GPL-3.0-or-later (см. LICENSE). Причина: в сборку линкуется код, производный от Nextcloud Talk for Android (GPL-3.0-or-later, каталог vendor/talk-android/), поэтому объединённая работа — тоже под GPL. Исходный код каждой распространяемой сборки предоставляется по тегу релиза в Gitea (обязательство corresponding source, GPLv3 §6). Сторонние компоненты и их лицензии — NOTICE.md.

Параметр Значение
applicationId ru.forbion.f7cloud.mobile
minSdk 26
compileSdk / targetSdk 36
Gradle 9.3.0
AGP 8.13.2
Kotlin 2.3.0
Модули app, core (auth, network, designsystem, push), feature (widgets, files, talk, mail, …)

Сборка APK

С v0.5.27 используется собственный Gradle wrapper в этом каталоге (Gradle 9.3, AGP 8.13, Kotlin 2.3):

cd /var/www/f7cloud/f7cloud-mobile
./gradlew assembleDebug
chown www-data:www-data app/build/outputs/apk/debug/*.apk

Старый способ через android-webview (Gradle 8.7) больше не поддерживается — там AGP 8.2, несовместим с Kotlin 2.3.

Release:

./gradlew assembleRelease

APK с версией в имени:

app/build/outputs/apk/debug/f7cloud-mobile-v{versionName}-{versionCode}-debug.apk

Структура навигации

Мобильный UI повторяет мобильную версию сайта (тема forbion):

  • нижняя панель: Talk, Профиль, Уведомления, Создать, Меню;
  • меню приложений — bottom sheet со списком модулей;
  • стартовый экран после входа — Главная (виджеты / Dashboard).

Модуль «Файлы»

  • Список папок и файлов через WebDAV PROPFIND (oc:fileid для идентификации).
  • Навигация по папкам, кнопка «Назад».

Word / Excel / PowerPoint (Richdocuments)

Office-документы открываются в Collabora Online через Richdocuments:

  1. По fileId (WebDAV или ссылка /f/{id} с виджетов) → Direct Editing API: POST /ocs/v2.php/apps/richdocuments/api/v1/document.
  2. Полноэкранный WebView (OfficeEditorActivity) с:
    • RichDocumentsMobileInterface (см. apps/richdocuments/docs/mobile_flow.md на сервере) — скрывает оболочку F7cloud;
    • desktop User-Agent — полная панель инструментов Collabora;
    • поддержка iframe Collabora (coll.f7cloud.ru).

Где работает: модуль Файлы и виджет Рекомендации на Главной (клик по .docx / .xlsx).

Поддерживаемые расширения: см. OfficeFiles.kt.

Требования на сервере: richdocuments + Collabora (у вас: https://coll.f7cloud.ru).

Модуль «Главная» (Widgets)

Данные с Dashboard API F7cloud:

Endpoint Назначение
/ocs/v2.php/apps/dashboard/api/v1/widgets метаданные виджетов
/ocs/v2.php/apps/dashboard/api/v3/layout порядок виджетов пользователя
/ocs/v2.php/apps/dashboard/api/v2/widget-items элементы (Talk, Mail, Calendar)
/ocs/v2.php/apps/dashboard/api/v1/widget-items?widgets[]=recommendations блок «Рекомендации»

Запросы выполняются параллельно (WidgetsRepository, с v0.5.4).

Производительность

Клиент (приложение)

Версия Изменение
≤ 0.5.3 4 последовательных запроса → до ~30 с
≥ 0.5.4 параллельные запросы, layout с таймаутом 2 с, v1 только для recommendations → ~24 с

Сервер

Перед релизом или при жалобах на медленную «Главную» проверьте сервер:

docs/SERVER-PERFORMANCE.md

Кратко для forbion.f7cloud.ru (2026-05-30):

  • OPcache включён (FPM: 256 MB, 100k файлов)
  • Redis + APCu для кеша F7cloud
  • PHP-FPM: min 18 spare workers, старт 30

Первый API-запрос после простоя сервера может занимать 15–20 с — это холодный bootstrap PHP/F7cloud, не ошибка приложения.

Авторизация

  • Используется тот же пароль, что и для веб-входа (или пароль приложения при 2FA).
  • OCS /ocs/v2.php/cloud/user — проверка и получение davUserId для WebDAV.

Связанные проекты

S
Description
No description provided
Readme GPL-3.0 10 MiB
Languages
Kotlin 99.4%
JavaScript 0.5%