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:
+25
-1
@@ -147,6 +147,8 @@ type
|
||||
// l'ouverture du coffre ne doit plus ecraser avec l'ancienne.
|
||||
FPwdShown: string;
|
||||
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) :
|
||||
// on ouvre la copie de secours, scellee sous le mot de passe.
|
||||
FRecover: Boolean;
|
||||
@@ -2591,6 +2593,19 @@ begin
|
||||
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
|
||||
// ecraser l'un par l'autre. Sans cela le conteneur local resterait
|
||||
// l'autorite, les enregistrements n'atteindraient jamais le depot, et les
|
||||
@@ -2687,7 +2702,10 @@ begin
|
||||
if LClient.IsGitea then Log(' known sha: ' + FETag)
|
||||
else Log(' If-None-Match: ' + FETag);
|
||||
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;
|
||||
// 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
|
||||
@@ -2904,6 +2922,11 @@ begin
|
||||
// Le cache le porte desormais : il redevient la reference.
|
||||
FPwdUserSet := False;
|
||||
FPwdShown := FPwd;
|
||||
if FSyncAfterVerify then
|
||||
begin
|
||||
FSyncAfterVerify := False;
|
||||
TThread.ForceQueue(nil, procedure begin DoSync(nil); end);
|
||||
end;
|
||||
try
|
||||
AdoptVault(LPlain);
|
||||
except
|
||||
@@ -2923,6 +2946,7 @@ begin
|
||||
// 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
|
||||
// le champ prerempli, et le coffre local reste consultable.
|
||||
FSyncAfterVerify := False; // rien ne part sous un mot de passe faux
|
||||
if not ASilent then
|
||||
TThread.Queue(nil, procedure
|
||||
begin ShowSettingsError('Wrong sync password - it must be the one set on the PC'); end);
|
||||
|
||||
Reference in New Issue
Block a user