# DOOZEN — instructions de développement

Copyright 2026 Vincent Gallet - DOOZEN consulting

## Environnement
PHP 8.3, PDO MySQL, sodium, MySQL 8/InnoDB, hébergement PlanetHoster.
API publique : https://licences.doozen.fr/api/v1/ ; MySQL accessible uniquement depuis PHP.
Lire INSTALLATION.md et schema.sql avant toute modification.

## Contraintes
- Communiquer et documenter en français.
- Aucune requête SQL arbitraire reçue du client. PDO préparé avec émulation désactivée.
- Aucune clé privée, aucun mot de passe ni jeton dans Git, les URLs ou les journaux.
- Garder private/ et cli/ hors du document root. Ne publier que public/.
- Authentifier chaque installation par son jeton ; vérifier produit et identifiant d'installation.
- Verrouiller la licence dans une transaction avant toute modification du quota.
- HTTPS obligatoire, aucun CORS permissif. Ne pas prendre X-Forwarded-For comme identité sans proxy explicitement approuvé.
- Ne jamais utiliser une panne réseau comme preuve qu'une licence est valide.
- Conserver l'UUID à travers les redémarrages et mises à jour. Il identifie une installation et ne prouve pas l'identité physique d'une machine.
- Signatures Ed25519 : clé privée exclusivement serveur, clé publique embarquée dans l'outil.
- Gestion initiale en CLI privée ; aucune interface web d'administration à ajouter sans authentification forte, contrôle des droits, CSRF et échappement HTML.
- Ne pas ajouter de connexion OpenBee à ce serveur de licences. Si un outil client en nécessite une, créer son fichier de configuration séparé avec [OPENBEE], openbee_api_url et openbee_api_token ; ne jamais envoyer ce secret au serveur de licences.
- Ajouter Copyright YYYY Vincent Gallet - DOOZEN consulting dans les fichiers produits.

## Validation
Exécuter php -l sur tous les PHP. Faire les tests de tests/RECETTE.md sur une base dédiée avant production.
Tester deux activations concurrentes pour une licence limitée à une installation.
Vérifier signature, nonce, produit, UUID, expiration et panne réseau côté client.
Ne pas annoncer un déploiement ni des tests MySQL si aucun serveur n'a été utilisé.

## Évolutions
Le client livré contrôle en ligne. Implémenter le cache hors connexion seulement avec vérification complète de la signature et une politique explicite de révocation/horloge ; ne pas accepter un JSON local non signé.
Pour un service Python sans interface, employer une CLI claire ; pour l'utilisateur final, une fenêtre simple adaptée à l'interface existante, sans afficher les secrets.
