Vlasnik izlazi iz DAL price za ovaj projekat - postaje samostalan proizvod. Preimenovanje je mehanicko (import putanje, imena fajlova/baze/UI naslova), NIJEDNA linija poslovne logike u internal/handler ili internal/service nije dirana - go build, go vet i go test ./... prolaze cisto pod novim imenom. - go.mod: module dal-license-server -> licence-server; 28 import linija u 13 .go fajlova usaglaseno - internal/config/config.go (+test): default DB_NAME licence_db - HTML sabloni (7 stranica) + 7 Playwright e2e spec fajlova: "DAL License Server" -> "Licence Server" u title/nav-brand, testovi usaglaseni u istom prolazu (nista ne moze da se razdvoji) - package.json/package-lock.json/.gitignore/.claude/project.json: ime projekta/binarnog fajla/work_dir - Usput: package.json je u repository.url nosio OTVORENU Gitea lozinku u cistom tekstu - uklonjena (URL sad bez kredencijala). Lozinka je i dalje u staroj git istoriji - preporuka: rotirati je posebno. - CLAUDE.md/README/API/TESTING/docs/SPEC/ARCHITECTURE/SETUP: naslovi, ASCII dijagrami, git clone URL, mysqldump primer, systemd predlozak u SETUP.md zamenjen stvarnim (obrazac terminia.service - journal log + graceful shutdown, ne stari minimalni predlozak) - Debrendiranje: "Univerzalni licencni server za sve DAL proizvode" -> "za vise proizvoda i klijenata"; potpis "Nenad Djukic / DAL d.o.o." -> "Nenad Djukic". NE dirano: nazivi ESIR/ARV/LIGHT_TICKET (tudji proizvodi, ne DAL brend), "DAL" kao stvaran naziv org-a u RBAC modelu (docs/loggerservice/README.md) - to je podatak, ne branding ovog servera. - docs/asp-terminia/, docs/loggerservice/: prozni pomeni imena servera Baza (dal_license_db -> licence_db) i deploy na 151 idu u posebnom koraku, posle preimenovanja Gitea repoa - vidi CLAUDE.md istorijsku belesku na dnu. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
100 lines
3.3 KiB
Markdown
100 lines
3.3 KiB
Markdown
# Licence Server — Specifikacija
|
|
|
|
## Cilj
|
|
|
|
Univerzalni licencni server koji zamenjuje stari `esir-license-server` i podržava više proizvoda: 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*
|