dal-license-server/docs/SPEC.md
djuka dc0114e4b7 Inicijalni commit: kompletna implementacija + dokumentacija + testovi
- Kompletna Go implementacija licencnog servera (19 Go fajlova)
- Klijentski API: activate, deactivate, validate
- Admin API: CRUD licence, stats, audit log
- Admin dashboard: htmx + Go templates
- RSA-2048 potpisivanje licencnih podataka
- Rate limiting i API key autentifikacija
- MySQL migracije i seed podaci (ESIR, ARV, LIGHT_TICKET)
- Unit testovi: keygen, crypto, model, middleware (24 testa)
- Dokumentacija: SPEC.md, ARCHITECTURE.md, SETUP.md, API.md, TESTING.md, README.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 07:42:25 +00:00

100 lines
3.3 KiB
Markdown

# DAL License Server — Specifikacija
## Cilj
Univerzalni licencni server koji zamenjuje stari `esir-license-server` i podržava sve DAL proizvode: ESIR, ARV, Light-Ticket, i buduće aplikacije.
## Principi
- **Jedan server, svi proizvodi** — License Server opslužuje N proizvoda sa jednog mesta
- **RSA potpisivanje** — Server ima private key, klijenti imaju public key ugrađen u binary
- **Offline rad** — Klijentske aplikacije rade offline sa lokalnim `license.enc` fajlom
- **Audit sve** — Svaka akcija (aktivacija, deaktivacija, revoke) se loguje
## Proizvodi
| Proizvod | Prefix | Default limiti |
|----------|--------|----------------|
| ESIR Fiskalizacija | `ESIR-` | max_installations: 1 |
| ARV Evidencija RV | `ARV-` | max_employees: 50, max_readers: 4 |
| Light-Ticket | `LT-` | max_operators: 3 |
## Tipovi licenci
| Tip | Trajanje | Opis |
|-----|----------|------|
| TRIAL | 30 dana | Besplatno testiranje, bez obnove |
| MONTHLY | 30 dana | Mesecna pretplata |
| ANNUAL | 365 dana | Godisnja licenca |
| PERPETUAL | Bez isteka | Kupljena zauvek (expires_at = NULL) |
### Grace period
- Default: 30 dana posle isteka licence
- Konfigurisano per licenca (`grace_days` kolona)
- Tokom grace perioda: pun rad + upozorenje u klijentskoj aplikaciji
- Posle grace perioda: read-only rezim (GET dozvoljen, POST/PUT/DELETE blokiran)
## Licencni kljuc — format
```
{PREFIX}-XXXX-XXXX-XXXX-XXXX
Primeri:
ESIR-K7M2-9P4N-R3W8-J6T1
ARV-A3B5-C8D2-E7F4-G9H6
LT-M4N8-P2Q6-R5S3-T7U9
```
- Prefix se cita iz `products.key_prefix`
- 4 grupe po 4 alfanumericka karaktera
- Karakteri: A-H, J-N, P-Y, 2-9 (bez O/0/I/1 konfuzije)
- Generisanje: `crypto/rand`
## Tok — od kupovine do rada
### 1. Admin kreira licencu
Admin kroz dashboard bira proizvod, unosi podatke firme, tip licence i limite. Server generise jedinstven kljuc.
### 2. Klijent aktivira
Klijentska aplikacija salje serveru: kljuc + machine_fingerprint + app_version + OS. Server proverava validnost, potpisuje licencne podatke RSA private key-em, vraca JSON + RSA potpis. Klijent kreira `license.enc` lokalno.
### 3. Svakodnevni rad (offline)
Aplikacija cita `license.enc`, dekriptuje, proverava RSA potpis (public key), proverava fingerprint i rok. Internet nije potreban.
### 4. Opciona online provera
Jednom dnevno (ako ima internet), aplikacija proverava da licenca nije revocirana na serveru.
## Light-Ticket paketi
| Paket | max_operators | Tip licence |
|-------|--------------|-------------|
| Starter | 3 | MONTHLY ili PERPETUAL |
| Pro | 10 | MONTHLY ili PERPETUAL |
| Enterprise | 0 (neograniceno) | MONTHLY ili PERPETUAL |
- Admin rucno upisuje `max_operators` prilikom kreiranja licence
- Sve features su iste za sve pakete — razlikuje se samo `max_operators`
- Tipovi licence za LT: MONTHLY i PERPETUAL (TRIAL i ANNUAL nisu predvidjeni za V1)
## Korisnici sistema
1. **Admin** — Upravlja licencama kroz dashboard ili API
2. **Klijentske aplikacije** — ESIR, ARV, Light-Ticket komuniciraju sa serverom za aktivaciju/validaciju
## Bezbednost
- `private.pem` nikad u git-u, permisije 600
- Admin API key minimum 32 karaktera
- Rate limiting na activate/validate (zastita od brute force)
- Licencni kljuc u logovima maskiran: `LT-K7M2-****-****-J6T1`
- HTTPS u produkciji (TLS termination na reverse proxy)
---
*Kreirano: mart 2026*