Modo offline con .dat
DevKanan permite que tus apps funcionen sin internet usando archivos .dat firmados con RSA. Hay dos escenarios típicos:
Escenario A: Activación online → uso offline después
El cliente tiene internet la primera vez. Tu app activa contra el servidor, guarda el .dat firmado, y después puede funcionar offline.
from devkanan import Key, LicenseKey, Helpers
from pathlib import Path
LICENSE_FILE = Path("license.dat")
# Si ya hay .dat, validar offline (sin internet)
if LICENSE_FILE.exists():
lk = LicenseKey.load_from_string(
RSA_PUB_KEY,
LICENSE_FILE.read_text(encoding="utf-8-sig"),
max_age_days=7, # re-validar online cada 7 días
)
if lk and lk.is_on_right_machine(Helpers.GetMachineCode(v=2)):
start_app()
exit()
# Primera vez o .dat caducó: activar online
result, msg = Key.activate(
token=ACCESS_TOKEN, rsa_pub_key=RSA_PUB_KEY,
product_id=100000, key="ABCD-...",
machine_code=Helpers.GetMachineCode(v=2),
)
if result is None:
print(f"Activación falló: {msg}")
exit(1)
# Guardar para próximas ejecuciones
LICENSE_FILE.write_text(json.dumps(result_full_response))
start_app()
Escenario B: 1 PC offline sin internet jamás
El admin genera un .dat desde el panel para el machine code del cliente, lo entrega físicamente. La app nunca toca el servidor.
En el panel
- Cliente envía su machine code (lo obtiene corriendo un programa pequeño tuyo con
Helpers.GetMachineCode(v=2)) - En la licencia: Registrar máquina con ese código
- Generar archivo offline (
.dat) y descarga - Envías el
.datpor email / USB al cliente
En la app del cliente
from devkanan import LicenseKey, Helpers
with open("license.dat", encoding="utf-8-sig") as f:
lk = LicenseKey.load_from_string(RSA_PUB_KEY, f.read(), max_age_days=0)
if not lk or not lk.is_on_right_machine(Helpers.GetMachineCode(v=2)):
print("Licencia inválida")
exit(1)
max_age_days=0significa "sin chequeo de freshness" — el.datvale hasta su fecha de expiración.
DevKanan Server (on-premise proxy)
Para clientes corporativos sin internet en su red, instalas el DevKananServer localmente. Sirve .dat a las apps clientes y maneja floating seats automáticamente. Ver self-hosted.