diff --git a/android-client/PLAN.md b/android-client/PLAN.md index ec72380..665f824 100644 --- a/android-client/PLAN.md +++ b/android-client/PLAN.md @@ -612,6 +612,67 @@ n''écrit rien), retirer WebDAV le jour où il n''a plus d''usage, et une purge périodique de l''historique — sans quoi le dépôt grossit d'un instantané complet à chaque synchronisation, pièces jointes comprises. +## 7. Se servir de l'application seule — compte local + +Aujourd'hui le téléphone ne sait que **lire un coffre venu d'ailleurs** : sans +URL, sans jeton et sans mot de passe de synchronisation, il n'affiche rien. +On veut qu'il serve seul, comme le poste : on s'inscrit, le coffre vit là, et +la synchronisation devient un ajout facultatif. + +### Ce que ça entraîne, et qu'il vaut mieux dire tout de suite + +Un coffre vide qu'on ne peut pas remplir ne sert à rien. **S'inscrire entraîne +donc créer des entrées depuis le téléphone** — précisément ce que §4 avait +écarté. C'est le vrai morceau ; l'écran de connexion n'en est que la façade. + +### Le coffre local devient l'autorité, chiffré sous le mot de passe + +Aujourd'hui `vault.bin` porte l'instantané **en clair**, scellé par le Keystore +(et, depuis peu, par un code). Le conteneur chiffré sous mot de passe, lui, +n'existe qu'au bout du réseau. Un compte local inverse la charge : + +- un fichier local porte **exactement ce que porterait le dépôt** — + `EncryptContainer(instantané, mot de passe, 600k)` ; +- `vault.bin` reste ce qu'il est : le cache d'ouverture rapide. + +Deux raisons, pas une : c'est le modèle du poste — le mot de passe maître +protège le coffre au repos, pas seulement le matériel — et **le format reste +celui du dépôt**, donc la synchronisation continue de marcher sans convertir +quoi que ce soit. + +### Le nom d'utilisateur + +Le conteneur le porte déjà (`username`, écrit par `buildSyncSnapshot`). Un seul +compte par appareil : plusieurs coffres sur un même téléphone est une envie +supposée, pas un besoin constaté. Le nom saisi se compare à celui du conteneur +après déchiffrement — c'est le mot de passe qui ouvre, le nom qui identifie. + +### S'inscrire + +Forge un instantané vide, le chiffre sous le mot de passe choisi, l'écrit +localement. Aucun réseau. **Le poste ne connaîtra pas ce compte** : il crée les +siens dans SQLite et rien ne les rapproche aujourd'hui. Un coffre né sur le +téléphone qu'on voudra ensuite ouvrir sur le poste demandera un import. + +### Par étapes + +1. **Identité** : écran connexion / inscription, conteneur local, coffre vide. +2. **Créer une entrée** — l'étape qui rend l'application utile seule. Un uuid + neuf, `updated_at` posé ; pas de tombstone, on ne supprime pas encore. +3. **Modifier n'importe quel champ, supprimer** : `PatchEntryField` prend déjà + le nom du champ ; supprimer exige les tombstones. +4. **Réconcilier avec la synchronisation** : un coffre né seul auquel on + ajoute un dépôt. C'est là que la fusion revient, et elle a été évitée + jusqu'ici pour de bonnes raisons. + +### Ce qui devient facultatif + +Sans dépôt configuré, *Sync* n'a rien à faire : les réglages du serveur +restent, mais l'application ne doit plus se comporter comme si le réseau était +la seule source. + +--- + ## Ordre proposé 1. **Vérifier §1 sur téléphone** — c'est ce qui valide le travail déjà fait, et