81 lines
2.0 KiB
Go
81 lines
2.0 KiB
Go
package license
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"license-server/storage"
|
|
"time"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
func GenerateLicenseHandler(db storage.Database) fiber.Handler {
|
|
return func(c *fiber.Ctx) error {
|
|
var req LicenseRequest
|
|
if err := c.BodyParser(&req); err != nil {
|
|
return fiber.ErrBadRequest
|
|
}
|
|
|
|
payloadBytes, _ := json.Marshal(req)
|
|
payloadB64 := base64.StdEncoding.EncodeToString(payloadBytes)
|
|
signature, _ := SignPayload(payloadBytes)
|
|
|
|
licenseFile := LicenseFile{
|
|
Payload: payloadB64,
|
|
Signature: signature,
|
|
}
|
|
|
|
return c.JSON(licenseFile)
|
|
}
|
|
}
|
|
|
|
func ActivateLicenseHandler(db storage.Database) fiber.Handler {
|
|
return func(c *fiber.Ctx) error {
|
|
var lf LicenseFile
|
|
if err := c.BodyParser(&lf); err != nil {
|
|
return fiber.ErrBadRequest
|
|
}
|
|
|
|
payloadBytes, _ := base64.StdEncoding.DecodeString(lf.Payload)
|
|
var req LicenseRequest
|
|
json.Unmarshal(payloadBytes, &req)
|
|
|
|
if db.HasActivated(req.MachineID) {
|
|
return fiber.NewError(403, "This machine is already activated.")
|
|
}
|
|
|
|
if !VerifySignature(&privateKey.PublicKey, payloadBytes, lf.Signature) {
|
|
return fiber.NewError(401, "Invalid license signature")
|
|
}
|
|
|
|
licenseText := lf.Payload + "." + lf.Signature
|
|
db.SaveActivation(req.MachineID, licenseText)
|
|
|
|
return c.SendString("License activated successfully.")
|
|
}
|
|
}
|
|
|
|
func ValidateLicenseHandler(db storage.Database) fiber.Handler {
|
|
return func(c *fiber.Ctx) error {
|
|
var lf LicenseFile
|
|
if err := c.BodyParser(&lf); err != nil {
|
|
return fiber.ErrBadRequest
|
|
}
|
|
|
|
payloadBytes, _ := base64.StdEncoding.DecodeString(lf.Payload)
|
|
var req LicenseRequest
|
|
json.Unmarshal(payloadBytes, &req)
|
|
|
|
if !VerifySignature(&privateKey.PublicKey, payloadBytes, lf.Signature) {
|
|
return fiber.NewError(401, "Invalid license signature")
|
|
}
|
|
|
|
expiry, _ := time.Parse("2006-01-02", req.Expiry)
|
|
if time.Now().After(expiry) {
|
|
return fiber.NewError(403, "License expired")
|
|
}
|
|
|
|
return c.JSON(fiber.Map{"valid": true, "features": req.Features})
|
|
}
|
|
}
|