From c3c4aac9340eaa55b0ecce1f77aaa828aa6a01d5 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 4 Dec 2023 04:19:08 -0500 Subject: [PATCH 1/9] Auth change for 4.5 --- deploy.go | 198 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 182 insertions(+), 16 deletions(-) diff --git a/deploy.go b/deploy.go index 4e9d182..38706ce 100644 --- a/deploy.go +++ b/deploy.go @@ -14,10 +14,13 @@ import ( "net/url" "os" path "path/filepath" + "regexp" "strconv" "strings" + "github.com/dell/goscaleio/api" types "github.com/dell/goscaleio/types/v1" + log "github.com/sirupsen/logrus" ) var ( @@ -28,14 +31,16 @@ var ( // GatewayClient is client for Gateway server type GatewayClient struct { http *http.Client + api api.Client host string username string password string + token string + version string } // NewGateway returns a new gateway client. -func NewGateway( - host string, username, password string, insecure, useCerts bool) (*GatewayClient, error) { +func NewGateway(host string, username, password string, insecure, useCerts bool) (*GatewayClient, error) { if host == "" { return nil, errNewClient @@ -72,9 +77,112 @@ func NewGateway( } } + version, err := gc.GetVersion() + if err != nil { + return nil, err + } + + if version == "3.5" { + gc.version = version + //No need to create token + } else { + bodyData := map[string]interface{}{ + "username": username, + "password": password, + } + + body, _ := json.Marshal(bodyData) + + req, err := http.NewRequest("POST", host+"/rest/auth/login", bytes.NewBuffer(body)) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", "application/json") + + resp, err := gc.http.Do(req) + if err != nil { + return nil, err + } + + defer func() { + if err := resp.Body.Close(); err != nil { + doLog(log.WithError(err).Error, "") + } + }() + + // parse the response + switch { + case resp == nil: + return nil, errNilReponse + case !(resp.StatusCode >= 200 && resp.StatusCode <= 299): + return nil, gc.api.ParseJSONError(resp) + } + + bs, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + responseBody := string(bs) + + result := make(map[string]interface{}) + json.Unmarshal([]byte(responseBody), &result) + + token := result["access_token"].(string) + + gc.token = token + + version, err = gc.GetVersion() + if err != nil { + return nil, err + } + gc.version = version + } + return gc, nil } +// GetVersion returns version +func (gc *GatewayClient) GetVersion() (string, error) { + + req, httpError := http.NewRequest("GET", gc.host+"/api/version", nil) + if httpError != nil { + return "", httpError + } + + if gc.token != "" { + req.Header.Set("Authorization", "Bearer "+gc.token) + } + + req.Header.Set("Content-Type", "application/json") + + client := gc.http + resp, httpRespError := client.Do(req) + if httpRespError != nil { + return "", httpRespError + } + + // parse the response + switch { + case resp == nil: + return "", errNilReponse + case !(resp.StatusCode >= 200 && resp.StatusCode <= 299): + return "", nil + } + + version, err := extractString(resp) + if err != nil { + return "", err + } + + versionRX := regexp.MustCompile(`^(\d+?\.\d+?).*$`) + if m := versionRX.FindStringSubmatch(version); len(m) > 0 { + return m[1], nil + } + return version, nil +} + // UploadPackages used for upload packge to gateway server func (gc *GatewayClient) UploadPackages(filePaths []string) (*types.GatewayResponse, error) { var gatewayResponse types.GatewayResponse @@ -120,7 +228,11 @@ func (gc *GatewayClient) UploadPackages(filePaths []string) (*types.GatewayRespo return &gatewayResponse, httpError } req.Header.Set("Content-Type", writer.FormDataContentType()) - req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + if gc.version == "4.0" { + req.Header.Set("Authorization", "Bearer "+gc.token) + } else { + req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + } client := gc.http response, httpRespError := client.Do(req) @@ -182,7 +294,11 @@ func (gc *GatewayClient) ParseCSV(filePath string) (*types.GatewayResponse, erro return &gatewayResponse, httpError } req.Header.Set("Content-Type", writer.FormDataContentType()) - req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + if gc.version == "4.0" { + req.Header.Set("Authorization", "Bearer "+gc.token) + } else { + req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + } client := gc.http response, httpRespError := client.Do(req) @@ -234,7 +350,13 @@ func (gc *GatewayClient) GetPackageDetails() ([]*types.PackageDetails, error) { if httpError != nil { return packageParam, httpError } - req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + + if gc.version == "4.0" { + req.Header.Set("Authorization", "Bearer "+gc.token) + } else { + req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + } + req.Header.Set("Content-Type", "application/json") client := gc.http @@ -270,7 +392,11 @@ func (gc *GatewayClient) ValidateMDMDetails(mdmTopologyParam []byte) (*types.Gat if httpError != nil { return &gatewayResponse, httpError } - req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + if gc.version == "4.0" { + req.Header.Set("Authorization", "Bearer "+gc.token) + } else { + req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + } req.Header.Set("Content-Type", "application/json") client := gc.http @@ -318,7 +444,11 @@ func (gc *GatewayClient) GetClusterDetails(mdmTopologyParam []byte, requireJSONO if httpError != nil { return &gatewayResponse, httpError } - req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + if gc.version == "4.0" { + req.Header.Set("Authorization", "Bearer "+gc.token) + } else { + req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + } req.Header.Set("Content-Type", "application/json") client := gc.http @@ -379,7 +509,11 @@ func (gc *GatewayClient) DeletePackage(packageName string) (*types.GatewayRespon if httpError != nil { return &gatewayResponse, httpError } - req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + if gc.version == "4.0" { + req.Header.Set("Authorization", "Bearer "+gc.token) + } else { + req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + } req.Header.Set("Content-Type", "application/json") client := gc.http @@ -451,7 +585,11 @@ func (gc *GatewayClient) BeginInstallation(jsonStr, mdmUsername, mdmPassword, li if httpError != nil { return &gatewayResponse, httpError } - req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + if gc.version == "4.0" { + req.Header.Set("Authorization", "Bearer "+gc.token) + } else { + req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + } req.Header.Set("Content-Type", "application/json") client := gc.http @@ -491,7 +629,11 @@ func (gc *GatewayClient) MoveToNextPhase() (*types.GatewayResponse, error) { if httpError != nil { return &gatewayResponse, httpError } - req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + if gc.version == "4.0" { + req.Header.Set("Authorization", "Bearer "+gc.token) + } else { + req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + } req.Header.Set("Content-Type", "application/json") client := gc.http @@ -531,7 +673,11 @@ func (gc *GatewayClient) RetryPhase() (*types.GatewayResponse, error) { if httpError != nil { return &gatewayResponse, httpError } - req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + if gc.version == "4.0" { + req.Header.Set("Authorization", "Bearer "+gc.token) + } else { + req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + } req.Header.Set("Content-Type", "application/json") client := gc.http @@ -571,7 +717,11 @@ func (gc *GatewayClient) AbortOperation() (*types.GatewayResponse, error) { if httpError != nil { return &gatewayResponse, httpError } - req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + if gc.version == "4.0" { + req.Header.Set("Authorization", "Bearer "+gc.token) + } else { + req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + } req.Header.Set("Content-Type", "application/json") client := gc.http @@ -611,7 +761,11 @@ func (gc *GatewayClient) ClearQueueCommand() (*types.GatewayResponse, error) { if httpError != nil { return &gatewayResponse, httpError } - req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + if gc.version == "4.0" { + req.Header.Set("Authorization", "Bearer "+gc.token) + } else { + req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + } req.Header.Set("Content-Type", "application/json") client := gc.http @@ -651,7 +805,11 @@ func (gc *GatewayClient) MoveToIdlePhase() (*types.GatewayResponse, error) { if httpError != nil { return &gatewayResponse, httpError } - req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + if gc.version == "4.0" { + req.Header.Set("Authorization", "Bearer "+gc.token) + } else { + req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + } req.Header.Set("Content-Type", "application/json") client := gc.http @@ -691,7 +849,11 @@ func (gc *GatewayClient) GetInQueueCommand() ([]types.MDMQueueCommandDetails, er if httpError != nil { return mdmQueueCommandDetails, httpError } - req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + if gc.version == "4.0" { + req.Header.Set("Authorization", "Bearer "+gc.token) + } else { + req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + } req.Header.Set("Content-Type", "application/json") client := gc.http @@ -801,7 +963,11 @@ func (gc *GatewayClient) UninstallCluster(jsonStr, mdmUsername, mdmPassword, lia if httpError != nil { return &gatewayResponse, httpError } - req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + if gc.version == "4.0" { + req.Header.Set("Authorization", "Bearer "+gc.token) + } else { + req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) + } req.Header.Set("Content-Type", "application/json") client := gc.http From e1c8b735cd2478af1053bf6427a9e8f290853695 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 4 Dec 2023 04:51:21 -0500 Subject: [PATCH 2/9] Auth change for 4.5 --- deploy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy.go b/deploy.go index 38706ce..55963e4 100644 --- a/deploy.go +++ b/deploy.go @@ -93,7 +93,7 @@ func NewGateway(host string, username, password string, insecure, useCerts bool) body, _ := json.Marshal(bodyData) - req, err := http.NewRequest("POST", host+"/rest/auth/login", bytes.NewBuffer(body)) + req, err := http.NewRequest("POST", host+"rest/auth/login", bytes.NewBuffer(body)) if err != nil { return nil, err } From 9590c65f90ca6950d71b8f099380a7832bd1f53e Mon Sep 17 00:00:00 2001 From: root Date: Mon, 4 Dec 2023 06:26:47 -0500 Subject: [PATCH 3/9] Auth change for 4.5 --- deploy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy.go b/deploy.go index 55963e4..38706ce 100644 --- a/deploy.go +++ b/deploy.go @@ -93,7 +93,7 @@ func NewGateway(host string, username, password string, insecure, useCerts bool) body, _ := json.Marshal(bodyData) - req, err := http.NewRequest("POST", host+"rest/auth/login", bytes.NewBuffer(body)) + req, err := http.NewRequest("POST", host+"/rest/auth/login", bytes.NewBuffer(body)) if err != nil { return nil, err } From e0d0793e0c161f2607f793861fa895dfb8327872 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 7 Dec 2023 00:39:55 -0500 Subject: [PATCH 4/9] Auth change for 4.5 Deployment --- deploy.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/deploy.go b/deploy.go index 38706ce..5beb6ad 100644 --- a/deploy.go +++ b/deploy.go @@ -127,7 +127,10 @@ func NewGateway(host string, username, password string, insecure, useCerts bool) responseBody := string(bs) result := make(map[string]interface{}) - json.Unmarshal([]byte(responseBody), &result) + jsonErr := json.Unmarshal([]byte(responseBody), &result) + if err != nil { + return nil, fmt.Errorf("Error For Uploading Package: %s", jsonErr) + } token := result["access_token"].(string) @@ -575,6 +578,10 @@ func (gc *GatewayClient) BeginInstallation(jsonStr, mdmUsername, mdmPassword, li q.Set("noLinuxDevValidation", "false") q.Set("globalZeroPadPolicy", "false") + if gc.version == "4.0" { + q.Set("noSecurityBootstrap", "false") + } + if expansion { q.Set("extend", strconv.FormatBool(expansion)) } From 2fade7ea9ca1a94359bcbbe6dcddf6375c8e70ce Mon Sep 17 00:00:00 2001 From: root Date: Thu, 7 Dec 2023 02:44:42 -0500 Subject: [PATCH 5/9] Auth change for 4.5 Deployment --- deploy.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/deploy.go b/deploy.go index 5beb6ad..ea054d8 100644 --- a/deploy.go +++ b/deploy.go @@ -572,14 +572,15 @@ func (gc *GatewayClient) BeginInstallation(jsonStr, mdmUsername, mdmPassword, li u, _ := url.Parse(gc.host + "/im/types/Configuration/actions/install") q := u.Query() - q.Set("noUpload", "false") - q.Set("noInstall", "false") - q.Set("noConfigure", "false") - q.Set("noLinuxDevValidation", "false") - q.Set("globalZeroPadPolicy", "false") if gc.version == "4.0" { q.Set("noSecurityBootstrap", "false") + } else { + q.Set("noUpload", "false") + q.Set("noInstall", "false") + q.Set("noConfigure", "false") + q.Set("noLinuxDevValidation", "false") + q.Set("globalZeroPadPolicy", "false") } if expansion { From 6a8bbb2c2c6cbc524412f7b2b3ffc7bdada4de0e Mon Sep 17 00:00:00 2001 From: root Date: Fri, 8 Dec 2023 03:32:56 -0500 Subject: [PATCH 6/9] Auth change for 4.5 Deployment --- deploy.go | 181 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) diff --git a/deploy.go b/deploy.go index ea054d8..460f66c 100644 --- a/deploy.go +++ b/deploy.go @@ -9,6 +9,7 @@ import ( "errors" "fmt" "io" + "io/ioutil" "mime/multipart" "net/http" "net/url" @@ -21,6 +22,7 @@ import ( "github.com/dell/goscaleio/api" types "github.com/dell/goscaleio/types/v1" log "github.com/sirupsen/logrus" + "gopkg.in/yaml.v3" ) var ( @@ -233,6 +235,8 @@ func (gc *GatewayClient) UploadPackages(filePaths []string) (*types.GatewayRespo req.Header.Set("Content-Type", writer.FormDataContentType()) if gc.version == "4.0" { req.Header.Set("Authorization", "Bearer "+gc.token) + + setCookie(req.Header, gc.host) } else { req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) } @@ -299,6 +303,8 @@ func (gc *GatewayClient) ParseCSV(filePath string) (*types.GatewayResponse, erro req.Header.Set("Content-Type", writer.FormDataContentType()) if gc.version == "4.0" { req.Header.Set("Authorization", "Bearer "+gc.token) + + setCookie(req.Header, gc.host) } else { req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) } @@ -356,6 +362,9 @@ func (gc *GatewayClient) GetPackageDetails() ([]*types.PackageDetails, error) { if gc.version == "4.0" { req.Header.Set("Authorization", "Bearer "+gc.token) + + setCookie(req.Header, gc.host) + } else { req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) } @@ -375,6 +384,10 @@ func (gc *GatewayClient) GetPackageDetails() ([]*types.PackageDetails, error) { if httpResp.StatusCode == 200 { + if gc.version == "4.0" { + storeCookie(httpResp.Header, gc.host) + } + err := json.Unmarshal([]byte(responseString), &packageParam) if err != nil { @@ -397,6 +410,8 @@ func (gc *GatewayClient) ValidateMDMDetails(mdmTopologyParam []byte) (*types.Gat } if gc.version == "4.0" { req.Header.Set("Authorization", "Bearer "+gc.token) + + setCookie(req.Header, gc.host) } else { req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) } @@ -424,6 +439,10 @@ func (gc *GatewayClient) ValidateMDMDetails(mdmTopologyParam []byte) (*types.Gat return &gatewayResponse, nil } + if gc.version == "4.0" { + storeCookie(httpResp.Header, gc.host) + } + var mdmTopologyDetails types.MDMTopologyDetails err := json.Unmarshal([]byte(responseString), &mdmTopologyDetails) @@ -449,6 +468,8 @@ func (gc *GatewayClient) GetClusterDetails(mdmTopologyParam []byte, requireJSONO } if gc.version == "4.0" { req.Header.Set("Authorization", "Bearer "+gc.token) + + setCookie(req.Header, gc.host) } else { req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) } @@ -480,6 +501,10 @@ func (gc *GatewayClient) GetClusterDetails(mdmTopologyParam []byte, requireJSONO return &gatewayResponse, fmt.Errorf("Error Getting Cluster Details") } + if gc.version == "4.0" { + storeCookie(httpResp.Header, gc.host) + } + if requireJSONOutput { gatewayResponse.StatusCode = 200 @@ -514,6 +539,8 @@ func (gc *GatewayClient) DeletePackage(packageName string) (*types.GatewayRespon } if gc.version == "4.0" { req.Header.Set("Authorization", "Bearer "+gc.token) + + setCookie(req.Header, gc.host) } else { req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) } @@ -541,6 +568,10 @@ func (gc *GatewayClient) DeletePackage(packageName string) (*types.GatewayRespon return &gatewayResponse, nil } + if gc.version == "4.0" { + storeCookie(httpResp.Header, gc.host) + } + gatewayResponse.StatusCode = 200 return &gatewayResponse, nil @@ -595,6 +626,8 @@ func (gc *GatewayClient) BeginInstallation(jsonStr, mdmUsername, mdmPassword, li } if gc.version == "4.0" { req.Header.Set("Authorization", "Bearer "+gc.token) + + setCookie(req.Header, gc.host) } else { req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) } @@ -639,6 +672,8 @@ func (gc *GatewayClient) MoveToNextPhase() (*types.GatewayResponse, error) { } if gc.version == "4.0" { req.Header.Set("Authorization", "Bearer "+gc.token) + + setCookie(req.Header, gc.host) } else { req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) } @@ -667,6 +702,10 @@ func (gc *GatewayClient) MoveToNextPhase() (*types.GatewayResponse, error) { return &gatewayResponse, nil } + if gc.version == "4.0" { + storeCookie(httpResp.Header, gc.host) + } + gatewayResponse.StatusCode = 200 return &gatewayResponse, nil @@ -683,6 +722,8 @@ func (gc *GatewayClient) RetryPhase() (*types.GatewayResponse, error) { } if gc.version == "4.0" { req.Header.Set("Authorization", "Bearer "+gc.token) + + setCookie(req.Header, gc.host) } else { req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) } @@ -711,6 +752,10 @@ func (gc *GatewayClient) RetryPhase() (*types.GatewayResponse, error) { return &gatewayResponse, nil } + if gc.version == "4.0" { + storeCookie(httpResp.Header, gc.host) + } + gatewayResponse.StatusCode = 200 return &gatewayResponse, nil @@ -727,6 +772,8 @@ func (gc *GatewayClient) AbortOperation() (*types.GatewayResponse, error) { } if gc.version == "4.0" { req.Header.Set("Authorization", "Bearer "+gc.token) + + setCookie(req.Header, gc.host) } else { req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) } @@ -755,6 +802,10 @@ func (gc *GatewayClient) AbortOperation() (*types.GatewayResponse, error) { return &gatewayResponse, nil } + if gc.version == "4.0" { + storeCookie(httpResp.Header, gc.host) + } + gatewayResponse.StatusCode = 200 return &gatewayResponse, nil @@ -771,6 +822,8 @@ func (gc *GatewayClient) ClearQueueCommand() (*types.GatewayResponse, error) { } if gc.version == "4.0" { req.Header.Set("Authorization", "Bearer "+gc.token) + + setCookie(req.Header, gc.host) } else { req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) } @@ -799,6 +852,10 @@ func (gc *GatewayClient) ClearQueueCommand() (*types.GatewayResponse, error) { return &gatewayResponse, nil } + if gc.version == "4.0" { + storeCookie(httpResp.Header, gc.host) + } + gatewayResponse.StatusCode = 200 return &gatewayResponse, nil @@ -815,6 +872,8 @@ func (gc *GatewayClient) MoveToIdlePhase() (*types.GatewayResponse, error) { } if gc.version == "4.0" { req.Header.Set("Authorization", "Bearer "+gc.token) + + setCookie(req.Header, gc.host) } else { req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) } @@ -843,6 +902,10 @@ func (gc *GatewayClient) MoveToIdlePhase() (*types.GatewayResponse, error) { return &gatewayResponse, nil } + if gc.version == "4.0" { + storeCookie(httpResp.Header, gc.host) + } + gatewayResponse.StatusCode = 200 return &gatewayResponse, nil @@ -859,6 +922,8 @@ func (gc *GatewayClient) GetInQueueCommand() ([]types.MDMQueueCommandDetails, er } if gc.version == "4.0" { req.Header.Set("Authorization", "Bearer "+gc.token) + + setCookie(req.Header, gc.host) } else { req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) } @@ -877,6 +942,10 @@ func (gc *GatewayClient) GetInQueueCommand() ([]types.MDMQueueCommandDetails, er if httpResp.StatusCode == 200 { + if gc.version == "4.0" { + storeCookie(httpResp.Header, gc.host) + } + var queueCommandDetails map[string][]interface{} err := json.Unmarshal([]byte(responseString), &queueCommandDetails) @@ -973,6 +1042,8 @@ func (gc *GatewayClient) UninstallCluster(jsonStr, mdmUsername, mdmPassword, lia } if gc.version == "4.0" { req.Header.Set("Authorization", "Bearer "+gc.token) + + setCookie(req.Header, gc.host) } else { req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(gc.username+":"+gc.password))) } @@ -1015,3 +1086,113 @@ func jsonToMap(jsonStr string) (map[string]interface{}, error) { } return result, nil } + +const configFile = "/home/.cookie_config.yaml" + +var globalCookie string + +// CookieConfig represents the YAML structure +type CookieConfig struct { + Hosts []Host `yaml:"hosts"` +} + +// Host represents individual hosts in the YAML structure +type Host struct { + Name string `yaml:"name"` + LegacyGWCookie string `yaml:"cookie"` +} + +func storeCookie(header http.Header, host string) error { + if header != nil && header["Set-Cookie"] != nil { + + newCookie := strings.Split(header["Set-Cookie"][0], ";")[0] + sanitizedCookie := strings.ReplaceAll(strings.Split(newCookie, "=")[1], "|", "_") + + // Load existing configuration + config, err := loadConfig() + if err != nil { + return err + } + + // Check if the host already exists, and update or add accordingly + found := false + for i, h := range config.Hosts { + if h.Name == host { + config.Hosts[i].LegacyGWCookie = sanitizedCookie + found = true + break + } + } + + // If the host is not found, add a new host + if !found { + config.Hosts = append(config.Hosts, Host{Name: host, LegacyGWCookie: sanitizedCookie}) + } + + // Update the global variable directly + globalCookie = sanitizedCookie + + err = writeConfig(config) + if err != nil { + return err + } + } + + return nil +} + +func setCookie(header http.Header, host string) error { + + if globalCookie != "" { + header.Set("Cookie", "LEGACYGWCOOKIE="+strings.ReplaceAll(globalCookie, "_", "|")) + } else { + config, err := loadConfig() + if err != nil { + return err + } + + // Check if the host already exists and set the globalCookie + for _, h := range config.Hosts { + if h.Name == host { + globalCookie = h.LegacyGWCookie + header.Set("Cookie", "LEGACYGWCOOKIE="+strings.ReplaceAll(globalCookie, "_", "|")) + break + } + } + } + + return nil +} + +func loadConfig() (*CookieConfig, error) { + if _, err := os.Stat(configFile); err == nil { + data, err := ioutil.ReadFile(configFile) + if err != nil { + return nil, err + } + + var config CookieConfig + err = yaml.Unmarshal(data, &config) + if err != nil { + return nil, err + } + + return &config, nil + } + + return &CookieConfig{}, nil +} + +func writeConfig(config *CookieConfig) error { + data, err := yaml.Marshal(&config) + if err != nil { + return err + } + + err = ioutil.WriteFile(configFile, data, 0644) + if err != nil { + return err + } + + return nil +} From 3f9869898a0cd9a1b955578ccbf6f715e1569193 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 11 Dec 2023 06:17:29 -0500 Subject: [PATCH 7/9] Auth change for 4.5 Deployment --- deploy.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/deploy.go b/deploy.go index 460f66c..70d8b5a 100644 --- a/deploy.go +++ b/deploy.go @@ -437,6 +437,8 @@ func (gc *GatewayClient) ValidateMDMDetails(mdmTopologyParam []byte) (*types.Gat } return &gatewayResponse, nil + } else if httpResp.StatusCode == 200 && responseString == "" { + return &gatewayResponse, errors.New("Wrong Primary MDM IP, Please provide valid Primary MDM IP") } if gc.version == "4.0" { From 956097487188f58d4ecf3b46e9c1781bf4f57bde Mon Sep 17 00:00:00 2001 From: root Date: Mon, 11 Dec 2023 07:27:44 -0500 Subject: [PATCH 8/9] Auth change for 4.5 Deployment --- deploy.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/deploy.go b/deploy.go index 70d8b5a..e488b34 100644 --- a/deploy.go +++ b/deploy.go @@ -438,7 +438,9 @@ func (gc *GatewayClient) ValidateMDMDetails(mdmTopologyParam []byte) (*types.Gat return &gatewayResponse, nil } else if httpResp.StatusCode == 200 && responseString == "" { - return &gatewayResponse, errors.New("Wrong Primary MDM IP, Please provide valid Primary MDM IP") + gatewayResponse.Message = "Wrong Primary MDM IP, Please provide valid Primary MDM IP" + + return &gatewayResponse, fmt.Errorf("Wrong Primary MDM IP, Please provide valid Primary MDM IP") } if gc.version == "4.0" { From f9545f5e0fd7f744678682b88cdc2dc3eb3fbac2 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 14 Dec 2023 02:31:47 -0500 Subject: [PATCH 9/9] Deployment Changes --- deploy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy.go b/deploy.go index db300d9..cdc0e1d 100644 --- a/deploy.go +++ b/deploy.go @@ -994,7 +994,7 @@ func (gc *GatewayClient) CheckForCompletionQueueCommands(currentPhase string) (* for _, mdmQueueCommandDetail := range mdmQueueCommandDetails { - if currentPhase == mdmQueueCommandDetail.AllowedPhase && mdmQueueCommandDetail.CommandState == "pending" { + if currentPhase == mdmQueueCommandDetail.AllowedPhase && (mdmQueueCommandDetail.CommandState == "pending" || mdmQueueCommandDetail.CommandState == "running") { checkCompleted = "Running" break } else if currentPhase == mdmQueueCommandDetail.AllowedPhase && mdmQueueCommandDetail.CommandState == "failed" {