mirror of
				https://github.com/yangjian102621/geekai.git
				synced 2025-11-04 16:23:42 +08:00 
			
		
		
		
	remove license code
This commit is contained in:
		@@ -4,24 +4,21 @@ import (
 | 
			
		||||
	"chatplus/core"
 | 
			
		||||
	"chatplus/core/types"
 | 
			
		||||
	"chatplus/handler"
 | 
			
		||||
	"chatplus/service"
 | 
			
		||||
	"chatplus/store"
 | 
			
		||||
	"chatplus/store/model"
 | 
			
		||||
	"chatplus/utils"
 | 
			
		||||
	"chatplus/utils/resp"
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"github.com/shirou/gopsutil/host"
 | 
			
		||||
	"gorm.io/gorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type ConfigHandler struct {
 | 
			
		||||
	handler.BaseHandler
 | 
			
		||||
	levelDB *store.LevelDB
 | 
			
		||||
	licenseService *service.LicenseService
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewConfigHandler(app *core.AppServer, db *gorm.DB, levelDB *store.LevelDB, licenseService *service.LicenseService) *ConfigHandler {
 | 
			
		||||
	return &ConfigHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}, levelDB: levelDB, licenseService: licenseService}
 | 
			
		||||
func NewConfigHandler(app *core.AppServer, db *gorm.DB, levelDB *store.LevelDB) *ConfigHandler {
 | 
			
		||||
	return &ConfigHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}, levelDB: levelDB}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *ConfigHandler) Update(c *gin.Context) {
 | 
			
		||||
@@ -91,27 +88,3 @@ func (h *ConfigHandler) Get(c *gin.Context) {
 | 
			
		||||
 | 
			
		||||
	resp.SUCCESS(c, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Active 激活系统
 | 
			
		||||
func (h *ConfigHandler) Active(c *gin.Context) {
 | 
			
		||||
	var data struct {
 | 
			
		||||
		License string `json:"license"`
 | 
			
		||||
	}
 | 
			
		||||
	if err := c.ShouldBindJSON(&data); err != nil {
 | 
			
		||||
		resp.ERROR(c, types.InvalidArgs)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	info, err := host.Info()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		resp.ERROR(c, err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = h.licenseService.ActiveLicense(data.License, info.HostID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		resp.ERROR(c, err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resp.SUCCESS(c, info.HostID)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,6 @@ import (
 | 
			
		||||
	"chatplus/core/types"
 | 
			
		||||
	"chatplus/handler"
 | 
			
		||||
	logger2 "chatplus/logger"
 | 
			
		||||
	"chatplus/service"
 | 
			
		||||
	"chatplus/service/oss"
 | 
			
		||||
	"chatplus/store/model"
 | 
			
		||||
	"chatplus/store/vo"
 | 
			
		||||
@@ -38,15 +37,13 @@ type ChatHandler struct {
 | 
			
		||||
	handler.BaseHandler
 | 
			
		||||
	redis         *redis.Client
 | 
			
		||||
	uploadManager *oss.UploaderManager
 | 
			
		||||
	licenseService *service.LicenseService
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewChatHandler(app *core.AppServer, db *gorm.DB, redis *redis.Client, manager *oss.UploaderManager, licenseService *service.LicenseService) *ChatHandler {
 | 
			
		||||
func NewChatHandler(app *core.AppServer, db *gorm.DB, redis *redis.Client, manager *oss.UploaderManager) *ChatHandler {
 | 
			
		||||
	return &ChatHandler{
 | 
			
		||||
		BaseHandler:   handler.BaseHandler{App: app, DB: db},
 | 
			
		||||
		redis:         redis,
 | 
			
		||||
		uploadManager: manager,
 | 
			
		||||
		licenseService: licenseService,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -482,14 +479,6 @@ func (h *ChatHandler) doRequest(ctx context.Context, req types.ApiRequest, sessi
 | 
			
		||||
		return nil, errors.New("no available key, please import key")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// ONLY allow apiURL in blank list
 | 
			
		||||
	if session.Model.Platform == types.OpenAI {
 | 
			
		||||
		err := h.licenseService.IsValidApiURL(apiKey.ApiURL)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var apiURL string
 | 
			
		||||
	switch session.Model.Platform {
 | 
			
		||||
	case types.Azure:
 | 
			
		||||
 
 | 
			
		||||
@@ -164,8 +164,6 @@ func main() {
 | 
			
		||||
 | 
			
		||||
		// 邮件服务
 | 
			
		||||
		fx.Provide(service.NewSmtpService),
 | 
			
		||||
		// License 服务
 | 
			
		||||
		fx.Provide(service.NewLicenseService),
 | 
			
		||||
 | 
			
		||||
		// 微信机器人服务
 | 
			
		||||
		fx.Provide(wx.NewWeChatBot),
 | 
			
		||||
@@ -290,7 +288,6 @@ func main() {
 | 
			
		||||
			group := s.Engine.Group("/api/admin/")
 | 
			
		||||
			group.POST("config/update", h.Update)
 | 
			
		||||
			group.GET("config/get", h.Get)
 | 
			
		||||
			group.POST("active", h.Active)
 | 
			
		||||
		}),
 | 
			
		||||
		fx.Invoke(func(s *core.AppServer, h *admin.ManagerHandler) {
 | 
			
		||||
			group := s.Engine.Group("/api/admin/")
 | 
			
		||||
 
 | 
			
		||||
@@ -1,108 +0,0 @@
 | 
			
		||||
package service
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"chatplus/core"
 | 
			
		||||
	"chatplus/core/types"
 | 
			
		||||
	"chatplus/store"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/imroc/req/v3"
 | 
			
		||||
	"github.com/shirou/gopsutil/host"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type LicenseService struct {
 | 
			
		||||
	config types.ApiConfig
 | 
			
		||||
	levelDB *store.LevelDB
 | 
			
		||||
	license types.License
 | 
			
		||||
	machineId string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewLicenseService(server *core.AppServer, levelDB *store.LevelDB) * LicenseService {
 | 
			
		||||
	var license types.License
 | 
			
		||||
	var machineId string
 | 
			
		||||
	_ = levelDB.Get(types.LicenseKey, &license)
 | 
			
		||||
	info, err := host.Info()
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		machineId = info.HostID
 | 
			
		||||
	}
 | 
			
		||||
	return &LicenseService{
 | 
			
		||||
		config: server.Config.ApiConfig,
 | 
			
		||||
		levelDB: levelDB,
 | 
			
		||||
		license: license,
 | 
			
		||||
		machineId: machineId,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ActiveLicense 激活 License
 | 
			
		||||
func (s *LicenseService) ActiveLicense(license string, machineId string) error {
 | 
			
		||||
	var res struct {
 | 
			
		||||
		Code    types.BizCode `json:"code"`
 | 
			
		||||
		Message string        `json:"message"`
 | 
			
		||||
		Data    struct {
 | 
			
		||||
			Name      string `json:"name"`
 | 
			
		||||
			License   string `json:"license"`
 | 
			
		||||
			Mid       string `json:"mid"`
 | 
			
		||||
			ExpiredAt int64  `json:"expired_at"`
 | 
			
		||||
			UserNum   int    `json:"user_num"`
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	apiURL := fmt.Sprintf("%s/%s", s.config.ApiURL, "api/license/active")
 | 
			
		||||
	response, err := req.C().R().
 | 
			
		||||
		SetBody(map[string]string{"license": license, "machine_id": machineId}).
 | 
			
		||||
		SetSuccessResult(&res).Post(apiURL)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("发送激活请求失败: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if response.IsErrorState() {
 | 
			
		||||
		return fmt.Errorf( "发送激活请求失败:%v", response.Status)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if res.Code != types.Success {
 | 
			
		||||
		return fmt.Errorf( "激活失败:%v", res.Message)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = s.levelDB.Put(types.LicenseKey, types.License{
 | 
			
		||||
		Key:       license,
 | 
			
		||||
		MachineId: machineId,
 | 
			
		||||
		UserNum:   res.Data.UserNum,
 | 
			
		||||
		ExpiredAt: res.Data.ExpiredAt,
 | 
			
		||||
		IsActive: true,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("保存许可证书失败:%v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetLicense 获取许可信息
 | 
			
		||||
func (s *LicenseService) GetLicense() types.License {
 | 
			
		||||
	return s.license
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsValidApiURL 判断是否合法的中转 URL
 | 
			
		||||
func (s *LicenseService) IsValidApiURL(uri string) error {
 | 
			
		||||
	// 获得许可授权的直接放行
 | 
			
		||||
	if s.license.IsActive {
 | 
			
		||||
		if s.license.MachineId != s.machineId {
 | 
			
		||||
			return errors.New("系统使用了盗版的许可证书")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if time.Now().Unix() > s.license.ExpiredAt {
 | 
			
		||||
			return errors.New("系统许可证书已经过期")
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !strings.HasPrefix(uri, "https://gpt.bemore.lol") &&
 | 
			
		||||
		!strings.HasPrefix(uri, "https://api.openai.com") &&
 | 
			
		||||
		!strings.HasPrefix(uri, "http://cdn.chat-plus.net") &&
 | 
			
		||||
		!strings.HasPrefix(uri, "https://api.chat-plus.net") {
 | 
			
		||||
		return fmt.Errorf("当前 API 地址 %s 不在白名单列表当中。",uri)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
@@ -3,7 +3,6 @@ package mj
 | 
			
		||||
import (
 | 
			
		||||
	"chatplus/core/types"
 | 
			
		||||
	logger2 "chatplus/logger"
 | 
			
		||||
	"chatplus/service"
 | 
			
		||||
	"chatplus/service/oss"
 | 
			
		||||
	"chatplus/service/sd"
 | 
			
		||||
	"chatplus/store"
 | 
			
		||||
@@ -27,7 +26,7 @@ type ServicePool struct {
 | 
			
		||||
 | 
			
		||||
var logger = logger2.GetLogger()
 | 
			
		||||
 | 
			
		||||
func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderManager, appConfig *types.AppConfig, licenseService *service.LicenseService) *ServicePool {
 | 
			
		||||
func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderManager, appConfig *types.AppConfig) *ServicePool {
 | 
			
		||||
	services := make([]*Service, 0)
 | 
			
		||||
	taskQueue := store.NewRedisQueue("MidJourney_Task_Queue", redisCli)
 | 
			
		||||
	notifyQueue := store.NewRedisQueue("MidJourney_Notify_Queue", redisCli)
 | 
			
		||||
@@ -36,11 +35,6 @@ func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderMa
 | 
			
		||||
		if config.Enabled == false {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		err := licenseService.IsValidApiURL(config.ApiURL)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logger.Error(err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		cli := NewPlusClient(config)
 | 
			
		||||
		name := fmt.Sprintf("mj-plus-service-%d", k)
 | 
			
		||||
 
 | 
			
		||||
@@ -258,19 +258,6 @@
 | 
			
		||||
        <Menu/>
 | 
			
		||||
      </el-tab-pane>
 | 
			
		||||
 | 
			
		||||
      <el-tab-pane label="授权激活" name="license">
 | 
			
		||||
        <div class="container">
 | 
			
		||||
          <el-form :model="system" label-width="150px" label-position="right">
 | 
			
		||||
            <el-form-item label="许可授权码" prop="license">
 | 
			
		||||
              <el-input v-model="license"/>
 | 
			
		||||
            </el-form-item>
 | 
			
		||||
 | 
			
		||||
            <el-form-item>
 | 
			
		||||
              <el-button type="primary" @click="active">立即激活</el-button>
 | 
			
		||||
            </el-form-item>
 | 
			
		||||
          </el-form>
 | 
			
		||||
        </div>
 | 
			
		||||
      </el-tab-pane>
 | 
			
		||||
    </el-tabs>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
@@ -344,19 +331,6 @@ const save = function (key) {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 激活授权
 | 
			
		||||
const license = ref("")
 | 
			
		||||
const active = () => {
 | 
			
		||||
  if (license.value === "") {
 | 
			
		||||
    return ElMessage.error("请输入授权码")
 | 
			
		||||
  }
 | 
			
		||||
  httpPost("/api/admin/active", {license: license.value}).then(res => {
 | 
			
		||||
    ElMessage.success("授权成功,机器编码为:" + res.data)
 | 
			
		||||
  }).catch(e => {
 | 
			
		||||
    ElMessage.error(e.message)
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const configKey = ref("")
 | 
			
		||||
const beforeUpload = (key) => {
 | 
			
		||||
  configKey.value = key
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user