fix(android): keep the ETag only when the decryption that followed succeeded

The harness stored the ETag on download, so a first attempt with no password left a valid tag behind: the next call answered 304 and there was nothing to decrypt, precisely when the right password had just been typed. Sending If-None-Match without holding the matching plaintext trades a download for having no data - the real client needs the same rule, the tag belonging to the cached vault.

Also drops an em dash from an exception message: Delphi reads a BOM-less source as ANSI and it reached the device as mojibake.
This commit is contained in:
r-zakarya
2026-08-15 00:06:30 +01:00
parent ccab734d61
commit a641669150
2 changed files with 12 additions and 7 deletions
+9 -6
View File
@@ -46,7 +46,11 @@ type
FBtn: TButton;
FBtnFetch: TButton;
FUrl, FToken, FPwd: TEdit;
FETag: string; // conserve entre deux appuis : c'est ce qui permet le 304
// L'ETag n'est conserve QUE si le dechiffrement qui a suivi a reussi :
// envoyer If-None-Match sans detenir le clair correspondant fait
// economiser un telechargement pour se retrouver sans donnees. Le vrai
// client aura la meme regle, l'ETag etant lie au coffre en cache.
FETag: string;
procedure RunSelfTest(Sender: TObject);
procedure RunFetch(Sender: TObject);
procedure Log(const AMsg: string);
@@ -190,17 +194,16 @@ begin
end;
Log(' recu ' + Length(LRes.Container).ToString + ' octets');
if LRes.ETag <> '' then
begin
FETag := LRes.ETag;
Log(' ETag conserve : ' + FETag);
end;
Log('');
Log('Dechiffrement...');
LSw := TStopwatch.StartNew;
// Volontairement AVANT de retenir l'ETag : un echec ici doit laisser
// FETag vide pour que le prochain essai retelecharge.
LPlain := DecryptContainer(LRes.Container, LPwd);
LSw.Stop;
FETag := LRes.ETag;
if FETag <> '' then Log(' ETag retenu : ' + FETag);
Log(' ' + LSw.ElapsedMilliseconds.ToString + ' ms pour ' +
Length(LPlain).ToString + ' caracteres');