Files
EdgeAdmin/internal/web/actions/default/settings/server/updateHTTPSPopup.go
2023-03-18 22:12:22 +08:00

143 lines
3.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package server
import (
"encoding/json"
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/sslconfigs"
"github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/actions"
"net"
"os"
)
type UpdateHTTPSPopupAction struct {
actionutils.ParentAction
}
func (this *UpdateHTTPSPopupAction) Init() {
this.Nav("", "", "")
}
func (this *UpdateHTTPSPopupAction) RunGet(params struct{}) {
serverConfig, err := loadServerConfig()
if err != nil {
this.ErrorPage(err)
return
}
this.Data["serverConfig"] = serverConfig
// 证书
certConfigs := []*sslconfigs.SSLCertConfig{}
if len(serverConfig.Https.Cert) > 0 && len(serverConfig.Https.Key) > 0 {
certData, err := os.ReadFile(Tea.Root + "/" + serverConfig.Https.Cert)
if err != nil {
this.ErrorPage(err)
return
}
keyData, err := os.ReadFile(Tea.Root + "/" + serverConfig.Https.Key)
if err != nil {
this.ErrorPage(err)
return
}
certConfig := &sslconfigs.SSLCertConfig{
Id: 0,
Name: "-",
CertData: certData,
KeyData: keyData,
}
_ = certConfig.Init(nil)
certConfig.CertData = nil
certConfig.KeyData = nil
certConfigs = append(certConfigs, certConfig)
}
this.Data["certConfigs"] = certConfigs
this.Show()
}
func (this *UpdateHTTPSPopupAction) RunPost(params struct {
IsOn bool
Listens []string
CertIdsJSON []byte
Must *actions.Must
}) {
defer this.CreateLogInfo("修改管理界面的HTTPS设置")
if len(params.Listens) == 0 {
this.Fail("请输入绑定地址")
}
serverConfig, err := loadServerConfig()
if err != nil {
this.Fail("保存失败:" + err.Error())
}
serverConfig.Https.On = params.IsOn
listen := []string{}
for _, addr := range params.Listens {
addr = utils.FormatAddress(addr)
if len(addr) == 0 {
continue
}
if _, _, err := net.SplitHostPort(addr); err != nil {
addr += ":80"
}
listen = append(listen, addr)
}
serverConfig.Https.Listen = listen
// 证书
certIds := []int64{}
err = json.Unmarshal(params.CertIdsJSON, &certIds)
if err != nil {
this.ErrorPage(err)
return
}
if params.IsOn && len(certIds) == 0 {
this.Fail("要启用HTTPS需要先选择或上传一个可用的证书")
}
// 保存证书到本地
if len(certIds) > 0 && certIds[0] != 0 {
certResp, err := this.RPC().SSLCertRPC().FindEnabledSSLCertConfig(this.AdminContext(), &pb.FindEnabledSSLCertConfigRequest{
SslCertId: certIds[0],
})
if err != nil {
this.ErrorPage(err)
return
}
if len(certResp.SslCertJSON) == 0 {
this.Fail("选择的证书已失效,请换一个")
}
certConfig := &sslconfigs.SSLCertConfig{}
err = json.Unmarshal(certResp.SslCertJSON, certConfig)
if err != nil {
this.ErrorPage(err)
return
}
err = os.WriteFile(Tea.ConfigFile("https.key.pem"), certConfig.KeyData, 0666)
if err != nil {
this.Fail("保存密钥失败:" + err.Error())
}
err = os.WriteFile(Tea.ConfigFile("https.cert.pem"), certConfig.CertData, 0666)
if err != nil {
this.Fail("保存证书失败:" + err.Error())
}
serverConfig.Https.Key = "configs/https.key.pem"
serverConfig.Https.Cert = "configs/https.cert.pem"
}
err = writeServerConfig(serverConfig)
if err != nil {
this.Fail("保存配置失败:" + err.Error())
}
this.Success()
}