From 3cbfd54c262a33c81fe8debf24ba3d79eabf834e Mon Sep 17 00:00:00 2001 From: r-zakarya <82443831+r-zakarya@users.noreply.github.com> Date: Sat, 15 Aug 2026 00:56:22 +0100 Subject: [PATCH] fix(android): KeyStore.load takes a LoadStoreParameter, not an Object The one-argument overload is load(LoadStoreParameter). Declaring JObject made the bridge look for a method that does not exist - reported at runtime as 'method not found', with nothing at compile time. Same class of mistake as generateSecret earlier: the JNI signature is built from the declared types, so an approximate type is a silent break. --- android-client/PMA.Store.pas | 15 ++++++++++++++- mainApk.pas | 4 +++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/android-client/PMA.Store.pas b/android-client/PMA.Store.pas index 012204d..e701c81 100644 --- a/android-client/PMA.Store.pas +++ b/android-client/PMA.Store.pas @@ -150,6 +150,19 @@ type end; TJGCMParameterSpecX = class(TJavaGenericImport) end; + // KeyStore.load a deux surcharges, et celle a un argument prend un + // LoadStoreParameter - pas un Object. Declarer JObject faisait chercher au + // pont une methode inexistante : "methode introuvable" a l'execution, sans + // rien signaler a la compilation. + JLoadStoreParameterClass = interface(IJavaClass) + ['{1C2D3E4F-5061-7283-94A5-B6C7D8E9F001}'] + end; + [JavaSignature('java/security/KeyStore$LoadStoreParameter')] + JLoadStoreParameter = interface(IJavaInstance) + ['{2D3E4F50-6172-8394-A5B6-C7D8E9F00112}'] + end; + TJLoadStoreParameter = class(TJavaGenericImport) end; + JKeyStoreXClass = interface(JObjectClass) ['{A49283B5-C6D7-E2F3-0415-8091A2B3C4D5}'] function getInstance(&type: JString): JKeyStoreX; cdecl; @@ -157,7 +170,7 @@ type [JavaSignature('java/security/KeyStore')] JKeyStoreX = interface(JObject) ['{B5A394C6-D7E8-F304-1526-91A2B3C4D5E6}'] - procedure load(param: JObject); cdecl; + procedure load(param: JLoadStoreParameter); cdecl; function getKey(alias: JString; password: TJavaArray): JKeyX; cdecl; function containsAlias(alias: JString): Boolean; cdecl; end; diff --git a/mainApk.pas b/mainApk.pas index 5191361..3242a02 100644 --- a/mainApk.pas +++ b/mainApk.pas @@ -290,8 +290,10 @@ begin else Log(' coffre enregistre - AUCUNE protection sur cet appareil'); except + // La classe compte autant que le message : "methode introuvable" + // designe une signature JNI fausse, pas un probleme de stockage. on E: Exception do - Log(' cache non ecrit : ' + E.Message); + Log(' cache non ecrit : ' + E.ClassName + ' - ' + E.Message); end; Log(' ' + LSw.ElapsedMilliseconds.ToString + ' ms pour ' + Length(LPlain).ToString + ' caracteres');