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

View File

@ -2,6 +2,7 @@ package service
import (
"bytes"
"encoding/base64"
"encoding/json"
"fmt"
"log"
@ -11,11 +12,10 @@ import (
)
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)
HealthCheck(baseURL string) (string, error)
SearchInstalledApp(p model2.InstalledAppRequest, baseURL string) (model2.InstalledAppResponse, error)
// InstallApp()
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)
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)
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)
DeleteWebsiteSSL(m model2.DeleteSSLRequest, baseUrl string, headers map[string]string) (model2.GenericResponse, error)
}
var (
@ -38,7 +39,35 @@ type onePanelService struct {
}
// 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) {
path := baseUrl + fmt.Sprintf("/api/v1/websites/%d/https", m.WebsiteID)
reqBody, err := json.Marshal(m)
@ -418,7 +447,7 @@ func (o *onePanelService) SearchInstalledApp(m model2.InstalledAppRequest, baseU
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"
// 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("Accept", "application/json")
req.Header.Set("Entrancecode", base64.StdEncoding.EncodeToString([]byte(entranceCode)))
// Reuse the HTTP client (consider making it a field in onePanelService)
client := &http.Client{}
resp, err := client.Do(req)

View File

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