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.
|
// 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);
|
||||||
|
|||||||
Reference in New Issue
Block a user