school-timetracker/backend/license.go

72 lines
1.6 KiB
Go

package main
import (
"crypto/ed25519"
"encoding/base64"
"encoding/hex"
"encoding/json"
"fmt"
"os"
"time"
)
const PublicKeyHex = "ab8287380d4f26b66b3e8067e179a2e304dcb3c4070963edd213cca9b225978f"
func VerifyLicenseFile() (*LicenseData, error) {
bytes, err := os.ReadFile("license.lic")
if err != nil {
return nil, fmt.Errorf("Keine Lizenzdatei gefunden")
}
var lic LicenseFile
if err := json.Unmarshal(bytes, &lic); err != nil {
return nil, fmt.Errorf("Lizenzdatei beschädigt")
}
pubBytes, _ := hex.DecodeString(PublicKeyHex)
publicKey := ed25519.PublicKey(pubBytes)
dataBytes, _ := json.Marshal(lic.Data)
sigBytes, err := base64.StdEncoding.DecodeString(lic.Signature)
if err != nil {
return nil, fmt.Errorf("Signatur ungültig")
}
if !ed25519.Verify(publicKey, dataBytes, sigBytes) {
return nil, fmt.Errorf("Lizenz-Signatur ungültig (Manipuliert?)")
}
expiry, err := time.Parse("2006-01-02", lic.Data.ExpiresAt)
if err != nil {
return nil, fmt.Errorf("Ungültiges Datumsformat")
}
if time.Now().After(expiry) {
return &lic.Data, fmt.Errorf("Lizenz abgelaufen am %s", lic.Data.ExpiresAt)
}
return &lic.Data, nil
}
func GetCurrentLicenseStatus(db *any) LicenseStatus {
lic, err := VerifyLicenseFile()
status := LicenseStatus{
IsValid: err == nil,
Message: "Gültig",
}
if err != nil {
status.Message = err.Error()
if lic != nil {
status.SchoolName = lic.SchoolName
status.ExpiresAt = lic.ExpiresAt
status.MaxUsers = lic.MaxUsers
}
return status
}
status.SchoolName = lic.SchoolName
status.ExpiresAt = lic.ExpiresAt
status.MaxUsers = lic.MaxUsers
return status
}