From b2c0c1c23196c78d2a840216dfb392a9ad08e612 Mon Sep 17 00:00:00 2001 From: hailin Date: Fri, 13 Jun 2025 23:09:54 +0800 Subject: [PATCH] . --- license/service.go | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/license/service.go b/license/service.go index 56bf098..266d042 100644 --- a/license/service.go +++ b/license/service.go @@ -16,10 +16,12 @@ func GenerateLicenseHandler(db storage.Database) fiber.Handler { return fiber.NewError(fiber.StatusBadRequest, "Invalid request body") } - if req.MachineID == "" || req.Expiry == "" { - return fiber.NewError(fiber.StatusBadRequest, "Missing required fields") + if req.MachineID == "" { + return fiber.NewError(fiber.StatusBadRequest, "Missing machine ID") } + // ⚠️ 此时不设置 Expiry 字段,由 Activate 阶段设置 + payloadBytes, err := json.Marshal(req) if err != nil { return fiber.NewError(fiber.StatusInternalServerError, "Failed to encode payload") @@ -68,15 +70,26 @@ func ActivateLicenseHandler(db storage.Database) fiber.Handler { return fiber.NewError(fiber.StatusForbidden, "This machine is already activated") } - expiry, err := time.Parse("2006-01-02", req.Expiry) - if err != nil || time.Now().After(expiry) { - return fiber.NewError(fiber.StatusForbidden, "License is invalid or expired") + // ✅ 设置新的 Expiry 字段(激活日起算 365 天) + req.Expiry = time.Now().AddDate(1, 0, 0).Format("2006-01-02") + + // ✅ 重新生成 payload 和签名 + newPayload, err := json.Marshal(req) + if err != nil { + return fiber.NewError(fiber.StatusInternalServerError, "Failed to re-encode payload") + } + newSignature, err := SignPayload(newPayload) + if err != nil { + return fiber.NewError(fiber.StatusInternalServerError, "Signing failed") } - // 绑定激活记录 - db.SaveActivation(req.MachineID, lf.Payload+"."+lf.Signature) + db.SaveActivation(req.MachineID, base64.StdEncoding.EncodeToString(newPayload)+"."+newSignature) - return c.JSON(fiber.Map{"status": "success", "message": "License activated successfully"}) + return c.JSON(fiber.Map{ + "status": "success", + "message": "License activated successfully", + "expiry": req.Expiry, + }) } } @@ -92,25 +105,20 @@ func ValidateLicenseHandler(db storage.Database) fiber.Handler { return fiber.NewError(fiber.StatusBadRequest, "Invalid base64 payload") } - // 1. 校验签名 if !VerifySignature(GetPublicKey(), payloadBytes, lf.Signature) { return fiber.NewError(fiber.StatusUnauthorized, "Invalid license signature") } - // 2. 解析 payload var req LicenseRequest if err := json.Unmarshal(payloadBytes, &req); err != nil { return fiber.NewError(fiber.StatusBadRequest, "Malformed payload") } - // 3. 验证是否过期 expiry, err := time.Parse("2006-01-02", req.Expiry) if err != nil || time.Now().After(expiry) { return fiber.NewError(fiber.StatusForbidden, "License expired") } - // ✅ 4. 关键补充:校验调用者的 MachineID 与 license 中一致 - // 从请求 Header 或 Body 读取实际设备 ID(假设从 Header 传) clientMachineID := c.Get("X-Machine-ID") if clientMachineID == "" { return fiber.NewError(fiber.StatusBadRequest, "Missing machine ID in header") @@ -122,8 +130,7 @@ func ValidateLicenseHandler(db storage.Database) fiber.Handler { return c.JSON(fiber.Map{ "valid": true, "features": req.Features, - // "machine": req.MachineID, - "expiry": req.Expiry, + "expiry": req.Expiry, }) } }