0b0f1e3fcd
The manifest asked for fine and coarse location, camera, phone, phone state and external storage - Delphi's defaults, none of them used. On a password vault those are exactly the wrong signals: whoever reads the app's listing saw a request for position and camera with no possible explanation. The list is written by hand now. A trap on the way: naming the substitution marker inside the comment that explains its removal is enough to bring it back. The substitution is textual and does not care that it lands in a comment. The bench credentials are no longer compiled into a release - the local include is debug-only. Verified in the binary in UTF-8 AND UTF-16: Delphi stores strings as UTF-16, so an ASCII grep returned zero on both sides and proved nothing. The log leaves the home screen in release without leaving the application: a 1.5 s press on the status line brings it back. Nothing secret is in it, but a permanent Log button is development noise, and diagnostics must stay reachable for the day something goes wrong remotely. And the Release configuration did not compile at all, which nobody knew: the two self-checks had their declarations under IFDEF DEBUG and their bodies outside. Invisible as long as one only ever builds Debug. Signing is what remains, and the keystore password is the user's to hold.
117 lines
6.0 KiB
XML
117 lines
6.0 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- BEGIN_INCLUDE(manifest) -->
|
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
xmlns:tools="http://schemas.android.com/tools"
|
|
package="%package%"
|
|
android:versionCode="%versionCode%"
|
|
android:versionName="%versionName%"
|
|
android:installLocation="%installLocation%">
|
|
<uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
|
|
<!-- LA LISTE EST ECRITE ICI, PAS HERITEE. Le marqueur de substitution qui
|
|
se trouvait a cette place y deversait les defauts de Delphi :
|
|
localisation fine et grossiere,
|
|
camera, telephone, etat du telephone, stockage externe en lecture et
|
|
en ecriture. Aucune n'est utilisee, et sur un coffre a mots de passe
|
|
ce sont exactement les mauvais signaux - celui qui lit la fiche de
|
|
l'application y voit une demande de position et d'appareil photo sans
|
|
explication possible.
|
|
|
|
Il n'en reste qu'une : le reseau, pour parler au depot. Les deux de
|
|
biometrie ci-dessous sont deja explicites depuis longtemps. Ajouter
|
|
une permission demande donc de l'ecrire ici, ce qui est le but.
|
|
|
|
NE PAS ECRIRE LE NOM DU MARQUEUR DANS CE COMMENTAIRE : la substitution
|
|
est textuelle et ne regarde pas si elle tombe dans un commentaire -
|
|
le nommer pour l'expliquer suffit a le faire revenir. -->
|
|
<uses-permission android:name="android.permission.INTERNET" />
|
|
<!-- Absente de la liste par defaut de Delphi, et sans elle BiometricPrompt
|
|
leve java.lang.SecurityException a la premiere invite - pas au
|
|
demarrage, donc le defaut ne se voit qu'en essayant d'ouvrir le coffre.
|
|
USE_FINGERPRINT couvre les versions anterieures a Android 9, ou
|
|
BiometricPrompt n'existe pas encore. -->
|
|
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
|
|
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
|
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
|
|
<queries>
|
|
<%queries-child-elements%>
|
|
</queries>
|
|
<!-- networkSecurityConfig REMPLACE usesCleartextTraffic="true", qui
|
|
autorisait le clair vers n'importe quel hote pour la seule raison que
|
|
l'essai local via "adb reverse" parle HTTP. La configuration ne
|
|
l'autorise plus que vers la boucle locale, nommement : le jeton ne
|
|
peut plus sortir qu'en TLS, et une URL http:// vers un vrai hote
|
|
echoue bruyamment au lieu de le laisser passer en clair.
|
|
Voir android-client/android-res/xml/network_security_config.xml. -->
|
|
<!-- allowBackup=false : le repertoire prive contient vault.bin, c'est-a-dire
|
|
le coffre entier. Il est chiffre par une cle qui ne quitte pas la puce,
|
|
donc ce qui sortirait serait inexploitable - mais il sortirait, et une
|
|
sauvegarde cloud n'a rien a faire dans le chemin d'un gestionnaire de
|
|
mots de passe. fullBackupContent et dataExtractionRules ne sont pas
|
|
necessaires une fois la sauvegarde refusee en bloc. -->
|
|
<application
|
|
android:allowBackup="false"
|
|
android:networkSecurityConfig="@xml/network_security_config"
|
|
android:persistent="%persistent%"
|
|
android:restoreAnyVersion="%restoreAnyVersion%"
|
|
android:label="%label%"
|
|
android:debuggable="%debuggable%"
|
|
android:largeHeap="%largeHeap%"
|
|
android:icon="%icon%"
|
|
android:theme="%theme%"
|
|
android:hardwareAccelerated="%hardwareAccelerated%"
|
|
android:resizeableActivity="true"
|
|
android:requestLegacyExternalStorage="true">
|
|
<%provider%>
|
|
<%application-meta-data%>
|
|
<%uses-libraries%>
|
|
<!-- Trigger Google Play services to install the backported photo picker module. -->
|
|
<service
|
|
android:name="com.google.android.gms.metadata.ModuleDependencies"
|
|
android:enabled="false"
|
|
android:exported="false"
|
|
tools:ignore="MissingClass">
|
|
<intent-filter>
|
|
<action android:name="com.google.android.gms.metadata.MODULE_DEPENDENCIES" />
|
|
</intent-filter>
|
|
|
|
<meta-data android:name="photopicker_activity:0:required" android:value="" />
|
|
</service>
|
|
<%services%>
|
|
<!-- Our activity is a subclass of the built-in NativeActivity framework class.
|
|
This will take care of integrating with our NDK code. -->
|
|
<activity
|
|
android:name="com.embarcadero.firemonkey.FMXNativeActivity"
|
|
android:exported="true"
|
|
android:label="%activityLabel%"
|
|
android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode"
|
|
android:launchMode="singleTask">
|
|
<!-- Tell NativeActivity the name of our .so -->
|
|
<meta-data android:name="android.app.lib_name" android:value="%libNameValue%" />
|
|
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.MAIN" />
|
|
|
|
<category android:name="android.intent.category.LAUNCHER" />
|
|
</intent-filter>
|
|
</activity>
|
|
<!-- FMX n'affiche pas BiometricPrompt depuis notre NativeActivity : il
|
|
lance SA PROPRE activite, qui heberge le fragment androidx. Elle
|
|
vit dans fmx.dex.jar, mais Android exige qu'elle soit declaree ici
|
|
- sinon android.content.ActivityNotFoundException a la premiere
|
|
invite, et nulle part avant.
|
|
|
|
Theme translucide du framework : cette activite ne dessine rien
|
|
d'elle-meme, elle ne fait qu'heberger le dialogue systeme. Sans
|
|
cela elle recouvrirait l'ecran d'une surface opaque le temps de
|
|
l'authentification. On prend un theme @android: et non AppCompat,
|
|
absent des ressources generees. -->
|
|
<activity
|
|
android:name="com.embarcadero.firemonkey.biometricauth.BiometricFragmentActivity"
|
|
android:exported="false"
|
|
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
|
|
<%activity%>
|
|
<%receivers%>
|
|
</application>
|
|
</manifest>
|
|
<!-- END_INCLUDE(manifest) -->
|