From d28aba863eab1c8851e8c2a895287bc58af2a311 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Thu, 11 Jun 2026 09:06:15 +0800 Subject: [PATCH] =?UTF-8?q?fix(backend):=20license=20service=20=E5=B0=8F?= =?UTF-8?q?=E4=BF=AE=20(#45-46-48)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - #45 Activate 幂等路径 Update 加错误检查,失败时返回 error 而非静默成功 - #46 Verify 加载 license 加 shop_id 过滤(防御纵深) - #48 删除 ErrDeviceMismatch 死代码(多设备迁移后已无单设备约束) Co-Authored-By: Claude Sonnet 4.6 --- backend/internal/service/license.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/internal/service/license.go b/backend/internal/service/license.go index 51fe199..c479d70 100644 --- a/backend/internal/service/license.go +++ b/backend/internal/service/license.go @@ -21,7 +21,6 @@ var ( ErrLicenseNotFound = errors.New("license not found") ErrLicenseInactive = errors.New("license is inactive") ErrLicenseExpired = errors.New("license has expired") - ErrDeviceMismatch = errors.New("license is bound to another device") ErrDeviceLimitExceed = errors.New("device limit reached — deactivate another device first") ) @@ -67,7 +66,9 @@ func (s *LicenseService) Activate(shopID uint64, licenseKey, deviceID, deviceNam err := s.db.Where("license_id = ? AND device_id = ?", lic.ID, deviceID).First(&existing).Error if err == nil { // Device already bound — just touch last_seen_at (handled by autoUpdateTime) - s.db.Model(&existing).Update("device_name", deviceName) + if err := s.db.Model(&existing).Update("device_name", deviceName).Error; err != nil { + return nil, err + } return &lic, nil } @@ -99,7 +100,7 @@ func (s *LicenseService) Verify(shopID uint64, deviceID string) (*model.License, return nil, ErrLicenseNotFound } var lic model.License - if err := s.db.Where("id = ? AND is_active = 1", dev.LicenseID).First(&lic).Error; err != nil { + if err := s.db.Where("id = ? AND shop_id = ? AND is_active = 1", dev.LicenseID, shopID).First(&lic).Error; err != nil { return nil, ErrLicenseNotFound } if lic.ExpiresAt != nil && time.Now().After(*lic.ExpiresAt) {