Cycle de vie côté client (activation offline)
Ce document décrit uniquement le cycle de vie côté client : installation du binaire, activation de chaque machine en mode offline, vérification runtime et bascule entre plusieurs licences.
Rappel principe directeur n°2 : le binaire SCA ne fait JAMAIS d'appel HTTP. Toute communication serveur ↔ client passe par email + actions du user sur le site PHP.
Récap chronologique (3 phases, dans l'ordre)
Phase A — 1ère installation (1 fois par client)
- Achat sur
codefixture.com/pricing.php→ paiement (Stripe ou virement V1). - Réception d'un email "package prêt" quand l'opérateur a livré le binaire.
- Login sur
codefixture.com/login.php(UUID en V1 ; email/password en V2).
Phase B — Pour CHAQUE plateforme utilisée (Linux, macOS, Windows…)
- Sur
/downloads.php, cliquer Télécharger sur la ligne de la plateforme voulue. Reçoit un fichier :sca-<version>-<platform>-<id>.tar.gz(Linux)sca-<version>-<platform>-<id>.dmg(macOS)sca-<version>-<platform>-<id>.zip(Windows)
- Vérifier le SHA-256 (recommandé) :
→ comparer avec la valeur affichée dans
shasum -a 256 sca-1.0.0-linux-x86_64-acme.tar.gz # macOS / Linux certutil -hashfile sca-1.0.0-win-x86_64-acme.zip SHA256 # Windows/downloads.php. - Extraire le package. Contenu :
staticcodeaudit-<platform>(le binaire exécutable)README.txt(procédure d'activation offline)NOTICE.txt(mentions de licence + rappel principe offline)
Phase C — Pour CHAQUE machine activée (jusqu'à max_machines)
- Sur la machine cible, lancer SCA une 1ère fois :
→ Le footer SCA (cf.
./staticcodeaudit-linux-x86_64 # n'importe quelle commandesca/license_footer.py) affiche un encadré ASCII avec :- le numéro de série de la licence
- l'empreinte machine (SHA-256 64 chars hex), calculée localement à partir de hostname + arch + OS + MAC, sans appel réseau.
- Copier ces deux valeurs (clé USB, téléphone, copier-coller) vers un poste connecté à Internet.
- Sur ce poste connecté, ouvrir
codefixture.com/activate.phpet saisir :- Numéro de série
- Empreinte machine
- Plateforme (sélection dans la liste déroulante) → cliquer Activer.
- Le site retourne un fichier
license.keysigné (incluant cette empreinte dans la liste signée). Télécharger ce fichier. - Rapatrier le
license.keysur la machine cible (clé USB / scp / AirDrop) et le placer dans le même dossier que le binaire. - Relancer SCA :
→ SCA :
./staticcodeaudit-linux-x86_64 scan ~/mon-projet- lit
license.keylocal - vérifie la signature HMAC HKDF (clé publique embarquée — zéro appel réseau)
- vérifie que son empreinte locale ∈ liste signée
- vérifie
expires_at > today - lance le scan
- footer en fin :
Statut : OK (machine activée)
- lit
Tableau action ↔ endpoint (pour les devs PHP)
| Action client | Page PHP | Endpoint admin (consommé par PHP) |
|---|---|---|
| Connexion | login.php |
POST /auth/token |
| Voir profil + abonnements + licences | account.php |
GET /clients/<id>/, /subscriptions/, /licenses/ |
| Lister packages téléchargeables | downloads.php |
GET /clients/<id>/downloads/ |
| Télécharger un package | clic direct | GET /builds/<id>/download (URL signée TTL 15 min) |
| Activer une machine (challenge manuel) | activate.php |
POST /activations (PHP relaie serial + empreinte saisie) |
| Lister machines actives | account.php |
GET /clients/<id>/activations/ |
| Désactiver une machine | account.php (bouton) |
PATCH /clients/<id>/activations/<id>/ {deactivate: true} |
| Lister factures | invoices.php |
GET /clients/<id>/invoices/ |
| Télécharger PDF facture | invoices.php (bouton) |
GET /clients/<id>/invoices/<id>/pdf |
| Télécharger Factur-X (PDF/A-3 + XML CII) | invoices.php |
GET /clients/<id>/invoices/<id>/facturx |
1 Vérification runtime (sans Internet)
À chaque exécution sur une machine déjà activée, SCA :
- Lit license.key depuis le filesystem local
- Vérifie la signature HMAC HKDF (intégrité + non-falsification — clé publique embarquée dans le binaire)
- Vérifie l'empreinte locale ∈ fingerprints du payload
- Vérifie expires_at > today
- Aucun appel réseau, aucun ping, aucune télémétrie.
Conséquence : une révocation côté admin (§8) n'est effective qu'au prochain renouvellement de licence (le user devra retélécharger un nouveau license.key qui n'inclura plus son empreinte ou aura une expires_at rapprochée).
2 Multi-licences sur une même machine — SCA_LICENSE_PATH
Si le client a 2 licences différentes (ex. Solo+ perso + Team équipe — cas rare, cf. §7.4), il peut basculer entre elles sans déplacer de fichier :
SCA_LICENSE_PATH=~/licences/team.key ./sca scan ~/projet-pro
SCA_LICENSE_PATH=~/licences/solo-plus.key ./sca scan ~/projet-perso
Ordre de priorité de SCA pour trouver son license.key :
$SCA_LICENSE_KEY(contenu JSON brut, défini par un wrapper)$SCA_LICENSE_PATH(chemin vers un fichier .key — recommandé pour le switching multi-licences)./license.key(cwd, convention par défaut)
3 Cas spéciaux côté client
| Cas | Procédure |
|---|---|
| Ajouter une N-ième machine | Refaire phase C (étapes 7→12) sur la nouvelle machine. Quota max_machines consommé d'1. |
| Réinstallation OS sur la même machine | L'empreinte change → refaire phase C. Si quota atteint, désactiver l'ancienne empreinte avant. |
| Transfert poste à poste | Désactiver l'ancien depuis /account.php → refaire phase C sur le nouveau. |
| Machine perdue/volée | Désactiver depuis /account.php (effectif au prochain renouvellement, cf. §8.1). |
Fichier license.key perdu |
Refaire phase C — POST /activations est idempotent (même empreinte = même slot). |
| Renouvellement annuel | Voir §6 — le client refait étape 4 (download nouveau package) + étape 11 (rapatriement nouveau license.key) sur chaque machine. |
L'opérateur n'a normalement rien à faire pour ces cas courants, sauf consultation diagnostic via Django admin (StaticCodeAudit → Activation).