Smail/server/controllers/setup.go
jinnrry 7860908f3a 1、重写SSL证书申请逻辑,支持DNS记录验证方式
2、修复无法查看详情的bug
3、优化手动设置证书的逻辑
4、补充详情接口的单元测试
2024-07-05 14:32:52 +08:00

184 lines
4.6 KiB
Go

package controllers
import (
"encoding/json"
log "github.com/sirupsen/logrus"
"io"
"net/http"
"os"
"pmail/config"
"pmail/dto/response"
"pmail/services/setup"
"pmail/services/setup/ssl"
"pmail/utils/context"
"strings"
)
func AcmeChallenge(w http.ResponseWriter, r *http.Request) {
log.Infof("AcmeChallenge: %s", r.URL.Path)
instance := ssl.GetHttpChallengeInstance()
token := strings.ReplaceAll(r.URL.Path, "/.well-known/acme-challenge/", "")
auth, exist := instance.AuthInfo[token]
if exist {
w.Write([]byte(auth.KeyAuth))
} else {
log.Errorf("AcmeChallenge Error Token Infos:%+v", instance.AuthInfo)
http.NotFound(w, r)
}
}
type sslResponse struct {
Port int `json:"port"`
Type string `json:"type"`
}
func Setup(ctx *context.Context, w http.ResponseWriter, req *http.Request) {
reqBytes, err := io.ReadAll(req.Body)
if err != nil {
response.NewSuccessResponse("").FPrint(w)
return
}
var reqData map[string]string
err = json.Unmarshal(reqBytes, &reqData)
if err != nil {
response.NewSuccessResponse("").FPrint(w)
return
}
if reqData["step"] == "database" && reqData["action"] == "get" {
dbType, dbDSN, err := setup.GetDatabaseSettings(ctx)
if err != nil {
response.NewErrorResponse(response.ServerError, err.Error(), "").FPrint(w)
return
}
response.NewSuccessResponse(map[string]string{
"db_type": dbType,
"db_dsn": dbDSN,
}).FPrint(w)
return
}
if reqData["step"] == "database" && reqData["action"] == "set" {
err := setup.SetDatabaseSettings(ctx, reqData["db_type"], reqData["db_dsn"])
if err != nil {
response.NewErrorResponse(response.ServerError, err.Error(), "").FPrint(w)
return
}
response.NewSuccessResponse("Succ").FPrint(w)
return
}
if reqData["step"] == "password" && reqData["action"] == "get" {
ok, err := setup.GetAdminPassword(ctx)
if err != nil {
response.NewErrorResponse(response.ServerError, err.Error(), "").FPrint(w)
return
}
response.NewSuccessResponse(ok).FPrint(w)
return
}
if reqData["step"] == "password" && reqData["action"] == "set" {
err := setup.SetAdminPassword(ctx, reqData["account"], reqData["password"])
if err != nil {
response.NewErrorResponse(response.ServerError, err.Error(), "").FPrint(w)
return
}
response.NewSuccessResponse("Succ").FPrint(w)
return
}
if reqData["step"] == "domain" && reqData["action"] == "get" {
smtpDomain, webDomain, err := setup.GetDomainSettings()
if err != nil {
response.NewErrorResponse(response.ServerError, err.Error(), "").FPrint(w)
return
}
response.NewSuccessResponse(map[string]string{
"smtp_domain": smtpDomain,
"web_domain": webDomain,
}).FPrint(w)
return
}
if reqData["step"] == "domain" && reqData["action"] == "set" {
err := setup.SetDomainSettings(reqData["smtp_domain"], reqData["web_domain"])
if err != nil {
response.NewErrorResponse(response.ServerError, err.Error(), "").FPrint(w)
return
}
response.NewSuccessResponse("Succ").FPrint(w)
return
}
if reqData["step"] == "dns" && reqData["action"] == "get" {
dnsInfos, err := setup.GetDNSSettings(ctx)
if err != nil {
response.NewErrorResponse(response.ServerError, err.Error(), "").FPrint(w)
return
}
response.NewSuccessResponse(dnsInfos).FPrint(w)
return
}
if reqData["step"] == "ssl" && reqData["action"] == "get" {
sslType := ssl.GetSSL()
res := sslResponse{
Type: sslType,
Port: config.Instance.GetSetupPort(),
}
response.NewSuccessResponse(res).FPrint(w)
return
}
if reqData["step"] == "ssl" && reqData["action"] == "getParams" {
dnsChallenge := ssl.GetDnsChallengeInstance()
response.NewSuccessResponse(dnsChallenge.GetDNSSettings(ctx)).FPrint(w)
return
}
if reqData["step"] == "ssl" && reqData["action"] == "set" {
keyPath := reqData["key_path"]
crtPath := reqData["crt_path"]
_, err := os.Stat(keyPath)
if err != nil {
response.NewErrorResponse(response.ServerError, err.Error(), "").FPrint(w)
return
}
_, err = os.Stat(crtPath)
if err != nil {
response.NewErrorResponse(response.ServerError, err.Error(), "").FPrint(w)
return
}
err = ssl.SetSSL(reqData["ssl_type"], reqData["key_path"], reqData["crt_path"])
if err != nil {
response.NewErrorResponse(response.ServerError, err.Error(), "").FPrint(w)
return
}
if reqData["ssl_type"] == config.SSLTypeAutoHTTP || reqData["ssl_type"] == config.SSLTypeAutoDNS {
err = ssl.GenSSL(false)
if err != nil {
response.NewErrorResponse(response.ServerError, err.Error(), "").FPrint(w)
return
}
}
response.NewSuccessResponse("Succ").FPrint(w)
if reqData["ssl_type"] == config.SSLTypeUser {
setup.Finish()
}
return
}
}