diff --git a/AndroidManifest.template.xml b/AndroidManifest.template.xml
index 61006f1..6be2ed1 100644
--- a/AndroidManifest.template.xml
+++ b/AndroidManifest.template.xml
@@ -77,6 +77,21 @@
+
+
<%activity%>
<%receivers%>
diff --git a/android-client/PMA.Store.pas b/android-client/PMA.Store.pas
index 1348cb4..9073b83 100644
--- a/android-client/PMA.Store.pas
+++ b/android-client/PMA.Store.pas
@@ -92,7 +92,16 @@ function VaultNeedsAuth: Boolean;
/// range : l'appelant redemande alors, et le prochain enregistrement le pose.
function LoadVault(out APlainJson, AETag, ASyncPwd: string): Boolean;
-/// Efface le coffre local. A appeler au moindre doute : il se retelecharge.
+/// Pourquoi la derniere lecture a echoue. Vide apres un succes.
+///
+/// LoadVault N'EFFACE RIEN de lui-meme. Un cache detruit par une routine de
+/// lecture, c'est un diagnostic errone qui coute un retelechargement et
+/// 4,5 s de derivation - et qui emporte la cause avec lui. Elle rapporte,
+/// l'appelant decide.
+function LastStoreError: string;
+
+/// Efface le coffre local. Seul un geste explicite de l'utilisateur, ou une
+/// certitude, devrait l'appeler : il se retelecharge, mais pas gratuitement.
procedure ClearVault;
/// Chemin du fichier, pour le journal et les tests.
@@ -129,6 +138,14 @@ const
VER_WRAP = 3; // AES aleatoire enveloppee par la cle publique RSA
RSA_TRANSFORM = 'RSA/ECB/OAEPWithSHA-256AndMGF1Padding';
+var
+ FLastStoreError: string = '';
+
+function LastStoreError: string;
+begin
+ Result := FLastStoreError;
+end;
+
function VaultPath: string;
begin
// GetHomePath sur Android = /data/data//files, prive a l'app.
@@ -678,6 +695,7 @@ begin
APlainJson := '';
AETag := '';
ASyncPwd := '';
+ FLastStoreError := '';
if not TFile.Exists(VaultPath) then Exit;
try
@@ -743,18 +761,11 @@ begin
on E: Exception do
begin
Result := False;
- // NE PAS effacer sur un simple defaut d'authentification : le coffre est
- // intact, c'est l'utilisateur qui n'a pas presente son schema ou qui a
- // laisse expirer le delai. L'effacer imposerait un retelechargement et
- // 4,5 secondes de derivation pour une empreinte annulee.
- //
- // On efface en revanche quand la cle est REELLEMENT perdue
- // (reinstallation, Keystore vide, nouvelle empreinte enrolee qui
- // invalide la cle) ou quand le fichier est altere : dans ces cas il ne
- // redeviendra jamais lisible.
- if (Pos('UserNotAuthenticated', E.Message) = 0) and
- (Pos('NotAuthenticated', E.ClassName) = 0) then
- ClearVault;
+ // ON N'EFFACE PAS. Le tri « cle perdue / pas authentifie » se faisait
+ // ici sur le texte du message, et une erreur de tri detruisait le cache
+ // en emportant la seule trace de sa cause. L'appelant a le journal et le
+ // contexte - lui seul sait si l'utilisateur a demande quelque chose.
+ FLastStoreError := E.ClassName + ': ' + E.Message;
end;
end;
end;
diff --git a/mainApk.pas b/mainApk.pas
index 949f2f7..80e801d 100644
--- a/mainApk.pas
+++ b/mainApk.pas
@@ -727,8 +727,11 @@ begin
end
else
begin
- Status('Coffre local illisible - retelechargement necessaire');
+ // ShowUnlock AVANT le message : il repositionne le statut selon ce que
+ // l'appareil detient, et ecraserait donc l'explication.
ShowUnlock;
+ Log('Coffre local illisible : ' + LastStoreError);
+ Status('Coffre local illisible - voir le journal');
end;
end;