update : add Delete SSL

This commit is contained in:
KaySar12 2024-11-01 17:07:43 +07:00
parent cb86b0862a
commit e4d7296154
4 changed files with 162 additions and 69 deletions

2
.vscode/launch.json vendored
View File

@ -6,7 +6,7 @@
"type": "go", "type": "go",
"debugAdapter": "dlv-dap", "debugAdapter": "dlv-dap",
"request": "launch", "request": "launch",
"port": 40751, "port": 44239,
"host": "127.0.0.1", "host": "127.0.0.1",
"mode": "exec", "mode": "exec",
"program": "${workspaceFolder}/dist/casaos-user-service-amd64_linux_amd64_v1/build/sysroot/usr/bin/casaos-user-service" "program": "${workspaceFolder}/dist/casaos-user-service-amd64_linux_amd64_v1/build/sysroot/usr/bin/casaos-user-service"

View File

@ -47,14 +47,15 @@ import (
) )
var ( var (
authServer = "http://accessmanager.local" authServer = "http://accessmanager.local"
clientID = "6KwKSxLCtaQ4r6HoAn3gdNMbNOAf75j3SejLIAx7" clientID = "6KwKSxLCtaQ4r6HoAn3gdNMbNOAf75j3SejLIAx7"
clientSecret = "PE05fcDP4qESUmyZ1TNYpZNBxRPq70VpFI81vehsoJ6WhGz5yPXMljrFrOdMRdRhrYmF03fHWTZHgO9ZdNENrLN13BzL8CAgtEkTsyjXfgx9GvISheIjYfpSfvo219fL" clientSecret = "PE05fcDP4qESUmyZ1TNYpZNBxRPq70VpFI81vehsoJ6WhGz5yPXMljrFrOdMRdRhrYmF03fHWTZHgO9ZdNENrLN13BzL8CAgtEkTsyjXfgx9GvISheIjYfpSfvo219fL"
authURL = "http://accessmanager.local/application/o/nextzenos-oidc/" authURL = "http://accessmanager.local/application/o/nextzenos-oidc/"
callbackURL = "http://nextzenos.local/v1/users/oidc/callback" callbackURL = "http://nextzenos.local/v1/users/oidc/callback"
onePanelServer = "http://nextweb.local" onePanelServer = "http://nextweb.local"
onePanelName = "nextzen" onePanelName = "nextzen"
onePanelPassword = "Smartyourlife123@*" onePanelPassword = "Smartyourlife123@*"
onePanelEntranceCode = "nextweb"
//authentik_api_token = "jidFioAIXpgl8awyk2O17K8W7vZzlXhOO0QXGxEhMDJdn9g747EQjmaI0i3e" //authentik_api_token = "jidFioAIXpgl8awyk2O17K8W7vZzlXhOO0QXGxEhMDJdn9g747EQjmaI0i3e"
) )
@ -155,7 +156,7 @@ func OnePanelLogin(c *gin.Context) error {
Language: "en", Language: "en",
} }
response, cookies, err := service.MyService.OnePanel().Login(cred, onePanelServer) response, cookies, err := service.MyService.OnePanel().Login(cred, onePanelServer, onePanelEntranceCode)
fmt.Println(response) fmt.Println(response)
if err != nil { if err != nil {
logger.Error("OnePanel login failed", zap.Error(err)) logger.Error("OnePanel login failed", zap.Error(err))
@ -303,8 +304,8 @@ func OnePanelUpdateWebsite(c *gin.Context) {
if sslProvider == "selfSigned" { if sslProvider == "selfSigned" {
searchSSLParam.AcmeAccountID = strconv.Itoa(acmeId) searchSSLParam.AcmeAccountID = strconv.Itoa(acmeId)
} }
searchSSLParam.Page = 1 searchSSLParam.Page = 0
searchSSLParam.PageSize = 50 searchSSLParam.PageSize = 0
searchSSL, err := service.MyService.OnePanel().SearchWebsiteSSl(searchSSLParam, onePanelServer, headers) searchSSL, err := service.MyService.OnePanel().SearchWebsiteSSl(searchSSLParam, onePanelServer, headers)
if err != nil { if err != nil {
c.JSON(common_err.SERVICE_ERROR, c.JSON(common_err.SERVICE_ERROR,
@ -313,7 +314,7 @@ func OnePanelUpdateWebsite(c *gin.Context) {
Message: common_err.GetMsg(common_err.SERVICE_ERROR), Message: common_err.GetMsg(common_err.SERVICE_ERROR),
}) })
} }
for _, item := range searchSSL.Data.Items { for _, item := range searchSSL.Data {
if item.Provider == sslProvider && item.PrimaryDomain == domain { if item.Provider == sslProvider && item.PrimaryDomain == domain {
sslId = item.ID sslId = item.ID
break break
@ -433,8 +434,8 @@ func OnePanelCreateWebsite(c *gin.Context) {
if protocol == "https" { if protocol == "https" {
//TODO Find SSL //TODO Find SSL
var searchSSL model2.SearchSSLRequest var searchSSL model2.SearchSSLRequest
searchSSL.Page = 1 searchSSL.Page = 0
searchSSL.PageSize = 50 searchSSL.PageSize = 0
sslId := -1 sslId := -1
ssl, err := service.MyService.OnePanel().SearchWebsiteSSl(searchSSL, onePanelServer, headers) ssl, err := service.MyService.OnePanel().SearchWebsiteSSl(searchSSL, onePanelServer, headers)
if err != nil { if err != nil {
@ -445,7 +446,7 @@ func OnePanelCreateWebsite(c *gin.Context) {
}) })
} }
for _, item := range ssl.Data.Items { for _, item := range ssl.Data {
if item.PrimaryDomain == domain && item.Provider == sslProvider { if item.PrimaryDomain == domain && item.Provider == sslProvider {
sslId = item.ID sslId = item.ID
break break
@ -479,8 +480,8 @@ func OnePanelCreateWebsite(c *gin.Context) {
// TODO Enable HTTPS // TODO Enable HTTPS
var searchAcme model2.AcmeSearchRequest var searchAcme model2.AcmeSearchRequest
acmeId := 0 acmeId := 0
searchAcme.Page = 1 searchAcme.Page = 0
searchAcme.PageSize = 50 searchAcme.PageSize = 0
if sslProvider == "http" { if sslProvider == "http" {
acme, err := service.MyService.OnePanel().AcmeAccountSearch(searchAcme, onePanelServer, headers) acme, err := service.MyService.OnePanel().AcmeAccountSearch(searchAcme, onePanelServer, headers)
if err != nil { if err != nil {
@ -541,7 +542,7 @@ func IssueSelfSignedCert(domain string, websiteId int, headers map[string]string
} }
var searchSelfSignedCert model2.SelfSignedCertSearchRequest var searchSelfSignedCert model2.SelfSignedCertSearchRequest
searchSelfSignedCert.Page = 1 searchSelfSignedCert.Page = 1
searchSelfSignedCert.PageSize = 50 searchSelfSignedCert.PageSize = 1000
selfsignedCert, err := service.MyService.OnePanel().SelfSignedCertSearch(searchSelfSignedCert, onePanelServer, headers) selfsignedCert, err := service.MyService.OnePanel().SelfSignedCertSearch(searchSelfSignedCert, onePanelServer, headers)
if err != nil { if err != nil {
return 0, err return 0, err
@ -581,13 +582,13 @@ func IssueSelfSignedCert(domain string, websiteId int, headers map[string]string
} }
fmt.Println(issueSelfSignedCertRes) fmt.Println(issueSelfSignedCertRes)
var searchSSL model2.SearchSSLRequest var searchSSL model2.SearchSSLRequest
searchSSL.Page = 1 searchSSL.Page = 0
searchSSL.PageSize = 50 searchSSL.PageSize = 0
ssl, err := service.MyService.OnePanel().SearchWebsiteSSl(searchSSL, onePanelServer, headers) ssl, err := service.MyService.OnePanel().SearchWebsiteSSl(searchSSL, onePanelServer, headers)
if err != nil { if err != nil {
return 0, err return 0, err
} }
for _, item := range ssl.Data.Items { for _, item := range ssl.Data {
if item.PrimaryDomain == domain { if item.PrimaryDomain == domain {
return item.ID, nil return item.ID, nil
} }
@ -597,8 +598,8 @@ func IssueSelfSignedCert(domain string, websiteId int, headers map[string]string
} }
func OnePanelApplyWebsiteSSl(domain string, websiteId int, headers map[string]string) (int, error) { func OnePanelApplyWebsiteSSl(domain string, websiteId int, headers map[string]string) (int, error) {
var searchAcme model2.AcmeSearchRequest var searchAcme model2.AcmeSearchRequest
searchAcme.Page = 1 searchAcme.Page = 0
searchAcme.PageSize = 50 searchAcme.PageSize = 0
acme, err := service.MyService.OnePanel().AcmeAccountSearch(searchAcme, onePanelServer, headers) acme, err := service.MyService.OnePanel().AcmeAccountSearch(searchAcme, onePanelServer, headers)
if err != nil { if err != nil {
return 0, err return 0, err
@ -651,6 +652,16 @@ func OnePanelDeleteWebsite(c *gin.Context) {
json := make(map[string]string) json := make(map[string]string)
c.ShouldBind(&json) c.ShouldBind(&json)
domain := json["domain"] domain := json["domain"]
deleteSSL, err := strconv.ParseBool(json["deleteSSL"])
if err != nil {
c.JSON(common_err.SERVICE_ERROR,
model.Result{
Success: common_err.SERVICE_ERROR,
Message: common_err.GetMsg(common_err.SERVICE_ERROR),
})
}
test := json["deleteSSL"]
fmt.Println(test)
var searchParam model2.SearchWebsiteRequest var searchParam model2.SearchWebsiteRequest
searchParam.Name = domain searchParam.Name = domain
searchParam.Page = 1 searchParam.Page = 1
@ -690,7 +701,45 @@ func OnePanelDeleteWebsite(c *gin.Context) {
Message: common_err.GetMsg(common_err.SUCCESS), Message: common_err.GetMsg(common_err.SUCCESS),
Data: response, Data: response,
}) })
return }
if deleteSSL {
var searchSSLParam model2.SearchSSLRequest
searchSSLParam.AcmeAccountID = ""
searchSSLParam.Page = 0
searchSSLParam.PageSize = 0
searchSSL, err := service.MyService.OnePanel().SearchWebsiteSSl(searchSSLParam, onePanelServer, headers)
if err != nil {
c.JSON(common_err.SERVICE_ERROR,
model.Result{
Success: common_err.SERVICE_ERROR,
Message: common_err.GetMsg(common_err.SERVICE_ERROR),
})
}
if len(searchSSL.Data) > 0 {
var deleleSSL model2.DeleteSSLRequest
for _, ssl := range searchSSL.Data {
if ssl.PrimaryDomain == domain {
deleleSSL.Ids = append(deleleSSL.Ids, ssl.ID)
}
}
if len(deleleSSL.Ids) > 0 {
deleteResult, err := service.MyService.OnePanel().DeleteWebsiteSSL(deleleSSL, onePanelServer, headers)
if err != nil {
c.JSON(common_err.SERVICE_ERROR,
model.Result{
Success: common_err.SERVICE_ERROR,
Message: common_err.GetMsg(common_err.SERVICE_ERROR),
})
}
fmt.Println(deleteResult)
c.JSON(common_err.SUCCESS,
model.Result{
Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS),
})
return
}
}
} }
c.JSON(common_err.SUCCESS, c.JSON(common_err.SUCCESS,
model.Result{ model.Result{
@ -780,7 +829,7 @@ var oidcInit bool
func InitOIDC() { func InitOIDC() {
const ( const (
maxSleep = 60 * time.Second maxSleep = 60 * time.Second
minSleep = 10 * time.Second minSleep = 3 * time.Second
maxRetryBackoff = 5 // Cap retry backoff to 5 attempts maxRetryBackoff = 5 // Cap retry backoff to 5 attempts
) )

View File

@ -2,6 +2,7 @@ package service
import ( import (
"bytes" "bytes"
"encoding/base64"
"encoding/json" "encoding/json"
"fmt" "fmt"
"log" "log"
@ -11,11 +12,10 @@ import (
) )
type OnePanelService interface { type OnePanelService interface {
Login(m model2.OnePanelCredentials, baseURL string) (model2.LoginResponse, []*http.Cookie, error) Login(m model2.OnePanelCredentials, baseURL string, entranceCode string) (model2.LoginResponse, []*http.Cookie, error)
Logout(m model2.OnePanelCredentials, baseURL string) (model2.LogoutResponse, error) Logout(m model2.OnePanelCredentials, baseURL string) (model2.LogoutResponse, error)
HealthCheck(baseURL string) (string, error) HealthCheck(baseURL string) (string, error)
SearchInstalledApp(p model2.InstalledAppRequest, baseURL string) (model2.InstalledAppResponse, error) SearchInstalledApp(p model2.InstalledAppRequest, baseURL string) (model2.InstalledAppResponse, error)
// InstallApp()
SearchWebsite(m model2.SearchWebsiteRequest, baseUrl string, headers map[string]string) (model2.SearchWebsiteResponse, error) SearchWebsite(m model2.SearchWebsiteRequest, baseUrl string, headers map[string]string) (model2.SearchWebsiteResponse, error)
CreateWebsite(m model2.CreateWebsiteRequest, baseUrl string, headers map[string]string) (model2.GenericResponse, error) CreateWebsite(m model2.CreateWebsiteRequest, baseUrl string, headers map[string]string) (model2.GenericResponse, error)
DeleteWebsite(m model2.DeleteWebsiteRequest, baseUrl string, headers map[string]string) (model2.GenericResponse, error) DeleteWebsite(m model2.DeleteWebsiteRequest, baseUrl string, headers map[string]string) (model2.GenericResponse, error)
@ -28,6 +28,7 @@ type OnePanelService interface {
ApplyWebsiteSSl(m model2.CreateSSLRequest, baseUrl string, headers map[string]string) (model2.CreateSSLResponse, error) ApplyWebsiteSSl(m model2.CreateSSLRequest, baseUrl string, headers map[string]string) (model2.CreateSSLResponse, error)
SearchWebsiteSSl(m model2.SearchSSLRequest, baseUrl string, headers map[string]string) (model2.SearchSSLResponse, error) SearchWebsiteSSl(m model2.SearchSSLRequest, baseUrl string, headers map[string]string) (model2.SearchSSLResponse, error)
UpdateWebsiteProtocol(m model2.WebsiteHttpsConfigRequest, baseUrl string, headers map[string]string) (model2.GenericResponse, error) UpdateWebsiteProtocol(m model2.WebsiteHttpsConfigRequest, baseUrl string, headers map[string]string) (model2.GenericResponse, error)
DeleteWebsiteSSL(m model2.DeleteSSLRequest, baseUrl string, headers map[string]string) (model2.GenericResponse, error)
} }
var ( var (
@ -38,7 +39,35 @@ type onePanelService struct {
} }
// TODO A lot of redundant code need refactor // TODO A lot of redundant code need refactor
func (o *onePanelService) DeleteWebsiteSSL(m model2.DeleteSSLRequest, baseUrl string, headers map[string]string) (model2.GenericResponse, error) {
path := baseUrl + "/api/v1/websites/ssl/del"
reqBody, err := json.Marshal(m)
if err != nil {
return model2.GenericResponse{}, fmt.Errorf("error marshaling request body: %v", err)
}
req, err := http.NewRequest("POST", path, bytes.NewReader(reqBody))
if err != nil {
return model2.GenericResponse{}, fmt.Errorf("error creating request: %v", err)
}
// Add headers to the request
for key, value := range headers {
req.Header.Set(key, value)
}
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return model2.GenericResponse{}, fmt.Errorf("error making request: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
return model2.GenericResponse{}, fmt.Errorf("HTTP error: %s", resp.Status)
}
var result model2.GenericResponse
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
return model2.GenericResponse{}, fmt.Errorf("error decoding response: %v", err)
}
return result, nil
}
func (o *onePanelService) UpdateWebsiteProtocol(m model2.WebsiteHttpsConfigRequest, baseUrl string, headers map[string]string) (model2.GenericResponse, error) { func (o *onePanelService) UpdateWebsiteProtocol(m model2.WebsiteHttpsConfigRequest, baseUrl string, headers map[string]string) (model2.GenericResponse, error) {
path := baseUrl + fmt.Sprintf("/api/v1/websites/%d/https", m.WebsiteID) path := baseUrl + fmt.Sprintf("/api/v1/websites/%d/https", m.WebsiteID)
reqBody, err := json.Marshal(m) reqBody, err := json.Marshal(m)
@ -418,7 +447,7 @@ func (o *onePanelService) SearchInstalledApp(m model2.InstalledAppRequest, baseU
return result, nil return result, nil
} }
func (o *onePanelService) Login(m model2.OnePanelCredentials, baseURL string) (model2.LoginResponse, []*http.Cookie, error) { func (o *onePanelService) Login(m model2.OnePanelCredentials, baseURL string, entranceCode string) (model2.LoginResponse, []*http.Cookie, error) {
path := baseURL + prefixV1 + "/auth/login" path := baseURL + prefixV1 + "/auth/login"
// Create the request body by marshaling the credentials into JSON // Create the request body by marshaling the credentials into JSON
@ -433,7 +462,7 @@ func (o *onePanelService) Login(m model2.OnePanelCredentials, baseURL string) (m
} }
req.Header.Set("Content-Type", "application/json") req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json") req.Header.Set("Accept", "application/json")
req.Header.Set("Entrancecode", base64.StdEncoding.EncodeToString([]byte(entranceCode)))
// Reuse the HTTP client (consider making it a field in onePanelService) // Reuse the HTTP client (consider making it a field in onePanelService)
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)

View File

@ -99,43 +99,56 @@ type SearchSSLRequest struct {
type SearchSSLResponse struct { type SearchSSLResponse struct {
Code int `json:"code"` Code int `json:"code"`
Message string `json:"message"` Message string `json:"message"`
Data struct { Data []struct {
Total int `json:"total"` ID int `json:"id"`
Items []struct { CreatedAt time.Time `json:"createdAt"`
ID int `json:"id"` UpdatedAt time.Time `json:"updatedAt"`
CreatedAt time.Time `json:"createdAt"` PrimaryDomain string `json:"primaryDomain"`
UpdatedAt time.Time `json:"updatedAt"` PrivateKey string `json:"privateKey"`
PrimaryDomain string `json:"primaryDomain"` Pem string `json:"pem"`
PrivateKey string `json:"privateKey"` Domains string `json:"domains"`
Pem string `json:"pem"` CertURL string `json:"certURL"`
Domains string `json:"domains"` Type string `json:"type"`
CertURL string `json:"certURL"` Provider string `json:"provider"`
Type string `json:"type"` Organization string `json:"organization"`
Provider string `json:"provider"` DNSAccountID int `json:"dnsAccountId"`
Organization string `json:"organization"` AcmeAccountID int `json:"acmeAccountId"`
DNSAccountID int `json:"dnsAccountId"` CaID int `json:"caId"`
AcmeAccountID int `json:"acmeAccountId"` AutoRenew bool `json:"autoRenew"`
CaID int `json:"caId"` ExpireDate time.Time `json:"expireDate"`
AutoRenew bool `json:"autoRenew"` StartDate time.Time `json:"startDate"`
ExpireDate time.Time `json:"expireDate"` Status string `json:"status"`
StartDate time.Time `json:"startDate"` Message string `json:"message"`
Status string `json:"status"` KeyType string `json:"keyType"`
Message string `json:"message"` PushDir bool `json:"pushDir"`
KeyType string `json:"keyType"` Dir string `json:"dir"`
PushDir bool `json:"pushDir"` Description string `json:"description"`
Dir string `json:"dir"` SkipDNS bool `json:"skipDNS"`
Description string `json:"description"` Nameserver1 string `json:"nameserver1"`
SkipDNS bool `json:"skipDNS"` Nameserver2 string `json:"nameserver2"`
Nameserver1 string `json:"nameserver1"` DisableCNAME bool `json:"disableCNAME"`
Nameserver2 string `json:"nameserver2"` ExecShell bool `json:"execShell"`
DisableCNAME bool `json:"disableCNAME"` Shell string `json:"shell"`
ExecShell bool `json:"execShell"` AcmeAccount struct {
Shell string `json:"shell"` ID int `json:"id"`
AcmeAccount AcmeAccount `json:"acmeAccount"` CreatedAt time.Time `json:"createdAt"`
DNSAccount DNSAccount `json:"dnsAccount"` UpdatedAt time.Time `json:"updatedAt"`
Websites []WebsiteDetail `json:"websites"` Email string `json:"email"`
LogPath string `json:"logPath"` URL string `json:"url"`
} `json:"items"` Type string `json:"type"`
EabKid string `json:"eabKid"`
EabHmacKey string `json:"eabHmacKey"`
KeyType string `json:"keyType"`
} `json:"acmeAccount"`
DNSAccount struct {
ID int `json:"id"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
Name string `json:"name"`
Type string `json:"type"`
} `json:"dnsAccount"`
Websites interface{} `json:"websites"`
LogPath string `json:"logPath"`
} `json:"data"` } `json:"data"`
} }
type WebsiteHttpsConfigRequest struct { type WebsiteHttpsConfigRequest struct {
@ -184,7 +197,9 @@ type SelfSignedCertSearchResponse struct {
} `json:"items"` } `json:"items"`
} `json:"data"` } `json:"data"`
} }
type DeleteSSLRequest struct {
Ids []int `json:"ids"`
}
type WebsiteDetail struct { type WebsiteDetail struct {
ID int `json:"id"` ID int `json:"id"`
CreatedAt time.Time `json:"createdAt"` CreatedAt time.Time `json:"createdAt"`