From 919ccd1a27cf58325244c4f175fd1cc2e41e9c4e Mon Sep 17 00:00:00 2001 From: wiremanb Date: Tue, 5 Dec 2023 17:50:55 -0600 Subject: [PATCH 1/9] added page shield requests --- page_shield.go | 67 +++++++++++++++++++++ page_shield_connections.go | 87 +++++++++++++++++++++++++++ page_shield_policies.go | 119 +++++++++++++++++++++++++++++++++++++ page_shield_scripts.go | 95 +++++++++++++++++++++++++++++ 4 files changed, 368 insertions(+) create mode 100644 page_shield.go create mode 100644 page_shield_connections.go create mode 100644 page_shield_policies.go create mode 100644 page_shield_scripts.go diff --git a/page_shield.go b/page_shield.go new file mode 100644 index 00000000000..f7fda4c1477 --- /dev/null +++ b/page_shield.go @@ -0,0 +1,67 @@ +package cloudflare + +import ( + "context" + "encoding/json" + "fmt" + "net/http" +) + +// PageShield represents the page shield object minus any timestamps +type PageShield struct { + Enabled bool `json:"enabled"` + UseCloudflareReportingEndpoint bool `json:"use_cloudflare_reporting_endpoint"` + UseConnectionURLPath bool `json:"use_connection_url_path"` +} + +// PageShieldSettings represents the page shield settings for a zone +type PageShieldSettings struct { + PageShield + UpdatedAt string `json:"updated_at"` +} + +// PageShieldSettingsResponse represents the response from the page shield settings endpoint +type PageShieldSettingsResponse struct { + PageShield PageShieldSettings `json:"result"` + Response +} + +// GetPageShieldSettings returns the page shield settings for a zone +// +// API documentation: https://developers.cloudflare.com/api/operations/page-shield-get-page-shield-settings +func (api *API) GetPageShieldSettings(ctx context.Context, rc *ResourceContainer) (*PageShieldSettingsResponse, error) { + uri := fmt.Sprintf("/zones/%s/page_shield", rc.Identifier) + + res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil) + if err != nil { + return nil, err + } + + var psResponse PageShieldSettingsResponse + err = json.Unmarshal(res, &psResponse) + if err != nil { + return nil, fmt.Errorf("%s: %w", errUnmarshalError, err) + } + + return &psResponse, nil +} + +// UpdatePageShieldSettings updates the page shield settings for a zone +// +// API documentation: https://developers.cloudflare.com/api/operations/page-shield-update-page-shield-settings +func (api *API) UpdatePageShieldSettings(ctx context.Context, rc *ResourceContainer, params PageShield) (*PageShieldSettingsResponse, error) { + uri := fmt.Sprintf("/zones/%s/page_shield", rc.Identifier) + + res, err := api.makeRequestContext(ctx, http.MethodPut, uri, params) + if err != nil { + return nil, err + } + + var psResponse PageShieldSettingsResponse + err = json.Unmarshal(res, &psResponse) + if err != nil { + return nil, fmt.Errorf("%s: %w", errUnmarshalError, err) + } + + return &psResponse, nil +} diff --git a/page_shield_connections.go b/page_shield_connections.go new file mode 100644 index 00000000000..07396f354ec --- /dev/null +++ b/page_shield_connections.go @@ -0,0 +1,87 @@ +package cloudflare + +import ( + "context" + "encoding/json" + "fmt" + "net/http" +) + +// ListPageShieldConnectionsParams represents parameters for a page shield connection request +type ListPageShieldConnectionsParams struct { + Direction string `json:"direction"` + ExcludeCdnCgi bool `json:"exclude_cdn_cgi"` + ExcludeUrls string `json:"exclude_urls"` + Export string `json:"export"` + Hosts string `json:"hosts"` + OrderBy string `json:"order_by"` + Page string `json:"page"` + PageURL string `json:"page_url"` + PerPage int `json:"per_page"` + PrioritizeMalicious bool `json:"prioritize_malicious"` + Status string `json:"status"` + URLs string `json:"urls"` +} + +// PageShieldConnection represents a page shield connection +type PageShieldConnection struct { + AddedAt string `json:"added_at"` + DomainReportedMalicious bool `json:"domain_reported_malicious"` + FirstPageURL string `json:"first_page_url"` + FirstSeenAt string `json:"first_seen_at"` + Host string `json:"host"` + ID string `json:"id"` + LastSeenAt string `json:"last_seen_at"` + PageURLs []string `json:"page_urls"` + URL string `json:"url"` + URLContainsCdnCgiPath bool `json:"url_contains_cdn_cgi_path"` +} + +// ListPageShieldConnectionsResponse represents the response from the list page shield connections endpoint +type ListPageShieldConnectionsResponse struct { + Result []PageShieldConnection `json:"result"` + Response + ResultInfo `json:"result_info"` +} + +// ListPageShieldConnections lists all page shield connections for a zone +// +// API documentation: https://api.cloudflare.com/#page-shield-connections-list-page-shield-connections +func (api *API) ListPageShieldConnections(ctx context.Context, rc *ResourceContainer, params ListPageShieldConnectionsParams) ([]PageShieldConnection, ResultInfo, error) { + path := fmt.Sprintf("/zones/%s/page_shield/connections", rc.Identifier) + + uri := buildURI(path, params) + + res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil) + if err != nil { + return nil, ResultInfo{}, err + } + + var psResponse ListPageShieldConnectionsResponse + err = json.Unmarshal(res, &psResponse) + if err != nil { + return nil, ResultInfo{}, fmt.Errorf("%s: %w", errUnmarshalError, err) + } + + return psResponse.Result, psResponse.ResultInfo, nil +} + +// GetPageShieldConnection gets a page shield connection for a zone +// +// API documentation: https://api.cloudflare.com/#page-shield-connections-get-page-shield-connection +func (api *API) GetPageShieldConnection(ctx context.Context, rc *ResourceContainer, connectionID string) (*PageShieldConnection, error) { + path := fmt.Sprintf("/zones/%s/page_shield/connections/%s", rc.Identifier, connectionID) + + res, err := api.makeRequestContext(ctx, http.MethodGet, path, nil) + if err != nil { + return nil, err + } + + var psResponse PageShieldConnection + err = json.Unmarshal(res, &psResponse) + if err != nil { + return nil, fmt.Errorf("%s: %w", errUnmarshalError, err) + } + + return &psResponse, nil +} diff --git a/page_shield_policies.go b/page_shield_policies.go new file mode 100644 index 00000000000..d95b76f0f40 --- /dev/null +++ b/page_shield_policies.go @@ -0,0 +1,119 @@ +package cloudflare + +import ( + "context" + "encoding/json" + "fmt" + "net/http" +) + +// PageShieldPolicy represents a page shield policy +type PageShieldPolicy struct { + Action string `json:"action"` + Description string `json:"description"` + Enabled bool `json:"enabled"` + Expression string `json:"expression"` + ID string `json:"id"` + Value string `json:"value"` +} + +// ListPageShieldPoliciesResponse represents the response from the list page shield policies endpoint +type ListPageShieldPoliciesResponse struct { + Result []PageShieldPolicy `json:"result"` + Response + ResultInfo `json:"result_info"` +} + +// ListPageShieldPolicies lists all page shield policies for a zone +// +// API documentation: https://developers.cloudflare.com/api/operations/page-shield-list-page-shield-policies +func (api *API) ListPageShieldPolicies(ctx context.Context, rc *ResourceContainer) ([]PageShieldPolicy, ResultInfo, error) { + path := fmt.Sprintf("/zones/%s/page_shield/policies", rc.Identifier) + + res, err := api.makeRequestContext(ctx, http.MethodGet, path, nil) + if err != nil { + return nil, ResultInfo{}, err + } + + var psResponse ListPageShieldPoliciesResponse + err = json.Unmarshal(res, &psResponse) + if err != nil { + return nil, ResultInfo{}, fmt.Errorf("%s: %w", errUnmarshalError, err) + } + + return psResponse.Result, psResponse.ResultInfo, nil +} + +// CreatePageShieldPolicy creates a page shield policy for a zone +// +// API documentation: https://developers.cloudflare.com/api/operations/page-shield-create-page-shield-policy +func (api *API) CreatePageShieldPolicy(ctx context.Context, rc *ResourceContainer, params PageShieldPolicy) (*PageShieldPolicy, error) { + path := fmt.Sprintf("/zones/%s/page_shield/policies", rc.Identifier) + + res, err := api.makeRequestContext(ctx, http.MethodPost, path, params) + if err != nil { + return nil, err + } + + var psResponse PageShieldPolicy + err = json.Unmarshal(res, &psResponse) + if err != nil { + return nil, fmt.Errorf("%s: %w", errUnmarshalError, err) + } + + return &psResponse, nil +} + +// DeletePageShieldPolicy deletes a page shield policy for a zone +// +// API documentation: https://developers.cloudflare.com/api/operations/page-shield-delete-page-shield-policy +func (api *API) DeletePageShieldPolicy(ctx context.Context, rc *ResourceContainer, policyID string) error { + path := fmt.Sprintf("/zones/%s/page_shield/policies/%s", rc.Identifier, policyID) + + _, err := api.makeRequestContext(ctx, http.MethodDelete, path, nil) + if err != nil { + return err + } + + return nil +} + +// GetPageShieldPolicy gets a page shield policy for a zone +// +// API documentation: https://developers.cloudflare.com/api/operations/page-shield-get-page-shield-policy +func (api *API) GetPageShieldPolicy(ctx context.Context, rc *ResourceContainer, policyID string) (*PageShieldPolicy, error) { + path := fmt.Sprintf("/zones/%s/page_shield/policies/%s", rc.Identifier, policyID) + + res, err := api.makeRequestContext(ctx, http.MethodGet, path, nil) + if err != nil { + return nil, err + } + + var psResponse PageShieldPolicy + err = json.Unmarshal(res, &psResponse) + if err != nil { + return nil, fmt.Errorf("%s: %w", errUnmarshalError, err) + } + + return &psResponse, nil +} + +// UpdatePageShieldPolicy updates a page shield policy for a zone +// +// API documentation: https://developers.cloudflare.com/api/operations/page-shield-update-page-shield-policy +func (api *API) UpdatePageShieldPolicy(ctx context.Context, rc *ResourceContainer, policyID string, params PageShieldPolicy) (*PageShieldPolicy, error) { + path := fmt.Sprintf("/zones/%s/page_shield/policies/%s", rc.Identifier, policyID) + + res, err := api.makeRequestContext(ctx, http.MethodPut, path, params) + if err != nil { + return nil, err + } + + var psResponse PageShieldPolicy + err = json.Unmarshal(res, &psResponse) + if err != nil { + return nil, fmt.Errorf("%s: %w", errUnmarshalError, err) + } + + return &psResponse, nil +} diff --git a/page_shield_scripts.go b/page_shield_scripts.go new file mode 100644 index 00000000000..82ae158a301 --- /dev/null +++ b/page_shield_scripts.go @@ -0,0 +1,95 @@ +package cloudflare + +import ( + "context" + "encoding/json" + "fmt" + "net/http" +) + +// PageShieldScript represents a Page Shield script. +type PageShieldScript struct { + AddedAt string `json:"added_at"` + DomainReportedMalicious bool `json:"domain_reported_malicious"` + FetchedAt string `json:"fetched_at"` + FirstPageURL string `json:"first_page_url"` + FirstSeenAt string `json:"first_seen_at"` + Hash string `json:"hash"` + Host string `json:"host"` + ID string `json:"id"` + JsIntegrityScore int `json:"js_integrity_score"` + LastSeenAt string `json:"last_seen_at"` + PageURLs []string `json:"page_urls"` + URL string `json:"url"` + URLContainsCdnCgiPath bool `json:"url_contains_cdn_cgi_path"` +} + +// ListPageShieldScriptsParams represents a PageShield Script request parameters +type ListPageShieldScriptsParams struct { + Direction string `json:"direction"` + ExcludeCdnCgi bool `json:"exclude_cdn_cgi"` + ExcludeDuplicates bool `json:"exclude_duplicates"` + ExcludeUrls string `json:"exclude_urls"` + Export string `json:"export"` + Hosts string `json:"hosts"` + OrderBy string `json:"order_by"` + Page string `json:"page"` + PageURL string `json:"page_url"` + PerPage int `json:"per_page"` + PrioritizeMalicious bool `json:"prioritize_malicious"` + Status string `json:"status"` + URLs string `json:"urls"` +} + +type PageShieldScriptsResponse struct { + Results []PageShieldScript `json:"result"` + Response + ResultInfo `json:"result_info"` +} + +type PageShieldScriptResponse struct { + Result PageShieldScript `json:"result"` + Versions []PageShieldScriptVersion `json:"versions"` +} + +type PageShieldScriptVersion struct { + FetchedAt string `json:"fetched_at"` + Hash string `json:"hash"` + JsIntegrityScore int `json:"js_integrity_score"` +} + +func (api *API) ListPageShieldScripts(ctx context.Context, rc *ResourceContainer, params ListPageShieldScriptsParams) ([]PageShieldScript, ResultInfo, error) { + path := fmt.Sprintf("/zones/%s/page_shield/scripts", rc.Identifier) + + uri := buildURI(path, params) + + res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil) + if err != nil { + return nil, ResultInfo{}, err + } + + var psResponse PageShieldScriptsResponse + err = json.Unmarshal(res, &psResponse) + if err != nil { + return nil, ResultInfo{}, fmt.Errorf("%s: %w", errUnmarshalError, err) + } + + return psResponse.Results, psResponse.ResultInfo, nil +} + +func (api *API) GetPageShieldScript(ctx context.Context, rc *ResourceContainer, scriptID string) (*PageShieldScript, []PageShieldScriptVersion, error) { + path := fmt.Sprintf("/zones/%s/page_shield/scripts/%s", rc.Identifier, scriptID) + + res, err := api.makeRequestContext(ctx, http.MethodGet, path, nil) + if err != nil { + return nil, nil, err + } + + var psResponse PageShieldScriptResponse + err = json.Unmarshal(res, &psResponse) + if err != nil { + return nil, nil, fmt.Errorf("%s: %w", errUnmarshalError, err) + } + + return &psResponse.Result, psResponse.Versions, nil +} From 41962670e1ae1fd9d5c1ada2479c2b0609ded678 Mon Sep 17 00:00:00 2001 From: wiremanb Date: Tue, 5 Dec 2023 18:00:47 -0600 Subject: [PATCH 2/9] added comments --- page_shield_connections.go | 4 ++-- page_shield_scripts.go | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/page_shield_connections.go b/page_shield_connections.go index 07396f354ec..dbe12980edd 100644 --- a/page_shield_connections.go +++ b/page_shield_connections.go @@ -46,7 +46,7 @@ type ListPageShieldConnectionsResponse struct { // ListPageShieldConnections lists all page shield connections for a zone // -// API documentation: https://api.cloudflare.com/#page-shield-connections-list-page-shield-connections +// API documentation: https://developers.cloudflare.com/api/operations/page-shield-list-page-shield-connections func (api *API) ListPageShieldConnections(ctx context.Context, rc *ResourceContainer, params ListPageShieldConnectionsParams) ([]PageShieldConnection, ResultInfo, error) { path := fmt.Sprintf("/zones/%s/page_shield/connections", rc.Identifier) @@ -68,7 +68,7 @@ func (api *API) ListPageShieldConnections(ctx context.Context, rc *ResourceConta // GetPageShieldConnection gets a page shield connection for a zone // -// API documentation: https://api.cloudflare.com/#page-shield-connections-get-page-shield-connection +// API documentation: https://developers.cloudflare.com/api/operations/page-shield-get-a-page-shield-connection func (api *API) GetPageShieldConnection(ctx context.Context, rc *ResourceContainer, connectionID string) (*PageShieldConnection, error) { path := fmt.Sprintf("/zones/%s/page_shield/connections/%s", rc.Identifier, connectionID) diff --git a/page_shield_scripts.go b/page_shield_scripts.go index 82ae158a301..d0a0e366374 100644 --- a/page_shield_scripts.go +++ b/page_shield_scripts.go @@ -25,6 +25,8 @@ type PageShieldScript struct { } // ListPageShieldScriptsParams represents a PageShield Script request parameters +// +// API reference: https://developers.cloudflare.com/api/operations/page-shield-list-page-shield-scripts#Query-Parameters type ListPageShieldScriptsParams struct { Direction string `json:"direction"` ExcludeCdnCgi bool `json:"exclude_cdn_cgi"` @@ -41,23 +43,29 @@ type ListPageShieldScriptsParams struct { URLs string `json:"urls"` } +// PageShieldScriptResponse represents the response from the PageShield Script API type PageShieldScriptsResponse struct { Results []PageShieldScript `json:"result"` Response ResultInfo `json:"result_info"` } +// PageShieldScriptResponse represents the response from the PageShield Script API type PageShieldScriptResponse struct { Result PageShieldScript `json:"result"` Versions []PageShieldScriptVersion `json:"versions"` } +// PageShieldScriptVersion represents a Page Shield script version. type PageShieldScriptVersion struct { FetchedAt string `json:"fetched_at"` Hash string `json:"hash"` JsIntegrityScore int `json:"js_integrity_score"` } +// ListPageShieldScripts returns a list of PageShield Scripts. +// +// API reference: https://developers.cloudflare.com/api/operations/page-shield-list-page-shield-scripts func (api *API) ListPageShieldScripts(ctx context.Context, rc *ResourceContainer, params ListPageShieldScriptsParams) ([]PageShieldScript, ResultInfo, error) { path := fmt.Sprintf("/zones/%s/page_shield/scripts", rc.Identifier) @@ -77,6 +85,9 @@ func (api *API) ListPageShieldScripts(ctx context.Context, rc *ResourceContainer return psResponse.Results, psResponse.ResultInfo, nil } +// GetPageShieldScript returns a PageShield Script. +// +// API reference: https://developers.cloudflare.com/api/operations/page-shield-get-a-page-shield-script func (api *API) GetPageShieldScript(ctx context.Context, rc *ResourceContainer, scriptID string) (*PageShieldScript, []PageShieldScriptVersion, error) { path := fmt.Sprintf("/zones/%s/page_shield/scripts/%s", rc.Identifier, scriptID) From 88fe07c7c254e2c244e0af0469abd2c4554559c3 Mon Sep 17 00:00:00 2001 From: wiremanb Date: Tue, 5 Dec 2023 19:04:13 -0600 Subject: [PATCH 3/9] added tests --- page_shield_connections_test.go | 86 +++++++++++++++++++ page_shield_policies_test.go | 145 ++++++++++++++++++++++++++++++++ page_shield_scripts_test.go | 76 +++++++++++++++++ page_shield_test.go | 71 ++++++++++++++++ 4 files changed, 378 insertions(+) create mode 100644 page_shield_connections_test.go create mode 100644 page_shield_policies_test.go create mode 100644 page_shield_scripts_test.go create mode 100644 page_shield_test.go diff --git a/page_shield_connections_test.go b/page_shield_connections_test.go new file mode 100644 index 00000000000..ae2778ea0d6 --- /dev/null +++ b/page_shield_connections_test.go @@ -0,0 +1,86 @@ +package cloudflare + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "testing" + + "github.com/stretchr/testify/assert" +) + +// Mock data for PageShieldConnections +var mockPageShieldConnections = []PageShieldConnection{ + { + AddedAt: "2021-08-18T10:51:10.09615Z", + DomainReportedMalicious: false, + FirstPageURL: "blog.cloudflare.com/page", + FirstSeenAt: "2021-08-18T10:51:08Z", + Host: "blog.cloudflare.com", + ID: "c9ef84a6bf5e47138c75d95e2f933e8f", + LastSeenAt: "2021-09-02T09:57:54Z", + PageURLs: []string{"blog.cloudflare.com/page1", "blog.cloudflare.com/page2"}, + URL: "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js", + URLContainsCdnCgiPath: false, + }, + { + AddedAt: "2021-09-18T10:51:10.09615Z", + DomainReportedMalicious: false, + FirstPageURL: "blog.cloudflare.com/page02", + FirstSeenAt: "2021-08-18T10:51:08Z", + Host: "blog.cloudflare.com", + ID: "c9ef84a6bf5e47138c75d95e2f933e8f", + LastSeenAt: "2021-09-02T09:57:54Z", + PageURLs: []string{"blog.cloudflare.com/page1", "blog.cloudflare.com/page2"}, + URL: "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js", + URLContainsCdnCgiPath: false, + }, + { + AddedAt: "2021-10-18T10:51:10.09615Z", + DomainReportedMalicious: false, + FirstPageURL: "blog.cloudflare.com/page03", + FirstSeenAt: "2021-08-18T10:51:08Z", + Host: "blog.cloudflare.com", + ID: "c9ef84a6bf5e47138c75d95e2f933e8f", + LastSeenAt: "2021-09-02T09:57:54Z", + PageURLs: []string{"blog.cloudflare.com/page1", "blog.cloudflare.com/page2"}, + URL: "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js", + URLContainsCdnCgiPath: false, + }, +} + +func TestListPageShieldConnections(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/zones/testzone/page_shield/connections", func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) + w.Header().Set("content-type", "application/json") + response := ListPageShieldConnectionsResponse{ + Result: mockPageShieldConnections, + } + json.NewEncoder(w).Encode(response) + }) + + result, _, err := client.ListPageShieldConnections(context.Background(), &ResourceContainer{Identifier: "testzone"}, ListPageShieldConnectionsParams{}) + assert.NoError(t, err) + assert.Equal(t, mockPageShieldConnections, result) +} + +func TestGetPageShieldConnection(t *testing.T) { + setup() + defer teardown() + + connectionID := "c9ef84a6bf5e47138c75d95e2f933e8f" + mux.HandleFunc(fmt.Sprintf("/zones/testzone/page_shield/connections/%s", connectionID), func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) + w.Header().Set("content-type", "application/json") + response := mockPageShieldConnections[0] // Assuming it's the first mock connection + json.NewEncoder(w).Encode(response) + }) + + result, err := client.GetPageShieldConnection(context.Background(), &ResourceContainer{Identifier: "testzone"}, connectionID) + assert.NoError(t, err) + assert.Equal(t, &mockPageShieldConnections[0], result) +} diff --git a/page_shield_policies_test.go b/page_shield_policies_test.go new file mode 100644 index 00000000000..0a631029781 --- /dev/null +++ b/page_shield_policies_test.go @@ -0,0 +1,145 @@ +package cloudflare + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "testing" + + "github.com/stretchr/testify/assert" +) + +// Mock data for PageShieldPolicies +var mockPageShieldPolicies = []PageShieldPolicy{ + { + Action: "allow", + Description: "Checkout page CSP policy", + Enabled: true, + Expression: "ends_with(http.request.uri.path, \"/checkout\")", + ID: "c9ef84a6bf5e47138c75d95e2f933e8f", + Value: "script-src 'none';", + }, + { + Action: "allow", + Description: "Checkout page CSP policy", + Enabled: true, + Expression: "ends_with(http.request.uri.path, \"/login\")", + ID: "c9ef84a6bf5e47138c75d95e2f933e82", + Value: "script-src 'none';", + }, + { + Action: "allow", + Description: "Checkout page CSP policy", + Enabled: true, + Expression: "ends_with(http.request.uri.path, \"/logout\")", + ID: "c9ef84a6bf5e47138c75d95e2f933e83", + Value: "script-src 'none';", + }, +} + +func TestListPageShieldPolicies(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/zones/testzone/page_shield/policies", func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) + w.Header().Set("content-type", "application/json") + response := ListPageShieldPoliciesResponse{ + Result: mockPageShieldPolicies, + } + json.NewEncoder(w).Encode(response) + }) + + // Test + result, _, err := client.ListPageShieldPolicies(context.Background(), &ResourceContainer{Identifier: "testzone"}) + assert.NoError(t, err) + assert.Equal(t, mockPageShieldPolicies, result) +} + +func TestCreatePageShieldPolicy(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/zones/testzone/page_shield/policies", func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodPost, r.Method, "Expected method 'POST', got %s", r.Method) + w.Header().Set("content-type", "application/json") + var params PageShieldPolicy + err := json.NewDecoder(r.Body).Decode(¶ms) + assert.NoError(t, err) + params.ID = "newPolicyID" + json.NewEncoder(w).Encode(params) + }) + + newPolicy := PageShieldPolicy{ + Action: "block", + Description: "New policy", + Enabled: true, + Expression: "ends_with(http.request.uri.path, \"/new\")", + Value: "script-src 'self';", + } + + result, err := client.CreatePageShieldPolicy(context.Background(), &ResourceContainer{Identifier: "testzone"}, newPolicy) + assert.NoError(t, err) + assert.Equal(t, "newPolicyID", result.ID) +} + +func TestDeletePageShieldPolicy(t *testing.T) { + setup() + defer teardown() + + policyID := "c9ef84a6bf5e47138c75d95e2f933e8f" + mux.HandleFunc(fmt.Sprintf("/zones/testzone/page_shield/policies/%s", policyID), func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodDelete, r.Method, "Expected method 'DELETE', got %s", r.Method) + w.WriteHeader(http.StatusOK) // Assuming successful deletion returns 200 OK + }) + + err := client.DeletePageShieldPolicy(context.Background(), &ResourceContainer{Identifier: "testzone"}, policyID) + assert.NoError(t, err) +} + +func TestGetPageShieldPolicy(t *testing.T) { + setup() + defer teardown() + + policyID := "c9ef84a6bf5e47138c75d95e2f933e8f" + mux.HandleFunc(fmt.Sprintf("/zones/testzone/page_shield/policies/%s", policyID), func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) + w.Header().Set("content-type", "application/json") + json.NewEncoder(w).Encode(mockPageShieldPolicies[0]) // Assuming the first mock policy + }) + + result, err := client.GetPageShieldPolicy(context.Background(), &ResourceContainer{Identifier: "testzone"}, policyID) + assert.NoError(t, err) + assert.Equal(t, &mockPageShieldPolicies[0], result) +} + +func TestUpdatePageShieldPolicy(t *testing.T) { + setup() + defer teardown() + + policyID := "c9ef84a6bf5e47138c75d95e2f933e8f" + mux.HandleFunc(fmt.Sprintf("/zones/testzone/page_shield/policies/%s", policyID), func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodPut, r.Method, "Expected method 'PUT', got %s", r.Method) + w.Header().Set("content-type", "application/json") + + var params PageShieldPolicy + err := json.NewDecoder(r.Body).Decode(¶ms) + assert.NoError(t, err) + params.ID = policyID + json.NewEncoder(w).Encode(params) + }) + + updatedPolicy := PageShieldPolicy{ + Action: "block", + Description: "Updated policy", + Enabled: false, + Expression: "ends_with(http.request.uri.path, \"/updated\")", + Value: "script-src 'self';", + } + + result, err := client.UpdatePageShieldPolicy(context.Background(), &ResourceContainer{Identifier: "testzone"}, policyID, updatedPolicy) + assert.NoError(t, err) + assert.Equal(t, policyID, result.ID) + assert.Equal(t, "Updated policy", result.Description) +} diff --git a/page_shield_scripts_test.go b/page_shield_scripts_test.go new file mode 100644 index 00000000000..6a12b379ede --- /dev/null +++ b/page_shield_scripts_test.go @@ -0,0 +1,76 @@ +package cloudflare + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "testing" + + "github.com/stretchr/testify/assert" +) + +// Mock data +var mockPageShieldScripts = []PageShieldScript{ + { + AddedAt: "2021-08-18T10:51:10.09615Z", + DomainReportedMalicious: false, + FetchedAt: "2021-09-02T10:17:54Z", + FirstPageURL: "blog.cloudflare.com/page", + FirstSeenAt: "2021-08-18T10:51:08Z", + Hash: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + Host: "blog.cloudflare.com", + ID: "c9ef84a6bf5e47138c75d95e2f933e8f", + JsIntegrityScore: 10, + LastSeenAt: "2021-09-02T09:57:54Z", + PageURLs: []string{"blog.cloudflare.com/page1", "blog.cloudflare.com/page2"}, + URL: "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js", + URLContainsCdnCgiPath: false, + }, +} + +var mockVersions = []PageShieldScriptVersion{ + { + FetchedAt: "2021-09-02T10:17:54Z", + Hash: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + JsIntegrityScore: 10, + }, +} + +func TestListPageShieldScripts(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/zones/testzone/page_shield/scripts", func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) + w.Header().Set("content-type", "application/json") + response := PageShieldScriptsResponse{Results: mockPageShieldScripts} + json.NewEncoder(w).Encode(response) + }) + + result, _, err := client.ListPageShieldScripts(context.Background(), &ResourceContainer{Identifier: "testzone"}, ListPageShieldScriptsParams{}) + assert.NoError(t, err) + assert.Equal(t, mockPageShieldScripts, result) +} + +func TestGetPageShieldScript(t *testing.T) { + setup() + defer teardown() + + scriptID := "c9ef84a6bf5e47138c75d95e2f933e8f" + mux.HandleFunc(fmt.Sprintf("/zones/testzone/page_shield/scripts/%s", scriptID), func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) + w.Header().Set("content-type", "application/json") + response := PageShieldScriptResponse{ + Result: mockPageShieldScripts[0], + Versions: mockVersions, + } + json.NewEncoder(w).Encode(response) + }) + + result, versions, err := client.GetPageShieldScript(context.Background(), &ResourceContainer{Identifier: "testzone"}, scriptID) + assert.NoError(t, err) + assert.Equal(t, &mockPageShieldScripts[0], result) + assert.Equal(t, mockVersions, versions) + +} diff --git a/page_shield_test.go b/page_shield_test.go new file mode 100644 index 00000000000..7933471aa5d --- /dev/null +++ b/page_shield_test.go @@ -0,0 +1,71 @@ +package cloudflare + +import ( + "context" + "encoding/json" + "net/http" + "testing" + + "github.com/stretchr/testify/assert" +) + +// Mock PageShieldSettings data +var mockPageShieldSettings = PageShieldSettings{ + PageShield: PageShield{ + Enabled: true, + UseCloudflareReportingEndpoint: true, + UseConnectionURLPath: true, + }, + UpdatedAt: "2022-10-12T17:56:52.083582+01:00", +} + +func TestGetPageShieldSettings(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/zones/testzone/page_shield", func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) + w.Header().Set("content-type", "application/json") + response := PageShieldSettingsResponse{ + PageShield: mockPageShieldSettings, + } + json.NewEncoder(w).Encode(response) + }) + + result, err := client.GetPageShieldSettings(context.Background(), &ResourceContainer{Identifier: "testzone"}) + assert.NoError(t, err) + assert.Equal(t, &PageShieldSettingsResponse{PageShield: mockPageShieldSettings}, result) +} + +func TestUpdatePageShieldSettings(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/zones/testzone/page_shield", func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodPut, r.Method, "Expected method 'PUT', got %s", r.Method) + w.Header().Set("content-type", "application/json") + + var params PageShield + err := json.NewDecoder(r.Body).Decode(¶ms) + assert.NoError(t, err) + + response := PageShieldSettingsResponse{ + PageShield: PageShieldSettings{ + PageShield: params, + UpdatedAt: "2022-10-13T10:00:00.000Z", + }, + } + json.NewEncoder(w).Encode(response) + }) + + newSettings := PageShield{ + Enabled: false, + UseCloudflareReportingEndpoint: false, + UseConnectionURLPath: false, + } + result, err := client.UpdatePageShieldSettings(context.Background(), &ResourceContainer{Identifier: "testzone"}, newSettings) + assert.NoError(t, err) + assert.Equal(t, false, result.PageShield.Enabled) + assert.Equal(t, false, result.PageShield.UseCloudflareReportingEndpoint) + assert.Equal(t, false, result.PageShield.UseConnectionURLPath) +} From b6fae9bd02b4863e65abfebc013ececa3d6a5a7a Mon Sep 17 00:00:00 2001 From: wiremanb Date: Tue, 5 Dec 2023 19:24:49 -0600 Subject: [PATCH 4/9] added changelog --- .changelog/1459.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/1459.txt diff --git a/.changelog/1459.txt b/.changelog/1459.txt new file mode 100644 index 00000000000..b7d1a74e418 --- /dev/null +++ b/.changelog/1459.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +page_shield: added support for page shield +``` \ No newline at end of file From 1487a405e3893f87507c5b0e74c471e16ba96adb Mon Sep 17 00:00:00 2001 From: wiremanb Date: Tue, 5 Dec 2023 21:04:56 -0600 Subject: [PATCH 5/9] changed to use github.com/goccy/go-json instead of std-lib-json --- page_shield.go | 2 +- page_shield_connections.go | 2 +- page_shield_connections_test.go | 2 +- page_shield_policies.go | 2 +- page_shield_policies_test.go | 4 +--- page_shield_scripts.go | 2 +- page_shield_scripts_test.go | 3 +-- 7 files changed, 7 insertions(+), 10 deletions(-) diff --git a/page_shield.go b/page_shield.go index f7fda4c1477..782dbaa3c8a 100644 --- a/page_shield.go +++ b/page_shield.go @@ -2,8 +2,8 @@ package cloudflare import ( "context" - "encoding/json" "fmt" + "github.com/goccy/go-json" "net/http" ) diff --git a/page_shield_connections.go b/page_shield_connections.go index dbe12980edd..b9e7070c9eb 100644 --- a/page_shield_connections.go +++ b/page_shield_connections.go @@ -2,8 +2,8 @@ package cloudflare import ( "context" - "encoding/json" "fmt" + "github.com/goccy/go-json" "net/http" ) diff --git a/page_shield_connections_test.go b/page_shield_connections_test.go index ae2778ea0d6..473226469a3 100644 --- a/page_shield_connections_test.go +++ b/page_shield_connections_test.go @@ -2,8 +2,8 @@ package cloudflare import ( "context" - "encoding/json" "fmt" + "github.com/goccy/go-json" "net/http" "testing" diff --git a/page_shield_policies.go b/page_shield_policies.go index d95b76f0f40..4a88743ff31 100644 --- a/page_shield_policies.go +++ b/page_shield_policies.go @@ -2,8 +2,8 @@ package cloudflare import ( "context" - "encoding/json" "fmt" + "github.com/goccy/go-json" "net/http" ) diff --git a/page_shield_policies_test.go b/page_shield_policies_test.go index 0a631029781..9745459496c 100644 --- a/page_shield_policies_test.go +++ b/page_shield_policies_test.go @@ -2,15 +2,14 @@ package cloudflare import ( "context" - "encoding/json" "fmt" + "github.com/goccy/go-json" "net/http" "testing" "github.com/stretchr/testify/assert" ) -// Mock data for PageShieldPolicies var mockPageShieldPolicies = []PageShieldPolicy{ { Action: "allow", @@ -51,7 +50,6 @@ func TestListPageShieldPolicies(t *testing.T) { json.NewEncoder(w).Encode(response) }) - // Test result, _, err := client.ListPageShieldPolicies(context.Background(), &ResourceContainer{Identifier: "testzone"}) assert.NoError(t, err) assert.Equal(t, mockPageShieldPolicies, result) diff --git a/page_shield_scripts.go b/page_shield_scripts.go index d0a0e366374..d81085d40c7 100644 --- a/page_shield_scripts.go +++ b/page_shield_scripts.go @@ -2,8 +2,8 @@ package cloudflare import ( "context" - "encoding/json" "fmt" + "github.com/goccy/go-json" "net/http" ) diff --git a/page_shield_scripts_test.go b/page_shield_scripts_test.go index 6a12b379ede..c874357a158 100644 --- a/page_shield_scripts_test.go +++ b/page_shield_scripts_test.go @@ -2,15 +2,14 @@ package cloudflare import ( "context" - "encoding/json" "fmt" + "github.com/goccy/go-json" "net/http" "testing" "github.com/stretchr/testify/assert" ) -// Mock data var mockPageShieldScripts = []PageShieldScript{ { AddedAt: "2021-08-18T10:51:10.09615Z", From a217c8d5c4f0beea4f23b9544e236bebeb56b8f2 Mon Sep 17 00:00:00 2001 From: wiremanb Date: Tue, 5 Dec 2023 22:14:16 -0600 Subject: [PATCH 6/9] linting and semgrep addressed --- page_shield.go | 11 +++++----- page_shield_connections.go | 11 +++++----- page_shield_connections_test.go | 28 ++++++++++++++----------- page_shield_policies.go | 5 +++-- page_shield_policies_test.go | 37 ++++++++++++++++++++------------- page_shield_scripts.go | 15 ++++++------- page_shield_scripts_test.go | 19 ++++++++++------- page_shield_test.go | 31 +++++++++++++++------------ 8 files changed, 90 insertions(+), 67 deletions(-) diff --git a/page_shield.go b/page_shield.go index 782dbaa3c8a..406a202d97e 100644 --- a/page_shield.go +++ b/page_shield.go @@ -3,15 +3,16 @@ package cloudflare import ( "context" "fmt" - "github.com/goccy/go-json" "net/http" + + "github.com/goccy/go-json" ) // PageShield represents the page shield object minus any timestamps type PageShield struct { - Enabled bool `json:"enabled"` - UseCloudflareReportingEndpoint bool `json:"use_cloudflare_reporting_endpoint"` - UseConnectionURLPath bool `json:"use_connection_url_path"` + Enabled *bool `json:"enabled,omitempty"` + UseCloudflareReportingEndpoint *bool `json:"use_cloudflare_reporting_endpoint,omitempty"` + UseConnectionURLPath *bool `json:"use_connection_url_path,omitempty"` } // PageShieldSettings represents the page shield settings for a zone @@ -20,7 +21,7 @@ type PageShieldSettings struct { UpdatedAt string `json:"updated_at"` } -// PageShieldSettingsResponse represents the response from the page shield settings endpoint +// PageShieldSettingsResponse represents the response from the page shield settings endpoint. type PageShieldSettingsResponse struct { PageShield PageShieldSettings `json:"result"` Response diff --git a/page_shield_connections.go b/page_shield_connections.go index b9e7070c9eb..f0f10fd930d 100644 --- a/page_shield_connections.go +++ b/page_shield_connections.go @@ -3,14 +3,15 @@ package cloudflare import ( "context" "fmt" - "github.com/goccy/go-json" "net/http" + + "github.com/goccy/go-json" ) // ListPageShieldConnectionsParams represents parameters for a page shield connection request type ListPageShieldConnectionsParams struct { Direction string `json:"direction"` - ExcludeCdnCgi bool `json:"exclude_cdn_cgi"` + ExcludeCdnCgi *bool `json:"exclude_cdn_cgi,omitempty"` ExcludeUrls string `json:"exclude_urls"` Export string `json:"export"` Hosts string `json:"hosts"` @@ -18,7 +19,7 @@ type ListPageShieldConnectionsParams struct { Page string `json:"page"` PageURL string `json:"page_url"` PerPage int `json:"per_page"` - PrioritizeMalicious bool `json:"prioritize_malicious"` + PrioritizeMalicious *bool `json:"prioritize_malicious,omitempty"` Status string `json:"status"` URLs string `json:"urls"` } @@ -26,7 +27,7 @@ type ListPageShieldConnectionsParams struct { // PageShieldConnection represents a page shield connection type PageShieldConnection struct { AddedAt string `json:"added_at"` - DomainReportedMalicious bool `json:"domain_reported_malicious"` + DomainReportedMalicious *bool `json:"domain_reported_malicious,omitempty"` FirstPageURL string `json:"first_page_url"` FirstSeenAt string `json:"first_seen_at"` Host string `json:"host"` @@ -34,7 +35,7 @@ type PageShieldConnection struct { LastSeenAt string `json:"last_seen_at"` PageURLs []string `json:"page_urls"` URL string `json:"url"` - URLContainsCdnCgiPath bool `json:"url_contains_cdn_cgi_path"` + URLContainsCdnCgiPath *bool `json:"url_contains_cdn_cgi_path,omitempty"` } // ListPageShieldConnectionsResponse represents the response from the list page shield connections endpoint diff --git a/page_shield_connections_test.go b/page_shield_connections_test.go index 473226469a3..1401b7bac57 100644 --- a/page_shield_connections_test.go +++ b/page_shield_connections_test.go @@ -3,10 +3,10 @@ package cloudflare import ( "context" "fmt" - "github.com/goccy/go-json" "net/http" "testing" + "github.com/goccy/go-json" "github.com/stretchr/testify/assert" ) @@ -14,7 +14,7 @@ import ( var mockPageShieldConnections = []PageShieldConnection{ { AddedAt: "2021-08-18T10:51:10.09615Z", - DomainReportedMalicious: false, + DomainReportedMalicious: BoolPtr(false), FirstPageURL: "blog.cloudflare.com/page", FirstSeenAt: "2021-08-18T10:51:08Z", Host: "blog.cloudflare.com", @@ -22,11 +22,11 @@ var mockPageShieldConnections = []PageShieldConnection{ LastSeenAt: "2021-09-02T09:57:54Z", PageURLs: []string{"blog.cloudflare.com/page1", "blog.cloudflare.com/page2"}, URL: "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js", - URLContainsCdnCgiPath: false, + URLContainsCdnCgiPath: BoolPtr(false), }, { AddedAt: "2021-09-18T10:51:10.09615Z", - DomainReportedMalicious: false, + DomainReportedMalicious: BoolPtr(false), FirstPageURL: "blog.cloudflare.com/page02", FirstSeenAt: "2021-08-18T10:51:08Z", Host: "blog.cloudflare.com", @@ -34,11 +34,11 @@ var mockPageShieldConnections = []PageShieldConnection{ LastSeenAt: "2021-09-02T09:57:54Z", PageURLs: []string{"blog.cloudflare.com/page1", "blog.cloudflare.com/page2"}, URL: "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js", - URLContainsCdnCgiPath: false, + URLContainsCdnCgiPath: BoolPtr(false), }, { AddedAt: "2021-10-18T10:51:10.09615Z", - DomainReportedMalicious: false, + DomainReportedMalicious: BoolPtr(false), FirstPageURL: "blog.cloudflare.com/page03", FirstSeenAt: "2021-08-18T10:51:08Z", Host: "blog.cloudflare.com", @@ -46,7 +46,7 @@ var mockPageShieldConnections = []PageShieldConnection{ LastSeenAt: "2021-09-02T09:57:54Z", PageURLs: []string{"blog.cloudflare.com/page1", "blog.cloudflare.com/page2"}, URL: "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js", - URLContainsCdnCgiPath: false, + URLContainsCdnCgiPath: BoolPtr(false), }, } @@ -60,9 +60,11 @@ func TestListPageShieldConnections(t *testing.T) { response := ListPageShieldConnectionsResponse{ Result: mockPageShieldConnections, } - json.NewEncoder(w).Encode(response) + err := json.NewEncoder(w).Encode(response) + if err != nil { + t.Fatal(err) + } }) - result, _, err := client.ListPageShieldConnections(context.Background(), &ResourceContainer{Identifier: "testzone"}, ListPageShieldConnectionsParams{}) assert.NoError(t, err) assert.Equal(t, mockPageShieldConnections, result) @@ -72,14 +74,16 @@ func TestGetPageShieldConnection(t *testing.T) { setup() defer teardown() - connectionID := "c9ef84a6bf5e47138c75d95e2f933e8f" + connectionID := "c9ef84a6bf5e47138c75d95e2f933e8f" //nolint mux.HandleFunc(fmt.Sprintf("/zones/testzone/page_shield/connections/%s", connectionID), func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) w.Header().Set("content-type", "application/json") response := mockPageShieldConnections[0] // Assuming it's the first mock connection - json.NewEncoder(w).Encode(response) + err := json.NewEncoder(w).Encode(response) + if err != nil { + t.Fatal(err) + } }) - result, err := client.GetPageShieldConnection(context.Background(), &ResourceContainer{Identifier: "testzone"}, connectionID) assert.NoError(t, err) assert.Equal(t, &mockPageShieldConnections[0], result) diff --git a/page_shield_policies.go b/page_shield_policies.go index 4a88743ff31..b07df175b9f 100644 --- a/page_shield_policies.go +++ b/page_shield_policies.go @@ -3,15 +3,16 @@ package cloudflare import ( "context" "fmt" - "github.com/goccy/go-json" "net/http" + + "github.com/goccy/go-json" ) // PageShieldPolicy represents a page shield policy type PageShieldPolicy struct { Action string `json:"action"` Description string `json:"description"` - Enabled bool `json:"enabled"` + Enabled *bool `json:"enabled,omitempty"` Expression string `json:"expression"` ID string `json:"id"` Value string `json:"value"` diff --git a/page_shield_policies_test.go b/page_shield_policies_test.go index 9745459496c..d6d964f549d 100644 --- a/page_shield_policies_test.go +++ b/page_shield_policies_test.go @@ -3,10 +3,10 @@ package cloudflare import ( "context" "fmt" - "github.com/goccy/go-json" "net/http" "testing" + "github.com/goccy/go-json" "github.com/stretchr/testify/assert" ) @@ -14,7 +14,7 @@ var mockPageShieldPolicies = []PageShieldPolicy{ { Action: "allow", Description: "Checkout page CSP policy", - Enabled: true, + Enabled: BoolPtr(true), Expression: "ends_with(http.request.uri.path, \"/checkout\")", ID: "c9ef84a6bf5e47138c75d95e2f933e8f", Value: "script-src 'none';", @@ -22,7 +22,7 @@ var mockPageShieldPolicies = []PageShieldPolicy{ { Action: "allow", Description: "Checkout page CSP policy", - Enabled: true, + Enabled: BoolPtr(true), Expression: "ends_with(http.request.uri.path, \"/login\")", ID: "c9ef84a6bf5e47138c75d95e2f933e82", Value: "script-src 'none';", @@ -30,7 +30,7 @@ var mockPageShieldPolicies = []PageShieldPolicy{ { Action: "allow", Description: "Checkout page CSP policy", - Enabled: true, + Enabled: BoolPtr(true), Expression: "ends_with(http.request.uri.path, \"/logout\")", ID: "c9ef84a6bf5e47138c75d95e2f933e83", Value: "script-src 'none';", @@ -47,9 +47,11 @@ func TestListPageShieldPolicies(t *testing.T) { response := ListPageShieldPoliciesResponse{ Result: mockPageShieldPolicies, } - json.NewEncoder(w).Encode(response) + err := json.NewEncoder(w).Encode(response) + if err != nil { + t.Fatal(err) + } }) - result, _, err := client.ListPageShieldPolicies(context.Background(), &ResourceContainer{Identifier: "testzone"}) assert.NoError(t, err) assert.Equal(t, mockPageShieldPolicies, result) @@ -66,17 +68,19 @@ func TestCreatePageShieldPolicy(t *testing.T) { err := json.NewDecoder(r.Body).Decode(¶ms) assert.NoError(t, err) params.ID = "newPolicyID" - json.NewEncoder(w).Encode(params) + err = json.NewEncoder(w).Encode(params) + if err != nil { + t.Fatal(err) + } }) newPolicy := PageShieldPolicy{ Action: "block", Description: "New policy", - Enabled: true, + Enabled: BoolPtr(true), Expression: "ends_with(http.request.uri.path, \"/new\")", Value: "script-src 'self';", } - result, err := client.CreatePageShieldPolicy(context.Background(), &ResourceContainer{Identifier: "testzone"}, newPolicy) assert.NoError(t, err) assert.Equal(t, "newPolicyID", result.ID) @@ -91,7 +95,6 @@ func TestDeletePageShieldPolicy(t *testing.T) { assert.Equal(t, http.MethodDelete, r.Method, "Expected method 'DELETE', got %s", r.Method) w.WriteHeader(http.StatusOK) // Assuming successful deletion returns 200 OK }) - err := client.DeletePageShieldPolicy(context.Background(), &ResourceContainer{Identifier: "testzone"}, policyID) assert.NoError(t, err) } @@ -104,9 +107,11 @@ func TestGetPageShieldPolicy(t *testing.T) { mux.HandleFunc(fmt.Sprintf("/zones/testzone/page_shield/policies/%s", policyID), func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) w.Header().Set("content-type", "application/json") - json.NewEncoder(w).Encode(mockPageShieldPolicies[0]) // Assuming the first mock policy + err := json.NewEncoder(w).Encode(mockPageShieldPolicies[0]) // Assuming the first mock policy + if err != nil { + t.Fatal(err) + } }) - result, err := client.GetPageShieldPolicy(context.Background(), &ResourceContainer{Identifier: "testzone"}, policyID) assert.NoError(t, err) assert.Equal(t, &mockPageShieldPolicies[0], result) @@ -125,17 +130,19 @@ func TestUpdatePageShieldPolicy(t *testing.T) { err := json.NewDecoder(r.Body).Decode(¶ms) assert.NoError(t, err) params.ID = policyID - json.NewEncoder(w).Encode(params) + err = json.NewEncoder(w).Encode(params) + if err != nil { + t.Fatal(err) + } }) updatedPolicy := PageShieldPolicy{ Action: "block", Description: "Updated policy", - Enabled: false, + Enabled: BoolPtr(false), Expression: "ends_with(http.request.uri.path, \"/updated\")", Value: "script-src 'self';", } - result, err := client.UpdatePageShieldPolicy(context.Background(), &ResourceContainer{Identifier: "testzone"}, policyID, updatedPolicy) assert.NoError(t, err) assert.Equal(t, policyID, result.ID) diff --git a/page_shield_scripts.go b/page_shield_scripts.go index d81085d40c7..b0010670987 100644 --- a/page_shield_scripts.go +++ b/page_shield_scripts.go @@ -3,14 +3,15 @@ package cloudflare import ( "context" "fmt" - "github.com/goccy/go-json" "net/http" + + "github.com/goccy/go-json" ) // PageShieldScript represents a Page Shield script. type PageShieldScript struct { AddedAt string `json:"added_at"` - DomainReportedMalicious bool `json:"domain_reported_malicious"` + DomainReportedMalicious *bool `json:"domain_reported_malicious,omitempty"` FetchedAt string `json:"fetched_at"` FirstPageURL string `json:"first_page_url"` FirstSeenAt string `json:"first_seen_at"` @@ -21,7 +22,7 @@ type PageShieldScript struct { LastSeenAt string `json:"last_seen_at"` PageURLs []string `json:"page_urls"` URL string `json:"url"` - URLContainsCdnCgiPath bool `json:"url_contains_cdn_cgi_path"` + URLContainsCdnCgiPath *bool `json:"url_contains_cdn_cgi_path,omitempty"` } // ListPageShieldScriptsParams represents a PageShield Script request parameters @@ -29,8 +30,8 @@ type PageShieldScript struct { // API reference: https://developers.cloudflare.com/api/operations/page-shield-list-page-shield-scripts#Query-Parameters type ListPageShieldScriptsParams struct { Direction string `json:"direction"` - ExcludeCdnCgi bool `json:"exclude_cdn_cgi"` - ExcludeDuplicates bool `json:"exclude_duplicates"` + ExcludeCdnCgi *bool `json:"exclude_cdn_cgi,omitempty"` + ExcludeDuplicates *bool `json:"exclude_duplicates,omitempty"` ExcludeUrls string `json:"exclude_urls"` Export string `json:"export"` Hosts string `json:"hosts"` @@ -38,12 +39,12 @@ type ListPageShieldScriptsParams struct { Page string `json:"page"` PageURL string `json:"page_url"` PerPage int `json:"per_page"` - PrioritizeMalicious bool `json:"prioritize_malicious"` + PrioritizeMalicious *bool `json:"prioritize_malicious,omitempty"` Status string `json:"status"` URLs string `json:"urls"` } -// PageShieldScriptResponse represents the response from the PageShield Script API +// PageShieldScriptsResponse represents the response from the PageShield Script API type PageShieldScriptsResponse struct { Results []PageShieldScript `json:"result"` Response diff --git a/page_shield_scripts_test.go b/page_shield_scripts_test.go index c874357a158..c8bc74f8f0c 100644 --- a/page_shield_scripts_test.go +++ b/page_shield_scripts_test.go @@ -3,17 +3,17 @@ package cloudflare import ( "context" "fmt" - "github.com/goccy/go-json" "net/http" "testing" + "github.com/goccy/go-json" "github.com/stretchr/testify/assert" ) var mockPageShieldScripts = []PageShieldScript{ { AddedAt: "2021-08-18T10:51:10.09615Z", - DomainReportedMalicious: false, + DomainReportedMalicious: BoolPtr(false), FetchedAt: "2021-09-02T10:17:54Z", FirstPageURL: "blog.cloudflare.com/page", FirstSeenAt: "2021-08-18T10:51:08Z", @@ -24,7 +24,7 @@ var mockPageShieldScripts = []PageShieldScript{ LastSeenAt: "2021-09-02T09:57:54Z", PageURLs: []string{"blog.cloudflare.com/page1", "blog.cloudflare.com/page2"}, URL: "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js", - URLContainsCdnCgiPath: false, + URLContainsCdnCgiPath: BoolPtr(false), }, } @@ -44,9 +44,11 @@ func TestListPageShieldScripts(t *testing.T) { assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) w.Header().Set("content-type", "application/json") response := PageShieldScriptsResponse{Results: mockPageShieldScripts} - json.NewEncoder(w).Encode(response) + err := json.NewEncoder(w).Encode(response) + if err != nil { + t.Fatal(err) + } }) - result, _, err := client.ListPageShieldScripts(context.Background(), &ResourceContainer{Identifier: "testzone"}, ListPageShieldScriptsParams{}) assert.NoError(t, err) assert.Equal(t, mockPageShieldScripts, result) @@ -64,12 +66,13 @@ func TestGetPageShieldScript(t *testing.T) { Result: mockPageShieldScripts[0], Versions: mockVersions, } - json.NewEncoder(w).Encode(response) + err := json.NewEncoder(w).Encode(response) + if err != nil { + t.Fatal(err) + } }) - result, versions, err := client.GetPageShieldScript(context.Background(), &ResourceContainer{Identifier: "testzone"}, scriptID) assert.NoError(t, err) assert.Equal(t, &mockPageShieldScripts[0], result) assert.Equal(t, mockVersions, versions) - } diff --git a/page_shield_test.go b/page_shield_test.go index 7933471aa5d..3da9af35ba0 100644 --- a/page_shield_test.go +++ b/page_shield_test.go @@ -2,19 +2,19 @@ package cloudflare import ( "context" - "encoding/json" "net/http" "testing" + "github.com/goccy/go-json" "github.com/stretchr/testify/assert" ) // Mock PageShieldSettings data var mockPageShieldSettings = PageShieldSettings{ PageShield: PageShield{ - Enabled: true, - UseCloudflareReportingEndpoint: true, - UseConnectionURLPath: true, + Enabled: BoolPtr(true), + UseCloudflareReportingEndpoint: BoolPtr(true), + UseConnectionURLPath: BoolPtr(true), }, UpdatedAt: "2022-10-12T17:56:52.083582+01:00", } @@ -29,9 +29,11 @@ func TestGetPageShieldSettings(t *testing.T) { response := PageShieldSettingsResponse{ PageShield: mockPageShieldSettings, } - json.NewEncoder(w).Encode(response) + err := json.NewEncoder(w).Encode(response) + if err != nil { + t.Fatal(err) + } }) - result, err := client.GetPageShieldSettings(context.Background(), &ResourceContainer{Identifier: "testzone"}) assert.NoError(t, err) assert.Equal(t, &PageShieldSettingsResponse{PageShield: mockPageShieldSettings}, result) @@ -55,17 +57,20 @@ func TestUpdatePageShieldSettings(t *testing.T) { UpdatedAt: "2022-10-13T10:00:00.000Z", }, } - json.NewEncoder(w).Encode(response) + err = json.NewEncoder(w).Encode(response) + if err != nil { + t.Fatal(err) + } }) newSettings := PageShield{ - Enabled: false, - UseCloudflareReportingEndpoint: false, - UseConnectionURLPath: false, + Enabled: BoolPtr(false), + UseCloudflareReportingEndpoint: BoolPtr(false), + UseConnectionURLPath: BoolPtr(false), } result, err := client.UpdatePageShieldSettings(context.Background(), &ResourceContainer{Identifier: "testzone"}, newSettings) assert.NoError(t, err) - assert.Equal(t, false, result.PageShield.Enabled) - assert.Equal(t, false, result.PageShield.UseCloudflareReportingEndpoint) - assert.Equal(t, false, result.PageShield.UseConnectionURLPath) + assert.Equal(t, false, *result.PageShield.Enabled) + assert.Equal(t, false, *result.PageShield.UseCloudflareReportingEndpoint) + assert.Equal(t, false, *result.PageShield.UseConnectionURLPath) } From 3158c3966740bf56569f6b01e25d5ed25a334671 Mon Sep 17 00:00:00 2001 From: wiremanb Date: Wed, 6 Dec 2023 15:43:12 -0600 Subject: [PATCH 7/9] changed json struct tags to url --- page_shield_connections.go | 24 ++++++++++++------------ page_shield_scripts.go | 26 +++++++++++++------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/page_shield_connections.go b/page_shield_connections.go index f0f10fd930d..d60aba9cf85 100644 --- a/page_shield_connections.go +++ b/page_shield_connections.go @@ -10,18 +10,18 @@ import ( // ListPageShieldConnectionsParams represents parameters for a page shield connection request type ListPageShieldConnectionsParams struct { - Direction string `json:"direction"` - ExcludeCdnCgi *bool `json:"exclude_cdn_cgi,omitempty"` - ExcludeUrls string `json:"exclude_urls"` - Export string `json:"export"` - Hosts string `json:"hosts"` - OrderBy string `json:"order_by"` - Page string `json:"page"` - PageURL string `json:"page_url"` - PerPage int `json:"per_page"` - PrioritizeMalicious *bool `json:"prioritize_malicious,omitempty"` - Status string `json:"status"` - URLs string `json:"urls"` + Direction string `url:"direction"` + ExcludeCdnCgi *bool `url:"exclude_cdn_cgi,omitempty"` + ExcludeUrls string `url:"exclude_urls"` + Export string `url:"export"` + Hosts string `url:"hosts"` + OrderBy string `url:"order_by"` + Page string `url:"page"` + PageURL string `url:"page_url"` + PerPage int `url:"per_page"` + PrioritizeMalicious *bool `url:"prioritize_malicious,omitempty"` + Status string `url:"status"` + URLs string `url:"urls"` } // PageShieldConnection represents a page shield connection diff --git a/page_shield_scripts.go b/page_shield_scripts.go index b0010670987..6e1cad2e6df 100644 --- a/page_shield_scripts.go +++ b/page_shield_scripts.go @@ -29,19 +29,19 @@ type PageShieldScript struct { // // API reference: https://developers.cloudflare.com/api/operations/page-shield-list-page-shield-scripts#Query-Parameters type ListPageShieldScriptsParams struct { - Direction string `json:"direction"` - ExcludeCdnCgi *bool `json:"exclude_cdn_cgi,omitempty"` - ExcludeDuplicates *bool `json:"exclude_duplicates,omitempty"` - ExcludeUrls string `json:"exclude_urls"` - Export string `json:"export"` - Hosts string `json:"hosts"` - OrderBy string `json:"order_by"` - Page string `json:"page"` - PageURL string `json:"page_url"` - PerPage int `json:"per_page"` - PrioritizeMalicious *bool `json:"prioritize_malicious,omitempty"` - Status string `json:"status"` - URLs string `json:"urls"` + Direction string `url:"direction"` + ExcludeCdnCgi *bool `url:"exclude_cdn_cgi,omitempty"` + ExcludeDuplicates *bool `url:"exclude_duplicates,omitempty"` + ExcludeUrls string `url:"exclude_urls"` + Export string `url:"export"` + Hosts string `url:"hosts"` + OrderBy string `url:"order_by"` + Page string `url:"page"` + PageURL string `url:"page_url"` + PerPage int `url:"per_page"` + PrioritizeMalicious *bool `url:"prioritize_malicious,omitempty"` + Status string `url:"status"` + URLs string `url:"urls"` } // PageShieldScriptsResponse represents the response from the PageShield Script API From 24abffa257e53772919ce8c379f0156425ab0f03 Mon Sep 17 00:00:00 2001 From: Jacob Bednarz Date: Thu, 7 Dec 2023 08:17:06 +1100 Subject: [PATCH 8/9] update to match library conventions --- page_shield.go | 20 +++++++++++----- page_shield_connections.go | 10 ++++---- page_shield_connections_test.go | 8 +++---- page_shield_policies.go | 42 ++++++++++++++++++++++++--------- page_shield_policies_test.go | 25 ++++++++++---------- page_shield_scripts.go | 10 ++++---- page_shield_scripts_test.go | 12 +++++----- page_shield_test.go | 11 +++++---- 8 files changed, 84 insertions(+), 54 deletions(-) diff --git a/page_shield.go b/page_shield.go index 406a202d97e..d05c9497224 100644 --- a/page_shield.go +++ b/page_shield.go @@ -8,14 +8,20 @@ import ( "github.com/goccy/go-json" ) -// PageShield represents the page shield object minus any timestamps +// PageShield represents the page shield object minus any timestamps. type PageShield struct { Enabled *bool `json:"enabled,omitempty"` UseCloudflareReportingEndpoint *bool `json:"use_cloudflare_reporting_endpoint,omitempty"` UseConnectionURLPath *bool `json:"use_connection_url_path,omitempty"` } -// PageShieldSettings represents the page shield settings for a zone +type UpdatePageShieldSettingsParams struct { + Enabled *bool `json:"enabled,omitempty"` + UseCloudflareReportingEndpoint *bool `json:"use_cloudflare_reporting_endpoint,omitempty"` + UseConnectionURLPath *bool `json:"use_connection_url_path,omitempty"` +} + +// PageShieldSettings represents the page shield settings for a zone. type PageShieldSettings struct { PageShield UpdatedAt string `json:"updated_at"` @@ -27,10 +33,12 @@ type PageShieldSettingsResponse struct { Response } -// GetPageShieldSettings returns the page shield settings for a zone +type GetPageShieldSettingsParams struct{} + +// GetPageShieldSettings returns the page shield settings for a zone. // // API documentation: https://developers.cloudflare.com/api/operations/page-shield-get-page-shield-settings -func (api *API) GetPageShieldSettings(ctx context.Context, rc *ResourceContainer) (*PageShieldSettingsResponse, error) { +func (api *API) GetPageShieldSettings(ctx context.Context, rc *ResourceContainer, params GetPageShieldSettingsParams) (*PageShieldSettingsResponse, error) { uri := fmt.Sprintf("/zones/%s/page_shield", rc.Identifier) res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil) @@ -47,10 +55,10 @@ func (api *API) GetPageShieldSettings(ctx context.Context, rc *ResourceContainer return &psResponse, nil } -// UpdatePageShieldSettings updates the page shield settings for a zone +// UpdatePageShieldSettings updates the page shield settings for a zone. // // API documentation: https://developers.cloudflare.com/api/operations/page-shield-update-page-shield-settings -func (api *API) UpdatePageShieldSettings(ctx context.Context, rc *ResourceContainer, params PageShield) (*PageShieldSettingsResponse, error) { +func (api *API) UpdatePageShieldSettings(ctx context.Context, rc *ResourceContainer, params UpdatePageShieldSettingsParams) (*PageShieldSettingsResponse, error) { uri := fmt.Sprintf("/zones/%s/page_shield", rc.Identifier) res, err := api.makeRequestContext(ctx, http.MethodPut, uri, params) diff --git a/page_shield_connections.go b/page_shield_connections.go index d60aba9cf85..90465127699 100644 --- a/page_shield_connections.go +++ b/page_shield_connections.go @@ -8,7 +8,7 @@ import ( "github.com/goccy/go-json" ) -// ListPageShieldConnectionsParams represents parameters for a page shield connection request +// ListPageShieldConnectionsParams represents parameters for a page shield connection request. type ListPageShieldConnectionsParams struct { Direction string `url:"direction"` ExcludeCdnCgi *bool `url:"exclude_cdn_cgi,omitempty"` @@ -24,7 +24,7 @@ type ListPageShieldConnectionsParams struct { URLs string `url:"urls"` } -// PageShieldConnection represents a page shield connection +// PageShieldConnection represents a page shield connection. type PageShieldConnection struct { AddedAt string `json:"added_at"` DomainReportedMalicious *bool `json:"domain_reported_malicious,omitempty"` @@ -38,14 +38,14 @@ type PageShieldConnection struct { URLContainsCdnCgiPath *bool `json:"url_contains_cdn_cgi_path,omitempty"` } -// ListPageShieldConnectionsResponse represents the response from the list page shield connections endpoint +// ListPageShieldConnectionsResponse represents the response from the list page shield connections endpoint. type ListPageShieldConnectionsResponse struct { Result []PageShieldConnection `json:"result"` Response ResultInfo `json:"result_info"` } -// ListPageShieldConnections lists all page shield connections for a zone +// ListPageShieldConnections lists all page shield connections for a zone. // // API documentation: https://developers.cloudflare.com/api/operations/page-shield-list-page-shield-connections func (api *API) ListPageShieldConnections(ctx context.Context, rc *ResourceContainer, params ListPageShieldConnectionsParams) ([]PageShieldConnection, ResultInfo, error) { @@ -67,7 +67,7 @@ func (api *API) ListPageShieldConnections(ctx context.Context, rc *ResourceConta return psResponse.Result, psResponse.ResultInfo, nil } -// GetPageShieldConnection gets a page shield connection for a zone +// GetPageShieldConnection gets a page shield connection for a zone. // // API documentation: https://developers.cloudflare.com/api/operations/page-shield-get-a-page-shield-connection func (api *API) GetPageShieldConnection(ctx context.Context, rc *ResourceContainer, connectionID string) (*PageShieldConnection, error) { diff --git a/page_shield_connections_test.go b/page_shield_connections_test.go index 1401b7bac57..e1433572260 100644 --- a/page_shield_connections_test.go +++ b/page_shield_connections_test.go @@ -54,7 +54,7 @@ func TestListPageShieldConnections(t *testing.T) { setup() defer teardown() - mux.HandleFunc("/zones/testzone/page_shield/connections", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/zones/"+testZoneID+"/page_shield/connections", func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) w.Header().Set("content-type", "application/json") response := ListPageShieldConnectionsResponse{ @@ -65,7 +65,7 @@ func TestListPageShieldConnections(t *testing.T) { t.Fatal(err) } }) - result, _, err := client.ListPageShieldConnections(context.Background(), &ResourceContainer{Identifier: "testzone"}, ListPageShieldConnectionsParams{}) + result, _, err := client.ListPageShieldConnections(context.Background(), ZoneIdentifier(testZoneID), ListPageShieldConnectionsParams{}) assert.NoError(t, err) assert.Equal(t, mockPageShieldConnections, result) } @@ -75,7 +75,7 @@ func TestGetPageShieldConnection(t *testing.T) { defer teardown() connectionID := "c9ef84a6bf5e47138c75d95e2f933e8f" //nolint - mux.HandleFunc(fmt.Sprintf("/zones/testzone/page_shield/connections/%s", connectionID), func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc(fmt.Sprintf("/zones/"+testZoneID+"/page_shield/connections/%s", connectionID), func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) w.Header().Set("content-type", "application/json") response := mockPageShieldConnections[0] // Assuming it's the first mock connection @@ -84,7 +84,7 @@ func TestGetPageShieldConnection(t *testing.T) { t.Fatal(err) } }) - result, err := client.GetPageShieldConnection(context.Background(), &ResourceContainer{Identifier: "testzone"}, connectionID) + result, err := client.GetPageShieldConnection(context.Background(), ZoneIdentifier(testZoneID), connectionID) assert.NoError(t, err) assert.Equal(t, &mockPageShieldConnections[0], result) } diff --git a/page_shield_policies.go b/page_shield_policies.go index b07df175b9f..29ce64ad0e2 100644 --- a/page_shield_policies.go +++ b/page_shield_policies.go @@ -8,7 +8,7 @@ import ( "github.com/goccy/go-json" ) -// PageShieldPolicy represents a page shield policy +// PageShieldPolicy represents a page shield policy. type PageShieldPolicy struct { Action string `json:"action"` Description string `json:"description"` @@ -18,17 +18,37 @@ type PageShieldPolicy struct { Value string `json:"value"` } -// ListPageShieldPoliciesResponse represents the response from the list page shield policies endpoint +type CreatePageShieldPolicyParams struct { + Action string `json:"action"` + Description string `json:"description"` + Enabled *bool `json:"enabled,omitempty"` + Expression string `json:"expression"` + ID string `json:"id"` + Value string `json:"value"` +} + +type UpdatePageShieldPolicyParams struct { + Action string `json:"action"` + Description string `json:"description"` + Enabled *bool `json:"enabled,omitempty"` + Expression string `json:"expression"` + ID string `json:"id"` + Value string `json:"value"` +} + +// ListPageShieldPoliciesResponse represents the response from the list page shield policies endpoint. type ListPageShieldPoliciesResponse struct { Result []PageShieldPolicy `json:"result"` Response ResultInfo `json:"result_info"` } -// ListPageShieldPolicies lists all page shield policies for a zone +type ListPageShieldPoliciesParams struct{} + +// ListPageShieldPolicies lists all page shield policies for a zone. // // API documentation: https://developers.cloudflare.com/api/operations/page-shield-list-page-shield-policies -func (api *API) ListPageShieldPolicies(ctx context.Context, rc *ResourceContainer) ([]PageShieldPolicy, ResultInfo, error) { +func (api *API) ListPageShieldPolicies(ctx context.Context, rc *ResourceContainer, params ListPageShieldPoliciesParams) ([]PageShieldPolicy, ResultInfo, error) { path := fmt.Sprintf("/zones/%s/page_shield/policies", rc.Identifier) res, err := api.makeRequestContext(ctx, http.MethodGet, path, nil) @@ -45,10 +65,10 @@ func (api *API) ListPageShieldPolicies(ctx context.Context, rc *ResourceContaine return psResponse.Result, psResponse.ResultInfo, nil } -// CreatePageShieldPolicy creates a page shield policy for a zone +// CreatePageShieldPolicy creates a page shield policy for a zone. // // API documentation: https://developers.cloudflare.com/api/operations/page-shield-create-page-shield-policy -func (api *API) CreatePageShieldPolicy(ctx context.Context, rc *ResourceContainer, params PageShieldPolicy) (*PageShieldPolicy, error) { +func (api *API) CreatePageShieldPolicy(ctx context.Context, rc *ResourceContainer, params CreatePageShieldPolicyParams) (*PageShieldPolicy, error) { path := fmt.Sprintf("/zones/%s/page_shield/policies", rc.Identifier) res, err := api.makeRequestContext(ctx, http.MethodPost, path, params) @@ -65,7 +85,7 @@ func (api *API) CreatePageShieldPolicy(ctx context.Context, rc *ResourceContaine return &psResponse, nil } -// DeletePageShieldPolicy deletes a page shield policy for a zone +// DeletePageShieldPolicy deletes a page shield policy for a zone. // // API documentation: https://developers.cloudflare.com/api/operations/page-shield-delete-page-shield-policy func (api *API) DeletePageShieldPolicy(ctx context.Context, rc *ResourceContainer, policyID string) error { @@ -79,7 +99,7 @@ func (api *API) DeletePageShieldPolicy(ctx context.Context, rc *ResourceContaine return nil } -// GetPageShieldPolicy gets a page shield policy for a zone +// GetPageShieldPolicy gets a page shield policy for a zone. // // API documentation: https://developers.cloudflare.com/api/operations/page-shield-get-page-shield-policy func (api *API) GetPageShieldPolicy(ctx context.Context, rc *ResourceContainer, policyID string) (*PageShieldPolicy, error) { @@ -99,11 +119,11 @@ func (api *API) GetPageShieldPolicy(ctx context.Context, rc *ResourceContainer, return &psResponse, nil } -// UpdatePageShieldPolicy updates a page shield policy for a zone +// UpdatePageShieldPolicy updates a page shield policy for a zone. // // API documentation: https://developers.cloudflare.com/api/operations/page-shield-update-page-shield-policy -func (api *API) UpdatePageShieldPolicy(ctx context.Context, rc *ResourceContainer, policyID string, params PageShieldPolicy) (*PageShieldPolicy, error) { - path := fmt.Sprintf("/zones/%s/page_shield/policies/%s", rc.Identifier, policyID) +func (api *API) UpdatePageShieldPolicy(ctx context.Context, rc *ResourceContainer, params UpdatePageShieldPolicyParams) (*PageShieldPolicy, error) { + path := fmt.Sprintf("/zones/%s/page_shield/policies/%s", rc.Identifier, params.ID) res, err := api.makeRequestContext(ctx, http.MethodPut, path, params) if err != nil { diff --git a/page_shield_policies_test.go b/page_shield_policies_test.go index d6d964f549d..239c4639d09 100644 --- a/page_shield_policies_test.go +++ b/page_shield_policies_test.go @@ -41,7 +41,7 @@ func TestListPageShieldPolicies(t *testing.T) { setup() defer teardown() - mux.HandleFunc("/zones/testzone/page_shield/policies", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/zones/"+testZoneID+"/page_shield/policies", func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) w.Header().Set("content-type", "application/json") response := ListPageShieldPoliciesResponse{ @@ -52,7 +52,7 @@ func TestListPageShieldPolicies(t *testing.T) { t.Fatal(err) } }) - result, _, err := client.ListPageShieldPolicies(context.Background(), &ResourceContainer{Identifier: "testzone"}) + result, _, err := client.ListPageShieldPolicies(context.Background(), ZoneIdentifier(testZoneID), ListPageShieldPoliciesParams{}) assert.NoError(t, err) assert.Equal(t, mockPageShieldPolicies, result) } @@ -61,7 +61,7 @@ func TestCreatePageShieldPolicy(t *testing.T) { setup() defer teardown() - mux.HandleFunc("/zones/testzone/page_shield/policies", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/zones/"+testZoneID+"/page_shield/policies", func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodPost, r.Method, "Expected method 'POST', got %s", r.Method) w.Header().Set("content-type", "application/json") var params PageShieldPolicy @@ -74,14 +74,14 @@ func TestCreatePageShieldPolicy(t *testing.T) { } }) - newPolicy := PageShieldPolicy{ + newPolicy := CreatePageShieldPolicyParams{ Action: "block", Description: "New policy", Enabled: BoolPtr(true), Expression: "ends_with(http.request.uri.path, \"/new\")", Value: "script-src 'self';", } - result, err := client.CreatePageShieldPolicy(context.Background(), &ResourceContainer{Identifier: "testzone"}, newPolicy) + result, err := client.CreatePageShieldPolicy(context.Background(), ZoneIdentifier(testZoneID), newPolicy) assert.NoError(t, err) assert.Equal(t, "newPolicyID", result.ID) } @@ -91,11 +91,11 @@ func TestDeletePageShieldPolicy(t *testing.T) { defer teardown() policyID := "c9ef84a6bf5e47138c75d95e2f933e8f" - mux.HandleFunc(fmt.Sprintf("/zones/testzone/page_shield/policies/%s", policyID), func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc(fmt.Sprintf("/zones/"+testZoneID+"/page_shield/policies/%s", policyID), func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodDelete, r.Method, "Expected method 'DELETE', got %s", r.Method) w.WriteHeader(http.StatusOK) // Assuming successful deletion returns 200 OK }) - err := client.DeletePageShieldPolicy(context.Background(), &ResourceContainer{Identifier: "testzone"}, policyID) + err := client.DeletePageShieldPolicy(context.Background(), ZoneIdentifier(testZoneID), policyID) assert.NoError(t, err) } @@ -104,7 +104,7 @@ func TestGetPageShieldPolicy(t *testing.T) { defer teardown() policyID := "c9ef84a6bf5e47138c75d95e2f933e8f" - mux.HandleFunc(fmt.Sprintf("/zones/testzone/page_shield/policies/%s", policyID), func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc(fmt.Sprintf("/zones/"+testZoneID+"/page_shield/policies/%s", policyID), func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) w.Header().Set("content-type", "application/json") err := json.NewEncoder(w).Encode(mockPageShieldPolicies[0]) // Assuming the first mock policy @@ -112,7 +112,7 @@ func TestGetPageShieldPolicy(t *testing.T) { t.Fatal(err) } }) - result, err := client.GetPageShieldPolicy(context.Background(), &ResourceContainer{Identifier: "testzone"}, policyID) + result, err := client.GetPageShieldPolicy(context.Background(), ZoneIdentifier(testZoneID), policyID) assert.NoError(t, err) assert.Equal(t, &mockPageShieldPolicies[0], result) } @@ -122,7 +122,7 @@ func TestUpdatePageShieldPolicy(t *testing.T) { defer teardown() policyID := "c9ef84a6bf5e47138c75d95e2f933e8f" - mux.HandleFunc(fmt.Sprintf("/zones/testzone/page_shield/policies/%s", policyID), func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc(fmt.Sprintf("/zones/"+testZoneID+"/page_shield/policies/%s", policyID), func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodPut, r.Method, "Expected method 'PUT', got %s", r.Method) w.Header().Set("content-type", "application/json") @@ -136,14 +136,15 @@ func TestUpdatePageShieldPolicy(t *testing.T) { } }) - updatedPolicy := PageShieldPolicy{ + updatedPolicy := UpdatePageShieldPolicyParams{ + ID: policyID, Action: "block", Description: "Updated policy", Enabled: BoolPtr(false), Expression: "ends_with(http.request.uri.path, \"/updated\")", Value: "script-src 'self';", } - result, err := client.UpdatePageShieldPolicy(context.Background(), &ResourceContainer{Identifier: "testzone"}, policyID, updatedPolicy) + result, err := client.UpdatePageShieldPolicy(context.Background(), ZoneIdentifier(testZoneID), updatedPolicy) assert.NoError(t, err) assert.Equal(t, policyID, result.ID) assert.Equal(t, "Updated policy", result.Description) diff --git a/page_shield_scripts.go b/page_shield_scripts.go index 6e1cad2e6df..09559b59f91 100644 --- a/page_shield_scripts.go +++ b/page_shield_scripts.go @@ -18,14 +18,14 @@ type PageShieldScript struct { Hash string `json:"hash"` Host string `json:"host"` ID string `json:"id"` - JsIntegrityScore int `json:"js_integrity_score"` + JSIntegrityScore int `json:"js_integrity_score"` LastSeenAt string `json:"last_seen_at"` PageURLs []string `json:"page_urls"` URL string `json:"url"` URLContainsCdnCgiPath *bool `json:"url_contains_cdn_cgi_path,omitempty"` } -// ListPageShieldScriptsParams represents a PageShield Script request parameters +// ListPageShieldScriptsParams represents a PageShield Script request parameters. // // API reference: https://developers.cloudflare.com/api/operations/page-shield-list-page-shield-scripts#Query-Parameters type ListPageShieldScriptsParams struct { @@ -44,14 +44,14 @@ type ListPageShieldScriptsParams struct { URLs string `url:"urls"` } -// PageShieldScriptsResponse represents the response from the PageShield Script API +// PageShieldScriptsResponse represents the response from the PageShield Script API. type PageShieldScriptsResponse struct { Results []PageShieldScript `json:"result"` Response ResultInfo `json:"result_info"` } -// PageShieldScriptResponse represents the response from the PageShield Script API +// PageShieldScriptResponse represents the response from the PageShield Script API. type PageShieldScriptResponse struct { Result PageShieldScript `json:"result"` Versions []PageShieldScriptVersion `json:"versions"` @@ -61,7 +61,7 @@ type PageShieldScriptResponse struct { type PageShieldScriptVersion struct { FetchedAt string `json:"fetched_at"` Hash string `json:"hash"` - JsIntegrityScore int `json:"js_integrity_score"` + JSIntegrityScore int `json:"js_integrity_score"` } // ListPageShieldScripts returns a list of PageShield Scripts. diff --git a/page_shield_scripts_test.go b/page_shield_scripts_test.go index c8bc74f8f0c..d6d430dcdce 100644 --- a/page_shield_scripts_test.go +++ b/page_shield_scripts_test.go @@ -20,7 +20,7 @@ var mockPageShieldScripts = []PageShieldScript{ Hash: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", Host: "blog.cloudflare.com", ID: "c9ef84a6bf5e47138c75d95e2f933e8f", - JsIntegrityScore: 10, + JSIntegrityScore: 10, LastSeenAt: "2021-09-02T09:57:54Z", PageURLs: []string{"blog.cloudflare.com/page1", "blog.cloudflare.com/page2"}, URL: "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js", @@ -32,7 +32,7 @@ var mockVersions = []PageShieldScriptVersion{ { FetchedAt: "2021-09-02T10:17:54Z", Hash: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - JsIntegrityScore: 10, + JSIntegrityScore: 10, }, } @@ -40,7 +40,7 @@ func TestListPageShieldScripts(t *testing.T) { setup() defer teardown() - mux.HandleFunc("/zones/testzone/page_shield/scripts", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/zones/"+testZoneID+"/page_shield/scripts", func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) w.Header().Set("content-type", "application/json") response := PageShieldScriptsResponse{Results: mockPageShieldScripts} @@ -49,7 +49,7 @@ func TestListPageShieldScripts(t *testing.T) { t.Fatal(err) } }) - result, _, err := client.ListPageShieldScripts(context.Background(), &ResourceContainer{Identifier: "testzone"}, ListPageShieldScriptsParams{}) + result, _, err := client.ListPageShieldScripts(context.Background(), ZoneIdentifier(testZoneID), ListPageShieldScriptsParams{}) assert.NoError(t, err) assert.Equal(t, mockPageShieldScripts, result) } @@ -59,7 +59,7 @@ func TestGetPageShieldScript(t *testing.T) { defer teardown() scriptID := "c9ef84a6bf5e47138c75d95e2f933e8f" - mux.HandleFunc(fmt.Sprintf("/zones/testzone/page_shield/scripts/%s", scriptID), func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc(fmt.Sprintf("/zones/"+testZoneID+"/page_shield/scripts/%s", scriptID), func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) w.Header().Set("content-type", "application/json") response := PageShieldScriptResponse{ @@ -71,7 +71,7 @@ func TestGetPageShieldScript(t *testing.T) { t.Fatal(err) } }) - result, versions, err := client.GetPageShieldScript(context.Background(), &ResourceContainer{Identifier: "testzone"}, scriptID) + result, versions, err := client.GetPageShieldScript(context.Background(), ZoneIdentifier(testZoneID), scriptID) assert.NoError(t, err) assert.Equal(t, &mockPageShieldScripts[0], result) assert.Equal(t, mockVersions, versions) diff --git a/page_shield_test.go b/page_shield_test.go index 3da9af35ba0..8247be46e83 100644 --- a/page_shield_test.go +++ b/page_shield_test.go @@ -23,7 +23,7 @@ func TestGetPageShieldSettings(t *testing.T) { setup() defer teardown() - mux.HandleFunc("/zones/testzone/page_shield", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/zones/"+testZoneID+"/page_shield", func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method) w.Header().Set("content-type", "application/json") response := PageShieldSettingsResponse{ @@ -34,7 +34,8 @@ func TestGetPageShieldSettings(t *testing.T) { t.Fatal(err) } }) - result, err := client.GetPageShieldSettings(context.Background(), &ResourceContainer{Identifier: "testzone"}) + + result, err := client.GetPageShieldSettings(context.Background(), ZoneIdentifier(testZoneID), GetPageShieldSettingsParams{}) assert.NoError(t, err) assert.Equal(t, &PageShieldSettingsResponse{PageShield: mockPageShieldSettings}, result) } @@ -43,7 +44,7 @@ func TestUpdatePageShieldSettings(t *testing.T) { setup() defer teardown() - mux.HandleFunc("/zones/testzone/page_shield", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/zones/"+testZoneID+"/page_shield", func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodPut, r.Method, "Expected method 'PUT', got %s", r.Method) w.Header().Set("content-type", "application/json") @@ -63,12 +64,12 @@ func TestUpdatePageShieldSettings(t *testing.T) { } }) - newSettings := PageShield{ + newSettings := UpdatePageShieldSettingsParams{ Enabled: BoolPtr(false), UseCloudflareReportingEndpoint: BoolPtr(false), UseConnectionURLPath: BoolPtr(false), } - result, err := client.UpdatePageShieldSettings(context.Background(), &ResourceContainer{Identifier: "testzone"}, newSettings) + result, err := client.UpdatePageShieldSettings(context.Background(), ZoneIdentifier(testZoneID), newSettings) assert.NoError(t, err) assert.Equal(t, false, *result.PageShield.Enabled) assert.Equal(t, false, *result.PageShield.UseCloudflareReportingEndpoint) From 71a7e82caaad5bb8f9a54ea09c9ac1af548889ee Mon Sep 17 00:00:00 2001 From: Jacob Bednarz Date: Thu, 7 Dec 2023 13:42:17 +1100 Subject: [PATCH 9/9] gotdot lint fixes --- page_shield_connections_test.go | 2 +- page_shield_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/page_shield_connections_test.go b/page_shield_connections_test.go index e1433572260..42e78cc6310 100644 --- a/page_shield_connections_test.go +++ b/page_shield_connections_test.go @@ -10,7 +10,7 @@ import ( "github.com/stretchr/testify/assert" ) -// Mock data for PageShieldConnections +// Mock data for PageShieldConnections. var mockPageShieldConnections = []PageShieldConnection{ { AddedAt: "2021-08-18T10:51:10.09615Z", diff --git a/page_shield_test.go b/page_shield_test.go index 8247be46e83..a41e51e221b 100644 --- a/page_shield_test.go +++ b/page_shield_test.go @@ -9,7 +9,7 @@ import ( "github.com/stretchr/testify/assert" ) -// Mock PageShieldSettings data +// Mock PageShieldSettings data. var mockPageShieldSettings = PageShieldSettings{ PageShield: PageShield{ Enabled: BoolPtr(true),