user_agent.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package cloudflare
  2. import (
  3. "encoding/json"
  4. "net/url"
  5. "strconv"
  6. "github.com/pkg/errors"
  7. )
  8. // UserAgentRule represents a User-Agent Block. These rules can be used to
  9. // challenge, block or whitelist specific User-Agents for a given zone.
  10. type UserAgentRule struct {
  11. ID string `json:"id"`
  12. Description string `json:"description"`
  13. Mode string `json:"mode"`
  14. Configuration UserAgentRuleConfig `json:"configuration"`
  15. Paused bool `json:"paused"`
  16. }
  17. // UserAgentRuleConfig represents a Zone Lockdown config, which comprises
  18. // a Target ("ip" or "ip_range") and a Value (an IP address or IP+mask,
  19. // respectively.)
  20. type UserAgentRuleConfig ZoneLockdownConfig
  21. // UserAgentRuleResponse represents a response from the Zone Lockdown endpoint.
  22. type UserAgentRuleResponse struct {
  23. Result UserAgentRule `json:"result"`
  24. Response
  25. ResultInfo `json:"result_info"`
  26. }
  27. // UserAgentRuleListResponse represents a response from the List Zone Lockdown endpoint.
  28. type UserAgentRuleListResponse struct {
  29. Result []UserAgentRule `json:"result"`
  30. Response
  31. ResultInfo `json:"result_info"`
  32. }
  33. // CreateUserAgentRule creates a User-Agent Block rule for the given zone ID.
  34. //
  35. // API reference: https://api.cloudflare.com/#user-agent-blocking-rules-create-a-useragent-rule
  36. func (api *API) CreateUserAgentRule(zoneID string, ld UserAgentRule) (*UserAgentRuleResponse, error) {
  37. switch ld.Mode {
  38. case "block", "challenge", "js_challenge", "whitelist":
  39. break
  40. default:
  41. return nil, errors.New(`the User-Agent Block rule mode must be one of "block", "challenge", "js_challenge", "whitelist"`)
  42. }
  43. uri := "/zones/" + zoneID + "/firewall/ua_rules"
  44. res, err := api.makeRequest("POST", uri, ld)
  45. if err != nil {
  46. return nil, errors.Wrap(err, errMakeRequestError)
  47. }
  48. response := &UserAgentRuleResponse{}
  49. err = json.Unmarshal(res, &response)
  50. if err != nil {
  51. return nil, errors.Wrap(err, errUnmarshalError)
  52. }
  53. return response, nil
  54. }
  55. // UpdateUserAgentRule updates a User-Agent Block rule (based on the ID) for the given zone ID.
  56. //
  57. // API reference: https://api.cloudflare.com/#user-agent-blocking-rules-update-useragent-rule
  58. func (api *API) UpdateUserAgentRule(zoneID string, id string, ld UserAgentRule) (*UserAgentRuleResponse, error) {
  59. uri := "/zones/" + zoneID + "/firewall/ua_rules/" + id
  60. res, err := api.makeRequest("PUT", uri, ld)
  61. if err != nil {
  62. return nil, errors.Wrap(err, errMakeRequestError)
  63. }
  64. response := &UserAgentRuleResponse{}
  65. err = json.Unmarshal(res, &response)
  66. if err != nil {
  67. return nil, errors.Wrap(err, errUnmarshalError)
  68. }
  69. return response, nil
  70. }
  71. // DeleteUserAgentRule deletes a User-Agent Block rule (based on the ID) for the given zone ID.
  72. //
  73. // API reference: https://api.cloudflare.com/#user-agent-blocking-rules-delete-useragent-rule
  74. func (api *API) DeleteUserAgentRule(zoneID string, id string) (*UserAgentRuleResponse, error) {
  75. uri := "/zones/" + zoneID + "/firewall/ua_rules/" + id
  76. res, err := api.makeRequest("DELETE", uri, nil)
  77. if err != nil {
  78. return nil, errors.Wrap(err, errMakeRequestError)
  79. }
  80. response := &UserAgentRuleResponse{}
  81. err = json.Unmarshal(res, &response)
  82. if err != nil {
  83. return nil, errors.Wrap(err, errUnmarshalError)
  84. }
  85. return response, nil
  86. }
  87. // UserAgentRule retrieves a User-Agent Block rule (based on the ID) for the given zone ID.
  88. //
  89. // API reference: https://api.cloudflare.com/#user-agent-blocking-rules-useragent-rule-details
  90. func (api *API) UserAgentRule(zoneID string, id string) (*UserAgentRuleResponse, error) {
  91. uri := "/zones/" + zoneID + "/firewall/ua_rules/" + id
  92. res, err := api.makeRequest("GET", uri, nil)
  93. if err != nil {
  94. return nil, errors.Wrap(err, errMakeRequestError)
  95. }
  96. response := &UserAgentRuleResponse{}
  97. err = json.Unmarshal(res, &response)
  98. if err != nil {
  99. return nil, errors.Wrap(err, errUnmarshalError)
  100. }
  101. return response, nil
  102. }
  103. // ListUserAgentRules retrieves a list of User-Agent Block rules for a given zone ID by page number.
  104. //
  105. // API reference: https://api.cloudflare.com/#user-agent-blocking-rules-list-useragent-rules
  106. func (api *API) ListUserAgentRules(zoneID string, page int) (*UserAgentRuleListResponse, error) {
  107. v := url.Values{}
  108. if page <= 0 {
  109. page = 1
  110. }
  111. v.Set("page", strconv.Itoa(page))
  112. v.Set("per_page", strconv.Itoa(100))
  113. query := "?" + v.Encode()
  114. uri := "/zones/" + zoneID + "/firewall/ua_rules" + query
  115. res, err := api.makeRequest("GET", uri, nil)
  116. if err != nil {
  117. return nil, errors.Wrap(err, errMakeRequestError)
  118. }
  119. response := &UserAgentRuleListResponse{}
  120. err = json.Unmarshal(res, &response)
  121. if err != nil {
  122. return nil, errors.Wrap(err, errUnmarshalError)
  123. }
  124. return response, nil
  125. }