Files
EdgeAdmin/internal/web/actions/default/clusters/grants/update.go

135 lines
3.3 KiB
Go
Raw Normal View History

2020-07-29 19:34:54 +08:00
package grants
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
2020-10-25 21:27:28 +08:00
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/grants/grantutils"
2023-06-30 18:08:30 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
2020-10-25 21:27:28 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
2020-07-29 19:34:54 +08:00
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/maps"
"golang.org/x/crypto/ssh"
"strings"
2020-07-29 19:34:54 +08:00
)
type UpdateAction struct {
actionutils.ParentAction
}
func (this *UpdateAction) Init() {
2020-10-25 21:27:28 +08:00
this.Nav("", "grant", "update")
2020-07-29 19:34:54 +08:00
}
func (this *UpdateAction) RunGet(params struct {
GrantId int64
}) {
2023-06-28 19:07:42 +08:00
this.Data["methods"] = grantutils.AllGrantMethods(this.LangCode())
2020-07-29 19:34:54 +08:00
2021-04-18 21:19:50 +08:00
grantResp, err := this.RPC().NodeGrantRPC().FindEnabledNodeGrant(this.AdminContext(), &pb.FindEnabledNodeGrantRequest{NodeGrantId: params.GrantId})
2020-07-29 19:34:54 +08:00
if err != nil {
this.ErrorPage(err)
return
}
2021-04-18 21:19:50 +08:00
if grantResp.NodeGrant == nil {
2020-07-29 19:34:54 +08:00
this.WriteString("can not find the grant")
return
}
// TODO 处理节点专用的认证
var grant = grantResp.NodeGrant
// private key
var privateKey = grant.PrivateKey
const maskLength = 64
if len(privateKey) > maskLength+32 {
privateKey = privateKey[:maskLength] + strings.Repeat("*", len(privateKey)-maskLength)
}
2020-07-29 19:34:54 +08:00
this.Data["grant"] = maps.Map{
"id": grant.Id,
"name": grant.Name,
"method": grant.Method,
2023-06-28 19:07:42 +08:00
"methodName": grantutils.FindGrantMethodName(grant.Method, this.LangCode()),
2020-07-29 19:34:54 +08:00
"username": grant.Username,
"password": strings.Repeat("*", len(grant.Password)),
"privateKey": privateKey,
2021-11-06 15:31:07 +08:00
"passphrase": grant.Passphrase,
2020-07-29 19:34:54 +08:00
"description": grant.Description,
"su": grant.Su,
}
this.Show()
}
func (this *UpdateAction) RunPost(params struct {
GrantId int64
Name string
Method string
Username string
Password string
PrivateKey string
2021-11-06 15:31:07 +08:00
Passphrase string
2020-07-29 19:34:54 +08:00
Description string
2021-12-06 19:24:30 +08:00
Su bool
2020-07-29 19:34:54 +08:00
Must *actions.Must
}) {
2020-11-10 21:37:48 +08:00
// 创建日志
2023-06-30 18:08:30 +08:00
defer this.CreateLogInfo(codes.NodeGrant_LogUpdateSSHGrant, params.GrantId)
2020-11-10 21:37:48 +08:00
2020-07-29 19:34:54 +08:00
params.Must.
Field("name", params.Name).
Require("请输入名称")
switch params.Method {
case "user":
if len(params.Username) == 0 {
this.FailField("username", "请输入SSH登录用户名")
}
case "privateKey":
if len(params.Username) == 0 {
this.FailField("username", "请输入SSH登录用户名")
}
2020-07-29 19:34:54 +08:00
if len(params.PrivateKey) == 0 {
this.FailField("privateKey", "请输入RSA私钥")
}
// 验证私钥
if !strings.HasSuffix(params.PrivateKey, "******") /* 非掩码 */ {
var err error
if len(params.Passphrase) > 0 {
_, err = ssh.ParsePrivateKeyWithPassphrase([]byte(params.PrivateKey), []byte(params.Passphrase))
} else {
_, err = ssh.ParsePrivateKey([]byte(params.PrivateKey))
}
if err != nil {
this.Fail("私钥验证失败,请检查格式:" + err.Error())
return
}
}
2020-07-29 19:34:54 +08:00
default:
this.Fail("请选择正确的认证方式")
}
// TODO 检查grantId是否存在
_, err := this.RPC().NodeGrantRPC().UpdateNodeGrant(this.AdminContext(), &pb.UpdateNodeGrantRequest{
2021-04-18 21:19:50 +08:00
NodeGrantId: params.GrantId,
2020-07-29 19:34:54 +08:00
Name: params.Name,
Method: params.Method,
Username: params.Username,
Password: params.Password,
PrivateKey: params.PrivateKey,
2021-11-06 15:31:07 +08:00
Passphrase: params.Passphrase,
2020-07-29 19:34:54 +08:00
Description: params.Description,
2021-12-06 19:24:30 +08:00
Su: params.Su,
2020-07-29 19:34:54 +08:00
NodeId: 0,
})
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}