Ciclo de vida del cliente (activación offline)
Este documento describe únicamente el ciclo de vida del lado del cliente: instalación del binario, activación de cada máquina en modo offline, verificación en ejecución y cambio entre varias licencias.
Recordatorio del principio rector n.º 2: el binario SCA NUNCA realiza llamadas HTTP. Toda comunicación servidor ↔ cliente pasa por email + acciones del usuario en el sitio PHP.
Recapitulación cronológica (3 fases, en orden)
Fase A — Primera instalación (1 vez por cliente)
- Compra en
codefixture.com/pricing.php→ pago (Stripe o transferencia en V1). - Recepción de un email "paquete listo" cuando el operador haya entregado el binario.
- Login en
codefixture.com/login.php(UUID en V1; email/password en V2).
Fase B — Para CADA plataforma utilizada (Linux, macOS, Windows…)
- En
/downloads.php, hacer clic en Descargar en la línea de la plataforma deseada. Recibe un archivo:sca-<version>-<platform>-<id>.tar.gz(Linux)sca-<version>-<platform>-<id>.dmg(macOS)sca-<version>-<platform>-<id>.zip(Windows)
- Verificar el SHA-256 (recomendado):
→ comparar con el valor mostrado en
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. - Extraer el paquete. Contenido:
staticcodeaudit-<platform>(el binario ejecutable)README.txt(procedimiento de activación offline)NOTICE.txt(menciones de licencia + recordatorio del principio offline)
Fase C — Para CADA máquina activada (hasta max_machines)
- En la máquina objetivo, lance SCA por primera vez:
→ El footer SCA (cf.
./staticcodeaudit-linux-x86_64 # cualquier comandosca/license_footer.py) muestra un recuadro ASCII con:- el número de serie de la licencia
- la huella de la máquina (SHA-256 64 caracteres hex), calculada localmente a partir de hostname + arch + OS + MAC, sin llamada de red.
- Copiar estos dos valores (memoria USB, teléfono, copiar-pegar) hacia un puesto conectado a Internet.
- En ese puesto conectado, abrir
codefixture.com/activate.phpe introducir:- Número de serie
- Huella de la máquina
- Plataforma (selección en el desplegable) → hacer clic en Activar.
- El sitio devuelve un archivo
license.keyfirmado (incluyendo esta huella en la lista firmada). Descargar ese archivo. - Trasladar el
license.keya la máquina objetivo (USB / scp / AirDrop) y colocarlo en la misma carpeta que el binario. - Volver a lanzar SCA:
→ SCA:
./staticcodeaudit-linux-x86_64 scan ~/mi-proyecto- lee el
license.keylocal - verifica la firma HMAC HKDF (clave pública embebida — cero llamadas de red)
- verifica que su huella local ∈ lista firmada
- verifica
expires_at > today - lanza el escaneo
- footer al final:
Estado: OK (máquina activada)
- lee el
Tabla acción ↔ endpoint (para los desarrolladores PHP)
| Acción cliente | Página PHP | Endpoint admin (consumido por PHP) |
|---|---|---|
| Conexión | login.php |
POST /auth/token |
| Ver perfil + suscripciones + licencias | account.php |
GET /clients/<id>/, /subscriptions/, /licenses/ |
| Listar paquetes descargables | downloads.php |
GET /clients/<id>/downloads/ |
| Descargar un paquete | clic directo | GET /builds/<id>/download (URL firmada TTL 15 min) |
| Activar una máquina (challenge manual) | activate.php |
POST /activations (PHP retransmite serial + huella introducida) |
| Listar máquinas activas | account.php |
GET /clients/<id>/activations/ |
| Desactivar una máquina | account.php (botón) |
PATCH /clients/<id>/activations/<id>/ {deactivate: true} |
| Listar facturas | invoices.php |
GET /clients/<id>/invoices/ |
| Descargar PDF factura | invoices.php (botón) |
GET /clients/<id>/invoices/<id>/pdf |
| Descargar Factur-X (PDF/A-3 + XML CII) | invoices.php |
GET /clients/<id>/invoices/<id>/facturx |
1 Verificación en tiempo de ejecución (sin Internet)
En cada ejecución sobre una máquina ya activada, SCA:
- Lee el license.key desde el sistema de archivos local
- Verifica la firma HMAC HKDF (integridad + no falsificación — clave pública embebida en el binario)
- Verifica la huella local ∈ fingerprints del payload
- Verifica expires_at > today
- Ninguna llamada de red, ningún ping, ninguna telemetría.
Consecuencia: una revocación del lado del admin (§8) solo es efectiva en la próxima renovación de licencia (el usuario deberá volver a descargar un nuevo license.key que ya no incluirá su huella o tendrá un expires_at más cercano).
2 Multi-licencias en una misma máquina — SCA_LICENSE_PATH
Si el cliente tiene 2 licencias diferentes (ej. Solo+ personal + Team equipo — caso poco frecuente, cf. §7.4), puede alternar entre ellas sin desplazar ningún archivo:
SCA_LICENSE_PATH=~/licences/team.key ./sca scan ~/proyecto-pro
SCA_LICENSE_PATH=~/licences/solo-plus.key ./sca scan ~/proyecto-personal
Orden de prioridad de SCA para encontrar su license.key:
$SCA_LICENSE_KEY(contenido JSON crudo, definido por un wrapper)$SCA_LICENSE_PATH(ruta hacia un archivo .key — recomendado para el switching multi-licencias)./license.key(cwd, convención por defecto)
3 Casos especiales del lado del cliente
| Caso | Procedimiento |
|---|---|
| Añadir una N-ésima máquina | Repetir fase C (pasos 7→12) en la nueva máquina. Cuota max_machines consumida en 1. |
| Reinstalación del SO en la misma máquina | La huella cambia → repetir fase C. Si la cuota está alcanzada, desactivar primero la huella antigua. |
| Transferencia puesto a puesto | Desactivar el antiguo desde /account.php → repetir fase C en el nuevo. |
| Máquina perdida/robada | Desactivar desde /account.php (efectivo en la próxima renovación, cf. §8.1). |
Archivo license.key perdido |
Repetir fase C — POST /activations es idempotente (misma huella = mismo slot). |
| Renovación anual | Ver §6 — el cliente repite el paso 4 (descarga del nuevo paquete) + paso 11 (traslado del nuevo license.key) en cada máquina. |
El operador normalmente no tiene nada que hacer para estos casos comunes, salvo consulta diagnóstica mediante Django admin (StaticCodeAudit → Activation).