feat(server): un port occupe ne tue plus le demarrage

Le lien n'etait garde par rien : un port pris levait, et l'application
s'ouvrait sur une boite d'erreur. Trois essais desormais - le premier
honore le port de config.txt, que l'utilisateur a peut-etre choisi
expres, les suivants prennent un ephemere.

SE LIER EST LE TEST. Sonder le port avant serait plus faible - un service
qui ecoute sans repondre passerait inapercu - et sujet a une course : le
port peut etre pris entre le sondage et le lien. Chaque deplacement est
journalise, un serveur qui change de port en silence etant pire qu'un
serveur qui refuse de demarrer.

Trouve en chemin : Randomize n'est appele NULLE PART, donc le port
"aleatoire" de port=0 etait le meme a chaque lancement - l'aleatoire cense
compliquer un balayage exterieur n'existait pas. Il vient maintenant de
RandomBytes, donc de BCryptGenRandom, deja utilise pour le jeton d'acces.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-09-05 08:45:32 +01:00
parent 77688a5af2
commit bf9b62a541
2 changed files with 70 additions and 9 deletions
+12 -1
View File
@@ -250,6 +250,7 @@ Détails :
Fichier `config.txt` à côté de l'exe (tous champs optionnels) :
```
port=8765 # 0 ou absent = port aléatoire ephemeral (49152-65535)
# occupé = jusqu'à 3 essais, replis en éphémère
debug=true # affiche PanelTop (Start/Stop, log memo)
require_token=false # désactive le token validation (curl/Postman direct)
require_process_check=false # désactive le PID-on-socket check
@@ -264,7 +265,17 @@ Le serveur Indy n'accepte une requête que si elle a :
- OU cookie `pm_token=<token>; HttpOnly; SameSite=Strict; Path=/`
Au start :
- Port aléatoire dans `[49152, 65535]` si pas configuré
- Port aléatoire dans `[49152, 65535]` si pas configuré. Tiré de
`PM.Crypto.RandomBytes` (BCryptGenRandom), **pas** de `Random` : `Randomize`
n'est appelé nulle part, donc `Random` rendait la même suite à chaque
lancement — le port « aléatoire » était en réalité le même tous les jours, ce
qui vidait de son sens l'aléatoire censé compliquer un balayage.
- **Port occupé → jusqu'à 3 essais** (`BindAttempts`). Le premier honore le port
demandé ; les suivants prennent un éphémère. Se lier EST le test : un sondage
préalable serait plus faible (un service qui écoute sans répondre passerait
inaperçu) et sujet à une course (le port peut être pris entre le sondage et le
lien). Chaque déplacement est journalisé — un serveur qui change de port en
silence est pire qu'un serveur qui refuse de démarrer.
- Token random 32-chars hex généré
- WebView2 navigate vers `http://127.0.0.1:{port}/index.html?pmt={token}`
- JS strip le `?pmt=...` du URL bar via `history.replaceState`