- 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>
159 lines
7.0 KiB
Markdown
159 lines
7.0 KiB
Markdown
# DAL License Server — Arhitektura
|
|
|
|
## Dijagram sistema
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────┐
|
|
│ DAL LICENSE SERVER │
|
|
│ port: 8090 │
|
|
│ │
|
|
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
|
|
│ │ Admin API │ │ Klijent │ │ Admin Dashboard │ │
|
|
│ │ (CRUD) │ │ API │ │ (htmx) │ │
|
|
│ └──────────┘ └──────────┘ └──────────────────┘ │
|
|
│ │ │ │ │
|
|
│ └──────────────┼───────────────┘ │
|
|
│ │ │
|
|
│ ┌────────┴────────┐ │
|
|
│ │ MySQL baza │ │
|
|
│ │ dal_license_db │ │
|
|
│ └─────────────────┘ │
|
|
│ │
|
|
│ RSA-2048 Private Key (samo ovde, nikad ne izlazi) │
|
|
└─────────────────────────────────────────────────────┘
|
|
▲ ▲ ▲
|
|
│ │ │
|
|
┌────┴────┐ ┌────┴────┐ ┌────┴────────┐
|
|
│ ESIR │ │ ARV │ │ Light-Ticket │
|
|
│ klijent │ │ klijent │ │ klijent │
|
|
└─────────┘ └─────────┘ └──────────────┘
|
|
Svaki ima RSA public key ugrađen u binary
|
|
```
|
|
|
|
## Struktura projekta
|
|
|
|
```
|
|
dal-license-server/
|
|
├── cmd/server/main.go — Entry point, MySQL konekcija, migracije
|
|
├── internal/
|
|
│ ├── config/config.go — .env loading, DSN builder
|
|
│ ├── model/
|
|
│ │ ├── license.go — Product, License, LicenseWithActivation
|
|
│ │ ├── activation.go — Activation model
|
|
│ │ ├── audit.go — AuditEntry model
|
|
│ │ └── request.go — Request/Response strukture
|
|
│ ├── repository/
|
|
│ │ ├── license_repo.go — License CRUD, product queries, stats
|
|
│ │ ├── activation_repo.go — Activation CRUD, deactivate, force release
|
|
│ │ └── audit_repo.go — Audit log insert/list
|
|
│ ├── service/
|
|
│ │ ├── license_service.go — License CRUD biznis logika
|
|
│ │ ├── activation_service.go — Activate, Deactivate, Validate, ForceRelease
|
|
│ │ ├── crypto_service.go — RSA-2048 potpisivanje (SHA-256, PKCS1v15)
|
|
│ │ └── keygen.go — Generisanje ključeva
|
|
│ ├── handler/
|
|
│ │ ├── client_handler.go — POST /api/v1/activate, deactivate, validate
|
|
│ │ ├── admin_handler.go — Admin CRUD API
|
|
│ │ ├── dashboard_handler.go — Dashboard stranice, in-memory sesije
|
|
│ │ └── helpers.go — writeJSON, writeError, clientIP
|
|
│ ├── middleware/
|
|
│ │ ├── auth.go — API key auth (X-API-Key header)
|
|
│ │ └── ratelimit.go — In-memory sliding window rate limiter
|
|
│ └── router/router.go — Sve rute
|
|
├── templates/
|
|
│ ├── layout/base.html — Glavni layout sa navbar-om
|
|
│ └── pages/ — login, dashboard, licenses, audit...
|
|
├── static/
|
|
│ ├── css/style.css — CSS
|
|
│ └── js/htmx.min.js — htmx biblioteka
|
|
├── crypto/
|
|
│ ├── private.pem — RSA-2048 privatni ključ (ne u git-u!)
|
|
│ └── public.pem — RSA javni ključ
|
|
├── migrations/
|
|
│ ├── 001_create_tables.sql — products, licenses, activations, audit_log
|
|
│ └── 002_seed_products.sql — ESIR, ARV, LIGHT_TICKET seed
|
|
└── .env — Konfiguracija (ne u git-u!)
|
|
```
|
|
|
|
## Slojevi
|
|
|
|
### 1. Handler (HTTP)
|
|
|
|
Prima HTTP zahteve, parsira input, poziva servis, vraca JSON ili HTML response. Tri grupe:
|
|
|
|
- **ClientHandler** — API za klijentske aplikacije (activate, deactivate, validate)
|
|
- **AdminHandler** — REST API za admin operacije (CRUD licence, stats, audit)
|
|
- **DashboardHandler** — htmx stranice za admin dashboard
|
|
|
|
### 2. Service (biznis logika)
|
|
|
|
- **LicenseService** — Kreiranje licenci, keygen, validacija tipova, expiry kalkulacija
|
|
- **ActivationService** — Aktivacija sa RSA potpisom, deaktivacija, online validacija, force release
|
|
- **CryptoService** — RSA-SHA256 potpisivanje licencnog JSON-a
|
|
|
|
### 3. Repository (baza)
|
|
|
|
- **LicenseRepo** — License i Product CRUD, filteri, statistike
|
|
- **ActivationRepo** — Activation CRUD, deaktivacija, force release
|
|
- **AuditRepo** — Insert i listanje audit log-a
|
|
|
|
### 4. Middleware
|
|
|
|
- **APIKeyAuth** — Provera `X-API-Key` header-a za admin API
|
|
- **RateLimit** — In-memory sliding window, per-IP, konfigurisani limiti
|
|
|
|
## Baza podataka (MySQL)
|
|
|
|
### Tabele
|
|
|
|
```
|
|
products — Definicija proizvoda (ESIR, ARV, LIGHT_TICKET)
|
|
licenses — Izdate licence sa limitima i feature-ima
|
|
activations — Aktivacije licenci (machine fingerprint, hostname, OS)
|
|
audit_log — Log svih akcija
|
|
```
|
|
|
|
### Relacije
|
|
|
|
```
|
|
products 1 ──── N licenses
|
|
licenses 1 ──── N activations
|
|
licenses 1 ──── N audit_log
|
|
```
|
|
|
|
### Kljucni indeksi
|
|
|
|
- `licenses.license_key` — UNIQUE
|
|
- `activations (license_id, is_active)` — Brza provera aktivnih aktivacija
|
|
- `audit_log (created_at)` — Sortiranje po vremenu
|
|
|
|
## Autentifikacija
|
|
|
|
### Admin API
|
|
- `X-API-Key` header sa API kljucem iz `.env`
|
|
- Minimum 32 karaktera
|
|
|
|
### Admin Dashboard
|
|
- Username/password login (password iz `.env`)
|
|
- In-memory session (cookie-based)
|
|
|
|
### Klijentski API
|
|
- Bez autentifikacije (javni endpointi)
|
|
- Zastiteni rate limiting-om
|
|
|
|
## Kripto
|
|
|
|
- **RSA-2048** — Potpisivanje licencnih podataka pri aktivaciji
|
|
- **SHA-256** — Hash za machine fingerprint
|
|
- **PKCS1v15** — Shema potpisa
|
|
- Isti par kljuceva za sve proizvode
|
|
- Private key samo na serveru, public key ugrađen u klijentske binary-je
|
|
|
|
## Migracije
|
|
|
|
Pokrecu se automatski pri startu servera (`runMigrations` u `main.go`). DSN koristi `multiStatements=true` za izvrsavanje SQL fajlova sa vise naredbi.
|
|
|
|
---
|
|
|
|
*Mart 2026*
|