diff --git a/license/service.go b/license/service.go index a7dfed4..268982d 100644 --- a/license/service.go +++ b/license/service.go @@ -1,78 +1,80 @@ package license import ( - "encoding/base64" - "encoding/json" - "github.com/gofiber/fiber/v2" - "license-server/storage" - "time" + "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 - } + 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) + payloadBytes, _ := json.Marshal(req) + payloadB64 := base64.StdEncoding.EncodeToString(payloadBytes) + signature, _ := SignPayload(payloadBytes) - licenseFile := LicenseFile{ - Payload: payloadB64, - Signature: signature, - } + licenseFile := LicenseFile{ + Payload: payloadB64, + Signature: signature, + } - return c.JSON(licenseFile) - } + 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 - } + 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) + 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 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") - } + if !VerifySignature(&privateKey.PublicKey, payloadBytes, lf.Signature) { + return fiber.NewError(401, "Invalid license signature") + } - db.SaveActivation(req.MachineID, lf) - return c.SendString("License activated successfully.") - } + 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 - } + 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) + 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") - } + 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") - } + 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}) - } + return c.JSON(fiber.Map{"valid": true, "features": req.Features}) + } } - diff --git a/storage/db.go b/storage/db.go index 3c33b7a..62e5ddc 100644 --- a/storage/db.go +++ b/storage/db.go @@ -1,35 +1,34 @@ package storage import ( - "database/sql" - _ "github.com/mattn/go-sqlite3" - "license-server/license" + "database/sql" + + _ "github.com/mattn/go-sqlite3" ) type Database struct { - db *sql.DB + db *sql.DB } func InitDB() Database { - db, _ := sql.Open("sqlite3", "./license.db") - db.Exec(`CREATE TABLE IF NOT EXISTS activations ( + db, _ := sql.Open("sqlite3", "./license.db") + db.Exec(`CREATE TABLE IF NOT EXISTS activations ( id INTEGER PRIMARY KEY AUTOINCREMENT, machine_id TEXT UNIQUE, license TEXT, activated INTEGER )`) - return Database{db} + return Database{db} } func (d Database) HasActivated(machineID string) bool { - row := d.db.QueryRow("SELECT activated FROM activations WHERE machine_id = ?", machineID) - var activated int - err := row.Scan(&activated) - return err == nil && activated == 1 + row := d.db.QueryRow("SELECT activated FROM activations WHERE machine_id = ?", machineID) + var activated int + err := row.Scan(&activated) + return err == nil && activated == 1 } -func (d Database) SaveActivation(machineID string, lf license.LicenseFile) { - d.db.Exec("INSERT OR REPLACE INTO activations(machine_id, license, activated) VALUES (?, ?, 1)", - machineID, lf.Payload+"."+lf.Signature) +func (d Database) SaveActivation(machineID string, licenseText string) { + d.db.Exec("INSERT OR REPLACE INTO activations(machine_id, license, activated) VALUES (?, ?, 1)", + machineID, licenseText) } -