Skip to main content

Cycle de vie côté client (offline)

Niveau Débutant
Temps de lecture ⏱ 10 min
mots 789
Sujets licenseactivation

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)

  1. Achat sur codefixture.com/pricing.php → paiement (Stripe ou virement V1).
  2. Réception d'un email "package prêt" quand l'opérateur a livré le binaire.
  3. Login sur codefixture.com/login.php (UUID en V1 ; email/password en V2).

Phase B — Pour CHAQUE plateforme utilisée (Linux, macOS, Windows…)

  1. 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)
  2. Vérifier le SHA-256 (recommandé) :
    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
    
    → comparer avec la valeur affichée dans /downloads.php.
  3. 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)

  1. Sur la machine cible, lancer SCA une 1ère fois :
    ./staticcodeaudit-linux-x86_64    # n'importe quelle commande
    
    → Le footer SCA (cf. sca/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.
  2. Copier ces deux valeurs (clé USB, téléphone, copier-coller) vers un poste connecté à Internet.
  3. Sur ce poste connecté, ouvrir codefixture.com/activate.php et saisir :
    • Numéro de série
    • Empreinte machine
    • Plateforme (sélection dans la liste déroulante) → cliquer Activer.
  4. Le site retourne un fichier license.key signé (incluant cette empreinte dans la liste signée). Télécharger ce fichier.
  5. Rapatrier le license.key sur la machine cible (clé USB / scp / AirDrop) et le placer dans le même dossier que le binaire.
  6. Relancer SCA :
    ./staticcodeaudit-linux-x86_64 scan ~/mon-projet
    
    → SCA :
    • lit license.key local
    • 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)

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 :

  1. $SCA_LICENSE_KEY (contenu JSON brut, défini par un wrapper)
  2. $SCA_LICENSE_PATH (chemin vers un fichier .key — recommandé pour le switching multi-licences)
  3. ./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 (StaticCodeAuditActivation).