From c21da2e6ee232e8c6b531a3f16cca5ba0ba8ef75 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Mon, 22 Jun 2026 16:29:53 +0800 Subject: [PATCH] refactor: clean code --- .../unicloud-webhost/unicloud_webhost.go | 2 +- .../conoha/vps/v3/api_dns_create_record.go | 2 +- .../conoha/vps/v3/api_dns_delete_record.go | 2 +- .../conoha/vps/v3/api_dns_get_domains_list.go | 2 +- pkg/sdk3rd/conoha/vps/v3/client.go | 32 ++--- .../unicloud/api_create_domain_with_cert.go | 9 +- pkg/sdk3rd/dcloud/unicloud/client.go | 113 ++++++++++-------- pkg/sdk3rd/flexcdn/api_update_ssl_cert.go | 2 +- pkg/sdk3rd/flexcdn/client.go | 35 ++++-- pkg/sdk3rd/goedge/api_update_ssl_cert.go | 2 +- pkg/sdk3rd/goedge/client.go | 35 ++++-- .../lecdn/v3/client/api_update_certificate.go | 2 +- pkg/sdk3rd/lecdn/v3/client/client.go | 24 ++-- .../lecdn/v3/master/api_update_certificate.go | 2 +- pkg/sdk3rd/lecdn/v3/master/client.go | 24 ++-- .../mohua/api_list_virtualhost_domains.go | 2 +- pkg/sdk3rd/mohua/api_set_virtualhost_ssl.go | 2 +- pkg/sdk3rd/mohua/client.go | 25 ++-- .../api_nginx_create_certificate.go | 2 +- .../api_nginx_list_certificates.go | 2 +- .../api_nginx_list_dead_hosts.go | 2 +- .../api_nginx_list_proxy_hosts.go | 2 +- .../api_nginx_list_redirection_hosts.go | 2 +- .../api_nginx_list_streams.go | 2 +- .../api_nginx_update_dead_host.go | 2 +- .../api_nginx_update_proxy_host.go | 2 +- .../api_nginx_update_redirection_host.go | 2 +- .../api_nginx_update_stream.go | 2 +- .../api_nginx_upload_certificate.go | 2 +- .../api_settings_get_default_site.go | 2 +- .../api_settings_set_default_site.go | 2 +- pkg/sdk3rd/nginxproxymanager/client.go | 28 +++-- pkg/sdk3rd/upyun/console/api_get_buckets.go | 2 +- .../api_get_https_certificate_manager.go | 2 +- .../console/api_get_https_service_manager.go | 2 +- .../upyun/console/api_migrate_https_domain.go | 2 +- .../api_update_https_certificate_manager.go | 2 +- .../console/api_upload_https_certificate.go | 2 +- pkg/sdk3rd/upyun/console/client.go | 27 +++-- 39 files changed, 240 insertions(+), 170 deletions(-) diff --git a/pkg/core/deployer/providers/unicloud-webhost/unicloud_webhost.go b/pkg/core/deployer/providers/unicloud-webhost/unicloud_webhost.go index 83a624182..3276d9407 100644 --- a/pkg/core/deployer/providers/unicloud-webhost/unicloud_webhost.go +++ b/pkg/core/deployer/providers/unicloud-webhost/unicloud_webhost.go @@ -81,7 +81,7 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*Dep Cert: url.QueryEscape(certPEM), Key: url.QueryEscape(privkeyPEM), } - createDomainWithCertResp, err := d.sdkClient.CreateDomainWithCert(createDomainWithCertReq) + createDomainWithCertResp, err := d.sdkClient.CreateDomainWithCertWithContext(ctx, createDomainWithCertReq) d.logger.Debug("sdk request 'unicloud.host.CreateDomainWithCert'", slog.Any("request", createDomainWithCertReq), slog.Any("response", createDomainWithCertResp)) if err != nil { return nil, fmt.Errorf("failed to execute sdk request 'unicloud.host.CreateDomainWithCert': %w", err) diff --git a/pkg/sdk3rd/conoha/vps/v3/api_dns_create_record.go b/pkg/sdk3rd/conoha/vps/v3/api_dns_create_record.go index d1e5bdf14..0bf6da251 100644 --- a/pkg/sdk3rd/conoha/vps/v3/api_dns_create_record.go +++ b/pkg/sdk3rd/conoha/vps/v3/api_dns_create_record.go @@ -36,7 +36,7 @@ func (c *Client) DnsCreateRecordWithContext(ctx context.Context, domainId string return nil, fmt.Errorf("sdkerr: bad request: unset domainId") } - if err := c.ensureAccessTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/conoha/vps/v3/api_dns_delete_record.go b/pkg/sdk3rd/conoha/vps/v3/api_dns_delete_record.go index 452fd8af6..aa64ec3c2 100644 --- a/pkg/sdk3rd/conoha/vps/v3/api_dns_delete_record.go +++ b/pkg/sdk3rd/conoha/vps/v3/api_dns_delete_record.go @@ -23,7 +23,7 @@ func (c *Client) DnsDeleteRecordWithContext(ctx context.Context, domainId string return nil, fmt.Errorf("sdkerr: bad request: unset recordId") } - if err := c.ensureAccessTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/conoha/vps/v3/api_dns_get_domains_list.go b/pkg/sdk3rd/conoha/vps/v3/api_dns_get_domains_list.go index bcd3815a2..7c92b0cc7 100644 --- a/pkg/sdk3rd/conoha/vps/v3/api_dns_get_domains_list.go +++ b/pkg/sdk3rd/conoha/vps/v3/api_dns_get_domains_list.go @@ -27,7 +27,7 @@ func (c *Client) DnsGetDomainsList(req *DnsGetDomainsListRequest) (*DnsGetDomain } func (c *Client) DnsGetDomainsListWithContext(ctx context.Context, req *DnsGetDomainsListRequest) (*DnsGetDomainsListResponse, error) { - if err := c.ensureAccessTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/conoha/vps/v3/client.go b/pkg/sdk3rd/conoha/vps/v3/client.go index e3779ee53..0a5345db3 100644 --- a/pkg/sdk3rd/conoha/vps/v3/client.go +++ b/pkg/sdk3rd/conoha/vps/v3/client.go @@ -3,6 +3,7 @@ package v3 import ( + "context" "crypto/tls" "encoding/json" "fmt" @@ -22,9 +23,9 @@ type Client struct { tenantId string tenantName string - accessToken string - accessTokenExp time.Time - accessTokenMtx sync.Mutex + token string + tokenAt time.Time + tokenMu sync.Mutex rc *resty.Client } @@ -57,8 +58,8 @@ func NewClient(optFns ...OptionsFunc) (*Client, error) { SetHeader("Content-Type", "application/json"). SetHeader("User-Agent", app.AppUserAgent). SetPreRequestHook(func(_ *resty.Client, req *http.Request) error { - if client.accessToken != "" { - req.Header.Set("X-Auth-Token", client.accessToken) + if client.token != "" { + req.Header.Set("X-Auth-Token", client.token) } return nil @@ -135,10 +136,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res sdkResponse) (*rest return resp, nil } -func (c *Client) ensureAccessTokenExists() error { - c.accessTokenMtx.Lock() - defer c.accessTokenMtx.Unlock() - if c.accessToken != "" && c.accessTokenExp.After(time.Now()) { +func (c *Client) ensureToken(ctx context.Context) error { + c.tokenMu.Lock() + defer c.tokenMu.Unlock() + if c.token != "" && c.tokenAt.After(time.Now()) { return nil } @@ -175,6 +176,7 @@ func (c *Client) ensureAccessTokenExists() error { }, }, }) + httpreq.SetContext(ctx) } type createAuthTokenResponse struct { @@ -189,20 +191,20 @@ func (c *Client) ensureAccessTokenExists() error { if httpresp, err := c.doRequestWithResult(httpreq, result); err != nil { return err } else if rCode := result.GetCode(); rCode != 0 { - return fmt.Errorf("sdkerr: failed to get conoha access token: code='%d', error='%s'", rCode, result.GetError()) + return fmt.Errorf("sdkerr: auth error: code='%d', error='%s'", rCode, result.GetError()) } else { token := httpresp.Header().Get("X-Subject-Token") if token == "" { - return fmt.Errorf("sdkerr: api error: received empty auth token") + return fmt.Errorf("sdkerr: auth error: received empty token") } - tokenExp, err := time.Parse(time.RFC3339Nano, result.Token.ExpiresAt) + tokenAt, err := time.Parse(time.RFC3339Nano, result.Token.ExpiresAt) if err != nil { - return fmt.Errorf("sdkerr: api error: received invalid auth token expiration: %w", err) + return fmt.Errorf("sdkerr: auth error: received invalid token expiration: %w", err) } - c.accessToken = token - c.accessTokenExp = tokenExp + c.token = token + c.tokenAt = tokenAt } return nil diff --git a/pkg/sdk3rd/dcloud/unicloud/api_create_domain_with_cert.go b/pkg/sdk3rd/dcloud/unicloud/api_create_domain_with_cert.go index b7bde7317..eb6c0dd58 100644 --- a/pkg/sdk3rd/dcloud/unicloud/api_create_domain_with_cert.go +++ b/pkg/sdk3rd/dcloud/unicloud/api_create_domain_with_cert.go @@ -1,6 +1,7 @@ package unicloud import ( + "context" "net/http" ) @@ -17,11 +18,15 @@ type CreateDomainWithCertResponse struct { } func (c *Client) CreateDomainWithCert(req *CreateDomainWithCertRequest) (*CreateDomainWithCertResponse, error) { - if err := c.ensureApiUserTokenExists(); err != nil { + return c.CreateDomainWithCertWithContext(context.Background(), req) +} + +func (c *Client) CreateDomainWithCertWithContext(ctx context.Context, req *CreateDomainWithCertRequest) (*CreateDomainWithCertResponse, error) { + if err := c.ensureApiUserToken(ctx); err != nil { return nil, err } resp := &CreateDomainWithCertResponse{} - err := c.sendRequestWithResult(http.MethodPost, "/host/create-domain-with-cert", req, resp) + err := c.sendRequestWithResult(ctx, http.MethodPost, "/host/create-domain-with-cert", req, resp) return resp, err } diff --git a/pkg/sdk3rd/dcloud/unicloud/client.go b/pkg/sdk3rd/dcloud/unicloud/client.go index ac80022b0..0cdf13ff7 100644 --- a/pkg/sdk3rd/dcloud/unicloud/client.go +++ b/pkg/sdk3rd/dcloud/unicloud/client.go @@ -2,6 +2,7 @@ package unicloud import ( + "context" "crypto/hmac" "crypto/md5" "encoding/hex" @@ -24,16 +25,15 @@ type Client struct { username string password string - serverlessJwtToken string - serverlessJwtTokenExp time.Time - serverlessJwtTokenMtx sync.Mutex + serverlessToken string + serverlessTokenAt time.Time + serverlessTokenMu sync.Mutex - serverlessClient *resty.Client + apiUserToken string + apiUserTokenMu sync.Mutex - apiUserToken string - apiUserTokenMtx sync.Mutex - - apiClient *resty.Client + rcForServerless *resty.Client + rcForApiUser *resty.Client } const ( @@ -64,11 +64,11 @@ func NewClient(optFns ...OptionsFunc) (*Client, error) { username: opts.Username, password: opts.Password, } - client.serverlessClient = resty.New(). + client.rcForServerless = resty.New(). SetHeader("Accept", "application/json"). SetHeader("Content-Type", "application/json"). SetHeader("User-Agent", app.AppUserAgent) - client.apiClient = resty.New(). + client.rcForApiUser = resty.New(). SetBaseURL("https://unicloud-api.dcloud.net.cn/unicloud/api"). SetHeader("Accept", "application/json"). SetHeader("Content-Type", "application/json"). @@ -85,7 +85,7 @@ func NewClient(optFns ...OptionsFunc) (*Client, error) { } func (c *Client) SetTimeout(timeout time.Duration) *Client { - c.serverlessClient.SetTimeout(timeout) + c.rcForServerless.SetTimeout(timeout) return c } @@ -120,7 +120,7 @@ func (c *Client) buildServerlessPayloadInfo(appId, spaceId, target, method, acti functionArgs := map[string]any{ "clientInfo": clientInfo, - "uniIdToken": c.serverlessJwtToken, + "uniIdToken": c.serverlessToken, } if method != "" { functionArgs["method"] = method @@ -156,14 +156,14 @@ func (c *Client) buildServerlessPayloadInfo(appId, spaceId, target, method, acti return payload, nil } -func (c *Client) invokeServerless(endpoint, clientSecret, appId, spaceId, target, method, action string, params, data interface{}) (*resty.Response, error) { +func (c *Client) invokeServerless(ctx context.Context, endpoint, clientSecret, appId, spaceId, target, method, action string, params, data interface{}) (*resty.Response, error) { if endpoint == "" { - return nil, fmt.Errorf("unicloud api error: endpoint cannot be empty") + return nil, fmt.Errorf("sdkerr: bad request: endpoint cannot be empty") } payload, err := c.buildServerlessPayloadInfo(appId, spaceId, target, method, action, params, data) if err != nil { - return nil, fmt.Errorf("unicloud api error: failed to build request: %w", err) + return nil, fmt.Errorf("sdkerr: bad request: failed to build request: %w", err) } clientInfo, _ := c.buildServerlessClientInfo(appId) @@ -171,26 +171,27 @@ func (c *Client) invokeServerless(endpoint, clientSecret, appId, spaceId, target sign := generateSignature(payload, clientSecret) - req := c.serverlessClient.R(). + req := c.rcForServerless.R(). SetHeader("Content-Type", "application/json"). SetHeader("Origin", "https://unicloud.dcloud.net.cn"). SetHeader("Referer", "https://unicloud.dcloud.net.cn"). SetHeader("X-Client-Info", string(clientInfoJsonb)). - SetHeader("X-Client-Token", c.serverlessJwtToken). + SetHeader("X-Client-Token", c.serverlessToken). SetHeader("X-Serverless-Sign", sign). - SetBody(payload) + SetBody(payload). + SetContext(ctx) resp, err := req.Post(endpoint) if err != nil { - return resp, fmt.Errorf("unicloud api error: failed to send request: %w", err) + return resp, fmt.Errorf("sdkerr: failed to send request: %w", err) } else if resp.IsError() { - return resp, fmt.Errorf("unicloud api error: unexpected status code: %d (resp: %s)", resp.StatusCode(), resp.String()) + return resp, fmt.Errorf("sdkerr: unexpected status code: %d (resp: %s)", resp.StatusCode(), resp.String()) } return resp, nil } -func (c *Client) invokeServerlessWithResult(endpoint, clientSecret, appId, spaceId, target, method, action string, params, data interface{}, result sdkResponse) error { - resp, err := c.invokeServerless(endpoint, clientSecret, appId, spaceId, target, method, action, params, data) +func (c *Client) invokeServerlessWithResult(ctx context.Context, endpoint, clientSecret, appId, spaceId, target, method, action string, params, data interface{}, result sdkResponse) error { + resp, err := c.invokeServerless(ctx, endpoint, clientSecret, appId, spaceId, target, method, action, params, data) if err != nil { if resp != nil { json.Unmarshal(resp.Body(), &result) @@ -199,16 +200,17 @@ func (c *Client) invokeServerlessWithResult(endpoint, clientSecret, appId, space } if err := json.Unmarshal(resp.Body(), &result); err != nil { - return fmt.Errorf("unicloud api error: failed to unmarshal response: %w", err) + return fmt.Errorf("sdkerr: failed to unmarshal response: %w", err) } else if rSuccess := result.GetSuccess(); !rSuccess { - return fmt.Errorf("unicloud api error: code='%s', message='%s'", result.GetErrorCode(), result.GetErrorMessage()) + return fmt.Errorf("sdkerr: code='%s', message='%s'", result.GetErrorCode(), result.GetErrorMessage()) } return nil } -func (c *Client) sendRequest(method string, path string, params interface{}) (*resty.Response, error) { - req := c.apiClient.R() +func (c *Client) sendRequest(ctx context.Context, method string, path string, params interface{}) (*resty.Response, error) { + req := c.rcForApiUser.R(). + SetContext(ctx) if strings.EqualFold(method, http.MethodGet) { qs := make(map[string]string) if params != nil { @@ -229,16 +231,16 @@ func (c *Client) sendRequest(method string, path string, params interface{}) (*r resp, err := req.Execute(method, path) if err != nil { - return resp, fmt.Errorf("unicloud api error: failed to send request: %w", err) + return resp, fmt.Errorf("sdkerr: failed to send request: %w", err) } else if resp.IsError() { - return resp, fmt.Errorf("unicloud api error: unexpected status code: %d (resp: %s)", resp.StatusCode(), resp.String()) + return resp, fmt.Errorf("sdkerr: unexpected status code: %d (resp: %s)", resp.StatusCode(), resp.String()) } return resp, nil } -func (c *Client) sendRequestWithResult(method string, path string, params interface{}, result sdkResponse) error { - resp, err := c.sendRequest(method, path, params) +func (c *Client) sendRequestWithResult(ctx context.Context, method string, path string, params interface{}, result sdkResponse) error { + resp, err := c.sendRequest(ctx, method, path, params) if err != nil { if resp != nil { json.Unmarshal(resp.Body(), &result) @@ -247,18 +249,18 @@ func (c *Client) sendRequestWithResult(method string, path string, params interf } if err := json.Unmarshal(resp.Body(), &result); err != nil { - return fmt.Errorf("unicloud api error: failed to unmarshal response: %w", err) + return fmt.Errorf("sdkerr: failed to unmarshal response: %w", err) } else if rReturnCode := result.GetReturnCode(); rReturnCode != 0 { - return fmt.Errorf("unicloud api error: ret='%d', desc='%s'", rReturnCode, result.GetReturnDesc()) + return fmt.Errorf("sdkerr: ret='%d', desc='%s'", rReturnCode, result.GetReturnDesc()) } return nil } -func (c *Client) ensureServerlessJwtTokenExists() error { - c.serverlessJwtTokenMtx.Lock() - defer c.serverlessJwtTokenMtx.Unlock() - if c.serverlessJwtToken != "" && c.serverlessJwtTokenExp.After(time.Now()) { +func (c *Client) ensureServerlessToken(ctx context.Context) error { + c.serverlessTokenMu.Lock() + defer c.serverlessTokenMu.Unlock() + if c.serverlessToken != "" && c.serverlessTokenAt.After(time.Now()) { return nil } @@ -286,28 +288,35 @@ func (c *Client) ensureServerlessJwtTokenExists() error { } resp := &loginResponse{} - if err := c.invokeServerlessWithResult( + if err := c.invokeServerlessWithResult(ctx, uniIdentityEndpoint, uniIdentityClientSecret, uniIdentityAppId, uniIdentitySpaceId, "uni-id-co", "login", "", params, nil, resp); err != nil { return err - } else if resp.Data == nil || resp.Data.NewToken == nil || resp.Data.NewToken.Token == "" { - return fmt.Errorf("unicloud api error: received empty token") - } + } else { + if resp.Data == nil || resp.Data.NewToken == nil || resp.Data.NewToken.Token == "" { + return fmt.Errorf("sdkerr: auth error: received empty token") + } - c.serverlessJwtToken = resp.Data.NewToken.Token - c.serverlessJwtTokenExp = time.UnixMilli(resp.Data.NewToken.TokenExpired) + tokenAt := time.UnixMilli(resp.Data.NewToken.TokenExpired) + if tokenAt.IsZero() { + return fmt.Errorf("sdkerr: auth error: received invalid token expiration") + } + + c.serverlessToken = resp.Data.NewToken.Token + c.serverlessTokenAt = tokenAt + } return nil } -func (c *Client) ensureApiUserTokenExists() error { - if err := c.ensureServerlessJwtTokenExists(); err != nil { +func (c *Client) ensureApiUserToken(ctx context.Context) error { + if err := c.ensureServerlessToken(ctx); err != nil { return err } - c.apiUserTokenMtx.Lock() - defer c.apiUserTokenMtx.Unlock() + c.apiUserTokenMu.Lock() + defer c.apiUserTokenMu.Unlock() if c.apiUserToken != "" { return nil } @@ -328,16 +337,18 @@ func (c *Client) ensureApiUserTokenExists() error { } resp := &getUserTokenResponse{} - if err := c.invokeServerlessWithResult( + if err := c.invokeServerlessWithResult(ctx, uniConsoleEndpoint, uniConsoleClientSecret, uniConsoleAppId, uniConsoleSpaceId, "uni-cloud-kernel", "", "user/getUserToken", nil, map[string]any{"isLogin": true}, resp); err != nil { return err - } else if resp.Data == nil || resp.Data.Data == nil || resp.Data.Data.Data == nil || resp.Data.Data.Data.Token == "" { - return fmt.Errorf("unicloud api error: received empty user token") - } + } else { + if resp.Data == nil || resp.Data.Data == nil || resp.Data.Data.Data == nil || resp.Data.Data.Data.Token == "" { + return fmt.Errorf("sdkerr: auth error: received empty token") + } - c.apiUserToken = resp.Data.Data.Data.Token + c.apiUserToken = resp.Data.Data.Data.Token + } return nil } diff --git a/pkg/sdk3rd/flexcdn/api_update_ssl_cert.go b/pkg/sdk3rd/flexcdn/api_update_ssl_cert.go index ce19f316c..ffbffa4df 100644 --- a/pkg/sdk3rd/flexcdn/api_update_ssl_cert.go +++ b/pkg/sdk3rd/flexcdn/api_update_ssl_cert.go @@ -29,7 +29,7 @@ func (c *Client) UpdateSSLCert(req *UpdateSSLCertRequest) (*UpdateSSLCertRespons } func (c *Client) UpdateSSLCertWithContext(ctx context.Context, req *UpdateSSLCertRequest) (*UpdateSSLCertResponse, error) { - if err := c.ensureAccessTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/flexcdn/client.go b/pkg/sdk3rd/flexcdn/client.go index bcb6a247c..a53bc9dd0 100644 --- a/pkg/sdk3rd/flexcdn/client.go +++ b/pkg/sdk3rd/flexcdn/client.go @@ -3,6 +3,7 @@ package flexcdn import ( + "context" "crypto/tls" "encoding/json" "fmt" @@ -22,9 +23,9 @@ type Client struct { accessKeyId string accessKey string - accessToken string - accessTokenExp time.Time - accessTokenMtx sync.Mutex + token string + tokenAt time.Time + tokenMu sync.Mutex rc *resty.Client } @@ -65,8 +66,8 @@ func NewClient(serverUrl string, optFns ...OptionsFunc) (*Client, error) { SetHeader("Content-Type", "application/json"). SetHeader("User-Agent", app.AppUserAgent). SetPreRequestHook(func(_ *resty.Client, req *http.Request) error { - if client.accessToken != "" { - req.Header.Set("X-Cloud-Access-Token", client.accessToken) + if client.token != "" { + req.Header.Set("X-Cloud-Access-Token", client.token) } return nil @@ -143,10 +144,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res sdkResponse) (*rest return resp, nil } -func (c *Client) ensureAccessTokenExists() error { - c.accessTokenMtx.Lock() - defer c.accessTokenMtx.Unlock() - if c.accessToken != "" && c.accessTokenExp.After(time.Now()) { +func (c *Client) ensureToken(ctx context.Context) error { + c.tokenMu.Lock() + defer c.tokenMu.Unlock() + if c.token != "" && c.tokenAt.After(time.Now()) { return nil } @@ -159,6 +160,7 @@ func (c *Client) ensureAccessTokenExists() error { "accessKeyId": c.accessKeyId, "accessKey": c.accessKey, }) + httpreq.SetContext(ctx) } type getAPIAccessTokenResponse struct { @@ -173,10 +175,19 @@ func (c *Client) ensureAccessTokenExists() error { if _, err := c.doRequestWithResult(httpreq, result); err != nil { return err } else if rCode := result.GetCode(); rCode != 200 { - return fmt.Errorf("sdkerr: failed to get flexcdn access token: code='%d', message='%s'", rCode, result.GetMessage()) + return fmt.Errorf("sdkerr: auth error: code='%d', message='%s'", rCode, result.GetMessage()) } else { - c.accessToken = result.Data.Token - c.accessTokenExp = time.Unix(result.Data.ExpiresAt, 0) + if result.Data == nil || result.Data.Token == "" { + return fmt.Errorf("sdkerr: auth error: received empty token") + } + + tokenAt := time.Unix(result.Data.ExpiresAt, 0) + if tokenAt.IsZero() { + return fmt.Errorf("sdkerr: auth error: received invalid token expiration") + } + + c.token = result.Data.Token + c.tokenAt = tokenAt } return nil diff --git a/pkg/sdk3rd/goedge/api_update_ssl_cert.go b/pkg/sdk3rd/goedge/api_update_ssl_cert.go index 0e1527f60..695d25e95 100644 --- a/pkg/sdk3rd/goedge/api_update_ssl_cert.go +++ b/pkg/sdk3rd/goedge/api_update_ssl_cert.go @@ -29,7 +29,7 @@ func (c *Client) UpdateSSLCert(req *UpdateSSLCertRequest) (*UpdateSSLCertRespons } func (c *Client) UpdateSSLCertWithContext(ctx context.Context, req *UpdateSSLCertRequest) (*UpdateSSLCertResponse, error) { - if err := c.ensureAccessTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/goedge/client.go b/pkg/sdk3rd/goedge/client.go index f98bb859a..af651c75a 100644 --- a/pkg/sdk3rd/goedge/client.go +++ b/pkg/sdk3rd/goedge/client.go @@ -3,6 +3,7 @@ package goedge import ( + "context" "crypto/tls" "encoding/json" "fmt" @@ -22,9 +23,9 @@ type Client struct { accessKeyId string accessKey string - accessToken string - accessTokenExp time.Time - accessTokenMtx sync.Mutex + token string + tokenAt time.Time + tokenMu sync.Mutex rc *resty.Client } @@ -65,8 +66,8 @@ func NewClient(serverUrl string, optFns ...OptionsFunc) (*Client, error) { SetHeader("Content-Type", "application/json"). SetHeader("User-Agent", app.AppUserAgent). SetPreRequestHook(func(_ *resty.Client, req *http.Request) error { - if client.accessToken != "" { - req.Header.Set("X-Edge-Access-Token", client.accessToken) + if client.token != "" { + req.Header.Set("X-Edge-Access-Token", client.token) } return nil @@ -143,10 +144,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res sdkResponse) (*rest return resp, nil } -func (c *Client) ensureAccessTokenExists() error { - c.accessTokenMtx.Lock() - defer c.accessTokenMtx.Unlock() - if c.accessToken != "" && c.accessTokenExp.After(time.Now()) { +func (c *Client) ensureToken(ctx context.Context) error { + c.tokenMu.Lock() + defer c.tokenMu.Unlock() + if c.token != "" && c.tokenAt.After(time.Now()) { return nil } @@ -159,6 +160,7 @@ func (c *Client) ensureAccessTokenExists() error { "accessKeyId": c.accessKeyId, "accessKey": c.accessKey, }) + httpreq.SetContext(ctx) } type getAPIAccessTokenResponse struct { @@ -173,10 +175,19 @@ func (c *Client) ensureAccessTokenExists() error { if _, err := c.doRequestWithResult(httpreq, result); err != nil { return err } else if rCode := result.GetCode(); rCode != 200 { - return fmt.Errorf("sdkerr: failed to get goedge access token: code='%d', message='%s'", rCode, result.GetMessage()) + return fmt.Errorf("sdkerr: auth error: code='%d', message='%s'", rCode, result.GetMessage()) } else { - c.accessToken = result.Data.Token - c.accessTokenExp = time.Unix(result.Data.ExpiresAt, 0) + if result.Data == nil || result.Data.Token == "" { + return fmt.Errorf("sdkerr: auth error: received empty token") + } + + tokenAt := time.Unix(result.Data.ExpiresAt, 0) + if tokenAt.IsZero() { + return fmt.Errorf("sdkerr: auth error: received invalid token expiration") + } + + c.token = result.Data.Token + c.tokenAt = tokenAt } return nil diff --git a/pkg/sdk3rd/lecdn/v3/client/api_update_certificate.go b/pkg/sdk3rd/lecdn/v3/client/api_update_certificate.go index bda4fe092..5e291812f 100644 --- a/pkg/sdk3rd/lecdn/v3/client/api_update_certificate.go +++ b/pkg/sdk3rd/lecdn/v3/client/api_update_certificate.go @@ -28,7 +28,7 @@ func (c *Client) UpdateCertificateWithContext(ctx context.Context, certId int64, return nil, fmt.Errorf("sdkerr: bad request: unset certId") } - if err := c.ensureAccessTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/lecdn/v3/client/client.go b/pkg/sdk3rd/lecdn/v3/client/client.go index a999edf0d..b94c66b0f 100644 --- a/pkg/sdk3rd/lecdn/v3/client/client.go +++ b/pkg/sdk3rd/lecdn/v3/client/client.go @@ -2,6 +2,7 @@ package client import ( + "context" "crypto/tls" "encoding/json" "fmt" @@ -20,8 +21,8 @@ type Client struct { username string password string - accessToken string - accessTokenMtx sync.Mutex + token string + tokenMu sync.Mutex rc *resty.Client } @@ -53,8 +54,8 @@ func NewClient(serverUrl string, optFns ...OptionsFunc) (*Client, error) { SetBaseURL(strings.TrimSuffix(serverUrl, "/")+"/prod-api"). SetHeader("User-Agent", app.AppUserAgent). SetPreRequestHook(func(_ *resty.Client, req *http.Request) error { - if client.accessToken != "" { - req.Header.Set("Authorization", "Bearer "+client.accessToken) + if client.token != "" { + req.Header.Set("Authorization", "Bearer "+client.token) } return nil @@ -131,10 +132,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res sdkResponse) (*rest return resp, nil } -func (c *Client) ensureAccessTokenExists() error { - c.accessTokenMtx.Lock() - defer c.accessTokenMtx.Unlock() - if c.accessToken != "" { +func (c *Client) ensureToken(ctx context.Context) error { + c.tokenMu.Lock() + defer c.tokenMu.Unlock() + if c.token != "" { return nil } @@ -147,6 +148,7 @@ func (c *Client) ensureAccessTokenExists() error { "username": c.username, "password": c.password, }) + httpreq.SetContext(ctx) } type loginResponse struct { @@ -162,7 +164,11 @@ func (c *Client) ensureAccessTokenExists() error { if _, err := c.doRequestWithResult(httpreq, result); err != nil { return err } else { - c.accessToken = result.Data.Token + if result.Data == nil || result.Data.Token == "" { + return fmt.Errorf("sdkerr: auth error: received empty token") + } + + c.token = result.Data.Token } return nil diff --git a/pkg/sdk3rd/lecdn/v3/master/api_update_certificate.go b/pkg/sdk3rd/lecdn/v3/master/api_update_certificate.go index 666020996..dfdd4fc86 100644 --- a/pkg/sdk3rd/lecdn/v3/master/api_update_certificate.go +++ b/pkg/sdk3rd/lecdn/v3/master/api_update_certificate.go @@ -29,7 +29,7 @@ func (c *Client) UpdateCertificateWithContext(ctx context.Context, certId int64, return nil, fmt.Errorf("sdkerr: bad request: unset certId") } - if err := c.ensureAccessTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/lecdn/v3/master/client.go b/pkg/sdk3rd/lecdn/v3/master/client.go index daaa51f36..df1d70665 100644 --- a/pkg/sdk3rd/lecdn/v3/master/client.go +++ b/pkg/sdk3rd/lecdn/v3/master/client.go @@ -2,6 +2,7 @@ package master import ( + "context" "crypto/tls" "encoding/json" "fmt" @@ -20,8 +21,8 @@ type Client struct { username string password string - accessToken string - accessTokenMtx sync.Mutex + token string + tokenMu sync.Mutex rc *resty.Client } @@ -55,8 +56,8 @@ func NewClient(serverUrl string, optFns ...OptionsFunc) (*Client, error) { SetHeader("Content-Type", "application/json"). SetHeader("User-Agent", app.AppUserAgent). SetPreRequestHook(func(_ *resty.Client, req *http.Request) error { - if client.accessToken != "" { - req.Header.Set("Authorization", "Bearer "+client.accessToken) + if client.token != "" { + req.Header.Set("Authorization", "Bearer "+client.token) } return nil @@ -133,10 +134,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res sdkResponse) (*rest return resp, nil } -func (c *Client) ensureAccessTokenExists() error { - c.accessTokenMtx.Lock() - defer c.accessTokenMtx.Unlock() - if c.accessToken != "" { +func (c *Client) ensureToken(ctx context.Context) error { + c.tokenMu.Lock() + defer c.tokenMu.Unlock() + if c.token != "" { return nil } @@ -148,6 +149,7 @@ func (c *Client) ensureAccessTokenExists() error { "username": c.username, "password": c.password, }) + httpreq.SetContext(ctx) } type loginResponse struct { @@ -163,7 +165,11 @@ func (c *Client) ensureAccessTokenExists() error { if _, err := c.doRequestWithResult(httpreq, result); err != nil { return err } else { - c.accessToken = result.Data.Token + if result.Data == nil || result.Data.Token == "" { + return fmt.Errorf("sdkerr: auth error: received empty token") + } + + c.token = result.Data.Token } return nil diff --git a/pkg/sdk3rd/mohua/api_list_virtualhost_domains.go b/pkg/sdk3rd/mohua/api_list_virtualhost_domains.go index 413a214ba..ad9b1c9a4 100644 --- a/pkg/sdk3rd/mohua/api_list_virtualhost_domains.go +++ b/pkg/sdk3rd/mohua/api_list_virtualhost_domains.go @@ -22,7 +22,7 @@ func (c *Client) ListVirtualHostDomainsWithContext(ctx context.Context, hostId s return nil, fmt.Errorf("sdkerr: bad request: unset hostId") } - if err := c.ensureJwtTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/mohua/api_set_virtualhost_ssl.go b/pkg/sdk3rd/mohua/api_set_virtualhost_ssl.go index c30baddcc..0e4a26f1f 100644 --- a/pkg/sdk3rd/mohua/api_set_virtualhost_ssl.go +++ b/pkg/sdk3rd/mohua/api_set_virtualhost_ssl.go @@ -29,7 +29,7 @@ func (c *Client) SetVirtualHostSSLWithContext(ctx context.Context, hostId string return nil, fmt.Errorf("sdkerr: bad request: unset hostId") } - if err := c.ensureJwtTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/mohua/client.go b/pkg/sdk3rd/mohua/client.go index 49b9577a5..3f74516ce 100644 --- a/pkg/sdk3rd/mohua/client.go +++ b/pkg/sdk3rd/mohua/client.go @@ -2,6 +2,7 @@ package mohua import ( + "context" "crypto/tls" "encoding/json" "fmt" @@ -18,8 +19,8 @@ type Client struct { username string password string - jwtToken string - jwtTokenMtx sync.Mutex + token string + tokenMu sync.Mutex rc *resty.Client } @@ -37,7 +38,7 @@ func NewClient(optFns ...OptionsFunc) (*Client, error) { client := &Client{ username: opts.Username, password: opts.Password, - jwtToken: opts.JwtToken, + token: opts.JwtToken, } client.rc = resty.New(). SetBaseURL("https://cloud.mhjz1.cn"). @@ -45,8 +46,8 @@ func NewClient(optFns ...OptionsFunc) (*Client, error) { SetHeader("Content-Type", "application/json"). SetHeader("User-Agent", app.AppUserAgent). SetPreRequestHook(func(_ *resty.Client, req *http.Request) error { - if client.jwtToken != "" { - req.Header.Set("JWT", "Bearer "+client.jwtToken) + if client.token != "" { + req.Header.Set("JWT", "Bearer "+client.token) } return nil @@ -126,10 +127,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res any) (*resty.Respon return resp, nil } -func (c *Client) ensureJwtTokenExists() error { - c.jwtTokenMtx.Lock() - defer c.jwtTokenMtx.Unlock() - if c.jwtToken != "" { +func (c *Client) ensureToken(ctx context.Context) error { + c.tokenMu.Lock() + defer c.tokenMu.Unlock() + if c.token != "" { return nil } @@ -154,7 +155,11 @@ func (c *Client) ensureJwtTokenExists() error { } else if rStatus := result.GetStatus(); rStatus != 200 { return fmt.Errorf("sdkerr: failed to create npm token: status='%d', msg='%s'", rStatus, result.GetMsg()) } else { - c.jwtToken = result.JWT + if result.JWT == "" { + return fmt.Errorf("sdkerr: auth error: received empty token") + } + + c.token = result.JWT } return nil diff --git a/pkg/sdk3rd/nginxproxymanager/api_nginx_create_certificate.go b/pkg/sdk3rd/nginxproxymanager/api_nginx_create_certificate.go index 8bdb4f7e5..7197b1874 100644 --- a/pkg/sdk3rd/nginxproxymanager/api_nginx_create_certificate.go +++ b/pkg/sdk3rd/nginxproxymanager/api_nginx_create_certificate.go @@ -19,7 +19,7 @@ func (c *Client) NginxCreateCertificate(req *NginxCreateCertificateRequest) (*Ng } func (c *Client) NginxCreateCertificateWithContext(ctx context.Context, req *NginxCreateCertificateRequest) (*NginxCreateCertificateResponse, error) { - if err := c.ensureJwtTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/nginxproxymanager/api_nginx_list_certificates.go b/pkg/sdk3rd/nginxproxymanager/api_nginx_list_certificates.go index a6fb2eaa9..6ef40d5bf 100644 --- a/pkg/sdk3rd/nginxproxymanager/api_nginx_list_certificates.go +++ b/pkg/sdk3rd/nginxproxymanager/api_nginx_list_certificates.go @@ -18,7 +18,7 @@ func (c *Client) NginxListCertificates(req *NginxListCertificatesRequest) (*Ngin } func (c *Client) NginxListCertificatesWithContext(ctx context.Context, req *NginxListCertificatesRequest) (*NginxListCertificatesResponse, error) { - if err := c.ensureJwtTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/nginxproxymanager/api_nginx_list_dead_hosts.go b/pkg/sdk3rd/nginxproxymanager/api_nginx_list_dead_hosts.go index 772a37e4f..47678e592 100644 --- a/pkg/sdk3rd/nginxproxymanager/api_nginx_list_dead_hosts.go +++ b/pkg/sdk3rd/nginxproxymanager/api_nginx_list_dead_hosts.go @@ -18,7 +18,7 @@ func (c *Client) NginxListDeadHosts(req *NginxListDeadHostsRequest) (*NginxListD } func (c *Client) NginxListDeadHostsWithContext(ctx context.Context, req *NginxListDeadHostsRequest) (*NginxListDeadHostsResponse, error) { - if err := c.ensureJwtTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/nginxproxymanager/api_nginx_list_proxy_hosts.go b/pkg/sdk3rd/nginxproxymanager/api_nginx_list_proxy_hosts.go index 17396a158..f6785916c 100644 --- a/pkg/sdk3rd/nginxproxymanager/api_nginx_list_proxy_hosts.go +++ b/pkg/sdk3rd/nginxproxymanager/api_nginx_list_proxy_hosts.go @@ -18,7 +18,7 @@ func (c *Client) NginxListProxyHosts(req *NginxListProxyHostsRequest) (*NginxLis } func (c *Client) NginxListProxyHostsWithContext(ctx context.Context, req *NginxListProxyHostsRequest) (*NginxListProxyHostsResponse, error) { - if err := c.ensureJwtTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/nginxproxymanager/api_nginx_list_redirection_hosts.go b/pkg/sdk3rd/nginxproxymanager/api_nginx_list_redirection_hosts.go index 5ebdbb6a7..ee533dde0 100644 --- a/pkg/sdk3rd/nginxproxymanager/api_nginx_list_redirection_hosts.go +++ b/pkg/sdk3rd/nginxproxymanager/api_nginx_list_redirection_hosts.go @@ -18,7 +18,7 @@ func (c *Client) NginxListRedirectionHosts(req *NginxListRedirectionHostsRequest } func (c *Client) NginxListRedirectionHostsWithContext(ctx context.Context, req *NginxListRedirectionHostsRequest) (*NginxListRedirectionHostsResponse, error) { - if err := c.ensureJwtTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/nginxproxymanager/api_nginx_list_streams.go b/pkg/sdk3rd/nginxproxymanager/api_nginx_list_streams.go index bcc32ee4a..e517becaa 100644 --- a/pkg/sdk3rd/nginxproxymanager/api_nginx_list_streams.go +++ b/pkg/sdk3rd/nginxproxymanager/api_nginx_list_streams.go @@ -18,7 +18,7 @@ func (c *Client) NginxListStreams(req *NginxListStreamsRequest) (*NginxListStrea } func (c *Client) NginxListStreamsWithContext(ctx context.Context, req *NginxListStreamsRequest) (*NginxListStreamsResponse, error) { - if err := c.ensureJwtTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/nginxproxymanager/api_nginx_update_dead_host.go b/pkg/sdk3rd/nginxproxymanager/api_nginx_update_dead_host.go index 59066525b..fd8214f90 100644 --- a/pkg/sdk3rd/nginxproxymanager/api_nginx_update_dead_host.go +++ b/pkg/sdk3rd/nginxproxymanager/api_nginx_update_dead_host.go @@ -23,7 +23,7 @@ func (c *Client) NginxUpdateDeadHostWithContext(ctx context.Context, hostId int6 return nil, fmt.Errorf("sdkerr: bad request: unset hostId") } - if err := c.ensureJwtTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/nginxproxymanager/api_nginx_update_proxy_host.go b/pkg/sdk3rd/nginxproxymanager/api_nginx_update_proxy_host.go index ea0d3c5a6..14c5c324b 100644 --- a/pkg/sdk3rd/nginxproxymanager/api_nginx_update_proxy_host.go +++ b/pkg/sdk3rd/nginxproxymanager/api_nginx_update_proxy_host.go @@ -23,7 +23,7 @@ func (c *Client) NginxUpdateProxyHostWithContext(ctx context.Context, hostId int return nil, fmt.Errorf("sdkerr: bad request: unset hostId") } - if err := c.ensureJwtTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/nginxproxymanager/api_nginx_update_redirection_host.go b/pkg/sdk3rd/nginxproxymanager/api_nginx_update_redirection_host.go index 9e0f1b006..d834d09c2 100644 --- a/pkg/sdk3rd/nginxproxymanager/api_nginx_update_redirection_host.go +++ b/pkg/sdk3rd/nginxproxymanager/api_nginx_update_redirection_host.go @@ -23,7 +23,7 @@ func (c *Client) NginxUpdateRedirectionHostWithContext(ctx context.Context, host return nil, fmt.Errorf("sdkerr: bad request: unset hostId") } - if err := c.ensureJwtTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/nginxproxymanager/api_nginx_update_stream.go b/pkg/sdk3rd/nginxproxymanager/api_nginx_update_stream.go index e9e3867fe..d5a6476a5 100644 --- a/pkg/sdk3rd/nginxproxymanager/api_nginx_update_stream.go +++ b/pkg/sdk3rd/nginxproxymanager/api_nginx_update_stream.go @@ -23,7 +23,7 @@ func (c *Client) NginxUpdateStreamWithContext(ctx context.Context, hostId int64, return nil, fmt.Errorf("sdkerr: bad request: unset hostId") } - if err := c.ensureJwtTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/nginxproxymanager/api_nginx_upload_certificate.go b/pkg/sdk3rd/nginxproxymanager/api_nginx_upload_certificate.go index 0e02d5cc7..c2aeb928b 100644 --- a/pkg/sdk3rd/nginxproxymanager/api_nginx_upload_certificate.go +++ b/pkg/sdk3rd/nginxproxymanager/api_nginx_upload_certificate.go @@ -24,7 +24,7 @@ func (c *Client) NginxUploadCertificateWithContext(ctx context.Context, certId i return nil, fmt.Errorf("sdkerr: bad request: unset certId") } - if err := c.ensureJwtTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/nginxproxymanager/api_settings_get_default_site.go b/pkg/sdk3rd/nginxproxymanager/api_settings_get_default_site.go index 6ce082b9f..fb42e6e22 100644 --- a/pkg/sdk3rd/nginxproxymanager/api_settings_get_default_site.go +++ b/pkg/sdk3rd/nginxproxymanager/api_settings_get_default_site.go @@ -23,7 +23,7 @@ func (c *Client) SettingsGetDefaultSite(req *SettingsGetDefaultSiteRequest) (*Se } func (c *Client) SettingsGetDefaultSiteWithContext(ctx context.Context, req *SettingsGetDefaultSiteRequest) (*SettingsGetDefaultSiteResponse, error) { - if err := c.ensureJwtTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/nginxproxymanager/api_settings_set_default_site.go b/pkg/sdk3rd/nginxproxymanager/api_settings_set_default_site.go index 445077ba8..468135355 100644 --- a/pkg/sdk3rd/nginxproxymanager/api_settings_set_default_site.go +++ b/pkg/sdk3rd/nginxproxymanager/api_settings_set_default_site.go @@ -20,7 +20,7 @@ func (c *Client) SettingsSetDefaultSite(req *SettingsSetDefaultSiteRequest) (*Se } func (c *Client) SettingsSetDefaultSiteWithContext(ctx context.Context, req *SettingsSetDefaultSiteRequest) (*SettingsSetDefaultSiteResponse, error) { - if err := c.ensureJwtTokenExists(); err != nil { + if err := c.ensureToken(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/nginxproxymanager/client.go b/pkg/sdk3rd/nginxproxymanager/client.go index eec70506f..c5357b185 100644 --- a/pkg/sdk3rd/nginxproxymanager/client.go +++ b/pkg/sdk3rd/nginxproxymanager/client.go @@ -3,6 +3,7 @@ package nginxproxymanager import ( + "context" "crypto/tls" "encoding/json" "fmt" @@ -21,8 +22,8 @@ type Client struct { username string password string - jwtToken string - jwtTokenMtx sync.Mutex + token string + tokenMu sync.Mutex rc *resty.Client } @@ -46,7 +47,7 @@ func NewClient(serverUrl string, optFns ...OptionsFunc) (*Client, error) { client := &Client{ username: opts.Username, password: opts.Password, - jwtToken: opts.JwtToken, + token: opts.JwtToken, } client.rc = resty.New(). SetBaseURL(strings.TrimSuffix(serverUrl, "/")+"/api"). @@ -54,8 +55,8 @@ func NewClient(serverUrl string, optFns ...OptionsFunc) (*Client, error) { SetHeader("Content-Type", "application/json"). SetHeader("User-Agent", app.AppUserAgent). SetPreRequestHook(func(_ *resty.Client, req *http.Request) error { - if client.jwtToken != "" { - req.Header.Set("Authorization", "Bearer "+client.jwtToken) + if client.token != "" { + req.Header.Set("Authorization", "Bearer "+client.token) } return nil @@ -135,10 +136,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res any) (*resty.Respon return resp, nil } -func (c *Client) ensureJwtTokenExists() error { - c.jwtTokenMtx.Lock() - defer c.jwtTokenMtx.Unlock() - if c.jwtToken != "" { +func (c *Client) ensureToken(ctx context.Context) error { + c.tokenMu.Lock() + defer c.tokenMu.Unlock() + if c.token != "" { return nil } @@ -150,6 +151,7 @@ func (c *Client) ensureJwtTokenExists() error { "identity": c.username, "secret": c.password, }) + httpreq.SetContext(ctx) } type tokensResponse struct { @@ -162,9 +164,13 @@ func (c *Client) ensureJwtTokenExists() error { if _, err := c.doRequestWithResult(httpreq, result); err != nil { return err } else if rError := result.GetError(); rError != "" { - return fmt.Errorf("sdkerr: failed to create npm token: error='%s'", rError) + return fmt.Errorf("sdkerr: auth error: error='%s'", rError) } else { - c.jwtToken = result.Token + if result.Token == "" { + return fmt.Errorf("sdkerr: auth error: received empty token") + } + + c.token = result.Token } return nil diff --git a/pkg/sdk3rd/upyun/console/api_get_buckets.go b/pkg/sdk3rd/upyun/console/api_get_buckets.go index 6216b0852..9f53e1b05 100644 --- a/pkg/sdk3rd/upyun/console/api_get_buckets.go +++ b/pkg/sdk3rd/upyun/console/api_get_buckets.go @@ -57,7 +57,7 @@ func (c *Client) GetBuckets(req *GetBucketsRequest) (*GetBucketsResponse, error) } func (c *Client) GetBucketsWithContext(ctx context.Context, req *GetBucketsRequest) (*GetBucketsResponse, error) { - if err := c.ensureCookieExists(); err != nil { + if err := c.ensureCookies(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/upyun/console/api_get_https_certificate_manager.go b/pkg/sdk3rd/upyun/console/api_get_https_certificate_manager.go index 61a411116..6efab934e 100644 --- a/pkg/sdk3rd/upyun/console/api_get_https_certificate_manager.go +++ b/pkg/sdk3rd/upyun/console/api_get_https_certificate_manager.go @@ -34,7 +34,7 @@ func (c *Client) GetHttpsCertificateManagerWithContext(ctx context.Context, cert return nil, fmt.Errorf("sdkerr: bad request: unset certificateId") } - if err := c.ensureCookieExists(); err != nil { + if err := c.ensureCookies(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/upyun/console/api_get_https_service_manager.go b/pkg/sdk3rd/upyun/console/api_get_https_service_manager.go index f48e5e986..132830b05 100644 --- a/pkg/sdk3rd/upyun/console/api_get_https_service_manager.go +++ b/pkg/sdk3rd/upyun/console/api_get_https_service_manager.go @@ -39,7 +39,7 @@ func (c *Client) GetHttpsServiceManagerWithContext(ctx context.Context, domain s return nil, fmt.Errorf("sdkerr: bad request: unset domain") } - if err := c.ensureCookieExists(); err != nil { + if err := c.ensureCookies(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/upyun/console/api_migrate_https_domain.go b/pkg/sdk3rd/upyun/console/api_migrate_https_domain.go index 63222923c..614e669f9 100644 --- a/pkg/sdk3rd/upyun/console/api_migrate_https_domain.go +++ b/pkg/sdk3rd/upyun/console/api_migrate_https_domain.go @@ -25,7 +25,7 @@ func (c *Client) MigrateHttpsDomain(req *MigrateHttpsDomainRequest) (*MigrateHtt } func (c *Client) MigrateHttpsDomainWithContext(ctx context.Context, req *MigrateHttpsDomainRequest) (*MigrateHttpsDomainResponse, error) { - if err := c.ensureCookieExists(); err != nil { + if err := c.ensureCookies(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/upyun/console/api_update_https_certificate_manager.go b/pkg/sdk3rd/upyun/console/api_update_https_certificate_manager.go index 68fb07b71..2a6b833e8 100644 --- a/pkg/sdk3rd/upyun/console/api_update_https_certificate_manager.go +++ b/pkg/sdk3rd/upyun/console/api_update_https_certificate_manager.go @@ -27,7 +27,7 @@ func (c *Client) UpdateHttpsCertificateManager(req *UpdateHttpsCertificateManage } func (c *Client) UpdateHttpsCertificateManagerWithContext(ctx context.Context, req *UpdateHttpsCertificateManagerRequest) (*UpdateHttpsCertificateManagerResponse, error) { - if err := c.ensureCookieExists(); err != nil { + if err := c.ensureCookies(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/upyun/console/api_upload_https_certificate.go b/pkg/sdk3rd/upyun/console/api_upload_https_certificate.go index 36c90dd93..04b3188c3 100644 --- a/pkg/sdk3rd/upyun/console/api_upload_https_certificate.go +++ b/pkg/sdk3rd/upyun/console/api_upload_https_certificate.go @@ -30,7 +30,7 @@ func (c *Client) UploadHttpsCertificate(req *UploadHttpsCertificateRequest) (*Up } func (c *Client) UploadHttpsCertificateWithContext(ctx context.Context, req *UploadHttpsCertificateRequest) (*UploadHttpsCertificateResponse, error) { - if err := c.ensureCookieExists(); err != nil { + if err := c.ensureCookies(ctx); err != nil { return nil, err } diff --git a/pkg/sdk3rd/upyun/console/client.go b/pkg/sdk3rd/upyun/console/client.go index 4eb047c5e..b4fef65ff 100644 --- a/pkg/sdk3rd/upyun/console/client.go +++ b/pkg/sdk3rd/upyun/console/client.go @@ -2,6 +2,7 @@ package console import ( + "context" "encoding/json" "fmt" "net/http" @@ -17,8 +18,8 @@ type Client struct { username string password string - loginCookie string - loginCookieMtx sync.Mutex + cookies string + cookiesMu sync.Mutex rc *resty.Client } @@ -46,8 +47,8 @@ func NewClient(optFns ...OptionsFunc) (*Client, error) { SetHeader("Content-Type", "application/json"). SetHeader("User-Agent", app.AppUserAgent). SetPreRequestHook(func(_ *resty.Client, req *http.Request) error { - if client.loginCookie != "" { - req.Header.Set("Cookie", client.loginCookie) + if client.cookies != "" { + req.Header.Set("Cookie", client.cookies) } return nil @@ -124,10 +125,10 @@ func (c *Client) doRequestWithResult(req *resty.Request, res sdkResponse) (*rest return resp, nil } -func (c *Client) ensureCookieExists() error { - c.loginCookieMtx.Lock() - defer c.loginCookieMtx.Unlock() - if c.loginCookie != "" { +func (c *Client) ensureCookies(ctx context.Context) error { + c.cookiesMu.Lock() + defer c.cookiesMu.Unlock() + if c.cookies != "" { return nil } @@ -139,6 +140,7 @@ func (c *Client) ensureCookieExists() error { "username": c.username, "password": c.password, }) + httpreq.SetContext(ctx) } type signinResponse struct { @@ -154,9 +156,14 @@ func (c *Client) ensureCookieExists() error { if err != nil { return err } else if !result.Data.Result { - return fmt.Errorf("sdkerr: failed to signin upyun console") + return fmt.Errorf("sdkerr: auth error") } else { - c.loginCookie = httpresp.Header().Get("Set-Cookie") + cookies := httpresp.Header().Get("Set-Cookie") + if cookies == "" { + return fmt.Errorf("sdkerr: auth error: received empty cookies") + } + + c.cookies = cookies } return nil