diff --git a/.vscode/launch.json b/.vscode/launch.json index 33fc68d..f56b972 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -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" diff --git a/route/v1/user.go b/route/v1/user.go index c073e92..f7290e9 100644 --- a/route/v1/user.go +++ b/route/v1/user.go @@ -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 ) diff --git a/service/1panel.go b/service/1panel.go index 71787e6..2d39dd5 100644 --- a/service/1panel.go +++ b/service/1panel.go @@ -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) diff --git a/service/model/dto_onepanel_ssl.go b/service/model/dto_onepanel_ssl.go index 300ad82..edaa920 100644 --- a/service/model/dto_onepanel_ssl.go +++ b/service/model/dto_onepanel_ssl.go @@ -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"`