2020-11-22 15:34:13 +08:00
|
|
|
|
package server
|
2020-10-15 16:41:32 +08:00
|
|
|
|
|
|
|
|
|
|
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"
|
2022-08-04 11:51:34 +08:00
|
|
|
|
"os"
|
2020-10-15 16:41:32 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
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 {
|
2022-08-04 11:51:34 +08:00
|
|
|
|
certData, err := os.ReadFile(Tea.Root + "/" + serverConfig.Https.Cert)
|
2020-10-15 16:41:32 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
this.ErrorPage(err)
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
2022-08-04 11:51:34 +08:00
|
|
|
|
keyData, err := os.ReadFile(Tea.Root + "/" + serverConfig.Https.Key)
|
2020-10-15 16:41:32 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
this.ErrorPage(err)
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
certConfig := &sslconfigs.SSLCertConfig{
|
|
|
|
|
|
Id: 0,
|
|
|
|
|
|
Name: "-",
|
|
|
|
|
|
CertData: certData,
|
|
|
|
|
|
KeyData: keyData,
|
|
|
|
|
|
}
|
2023-03-18 22:12:22 +08:00
|
|
|
|
_ = certConfig.Init(nil)
|
2020-10-15 16:41:32 +08:00
|
|
|
|
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
|
|
|
|
|
|
}) {
|
2020-11-20 15:32:42 +08:00
|
|
|
|
defer this.CreateLogInfo("修改管理界面的HTTPS设置")
|
|
|
|
|
|
|
2020-10-15 16:41:32 +08:00
|
|
|
|
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{
|
2020-12-18 21:18:35 +08:00
|
|
|
|
SslCertId: certIds[0],
|
2020-10-15 16:41:32 +08:00
|
|
|
|
})
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
this.ErrorPage(err)
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
2020-12-18 21:18:35 +08:00
|
|
|
|
if len(certResp.SslCertJSON) == 0 {
|
2020-10-15 16:41:32 +08:00
|
|
|
|
this.Fail("选择的证书已失效,请换一个")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
certConfig := &sslconfigs.SSLCertConfig{}
|
2020-12-18 21:18:35 +08:00
|
|
|
|
err = json.Unmarshal(certResp.SslCertJSON, certConfig)
|
2020-10-15 16:41:32 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
this.ErrorPage(err)
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
2022-08-04 11:51:34 +08:00
|
|
|
|
err = os.WriteFile(Tea.ConfigFile("https.key.pem"), certConfig.KeyData, 0666)
|
2020-10-15 16:41:32 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
this.Fail("保存密钥失败:" + err.Error())
|
|
|
|
|
|
}
|
2022-08-04 11:51:34 +08:00
|
|
|
|
err = os.WriteFile(Tea.ConfigFile("https.cert.pem"), certConfig.CertData, 0666)
|
2020-10-15 16:41:32 +08:00
|
|
|
|
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()
|
|
|
|
|
|
}
|