mirror of
https://github.com/TeaOSLab/EdgeAdmin.git
synced 2025-11-03 20:40:26 +08:00
实现自动匹配证书和批量选择证书功能
This commit is contained in:
@@ -2,9 +2,11 @@ package certs
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"github.com/TeaOSLab/EdgeAdmin/internal/utils/numberutils"
|
||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/sslconfigs"
|
||||
"github.com/iwind/TeaGo/lists"
|
||||
"github.com/iwind/TeaGo/maps"
|
||||
@@ -23,15 +25,82 @@ func (this *SelectPopupAction) Init() {
|
||||
}
|
||||
|
||||
func (this *SelectPopupAction) RunGet(params struct {
|
||||
ServerId int64 // 搜索的服务
|
||||
UserId int64 // 搜索的用户名
|
||||
SearchingDomains string // 搜索的域名
|
||||
SearchingType string // 搜索类型:match|all
|
||||
|
||||
ViewSize string
|
||||
SelectedCertIds string
|
||||
Keyword string
|
||||
}) {
|
||||
// TODO 列出常用和最新的证书供用户选择
|
||||
// 服务相关
|
||||
if params.ServerId > 0 {
|
||||
serverResp, err := this.RPC().ServerRPC().FindEnabledUserServerBasic(this.AdminContext(), &pb.FindEnabledUserServerBasicRequest{ServerId: params.ServerId})
|
||||
if err != nil {
|
||||
this.ErrorPage(err)
|
||||
return
|
||||
}
|
||||
var server = serverResp.Server
|
||||
if server != nil {
|
||||
if server.UserId > 0 {
|
||||
params.UserId = server.UserId
|
||||
}
|
||||
|
||||
// 读取所有ServerNames
|
||||
serverNamesResp, err := this.RPC().ServerRPC().FindServerNames(this.AdminContext(), &pb.FindServerNamesRequest{ServerId: params.ServerId})
|
||||
if err != nil {
|
||||
this.ErrorPage(err)
|
||||
return
|
||||
}
|
||||
if len(serverNamesResp.ServerNamesJSON) > 0 {
|
||||
var serverNames = []*serverconfigs.ServerNameConfig{}
|
||||
err = json.Unmarshal(serverNamesResp.ServerNamesJSON, &serverNames)
|
||||
if err != nil {
|
||||
this.ErrorPage(err)
|
||||
return
|
||||
}
|
||||
params.SearchingDomains = strings.Join(serverconfigs.PlainServerNames(serverNames), ",")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 用户相关
|
||||
this.Data["userId"] = params.UserId
|
||||
|
||||
// 域名搜索相关
|
||||
var url = this.Request.URL.Path
|
||||
var query = this.Request.URL.Query()
|
||||
query.Del("searchingType")
|
||||
this.Data["baseURL"] = url + "?" + query.Encode()
|
||||
|
||||
var searchingDomains = []string{}
|
||||
if len(params.SearchingDomains) > 0 {
|
||||
searchingDomains = strings.Split(params.SearchingDomains, ",")
|
||||
}
|
||||
const maxDomains = 2_000 // 限制搜索的域名数量
|
||||
if len(searchingDomains) > maxDomains {
|
||||
searchingDomains = searchingDomains[:maxDomains]
|
||||
}
|
||||
this.Data["searchingDomains"] = searchingDomains
|
||||
|
||||
this.Data["keyword"] = params.Keyword
|
||||
this.Data["selectedCertIds"] = params.SelectedCertIds
|
||||
|
||||
var searchingType = params.SearchingType
|
||||
if len(searchingType) == 0 {
|
||||
if len(params.SearchingDomains) == 0 {
|
||||
searchingType = "all"
|
||||
} else {
|
||||
searchingType = "match"
|
||||
}
|
||||
}
|
||||
if searchingType != "all" && searchingType != "match" {
|
||||
this.ErrorPage(errors.New("invalid searching type '" + searchingType + "'"))
|
||||
return
|
||||
}
|
||||
this.Data["searchingType"] = searchingType
|
||||
|
||||
// 已经选择的证书
|
||||
var selectedCertIds = []string{}
|
||||
if len(params.SelectedCertIds) > 0 {
|
||||
@@ -43,24 +112,68 @@ func (this *SelectPopupAction) RunGet(params struct {
|
||||
}
|
||||
this.Data["viewSize"] = params.ViewSize
|
||||
|
||||
countResp, err := this.RPC().SSLCertRPC().CountSSLCerts(this.AdminContext(), &pb.CountSSLCertRequest{
|
||||
// 全部证书数量
|
||||
countAllResp, err := this.RPC().SSLCertRPC().CountSSLCerts(this.AdminContext(), &pb.CountSSLCertRequest{
|
||||
UserId: params.UserId,
|
||||
Keyword: params.Keyword,
|
||||
})
|
||||
if err != nil {
|
||||
this.ErrorPage(err)
|
||||
return
|
||||
}
|
||||
var totalAll = countAllResp.Count
|
||||
this.Data["totalAll"] = totalAll
|
||||
|
||||
page := this.NewPage(countResp.Count)
|
||||
// 已匹配证书数量
|
||||
var totalMatch int64 = 0
|
||||
if len(searchingDomains) > 0 {
|
||||
countMatchResp, err := this.RPC().SSLCertRPC().CountSSLCerts(this.AdminContext(), &pb.CountSSLCertRequest{
|
||||
UserId: params.UserId,
|
||||
Keyword: params.Keyword,
|
||||
Domains: searchingDomains,
|
||||
})
|
||||
if err != nil {
|
||||
this.ErrorPage(err)
|
||||
return
|
||||
}
|
||||
totalMatch = countMatchResp.Count
|
||||
}
|
||||
this.Data["totalMatch"] = totalMatch
|
||||
|
||||
var totalCerts int64
|
||||
if searchingType == "all" {
|
||||
totalCerts = totalAll
|
||||
} else if searchingType == "match" {
|
||||
totalCerts = totalMatch
|
||||
}
|
||||
|
||||
var page = this.NewPage(totalCerts)
|
||||
this.Data["page"] = page.AsHTML()
|
||||
|
||||
listResp, err := this.RPC().SSLCertRPC().ListSSLCerts(this.AdminContext(), &pb.ListSSLCertsRequest{
|
||||
Keyword: params.Keyword,
|
||||
Offset: page.Offset,
|
||||
Size: page.Size,
|
||||
})
|
||||
var listResp *pb.ListSSLCertsResponse
|
||||
if searchingType == "all" {
|
||||
listResp, err = this.RPC().SSLCertRPC().ListSSLCerts(this.AdminContext(), &pb.ListSSLCertsRequest{
|
||||
UserId: params.UserId,
|
||||
Keyword: params.Keyword,
|
||||
Offset: page.Offset,
|
||||
Size: page.Size,
|
||||
})
|
||||
} else if searchingType == "match" {
|
||||
listResp, err = this.RPC().SSLCertRPC().ListSSLCerts(this.AdminContext(), &pb.ListSSLCertsRequest{
|
||||
UserId: params.UserId,
|
||||
Keyword: params.Keyword,
|
||||
Domains: searchingDomains,
|
||||
Offset: page.Offset,
|
||||
Size: page.Size,
|
||||
})
|
||||
}
|
||||
|
||||
certConfigs := []*sslconfigs.SSLCertConfig{}
|
||||
if listResp == nil {
|
||||
this.ErrorPage(errors.New("'listResp' should not be nil"))
|
||||
return
|
||||
}
|
||||
|
||||
var certConfigs = []*sslconfigs.SSLCertConfig{}
|
||||
err = json.Unmarshal(listResp.SslCertsJSON, &certConfigs)
|
||||
if err != nil {
|
||||
this.ErrorPage(err)
|
||||
@@ -68,8 +181,8 @@ func (this *SelectPopupAction) RunGet(params struct {
|
||||
}
|
||||
this.Data["certs"] = certConfigs
|
||||
|
||||
certMaps := []maps.Map{}
|
||||
nowTime := time.Now().Unix()
|
||||
var certMaps = []maps.Map{}
|
||||
var nowTime = time.Now().Unix()
|
||||
for _, certConfig := range certConfigs {
|
||||
countServersResp, err := this.RPC().ServerRPC().CountAllEnabledServersWithSSLCertId(this.AdminContext(), &pb.CountAllEnabledServersWithSSLCertIdRequest{SslCertId: certConfig.Id})
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user