fix(android): l'exception etait lue apres sa liberation
Register et Login mettaient leur gestionnaire d'erreur en file avec TThread.Queue, puis y lisaient E.ClassName et E.Message. Or la file s'execute sur le thread principal bien apres que le except a rendu la main, et Delphi libere E en sortant du gestionnaire : c'etait une lecture apres liberation. Elle rendait un message vide - "Login failed: EPMACrypto - " sans la raison - et parfois une violation d'acces qui remontait a FMX sans rien laisser au journal. Le vrai motif de l'echec n'a donc jamais ete affiche. On ne met plus en file que des chaines, qui survivent. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+48
-6
@@ -1935,14 +1935,25 @@ begin
|
|||||||
end);
|
end);
|
||||||
except
|
except
|
||||||
on E: Exception do
|
on E: Exception do
|
||||||
|
begin
|
||||||
|
// LE TEXTE EST PRIS ICI, PAS DANS LA FILE.
|
||||||
|
//
|
||||||
|
// TThread.Queue s'execute sur le thread principal bien apres que le
|
||||||
|
// except a rendu la main - et Delphi libere l'objet E en sortant du
|
||||||
|
// gestionnaire. Lire E.Message depuis la file etait donc une lecture
|
||||||
|
// apres liberation : elle rendait un message vide, et parfois une
|
||||||
|
// violation d'acces qui remontait a FMX sans rien laisser au journal.
|
||||||
|
// On ne met en file que des chaines, qui, elles, survivent.
|
||||||
|
var LWhy := E.ClassName + ' - ' + E.Message;
|
||||||
TThread.Queue(nil,
|
TThread.Queue(nil,
|
||||||
procedure
|
procedure
|
||||||
begin
|
begin
|
||||||
SetBusy(False);
|
SetBusy(False);
|
||||||
Log('Register failed: ' + E.ClassName + ' - ' + E.Message);
|
Log('Register failed: ' + LWhy);
|
||||||
StatusErr('Could not create the vault - see log');
|
StatusErr('Could not create the vault - see log');
|
||||||
end);
|
end);
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
end).Start;
|
end).Start;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -1978,7 +1989,9 @@ begin
|
|||||||
begin
|
begin
|
||||||
try
|
try
|
||||||
FVaultPwd := APwd; // avant l'ouverture : c'est lui qui la fait
|
FVaultPwd := APwd; // avant l'ouverture : c'est lui qui la fait
|
||||||
|
Log('login: opening the local container');
|
||||||
LPlain := OpenContainer(LoadLocalContainer, APwd);
|
LPlain := OpenContainer(LoadLocalContainer, APwd);
|
||||||
|
Log(Format('login: opened, %d chars', [Length(LPlain)]));
|
||||||
LOwner := '';
|
LOwner := '';
|
||||||
LDoc := TJSONObject.ParseJSONValue(LPlain) as TJSONObject;
|
LDoc := TJSONObject.ParseJSONValue(LPlain) as TJSONObject;
|
||||||
if LDoc <> nil then
|
if LDoc <> nil then
|
||||||
@@ -1994,31 +2007,60 @@ begin
|
|||||||
TThread.Queue(nil, procedure
|
TThread.Queue(nil, procedure
|
||||||
begin Log('Vault belongs to ' + LOwner + ', not ' + AUser); end);
|
begin Log('Vault belongs to ' + LOwner + ', not ' + AUser); end);
|
||||||
|
|
||||||
|
Log('login: writing the cache');
|
||||||
SaveVault(LPlain, FETag, APwd, BiometricAvailable, False, FPinSealed,
|
SaveVault(LPlain, FETag, APwd, BiometricAvailable, False, FPinSealed,
|
||||||
FKey, FKeySalt, FKeyIters);
|
FKey, FKeySalt, FKeyIters);
|
||||||
|
Log('login: cache written');
|
||||||
TThread.Queue(nil,
|
TThread.Queue(nil,
|
||||||
procedure
|
procedure
|
||||||
begin
|
begin
|
||||||
|
// LE RETOUR SUR LE THREAD PRINCIPAL N'EST GARDE PAR RIEN, et c'est
|
||||||
|
// le seul endroit du chemin qui ne l'etait pas : ni le except du
|
||||||
|
// thread, ni celui du pont ne le couvrent - il s'execute bien apres
|
||||||
|
// que les deux ont rendu la main. Une faute ici remontait donc a
|
||||||
|
// FMX, qui montrait "Access violation" pendant que le journal
|
||||||
|
// s'arretait sans un mot.
|
||||||
|
try
|
||||||
|
Log('login: adopting');
|
||||||
SetBusy(False);
|
SetBusy(False);
|
||||||
if LOwner <> '' then FUser := LOwner else FUser := AUser;
|
if LOwner <> '' then FUser := LOwner else FUser := AUser;
|
||||||
// Meme regle qu'a la creation : ce mot de passe ouvre le conteneur
|
// Meme regle qu'a la creation : ce mot de passe ouvre le
|
||||||
// local et s'arrete la.
|
// conteneur local et s'arrete la.
|
||||||
FVaultPwd := APwd;
|
FVaultPwd := APwd;
|
||||||
|
|
||||||
AdoptVault(LPlain);
|
AdoptVault(LPlain);
|
||||||
|
Log('login: done');
|
||||||
|
except
|
||||||
|
on E: Exception do
|
||||||
|
begin
|
||||||
|
SetBusy(False);
|
||||||
|
Log('login: adopt FAILED: ' + E.ClassName + ' - ' + E.Message);
|
||||||
|
StatusErr('Could not display the vault - see log');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end);
|
end);
|
||||||
except
|
except
|
||||||
on E: Exception do
|
on E: Exception do
|
||||||
|
begin
|
||||||
|
// LE TEXTE EST PRIS ICI, PAS DANS LA FILE.
|
||||||
|
//
|
||||||
|
// TThread.Queue s'execute sur le thread principal bien apres que le
|
||||||
|
// except a rendu la main - et Delphi libere l'objet E en sortant du
|
||||||
|
// gestionnaire. Lire E.Message depuis la file etait donc une lecture
|
||||||
|
// apres liberation : elle rendait un message vide, et parfois une
|
||||||
|
// violation d'acces qui remontait a FMX sans rien laisser au journal.
|
||||||
|
// On ne met en file que des chaines, qui, elles, survivent.
|
||||||
|
var LWhy := E.ClassName + ' - ' + E.Message;
|
||||||
TThread.Queue(nil,
|
TThread.Queue(nil,
|
||||||
procedure
|
procedure
|
||||||
begin
|
begin
|
||||||
SetBusy(False);
|
SetBusy(False);
|
||||||
Log('Login failed: ' + E.ClassName + ' - ' + E.Message);
|
Log('Login failed: ' + LWhy);
|
||||||
// GCM echoue a sa verification quand la cle est fausse, et son
|
// GCM echoue a sa verification quand la cle est fausse, et son
|
||||||
// message ne le dit pas. Le cas de loin le plus frequent.
|
// message ne le dit pas. Le cas de loin le plus frequent.
|
||||||
Status('Wrong master password');
|
StatusErr('Wrong master password');
|
||||||
end);
|
end);
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
end).Start;
|
end).Start;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user