From 1d707f878545bf11e1512ba0975e8166f4ec3065 Mon Sep 17 00:00:00 2001 From: tuxgyver Date: Sun, 25 Oct 2026 10:51:49 +0100 Subject: [PATCH] chore(release): v0.1.9 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01R9CBCVP5oDu2sfoYPisNCQ --- CHANGELOG.md | 12 ++++++++++++ Makefile | 7 ++++++- README.md | 2 ++ .../com/jttools/datacontrol/ui/about/AboutContent.kt | 11 ++++++----- version.properties | 4 ++-- 5 files changed, 28 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a83beda..db0ffee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## v0.1.9 – 2026-10-25 + +- 🔒 **Sécurité** — Retirer l'autorisation VPN ou activer un autre VPN ne désactive plus le contrôle : la notification passe en rouge, le parent est alerté, le tunnel est remonté après 30 s si possible et l'autorisation est redemandée à l'ouverture. +- 🔒 **Sécurité** — Changer à la main la date, l'heure ou le fuseau du téléphone ne contourne plus les plages horaires ni le temps d'écran : le changement est ignoré et signalé au parent. +- 🔒 **Sécurité** — Mot de passe haché avec PBKDF2 ; après 3 essais ratés, attente croissante (30 s à 15 min). Les mots de passe existants restent valides. +- 🔒 **Sécurité** — Effacer le journal demande le mot de passe ; les écrans protégés ne s'affichent plus un instant avant le verrou. +- 🔒 **Sécurité** — Le code d'appairage ne sert qu'une fois ; réglages, appairage et journal ne sont plus inclus dans la sauvegarde Google. +- 🐛 **Corrigé** — L'alerte « protection anti-désinstallation retirée » ne peut plus se perdre ; si le système refuse de relancer la surveillance, une notification invite à rouvrir l'application et le parent est prévenu. +- 🐛 **Corrigé** — La liste des applications est renvoyée au parent à chaque installation ou désinstallation ; le bouton Retour de l'écran de blocage renvoie toujours à l'accueil. +- 🛠️ **Modifié** — Journal plus léger (la liste n'est reconstruite que lorsque l'onglet est ouvert) et horodatage fiable. +- ⚙️ **Technique** — Signature des releases via `keystore.properties` (même clé qu'avant) ; premiers tests unitaires ; README et page « À propos » alignés sur le comportement réel (la coupure cyclique tourne en permanence sur données mobiles). + ## v0.1.8 – 2026-09-21 - Contrôle parental : la configuration Firebase se **saisit dans l'application** (Réglages → Contrôle parental → Configuration Firebase), en collant la chaîne « fc1:… » partagée par FamilyControl ou le bloc « firebaseConfig » de la console. Plus besoin de recompiler ni de fichier firebase.properties (qui reste possible comme valeur par défaut). diff --git a/Makefile b/Makefile index 9e85fc9..a19673d 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ GITEA_REPO_NAME := DataControl GITEA_TOKEN ?= $(shell sed -n 's/^giteaToken=//p' gitea-token.properties 2>/dev/null | tr -d '[:space:]') .DEFAULT_GOAL := help -.PHONY: help build release install push version-bump changelog clean tag _check-token _check-apk publish deploy +.PHONY: help build release install push version version-bump changelog clean tag _check-token _check-apk publish deploy BOLD := \033[1m DIM := \033[2m @@ -34,6 +34,7 @@ help: @printf " $(GREEN)make install$(RESET) 📲 Installer l'APK debug sur l'appareil connecté\n" @printf "\n" @printf " $(BOLD)🚀 Versions & publication$(RESET)\n" + @printf " $(GREEN)make version$(RESET) 🏷️ Afficher la version courante\n" @printf " $(GREEN)make version-bump$(RESET) 🔖 Incrémenter versionCode et le patch de versionName\n" @printf " $(GREEN)make changelog$(RESET) 📝 Ajouter au CHANGELOG les commits depuis le dernier tag\n" @printf " $(GREEN)make push$(RESET) 📤 Commit, tag et push de la version courante\n" @@ -131,6 +132,10 @@ publish: _check-apk _check-token tag deploy: release publish @printf "$(GREEN)🚢 Déploiement terminé.$(RESET)\n" +version: + @printf "$(YELLOW)🏷️ Version courante...$(RESET)\n" + @echo "v$(VERSION_NAME) (build $(VERSION_CODE))" + version-bump: @printf "$(YELLOW)🔖 Incrémentation de la version...$(RESET)\n" @NEW_CODE=$$(( $(VERSION_CODE) + 1 )); \ diff --git a/README.md b/README.md index 6561489..6abaa7d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # DataControl +🚀 v0.1.9 · 🤖 Android · 🟣 Kotlin · 🎨 Jetpack Compose · 🔥 Firebase · 🔒 pare-feu VPN local · 👨‍👩‍👧 contrôle parental · 🧪 tests · 📄 licence non déclarée + **DataControl** est une application Android qui surveille en arrière-plan la consommation de données mobiles et coupe automatiquement l'accès à Internet en cas de dépassement du forfait — sans jamais toucher au Wi-Fi. > JT-Tools by Johnny — version courante et historique : voir [CHANGELOG.md](CHANGELOG.md) (aussi lisible dans l'onglet *À propos* de l'application). diff --git a/app/src/main/java/com/jttools/datacontrol/ui/about/AboutContent.kt b/app/src/main/java/com/jttools/datacontrol/ui/about/AboutContent.kt index 2e61628..1f8d3ad 100644 --- a/app/src/main/java/com/jttools/datacontrol/ui/about/AboutContent.kt +++ b/app/src/main/java/com/jttools/datacontrol/ui/about/AboutContent.kt @@ -22,7 +22,8 @@ object AboutContent { AboutEntry("Reprise automatique", "Le suivi redémarre après un redémarrage de l'appareil et est relancé périodiquement si le système l'a arrêté.") )), AboutSection("Protection", listOf( - AboutEntry("Mot de passe de verrouillage", "Protège l'accès aux Réglages et la désactivation du contrôle."), + AboutEntry("Mot de passe de verrouillage", "Protège les Réglages, la Liste blanche, l'effacement du journal et la désactivation du contrôle."), + AboutEntry("Date et heure", "Changer à la main la date, l'heure ou le fuseau ne contourne pas les plages horaires ni le temps d'écran : le changement est ignoré et signalé au parent. Laissez l'heure automatique activée."), AboutEntry("Anti-désinstallation", "DataControl peut devenir administrateur de l'appareil : Android refuse alors de le désinstaller tant que la protection est active."), AboutEntry("Journal de diagnostic", "L'onglet Journal montre l'état du VPN, les décisions du pare-feu et, si le service d'accessibilité est activé, chaque application utilisée avec son verdict réseau et lancement. Conservé 15 jours, avec copie et partage."), AboutEntry("Mise à jour intégrée", "Recherche et installation de la dernière version publiée, depuis l'onglet Journal de cette page.") @@ -53,8 +54,8 @@ object AboutContent { val troubleshooting = listOf( AboutEntry("Je ne vois pas l'icône VPN", "Le pare-feu ne se monte que sur données mobiles, contrôle activé. Sur Wi-Fi, il n'y en a jamais (sauf filtrage Wi-Fi activé). Consultez l'onglet Journal : il donne la raison exacte."), - AboutEntry("« PARE-FEU INACTIF » dans la notification", "Les données mobiles ne sont pas filtrées : autorisation VPN retirée ou tunnel non monté. Réactivez le contrôle et lisez le Journal."), - AboutEntry("Le contrôle s'est désactivé tout seul", "Un seul VPN peut être actif sous Android : si un autre VPN prend la main, DataControl est révoqué et se désactive."), + AboutEntry("« PARE-FEU INACTIF » dans la notification", "Les données mobiles ne sont pas filtrées : autorisation VPN retirée ou tunnel non monté. Rouvrez DataControl pour redonner l'autorisation VPN, et lisez le Journal."), + AboutEntry("Un autre VPN a pris la main", "Un seul VPN peut être actif sous Android. Le contrôle reste activé mais ne filtre plus : la notification passe en rouge, le parent est alerté et DataControl retente toutes les 30 s ; à l'ouverture, l'autorisation VPN est redemandée."), AboutEntry("Le service d'accessibilité est grisé (Android 13+)", "Ouvrez Infos sur l'application → ⋮ → « Autoriser les paramètres restreints », puis réessayez.") ) @@ -84,11 +85,11 @@ object AboutContent { AboutEntry("DataControl jamais bloqué", "L'application est toujours exclue du tunnel : la liaison avec le parent ne peut pas être coupée par le pare-feu.") )), AboutSection("Accès à l'application", listOf( - AboutEntry("Mot de passe", "Haché en SHA-256 avec un sel aléatoire de 16 octets (SecureRandom), jamais stocké en clair. Limite : un hachage simple, sans étirement de type bcrypt ou Argon2."), + AboutEntry("Mot de passe", "Haché avec PBKDF2-HMAC-SHA256 (100 000 itérations) et un sel aléatoire de 16 octets, jamais stocké en clair. Après 3 essais ratés, attente croissante de 30 s à 15 min."), AboutEntry("Anti-désinstallation", "Administrateur d'appareil. Limite : la protection peut être retirée depuis les Réglages Android ; si l'appareil est associé, le parent en est alerté. La demande de mot de passe ne s'applique qu'au retrait fait depuis DataControl.") )), AboutSection("Liaison FamilyControl", listOf( - AboutEntry("Appairage", "Code aléatoire à durée limitée (10 minutes) créé côté parent. Connexion anonyme Firebase côté appareil, compte e-mail côté parent."), + AboutEntry("Appairage", "Code aléatoire à usage unique et à durée limitée (10 minutes) créé côté parent. Connexion anonyme Firebase côté appareil, compte e-mail côté parent."), AboutEntry("Règles Firestore", "Fournies avec FamilyControl (firebase/firestore.rules) : l'appareil n'écrit que dans son propre espace et ne peut pas modifier les consignes du parent."), AboutEntry("Service d'accessibilité", "Détecte uniquement l'application au premier plan : la lecture du contenu des écrans est désactivée (canRetrieveWindowContent = false)."), AboutEntry("Applications exemptées", "Lanceur, téléphone, clavier et DataControl ne sont jamais bloqués, pour que l'appareil reste utilisable.") diff --git a/version.properties b/version.properties index 6c4d7a8..970e81e 100644 --- a/version.properties +++ b/version.properties @@ -1,2 +1,2 @@ -versionName=0.1.8 -versionCode=9 +versionName=0.1.9 +versionCode=10