- 新增 DeployRBAC 页面: Jenkins-style Item Role 权限管理 - 正则匹配流水线 code,实时命中预览 - 内置用户分配面板,无需跳转系统管理 - 支持创建/编辑/删除/启用禁用 Item Role - 修复 PipelineEditor 成员管理 http 双解包 bug - 修复 PipelineManager 前端 code 路由迁移(delete/trigger/stop/loadRuns) - 新增批量删除流水线运行记录 API - Sidebar: 应用发布下新增「发布权限」, 仓库认证→发布配置, 移除用户组 - 恢复系统管理菜单(不受发布权限改动影响) - 后端 ItemRole CRUD handler + 正则匹配中间件已就绪
63 lines
1.7 KiB
Go
63 lines
1.7 KiB
Go
package handlers
|
||
|
||
import (
|
||
"net/http"
|
||
"strconv"
|
||
|
||
"ezops/internal/models"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// AssignCredential 将凭据分配给服务器(解密凭据并写入 password/ssh_key) // Logan.Li
|
||
func (h *CredentialHandler) AssignCredential(c *gin.Context) {
|
||
serverID, err := strconv.ParseUint(c.Param("id"), 10, 32)
|
||
if err != nil {
|
||
c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "无效的服务器ID"})
|
||
return
|
||
}
|
||
|
||
var req struct {
|
||
CredentialID uint `json:"credential_id"`
|
||
}
|
||
if err := c.ShouldBindJSON(&req); err != nil || req.CredentialID == 0 {
|
||
c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "请选择凭据"})
|
||
return
|
||
}
|
||
|
||
var cred models.Credential
|
||
if err := h.db.First(&cred, req.CredentialID).Error; err != nil {
|
||
c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "凭据不存在"})
|
||
return
|
||
}
|
||
|
||
plain, err := h.crypt.Decrypt(cred.Content)
|
||
if err != nil {
|
||
c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "凭据解密失败"})
|
||
return
|
||
}
|
||
|
||
var server models.Server
|
||
if err := h.db.First(&server, serverID).Error; err != nil {
|
||
c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "服务器不存在"})
|
||
return
|
||
}
|
||
|
||
if cred.SecretType == "ssh" {
|
||
server.SSHKey = plain
|
||
server.AuthType = "key"
|
||
server.Password = ""
|
||
} else {
|
||
server.Password = plain
|
||
server.AuthType = "password"
|
||
server.SSHKey = ""
|
||
}
|
||
|
||
if err := h.db.Save(&server).Error; err != nil {
|
||
c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "分配失败: " + err.Error()})
|
||
return
|
||
}
|
||
|
||
c.JSON(http.StatusOK, models.Response{Code: 200, Message: "凭据已关联"})
|
||
}
|