- 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>
27 lines
556 B
Go
27 lines
556 B
Go
package service
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"math/big"
|
|
"strings"
|
|
)
|
|
|
|
// Characters: A-H, J-N, P-Y, 2-9 (no O/0/I/1)
|
|
const keyChars = "ABCDEFGHJKMNPQRSTUVWXY23456789"
|
|
|
|
func GenerateKey(prefix string) (string, error) {
|
|
groups := make([]string, 4)
|
|
for i := range groups {
|
|
group := make([]byte, 4)
|
|
for j := range group {
|
|
idx, err := rand.Int(rand.Reader, big.NewInt(int64(len(keyChars))))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
group[j] = keyChars[idx.Int64()]
|
|
}
|
|
groups[i] = string(group)
|
|
}
|
|
return prefix + strings.Join(groups, "-"), nil
|
|
}
|