Files
DataControl/README.md
T

8.8 KiB

DataControl

🚀 v0.3.0 · 🤖 Android · 🟣 Kotlin · 🎨 Jetpack Compose · 🔒 WireGuard · 🛡️ mode propriétaire · 👨‍👩‍👧 contrôle parental · 🧪 tests · 📄 licence non déclarée

DataControl est l'application Android du téléphone de l'enfant. Elle relie le téléphone en permanence, par un tunnel WireGuard, au serveur de contrôle parental familyd du parent : tout le trafic (Wi-Fi comme données mobiles) passe par ce serveur, qui décide de ce qui passe. Sur le téléphone, elle bloque les applications interdites, compte le temps d'écran et suit la consommation de données mobiles.

JT-Tools by Johnny — version courante et historique : voir CHANGELOG.md (aussi lisible dans l'onglet À propos de l'application). Plan de la refonte WireGuard : docs/PLAN-wireguard.md.


Fonctionnalités

  • Tunnel WireGuard permanent — Une fois le téléphone associé et la protection activée, tout son trafic passe par le serveur du parent. Bibliothèque officielle com.wireguard.android:tunnel (wireguard-go embarqué).
  • Accès décidé par le parent — Le serveur applique l'un des trois modes : accès libre, liste blanche seulement (par exemple Pronote) ou Internet coupé ; à la main, ou selon des plages horaires, un forfait de données mobiles ou une coupure cyclique. Il bloque aussi des services (réseaux sociaux, vidéo, jeux…) par son DNS filtrant.
  • Appairage par code — Code de 8 caractères (ou lien familyd://) créé sur l'espace parents, saisi dans Réglages → Contrôle parental. La paire de clés WireGuard est générée sur le téléphone ; la clé privée et le jeton de l'appareil sont chiffrés par l'Android Keystore.
  • Règles d'usage (service d'accessibilité) — Plages horaires, temps d'écran quotidien global ou par application, ajout de temps, applications interdites ; le lanceur, le téléphone, le clavier et DataControl ne sont jamais bloqués. Changer à la main la date, l'heure ou le fuseau ne contourne pas ces règles (le changement est ignoré et signalé au parent).
  • Remontées au parent — Batterie, position (si autorisée), type de réseau, état des protections, applications installées, temps d'écran, évènements (tunnel coupé, protection retirée, heure modifiée…). Les évènements sont gardés sur le téléphone tant que le serveur n'est pas joignable.
  • Tunnel coupé = alerte — Si le tunnel tombe (VPN retiré, autre VPN, serveur injoignable), la protection reste activée : la notification passe en rouge (« PROTECTION INACTIVE »), le parent est prévenu et le tunnel est remonté dès que possible.
  • Mode propriétaire de l'appareil (Device Owner, facultatif) — VPN toujours actif avec blocage des connexions hors VPN, réglages VPN / date et heure / DNS privé verrouillés, pas de réinitialisation ni de mode sans échec, DataControl indésinstallable. Garde-fou : si le serveur ne répond plus pendant 15 min, le blocage hors VPN est levé jusqu'à son retour.
  • Suivi de la consommation — Données mobiles depuis le début du cycle (TrafficStats), forfait, coût estimé, réinitialisation mensuelle automatique ou manuelle.
  • Mot de passe de verrouillage — Protège les Réglages, l'effacement du journal, la désactivation de la protection et la sortie du mode propriétaire. Haché avec PBKDF2 ; après 3 essais ratés, attente croissante (30 s à 15 min).
  • Journal de diagnostic — État du tunnel, mode appliqué et, avec le service d'accessibilité, chaque application utilisée. Conservé 15 jours.
  • Mise à jour intégrée — Dernière Release Gitea depuis l'onglet À propos ; le serveur familyd la propose aussi aux appareils du tunnel sur http://10.78.0.1/installer.

Installation sur le téléphone de l'enfant

  1. Installer DataControl : par la Release Gitea, ou — sans PC — en ajoutant d'abord le téléphone par QR code dans l'application WireGuard (espace parents → Ajouter un appareil), puis en ouvrant http://10.78.0.1/installer dans son navigateur.

  2. Associer : espace parents → Associer un téléphone (DataControl) ; saisir le code dans Réglages → Contrôle parental.

  3. Activer la protection sur le tableau de bord et accepter la demande VPN d'Android.

  4. Verrouiller (recommandé) : mot de passe dans Réglages → Sécurité, administrateur d'appareil, et si possible le mode propriétaire.

    Par QR code, sans PC (téléphone réinitialisé) : espace parents → Préparer un téléphone (mode propriétaire) ; sur l'écran « Bienvenue » du téléphone, toucher 6 fois au même endroit, scanner le QR. DataControl est installé, devient propriétaire, s'associe et active la protection tout seul.

    Ou par adb :

    # téléphone branché en USB, débogage USB actif, tous les comptes retirés le temps de la commande
    adb shell dpm set-device-owner com.jttools.datacontrol/.admin.AppDeviceAdminReceiver
    

Autorisations requises

Permission Usage
VPN (consentement système) Tunnel WireGuard — demandé à l'activation de la protection (accordé automatiquement en mode propriétaire)
Notifications (Android 13+) Notification permanente d'état
Ignorer l'optimisation de la batterie Éviter que le système n'arrête la surveillance
QUERY_ALL_PACKAGES Liste des applications installées, pour que le parent choisisse lesquelles limiter
RECEIVE_BOOT_COMPLETED Relancer la surveillance et le tunnel après redémarrage
Position (dont arrière-plan) Facultatif — transmise au parent
Administrateur d'appareil / propriétaire de l'appareil Facultatif — anti-désinstallation, verrouillage du VPN et des réglages
Service d'accessibilité Facultatif — détecte l'application au premier plan (sans lire les écrans) pour les règles d'usage

Réseau : sortant UDP 51721 (tunnel vers fam-vpn.tuxtech.fr) et HTTPS (appairage sur family.tuxtech.fr, mises à jour sur git.tuxtech.fr). L'API du serveur est jointe en HTTP dans le tunnel (10.78.0.1:8100), seule exception autorisée par network_security_config.xml.


Limites connues

  • Sans le mode propriétaire, le VPN peut être coupé dans les réglages Android : le serveur le voit et alerte le parent, sans pouvoir l'empêcher.
  • Le mode propriétaire se provisionne par QR code au premier démarrage (téléphone réinitialisé) ou par adb sur un téléphone sans compte.
  • Un seul VPN peut être actif à la fois sous Android : DataControl est incompatible avec un autre VPN.
  • Si le serveur familyd est arrêté, le téléphone n'est plus filtré (et, en mode propriétaire, n'a plus Internet pendant 15 min au plus).
  • Le compteur de consommation local repose sur TrafficStats (remis à zéro au redémarrage, la référence est recalée) ; le serveur mesure de son côté le trafic réel du tunnel.

Architecture

  • Kotlin + Jetpack Compose (Material 3), Hilt, DataStore Preferences.
  • vpn/ — TunnelManager (bibliothèque WireGuard officielle, GoBackend).
  • remote/ — FamilyApi (client HTTP de familyd), FamilyLink / PairingInput (liaison et saisie du code), RemoteSync (appairage, consignes, file d'évènements), DeviceReporter (état, temps d'écran, applications).
  • service/ — DataMonitorService (tunnel, consommation, notification, mode propriétaire), ConnectivityObserver, MonitorStateHolder, BootReceiver, DataMonitorRestartWorker.
  • guard/ — GuardEngine (règles d'usage, temps d'écran, horloge de confiance), AppGuardService (accessibilité), BlockedActivity.
  • admin/ — administrateur d'appareil et OwnerPolicy (mode propriétaire). data/ — réglages, mot de passe, SecretBox (Android Keystore). log/ — journal.
  • ui/ — écrans Compose (dashboard, settings, family, journal, about).

Le serveur familyd (FastAPI, WireGuard, nftables, AdGuard Home) est dans un dépôt séparé (~/scripts/familyd).


Build

make build      # APK debug
make release    # APK release signé, copié en DataControl-<version>.apk
make install    # Installe le debug sur un appareil connecté (adb)
make deploy     # APK release + publication en Release Gitea (voir `make help`)

Prérequis : Android SDK (API 34), JDK 17. Le wrapper Gradle télécharge Gradle 8.13 au premier lancement.

Signature : la release est signée avec la clé décrite dans keystore.properties (non versionné, modèle dans keystore.properties.example). Cette clé doit rester celle des versions déjà publiées, sinon les téléphones refusent la mise à jour : sauvegarder le keystore et ce fichier. Sans keystore.properties, la compilation retombe sur la clé de débogage, avec un avertissement.


Licence

Projet personnel — JT-Tools by Johnny.