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
+3 -1
View File
@@ -330,7 +330,9 @@ begin
// AEADBadTagException surfaces here: wrong password, or altered bytes. // AEADBadTagException surfaces here: wrong password, or altered bytes.
// Both are indistinguishable by design — that is what authentication means. // Both are indistinguishable by design — that is what authentication means.
on E: Exception do on E: Exception do
raise EPMACrypto.Create('Decryption failed — wrong password or corrupt file'); // Message en pur ASCII : un tiret cadratin dans une source lue en ANSI
// par Delphi ressort en mojibake sur l'appareil.
raise EPMACrypto.Create('Decryption failed - wrong password or corrupt file');
end; end;
end; end;
{$ELSE} {$ELSE}
+9 -6
View File
@@ -46,7 +46,11 @@ type
FBtn: TButton; FBtn: TButton;
FBtnFetch: TButton; FBtnFetch: TButton;
FUrl, FToken, FPwd: TEdit; 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 RunSelfTest(Sender: TObject);
procedure RunFetch(Sender: TObject); procedure RunFetch(Sender: TObject);
procedure Log(const AMsg: string); procedure Log(const AMsg: string);
@@ -190,17 +194,16 @@ begin
end; end;
Log(' recu ' + Length(LRes.Container).ToString + ' octets'); Log(' recu ' + Length(LRes.Container).ToString + ' octets');
if LRes.ETag <> '' then
begin
FETag := LRes.ETag;
Log(' ETag conserve : ' + FETag);
end;
Log(''); Log('');
Log('Dechiffrement...'); Log('Dechiffrement...');
LSw := TStopwatch.StartNew; 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); LPlain := DecryptContainer(LRes.Container, LPwd);
LSw.Stop; LSw.Stop;
FETag := LRes.ETag;
if FETag <> '' then Log(' ETag retenu : ' + FETag);
Log(' ' + LSw.ElapsedMilliseconds.ToString + ' ms pour ' + Log(' ' + LSw.ElapsedMilliseconds.ToString + ' ms pour ' +
Length(LPlain).ToString + ' caracteres'); Length(LPlain).ToString + ' caracteres');