Skip to content
BLXCKBXXSTPublic

About

TUI/CLI для настройки FindMyDevice на Android через ADB с верификацией подписи F-Droid

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

10 Commits

Folders and files

Repository files navigation

███████ ███    ███ ██████      ███████ ███████ ████████ ██    ██ ██████
██      ████  ████ ██   ██     ██      ██         ██    ██    ██ ██   ██
█████   ██ ████ ██ ██   ██     ███████ █████      ██    ██    ██ ██████
██      ██  ██  ██ ██   ██          ██ ██         ██    ██    ██ ██
██      ██      ██ ██████      ███████ ███████    ██     ██████  ██

Одна команда — Android готов к FindMyDevice. С верификацией подписи F-Droid.

CI License: Unlicense Go 1.26+ Platform Verified downloads


Кроссплатформенная (Linux + Windows 10/11) утилита для настройки Android-приложения FindMyDevice (de.nulide.findmydevice): выдача всех runtime/special permissions через ADB, установка APK с F-Droid с проверкой подписи репозитория и SHA-256 каждого скачанного файла, опциональная установка Sunup как UnifiedPush-distributor.


📜 Содержание


🚀 Quickstart

make build-linux                   # → dist/fmd-setup-linux-amd64
./dist/fmd-setup-linux-amd64       # запустится интерактивный TUI
  1. На телефоне включи Параметры разработчика → Отладка по USB.
  2. Подключи телефон по USB, нажми Allow на RSA-диалоге.
  3. В TUI выбери [1] GRANT → [2] INSTALL → [3] CHECK (или headless — см. ниже).

✨ Что умеет

  • 🔌 Автодетект ADB. Если adb не найден в PATH, утилита предложит: скачать portable platform-tools с dl.google.com, показать команду для системной установки, либо указать путь вручную.
  • 📱 Установка APK с F-Droid для трёх пакетов: FMD, Sunup (UnifiedPush distributor), F-Droid client.
  • 🔐 Выдача всех permissions через pm grant: location, SMS, телефон, камера/микро, Bluetooth, уведомления, плюс optional WRITE_SECURE_SETTINGS.
  • ⚙️ «Special» permissions, которые не поддаются pm grant: battery whitelist, overlay, notification listener.
  • ✅ CHECK-таблица по dumpsys package — какое разрешение granted/denied/unsupported.
  • 🧹 Полное удаление FMD/Sunup/F-Droid + сброс special-настроек одной командой.
  • 🛰️ Live device watcher в TUI: показывает статус устройства в реальном времени (с active ping для обхода кеша adb-сервера).
  • 💀 DedSec-style UI: ANSI-цвета, глитч-эффекты, alt-screen Bubble Tea.

💻 Headless mode

Для скриптов и автоматизации — без TUI:

fmd-setup --action <name> [--device SERIAL] [--adb PATH] [--yes] [--no-color]
--action Что делает
grant-all Выдаёт все runtime/optional permissions + special-настройки
revoke-all Снимает всё (destructive, требует --yes)
check Печатает таблицу granted/denied для всех permissions
dump Сырой обрезанный dumpsys package <fmd>
install-fmd Скачивает (с верификацией) и ставит FMD APK
install-sunup То же для Sunup
install-fdroid То же для F-Droid client
uninstall-all Сносит FMD/Sunup/F-Droid + сбрасывает special (destructive, требует --yes)

Exit-коды:

Код Смысл
0 Успех
1 Action отработал, но были failures (например, denied permission)
2 Init-ошибка: не найден adb, нет устройства, и т.п.
64 Неверное использование (unknown action, отсутствует --yes для destructive)

Пример:

# залить FMD на конкретное устройство и сразу выдать permissions
fmd-setup --action install-fmd --device R5CT123ABCD
fmd-setup --action grant-all   --device R5CT123ABCD
fmd-setup --action check       --device R5CT123ABCD

🔒 Верификация APK

Каждое скачивание APK с F-Droid проходит трёхступенчатую проверку:

  1. 📥 entry.jar (~5 КБ) с https://f-droid.org/repo/entry.jar — его JAR-подпись (scheme v1, PKCS#7) сверяется с захардкоженным SHA-256 fingerprint сертификата репозитория F-Droid (internal/fdroid/pin.go): 43238d51…9ccab.
  2. 📦 index-v2.json скачивается и хешируется. Если SHA-256 ≠ значению из entry.json → ошибка, файл не используется. Кэш в <ConfigDir>/cache/index-v2.json инвалидируется только по SHA-256 (не по TTL), что исключает stale data race.
  3. 📲 APK скачивается, его SHA-256 сверяется с записью в проверенном индексе. Несовпадение → файл удаляется, exit code 1.

Модель угроз — та же, что у официального F-Droid Client: компрометация CDN / mirror без компрометации ключа репозитория не подсунет подменённый APK.

Если F-Droid публично анонсирует ротацию ключа репо — обнови FDroidRepoFingerprint через PR.


🔑 Permissions, которые выдаются

Runtime (через pm grant --user 0):

Permission Зачем нужно
ACCESS_COARSE_LOCATION Find-my-device по сетям
ACCESS_FINE_LOCATION Find-my-device по GPS
ACCESS_BACKGROUND_LOCATION Локация когда приложение в фоне
READ_PHONE_STATE Команды связанные с телефонией
SEND_SMS / READ_SMS / RECEIVE_SMS Команды через SMS и ответы
POST_NOTIFICATIONS Уведомления (Android 13+; на <13 — skip)
CAMERA / RECORD_AUDIO Удалённое фото / запись звука
BLUETOOTH_CONNECT Bluetooth-команды (Android 12+)

Optional:

Permission Зачем
WRITE_SECURE_SETTINGS Авто включение/выключение GPS

Special (не поддаются pm grant):

Шаг Через что
Battery whitelist (FMD + Sunup) dumpsys deviceidle whitelist +<pkg>
Overlay (display over other apps) appops set ... SYSTEM_ALERT_WINDOW allow
Notification listener cmd notification allow_listener ...

Источник — AndroidManifest.xml FMD master + документация приложения.


🛠️ Сборка

Нужен Go 1.26+.

make build-all       # обе ОС в dist/
make build-linux     # только linux/amd64
make build-windows   # только windows/amd64
make run             # запуск из исходников
make check           # fmt + lint + test (race + cover)
make test            # только тесты
make lint            # только golangci-lint
make version         # печатает версию из git describe

Версия запекается через -ldflags -X main.version=$(git describe --tags --always --dirty). Бинарь делает --version:

$ ./dist/fmd-setup-linux-amd64 --version
fmd-setup v0.1.0-3-g962a2a6

📂 Где живёт конфиг

OS Путь
Linux ~/.config/fmd-setup/ (или $XDG_CONFIG_HOME/fmd-setup/)
Windows %APPDATA%\fmd-setup\

Внутри:

  • config.json — путь к выбранному adb-бинарю.
  • platform-tools/ — portable adb (если выбран этот путь).
  • cache/ — index-v2.json + скачанные APK.

🏗️ Архитектура

fmd-setup/
├── main.go                    точка входа: TUI или headless по --action
└── internal/
    ├── actions/               бизнес-логика команд (Grant, Install, Check, ...)
    ├── adb/                   обёртка над adb с context-таймаутами
    ├── cli/                   парсер флагов + stdoutSink для headless
    ├── fdroid/                F-Droid index-v2 client + JAR signature verify
    ├── fmd/                   константы FMD: permissions, SpecialSteps, packages
    ├── httputil/              shared Download с progress
    ├── platform/              ConfigDir / PortableToolsDir / InstallHint (per-OS)
    ├── tui/                   Bubble Tea модель / view / commands
    └── ui/                    ANSI колоры, banner, glitch-эффекты, Log helpers

actions/ — единственный источник правды для всех команд: и TUI, и headless CLI вызывают одни и те же функции через actions.LogSink интерфейс.


📜 License

Unlicense — public domain. Делай что хочешь.

— зарелижено в дом → найди телефон в кустах

About

TUI/CLI для настройки FindMyDevice на Android через ADB с верификацией подписи F-Droid

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages