Skip to main content

Ciclo de vida del cliente (offline)

Nivel Principiante
Tiempo de lectura ⏱ 10 min
palabras 826
Temas licenseactivation

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)

  1. Compra en codefixture.com/pricing.php → pago (Stripe o transferencia en V1).
  2. Recepción de un email "paquete listo" cuando el operador haya entregado el binario.
  3. Login en codefixture.com/login.php (UUID en V1; email/password en V2).

Fase B — Para CADA plataforma utilizada (Linux, macOS, Windows…)

  1. 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)
  2. Verificar el SHA-256 (recomendado):
    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
    
    → comparar con el valor mostrado en /downloads.php.
  3. 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)

  1. En la máquina objetivo, lance SCA por primera vez:
    ./staticcodeaudit-linux-x86_64    # cualquier comando
    
    → El footer SCA (cf. sca/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.
  2. Copiar estos dos valores (memoria USB, teléfono, copiar-pegar) hacia un puesto conectado a Internet.
  3. En ese puesto conectado, abrir codefixture.com/activate.php e introducir:
    • Número de serie
    • Huella de la máquina
    • Plataforma (selección en el desplegable) → hacer clic en Activar.
  4. El sitio devuelve un archivo license.key firmado (incluyendo esta huella en la lista firmada). Descargar ese archivo.
  5. Trasladar el license.key a la máquina objetivo (USB / scp / AirDrop) y colocarlo en la misma carpeta que el binario.
  6. Volver a lanzar SCA:
    ./staticcodeaudit-linux-x86_64 scan ~/mi-proyecto
    
    → SCA:
    • lee el license.key local
    • 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)

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:

  1. $SCA_LICENSE_KEY (contenido JSON crudo, definido por un wrapper)
  2. $SCA_LICENSE_PATH (ruta hacia un archivo .key — recomendado para el switching multi-licencias)
  3. ./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 (StaticCodeAuditActivation).