fix(apk): un mot de passe de synchro change est verifie contre le depot avant toute publication

Le sha inchange faisait repondre 'rien n'a change' sans dechiffrer : un
mot de passe faux passait pour bon. Tant qu'il n'est pas verifie, le depot
est retelecharge en entier ; la synchro reprend ensuite si rien n'echoue.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-09-18 11:38:30 +01:00
parent 891abf7a9d
commit 395d7a70d4
+25 -1
View File
@@ -147,6 +147,8 @@ type
// l'ouverture du coffre ne doit plus ecraser avec l'ancienne. // l'ouverture du coffre ne doit plus ecraser avec l'ancienne.
FPwdShown: string; FPwdShown: string;
FPwdUserSet: Boolean; FPwdUserSet: Boolean;
// Synchro a reprendre une fois le nouveau mot de passe verifie.
FSyncAfterVerify: Boolean;
// La cle du verrouillage d'ecran est morte (schema retire ou reinitialise) : // La cle du verrouillage d'ecran est morte (schema retire ou reinitialise) :
// on ouvre la copie de secours, scellee sous le mot de passe. // on ouvre la copie de secours, scellee sous le mot de passe.
FRecover: Boolean; FRecover: Boolean;
@@ -2591,6 +2593,19 @@ begin
end; end;
// UN MOT DE PASSE DE SYNCHRO CHANGE SE VERIFIE AVANT TOUTE PUBLICATION.
// Publier d'abord chiffrerait l'instantane sous un mot de passe peut-etre
// faux - le poste ne pourrait plus le lire. On retelecharge donc en entier
// (FetchAndDecrypt ignore le sha connu tant que FPwdUserSet) : le
// dechiffrement tranche, puis la synchro reprend si quelque chose attendait.
if FPwdUserSet and not HasLocalContainer then
begin
Log('Sync password changed - verifying it against the repository first');
FSyncAfterVerify := FPending;
FetchAndDecrypt(LUrl, LTok, LPwd, False);
Exit;
end;
// UN COFFRE NE ICI A QUI L'ON DONNE UN DEPOT : il faut fondre les deux, pas // UN COFFRE NE ICI A QUI L'ON DONNE UN DEPOT : il faut fondre les deux, pas
// ecraser l'un par l'autre. Sans cela le conteneur local resterait // ecraser l'un par l'autre. Sans cela le conteneur local resterait
// l'autorite, les enregistrements n'atteindraient jamais le depot, et les // l'autorite, les enregistrements n'atteindraient jamais le depot, et les
@@ -2687,7 +2702,10 @@ begin
if LClient.IsGitea then Log(' known sha: ' + FETag) if LClient.IsGitea then Log(' known sha: ' + FETag)
else Log(' If-None-Match: ' + FETag); else Log(' If-None-Match: ' + FETag);
LSw := TStopwatch.StartNew; LSw := TStopwatch.StartNew;
LRes := LClient.Fetch(FETag); // Sha connu IGNORE tant que le mot de passe n'est pas verifie : un
// "rien n'a change" ne dechiffrerait rien, et donc ne prouverait rien.
if FPwdUserSet then LRes := LClient.Fetch('')
else LRes := LClient.Fetch(FETag);
LSw.Stop; LSw.Stop;
// Un code a zero n'est pas un statut : c'est qu'aucune reponse HTTP // Un code a zero n'est pas un statut : c'est qu'aucune reponse HTTP
// n'est arrivee. Ecrit tel quel, il se lisait comme un vrai code rendu // n'est arrivee. Ecrit tel quel, il se lisait comme un vrai code rendu
@@ -2904,6 +2922,11 @@ begin
// Le cache le porte desormais : il redevient la reference. // Le cache le porte desormais : il redevient la reference.
FPwdUserSet := False; FPwdUserSet := False;
FPwdShown := FPwd; FPwdShown := FPwd;
if FSyncAfterVerify then
begin
FSyncAfterVerify := False;
TThread.ForceQueue(nil, procedure begin DoSync(nil); end);
end;
try try
AdoptVault(LPlain); AdoptVault(LPlain);
except except
@@ -2923,6 +2946,7 @@ begin
// plus - le poste a change de mot de passe de sync. On ne le jette // plus - le poste a change de mot de passe de sync. On ne le jette
// PAS : il faudra le retaper, mais garder l'ancien laisse au moins // PAS : il faudra le retaper, mais garder l'ancien laisse au moins
// le champ prerempli, et le coffre local reste consultable. // le champ prerempli, et le coffre local reste consultable.
FSyncAfterVerify := False; // rien ne part sous un mot de passe faux
if not ASilent then if not ASilent then
TThread.Queue(nil, procedure TThread.Queue(nil, procedure
begin ShowSettingsError('Wrong sync password - it must be the one set on the PC'); end); begin ShowSettingsError('Wrong sync password - it must be the one set on the PC'); end);