Commit Graph

709 Commits

Author SHA1 Message Date
r-zakarya 9947ce5718 feat(fillbar): Fill bar settings... au clic droit, ouvre l'onglet par-dessus l'entree en cours
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 11:08:52 +01:00
r-zakarya af6e8a2d9a feat(apk): Save des reglages actif seulement s'il y a un changement, coche apres enregistrement
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 10:59:03 +01:00
r-zakarya 3c16b41714 feat(sync): GitHub en plus de Gitea, et refus d'un depot public
GitHub parle la meme API des contenus (base64, sha, corps du PUT) : meme
chemin, reconnu a api.github.com/repos/. User-Agent pose partout (GitHub
refuse sans). Un depot public est refuse avant toute lecture ou ecriture,
Gitea comme GitHub : l'historique garde tous les instantanes chiffres.
Telephone : github.com/O/R se convertit en URL d'API et inversement.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 10:36:18 +01:00
r-zakarya d7a8b4ddff feat(fillbar): onglet Fill bar dans les reglages, icones ou texte, boutons Add et Search
- boutons choisis (Full, Password, 2FA, Add current window, Search, Open),
  style icones (Segoe MDL2 Assets) ou texte, opacite au repos, allumee ou non
- clic droit sur la barrette : Show icons / Show text en plus de l'opacite
- info-bulles sur chaque bouton
- Add et Search reprennent les corps extraits de Ctrl+Shift+A et Ctrl+Shift+Q

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 10:24:26 +01:00
r-zakarya ba8c4205f9 feat(apk): generateur de mot de passe, erreurs du depot affichees dans les reglages
- de sur le champ mot de passe (nouvelle entree et modification), tirage
  crypto.getRandomValues avec rejet
- Download vault sans reglages ouvre les reglages
- 404/401 tranches (jeton refuse, utilisateur ou depot inexistant, fichier
  absent) et mauvais mot de passe de synchro : les reglages s'ouvrent avec
  le message en rouge

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 10:18:47 +01:00
r-zakarya 3eb26e23e5 docs(sync): note l'idee d'un bouton Reinitialiser l'historique, sans la faire
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 22:55:18 +01:00
r-zakarya 9b79d62553 fix(apk): l'aide de la synchro s'adapte selon que le coffre est ouvert
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 22:34:02 +01:00
r-zakarya 061ea211c0 docs(apk): l'aide de la synchro ne renvoie plus a une section masquee
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 22:29:00 +01:00
r-zakarya 034fa48994 docs: QR des reglages, trois facons d'ouvrir, scanner, AllowCreateLocal, debuggable
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 22:19:01 +01:00
r-zakarya 405f058a92 fix(apk): le titre Diagnostics disparait avec son bouton en release
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 22:08:48 +01:00
r-zakarya 137fa24d19 fix(apk): le libelle du mode d'ouverture suit le scellement apres un telechargement
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 21:56:39 +01:00
r-zakarya 451574394e feat(apk): l'app s'appelle Vault, et la release n'est plus debuggable
Delphi ecrivait android:debuggable=true meme en Release : sur un telephone
avec le debogage USB actif, adb run-as ouvrait le dossier prive de l'app.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 21:50:26 +01:00
r-zakarya 1d2ea55bec feat(apk): creer un coffre local seulement en debogage (AllowCreateLocal)
En release le telephone ne sait que reprendre le coffre du depot : l'ecran
d'accueil n'offre plus que Download vault, et RegisterLocal refuse aussi.
Depot vide (404) ou conteneur illisible : rien n'est cree.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 21:14:16 +01:00
r-zakarya 22b1120228 fix(apk): la camera s'affiche des le premier scan apres l'autorisation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 19:05:51 +01:00
r-zakarya c53b3b0b8b chore(apk): retire le diagnostic temporaire du scan QR
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 19:01:25 +01:00
r-zakarya fb5d2f35a2 fix(apk): le lien du QR est accepte meme precede d'un caractere invisible
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 18:53:14 +01:00
r-zakarya 23967ddfca fix(sync): QR plus court (adresse du depot, sans sur-echappement) + TRY_HARDER au decodage
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 18:48:04 +01:00
r-zakarya dd9fd62dcb feat(apk): scanner le QR du poste depuis l'app (ZXing.Delphi, Apache 2.0)
Le scanner du systeme demandait avec quoi ouvrir le lien. L'app ouvre la
camera arriere, decode une image sur quatre et remplit URL + jeton des
qu'un lien pmserver://sync est lu. Rien n'est enregistre avant Save.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 18:38:41 +01:00
r-zakarya 780eecc11b feat(sync): le QR porte un lien pmserver://sync ouvert directement par l'app
Le scanner du telephone envoyait le texte a une recherche web (Google,
Chrome) : le jeton serait parti a un appui pres. Le lien a schema propre
n'a qu'une application pour l'ouvrir. Rien n'est enregistre avant Save.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 18:29:37 +01:00
r-zakarya 9bee179d1b fix(sync): QR a sa vraie taille, la regle svg des icones l'ecrasait
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 18:22:33 +01:00
r-zakarya f817a6df43 feat(sync): QR des reglages sur le PC, Paste settings sur le telephone
Le poste genere le QR (DelphiZXingQRCode, Apache 2.0) depuis ses prefs :
URL + jeton, jamais le mot de passe de synchro. Le telephone lit le texte
copie par l'appareil photo et remplit les champs ; Save valide.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 18:03:00 +01:00
r-zakarya 05ff08886d fix(apk): la zone URL prend la hauteur de son texte
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 17:42:51 +01:00
r-zakarya 826b0809aa feat(apk): URL du depot affichee en forme courte + sync password quand le coffre vient de la synchro
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 17:38:47 +01:00
r-zakarya a9618e9395 fix(apk): URL du depot sur plusieurs lignes, la fin n'etait pas atteignable
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 17:33:45 +01:00
r-zakarya 333af8c28f fix(apk): entrer dans un champ place le curseur a la fin du texte
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 17:23:25 +01:00
r-zakarya 732b93e5dd feat(apk): URL du depot telle que dans le navigateur + croix qui ne mange plus la fin du champ
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 16:23:09 +01:00
r-zakarya 231e3f98ae feat(apk): bouton Save dans les reglages, fermer n'enregistre plus
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 16:14:31 +01:00
r-zakarya 8269d99b5b feat(apk): copie de secours au mot de passe, le coffre survit au retrait du schema
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 15:13:13 +01:00
r-zakarya d6bf06b6a7 feat(apk): coche sur la facon d'ouvrir en place + journal du mode detecte
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 15:02:22 +01:00
r-zakarya 030df48559 fix(apk): Screen lock explique pourquoi il est indisponible au lieu de rester muet
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 14:52:49 +01:00
r-zakarya 799f75d53d feat(apk): choisir d'ouvrir avec le verrouillage d'ecran, un code ou le mot de passe du coffre
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 14:44:08 +01:00
r-zakarya b6ddd8c2fa docs(licence): essai F bis, login silencieux quand la 2e couche refuse
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 06:35:08 +01:00
r-zakarya 649abc85e7 fix(licence): le login n'affiche plus Invalid credentials quand la 2e couche refuse
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 06:27:15 +01:00
r-zakarya d41dbfbb3a fix(tray): relancer l'exe ramene bien la fenetre au premier plan
Lancee, fermee par la croix (tray), puis relancee : la fenetre revenait
derriere les autres, seule son icone dans la barre des taches. Mesure :
visible, non minimisee, pas au premier plan.

La 2e instance, qui recoit le double-clic, reveille la 1re par un
message ; mais la 1re n'a recu aucune entree, et Windows lui refuse
SetForegroundWindow. La 2e cede maintenant son droit
(AllowSetForegroundWindow) avant d'envoyer le message.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 06:20:17 +01:00
r-zakarya d8f4f19041 fix(licence): Register ne clignote plus avant d'etre masque
Les onglets etaient visibles par defaut puis masques a la reponse de
/ping : Register restait affiche quelques millisecondes. Ils naissent
maintenant invisibles (visibility, place reservee) et ne sont reveles
qu'une fois la reponse connue — licence valide, ils apparaissent sans
rien decaler ; licence refusee, Register n'est jamais montre.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 06:08:37 +01:00
r-zakarya 510b75d5bf feat(licence): masquer Register quand la 2e couche refuse
A l'arrivee sur l'ecran de connexion, /ping est interroge : son 404 JSON
exact ne peut venir, avant connexion, que de la 2e couche. Dans ce cas les
onglets disparaissent et seul Login reste. Tout autre echec laisse
Register visible — le masquer a tort empecherait un vrai client de creer
son compte. Le test porte sur le corps JSON, pas sur le seul statut : le
verrou du jeton repond aussi 404, sans corps.

Cosmetique : /register etait deja refuse cote serveur. On cesse seulement
de proposer un formulaire qui n'aboutit jamais.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 06:05:50 +01:00
r-zakarya 9de3cde6da fix(licence): le refus de la 2e couche ne s'affiche plus avant connexion
Avant toute session, le 404 generique ne peut venir que de la 2e couche :
les routes appelees a ce stade existent toutes, et leurs vraies erreurs
portent un autre texte. api() vide son message, toast() ignore un message
vide — qui a rapiece la 1re couche ne voit rien.

Apres connexion rien ne change : pieces jointes et dossiers renvoient un
404 'Not found' legitime qu'il faut montrer. Prix assume : une route
perdue par un build casse echouerait aussi en silence avant connexion.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 05:57:16 +01:00
r-zakarya 7582450454 docs(licence): essai F bis, la 2e couche tient depuis l'application
Exe d'essai qui saute l'ecran, licence retiree : toasts « Not found »,
impossible d'entrer. Le 404 est le generique d'une route inexistante,
donc aucun indice qu'une verification de licence existe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 05:52:58 +01:00
r-zakarya d5234e1390 fix(licence): refus de la 2e couche indiscernable d'une route inconnue
Le 404 a corps vide etait remplace par la page HTML d'Indy, distincte du
404 JSON d'une route inexistante : on pouvait lister les routes reelles.
La 2e couche renvoie maintenant exactement le meme JSON.

Ajoute un exe d'essai qui saute l'ecran d'activation, pour eprouver la
2e couche depuis l'application. Define de compilation
LICENCE_TEST_SKIP_SCREEN, jamais un reglage : un interrupteur dans
config.txt ferait sauter la 1re couche sans rapiecage. Build dedie,
.dcu a part ; verifie que seul l'exe d'essai porte le define.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 05:36:28 +01:00
r-zakarya 16e0f3bd78 docs(licence): essai F, la deuxieme couche tient la premiere sautee
API interrogee en direct, sans passer par l'ecran : licence active /ping
repond pong, licence retiree toutes les routes tombent en 404, y compris
POST /register ; /index.html reste servi.

Notes les deux pieges qui faussaient le resultat — config.txt lu depuis
le dossier courant, et le oui retenu par un processus que fermer la
fenetre ne quitte pas — et une observation : le 404 de la 2e couche
porte la page d'Indy, distincte du 404 JSON d'une route inexistante, ce
qui revele les routes existantes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 23:50:39 +01:00
r-zakarya f549b36563 fix(android): repack-apk ne depend plus du dossier courant
$p et $outDir etaient relatifs (".\Android64\..."). Lance depuis un
autre dossier que la racine du depot, build-apk compilait bien dans le
depot mais repack empaquetait un dossier inexistant sous le repertoire
courant, y semait des copies de ressources, puis echouait sur un
Copy-Item ("Container cannot be copied onto existing leaf item").

Les deux chemins partent maintenant de $PSScriptRoot. Ca ne se voyait
pas tant que le script etait appele depuis la racine.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 23:31:45 +01:00
r-zakarya a7af9af47e fix(build): lier SQLite dans l'exe, qui chargeait sqlite3.dll du PATH
Sans FireDAC.Phys.SQLiteWrapper.Stat, FireDAC charge sqlite3.dll au
demarrage. Sur ce poste ca marchait quand meme : le dossier bin
d'Embarcadero, qui en contient un, est dans le PATH. Sur une machine
sans Delphi, l'exe refusait de demarrer.

C'est le Win64 qui l'a revele — la DLL du PATH est 32 bits — mais le
Win32 livre etait casse de la meme facon chez quiconque n'a pas Delphi,
paquet prepare pour un tiers compris.

Prouve avec un PATH reduit a Windows : avec l'unite SQLite s'ouvre
(3.42.0), sans elle l'erreur exacte. Lire la table d'import ne
suffisait pas, le chargement est dynamique.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 23:15:42 +01:00
r-zakarya 0d4d4d518c build: activer Win64, dont la configuration etait vide
Le groupe Base_Win64 du .dproj n'avait ni prefixes d'unites — d'ou
"Unite 'Windows' non trouvee" en recompilant TMS — ni Cfg_1_Win64 :
l'exe aurait compile sans icone et sans PerMonitorV2, donc flou sur un
ecran haute resolution. Complete en miroir exact de Win32, et Win64
coche dans l'IDE.

Builds Release 32 et 64 bits produits sur E:, un dossier .dcu par
plateforme — c'est ce qui empeche la pollution des sources TMS qui avait
casse le build Win32 le 7 septembre. Verifie : aucun .dcu depose.

Empreinte de licence identique en 32 et 64 bits, les deux couches a
TRUE des deux cotes : une licence vaut pour les deux exe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 23:01:25 +01:00
r-zakarya 72b776c26e docs: le dernier caractere de controle, que le commit precedent disait absent
\a s'etait change en BEL dans E:\a pmanager. Le commit precedent
affirmait qu'il ne restait plus rien sans l'avoir mesure apres coup —
c'est ce qui l'a laisse passer. Mesure cette fois : zero.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 22:56:44 +01:00
r-zakarya 5d51614a1b docs: reparer deux chemins que le heredoc avait corrompus
\t et \r s'etaient changes en tabulation et en retour chariot dans les
chemins du piege TMS. Verifie apres coup : plus aucun caractere de
controle parasite dans le fichier.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 22:56:23 +01:00
r-zakarya 1fa5113c02 feat(licence): deuxieme couche, l'API refuse sans licence valable
L'ecran d'activation ne consultait qu'un branchement : le rapiecer
ouvrait tout, l'API ne demandant rien. Chaque route de PM.Router passe
maintenant par PM.LicenceGate.ApiLicenceOk avant son handler.

Aucune fonction de decision partagee avec PM.Licence — sinon un seul
rapiecage ouvrirait les deux couches. La verification est refaite de
bout en bout, appels CNG redeclares compris ; seules la cle publique et
le nom de la pref sont partages, parce que ce sont des donnees.

Branchee dans DispatchRequest : les fichiers de l'ecran d'activation
passent par TryServeEmbedded, non garde, sinon l'ecran ne se chargerait
plus. Un oui est retenu pour le processus, un non jamais.

Le risque etait qu'elle refuse un client licencie. Auto-test sur un
vecteur lie a une empreinte fixe, sens accepte en premier ; et accord
verifie en conditions reelles sur ce poste : IsLicensed = TRUE,
ApiLicenceOk = TRUE.

Documente aussi le piege du jour, sans lien avec ce code : des .dcu TMS
x64 deposes a cote des sources cassaient le build Win32, et la sortie
redirigee vers E: faute de place sur Z:.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 22:55:33 +01:00
r-zakarya 5722347e75 docs: le depot a un remote, contrairement a ce qui etait ecrit
origin pointe sur le Gitea auto-heberge. CLAUDE.md affirmait "pas de
remote configure (dev local)", ce qui a cesse d'etre vrai sans que le
document suive — 427 commits d'avance au moment du constat.

Rien n'est pousse automatiquement, et c'est note : lire "il y a un
remote" ne doit pas se comprendre comme "c'est sauvegarde ailleurs".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 19:30:32 +01:00
r-zakarya 23568049da feat(android): saisir le secret 2FA des la creation d'une entree
Le formulaire New entry n'avait pas le champ et AddEntry ecrivait
totp_secret = '' en dur : il fallait enregistrer l'entree puis la rouvrir
pour poser un second facteur, alors que l'editeur portait deja le champ.

Meme intitule que l'editeur ("2FA secret"), masque pour une note comme
site et identifiant, et achemine par &o= — t, s, u, p, k, d etaient
pris.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 19:18:39 +01:00
r-zakarya 370d35f69a docs(licence): l'APK reutilisera la licence desktop, pas la sienne
Differe volontairement : l'APK ne part chez personne aujourd'hui. Le
jour venu, l'instantane publie par le poste portera la licence et le
telephone exigera d'y en trouver une — il le lit deja, donc aucun
nouveau format, aucune empreinte Android, aucune emission de plus.

Les trois raisons de ne pas refaire un second dispositif sont notees
pour ne pas les re-deriver : Java attend du DER la ou CNG accepte r||s
brut, ANDROID_ID est remis a zero par une reinitialisation d'usine (donc
des clients legitimes refuses), et un APK se repaquette en dix minutes.

Et l'APK n'aura PAS a verifier la signature, seulement la presence :
payer le DER et le JNI pour durcir un controle que le repaquetage retire
serait le mauvais echange.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 19:13:12 +01:00
r-zakarya 67c13332d0 docs(licence): campagne d'essai passee, et l'essai qui manquait
A, B, C, D, E2, E3 passes, rien a corriger. E1 (autre compte Windows)
reste non joue, faute d'un second compte : note comme tel plutot que
presente comme verifie.

E3 ajoute au plan pendant la campagne — remplacer l'exe d'une
installation existante par une nouvelle version. C'est le cas qu'on vit
reellement a chaque livraison, et une desactivation a la mise a jour ne
se verrait qu'au premier client mecontent.

Deux observations gardees : C3 a ete plus probant que prevu (le port
avait change entre les deux lancements, donc l'origine aussi), et un
port ephemere sans ligne de repli dans le journal n'est pas un defaut
mais un config.txt absent ou port=0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 18:49:31 +01:00