189 lines
5.9 KiB
Go
189 lines
5.9 KiB
Go
package admin
|
||
|
||
import (
|
||
"encoding/base64"
|
||
"os"
|
||
"strconv"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/lejianwen/rustdesk-api/v2/global"
|
||
"github.com/lejianwen/rustdesk-api/v2/http/request/admin"
|
||
"github.com/lejianwen/rustdesk-api/v2/http/response"
|
||
"github.com/lejianwen/rustdesk-api/v2/service"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
type ClientConfig struct {
|
||
}
|
||
|
||
// Generate генерирует клиент с настройками
|
||
// @Tags 客户端生成
|
||
// @Summary 生成客户端
|
||
// @Description 生成带有服务器配置的客户端
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Param body body admin.ClientConfigGenerateForm true "客户端信息"
|
||
// @Success 200 {object} response.Response{data=model.ClientConfig}
|
||
// @Failure 500 {object} response.Response
|
||
// @Router /admin/client_config/generate [post]
|
||
// @Security token
|
||
func (ct *ClientConfig) Generate(c *gin.Context) {
|
||
f := &admin.ClientConfigGenerateForm{}
|
||
if err := c.ShouldBindJSON(f); err != nil {
|
||
response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
|
||
return
|
||
}
|
||
errList := global.Validator.ValidStruct(c, f)
|
||
if len(errList) > 0 {
|
||
response.Fail(c, 101, errList[0])
|
||
return
|
||
}
|
||
|
||
u := service.AllService.UserService.CurUser(c)
|
||
if u.Id == 0 {
|
||
response.Fail(c, 101, response.TranslateMsg(c, "UserNotFound"))
|
||
return
|
||
}
|
||
|
||
// Обрабатываем кастомный конфигурационный файл
|
||
// Принимаем любой конфигурационный файл без проверки сертификатов/подписей
|
||
customConfigFile := ""
|
||
if f.UseCustomConfig && f.CustomConfigFile != "" {
|
||
customConfigFile = f.CustomConfigFile
|
||
// Пытаемся декодировать base64, если не получается - используем как есть
|
||
decoded, err := base64.StdEncoding.DecodeString(customConfigFile)
|
||
if err == nil {
|
||
customConfigFile = string(decoded)
|
||
}
|
||
// Если декодирование не удалось, используем исходную строку как текст конфига
|
||
}
|
||
|
||
clientConfig, err := service.AllService.ClientConfigService.GenerateClientConfig(u.Id, f.Password, f.Description, customConfigFile)
|
||
if err != nil {
|
||
response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
|
||
return
|
||
}
|
||
|
||
response.Success(c, clientConfig)
|
||
}
|
||
|
||
// List получает список сгенерированных клиентов
|
||
// @Tags 客户端生成
|
||
// @Summary 客户端列表
|
||
// @Description 获取当前用户的客户端列表
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Param page query int false "页码"
|
||
// @Param page_size query int false "页大小"
|
||
// @Success 200 {object} response.Response{data=model.ClientConfigList}
|
||
// @Failure 500 {object} response.Response
|
||
// @Router /admin/client_config/list [get]
|
||
// @Security token
|
||
func (ct *ClientConfig) List(c *gin.Context) {
|
||
query := &admin.ClientConfigQuery{}
|
||
if err := c.ShouldBindQuery(query); err != nil {
|
||
response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
|
||
return
|
||
}
|
||
|
||
u := service.AllService.UserService.CurUser(c)
|
||
if u.Id == 0 {
|
||
response.Fail(c, 101, response.TranslateMsg(c, "UserNotFound"))
|
||
return
|
||
}
|
||
|
||
res := service.AllService.ClientConfigService.List(uint(query.Page), uint(query.PageSize), func(tx *gorm.DB) *gorm.DB {
|
||
return tx.Where("user_id = ?", u.Id)
|
||
})
|
||
|
||
response.Success(c, res)
|
||
}
|
||
|
||
// Download скачивает сгенерированный клиент
|
||
// @Tags 客户端生成
|
||
// @Summary 下载客户端
|
||
// @Description 下载生成的客户端文件
|
||
// @Accept json
|
||
// @Produce application/zip
|
||
// @Param id path int true "客户端ID"
|
||
// @Success 200 {file} file
|
||
// @Failure 500 {object} response.Response
|
||
// @Router /admin/client_config/download/{id} [get]
|
||
// @Security token
|
||
func (ct *ClientConfig) Download(c *gin.Context) {
|
||
id := c.Param("id")
|
||
idUint, err := strconv.ParseUint(id, 10, 32)
|
||
if err != nil {
|
||
response.Fail(c, 101, response.TranslateMsg(c, "ParamsError"))
|
||
return
|
||
}
|
||
|
||
u := service.AllService.UserService.CurUser(c)
|
||
if u.Id == 0 {
|
||
response.Fail(c, 101, response.TranslateMsg(c, "UserNotFound"))
|
||
return
|
||
}
|
||
|
||
clientConfig := service.AllService.ClientConfigService.GetById(uint(idUint))
|
||
if clientConfig.Id == 0 {
|
||
response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
|
||
return
|
||
}
|
||
|
||
// Проверяем, что клиент принадлежит пользователю
|
||
if clientConfig.UserId != u.Id {
|
||
response.Fail(c, 101, response.TranslateMsg(c, "AccessDenied"))
|
||
return
|
||
}
|
||
|
||
// Проверяем существование файла
|
||
if _, err := os.Stat(clientConfig.FilePath); os.IsNotExist(err) {
|
||
response.Fail(c, 101, response.TranslateMsg(c, "FileNotFound"))
|
||
return
|
||
}
|
||
|
||
// Отправляем файл
|
||
c.Header("Content-Disposition", "attachment; filename="+clientConfig.FileName)
|
||
c.Header("Content-Type", "application/zip")
|
||
c.File(clientConfig.FilePath)
|
||
}
|
||
|
||
// Delete удаляет сгенерированный клиент
|
||
// @Tags 客户端生成
|
||
// @Summary 删除客户端
|
||
// @Description 删除生成的客户端
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Param body body admin.ClientConfigDeleteForm true "客户端信息"
|
||
// @Success 200 {object} response.Response
|
||
// @Failure 500 {object} response.Response
|
||
// @Router /admin/client_config/delete [post]
|
||
// @Security token
|
||
func (ct *ClientConfig) Delete(c *gin.Context) {
|
||
f := &admin.ClientConfigDeleteForm{}
|
||
if err := c.ShouldBindJSON(f); err != nil {
|
||
response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
|
||
return
|
||
}
|
||
errList := global.Validator.ValidStruct(c, f)
|
||
if len(errList) > 0 {
|
||
response.Fail(c, 101, errList[0])
|
||
return
|
||
}
|
||
|
||
u := service.AllService.UserService.CurUser(c)
|
||
if u.Id == 0 {
|
||
response.Fail(c, 101, response.TranslateMsg(c, "UserNotFound"))
|
||
return
|
||
}
|
||
|
||
err := service.AllService.ClientConfigService.Delete(f.Id, u.Id)
|
||
if err != nil {
|
||
response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
|
||
return
|
||
}
|
||
|
||
response.Success(c, nil)
|
||
}
|
||
|