feat(sync): http:// limite au reseau local, Basic des la 1re requete

APK : le clair est permis par Android et trie dans TSyncClient.RefusalReason
(IsLocalHost : RFC 1918, 127.x, .local, .lan, nom sans point) - chacun pointe
vers son propre WebDAV sans IP connue a la compilation ; vers Internet, HTTPS.
PC : Authorization Basic envoye d'emblee, plus de 401 anonyme ni de PUT du
coffre envoye deux fois.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-10-02 23:26:17 +01:00
parent 3051c3c392
commit 0604344c60
4 changed files with 79 additions and 32 deletions
@@ -1,30 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Le trafic en clair n'est permis que vers la BOUCLE LOCALE, et interdit
partout ailleurs.
Le clair est PERMIS ICI, et trie dans le code (PMA.SyncClient.IsLocalHost).
Il l'etait auparavant partout, via usesCleartextTraffic="true". C'etait pour
une seule raison : l'essai local passe par "adb reverse", qui fait voir le
poste comme 127.0.0.1 et parle HTTP. Mais l'attribut ne distingue pas la
boucle locale du reste du monde - une URL mal saisie, ou un serveur repassant
en HTTP, envoyait le jeton en clair sur le reseau sans que rien ne le signale.
Ici la permission est nominative. Le jeton ne peut plus sortir qu'en TLS, et
une URL "http://" vers un vrai hote echoue tout de suite, ce qui est
exactement le comportement voulu : bruyant, pas silencieux.
cleartextTrafficPermitted="false" a la racine n'est pas redondant avec le
defaut d'Android 9+ : il vaut aussi pour les versions anterieures, et il dit
l'intention noir sur blanc.
Chacun pointe vers SON serveur WebDAV, souvent en http:// sur son reseau
local, a une adresse qu'on ne connait pas a la compilation - et Android ne
sait autoriser ni une plage ni un masque, seulement des noms un par un.
Avant tout envoi, la synchro refuse donc tout http:// qui ne vise pas le
reseau local (RFC 1918, boucle, .local, .lan, nom sans point) : vers
Internet, le jeton ne part qu'en HTTPS, et le refus s'affiche au lieu de
laisser passer en silence.
-->
<network-security-config>
<base-config cleartextTrafficPermitted="false" />
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="false">127.0.0.1</domain>
<domain includeSubdomains="false">localhost</domain>
<!-- ponytail: WebDAV local du poste (IP fixe), en clair sur le Wi-Fi.
Le coffre reste chiffre ; le mot de passe WebDAV, lui, passe en
clair. A retirer quand le serveur parlera HTTPS. -->
<domain includeSubdomains="false">192.168.1.28</domain>
</domain-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>