diff --git a/mainApk.pas b/mainApk.pas index b539d46..0d294c2 100644 --- a/mainApk.pas +++ b/mainApk.pas @@ -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);