From bc3024299868c7f9d46abd68e7480c57946c516a Mon Sep 17 00:00:00 2001 From: Francisc Balint <7178547+franciscbalint@users.noreply.github.com> Date: Thu, 20 Aug 2026 00:41:24 +0400 Subject: [PATCH] Redact VCR API keys and harden HTTP, URLs, and CI. Replace captured api_key values in cassettes, filter future recordings, require https URLs, set RestClient timeouts, and pin the RubyGems credentials Action. --- .github/workflows/publish.yml | 2 +- README.md | 7 ++++++ lib/zerobounce/base_request.rb | 22 +++++++++++++++---- spec/base_request_spec.rb | 12 ++++++++++ spec/cassettes/activity-valid-result.yml | 2 +- spec/cassettes/api-usage-valid.yml | 2 +- spec/cassettes/batch-validate-valid.yml | 2 +- spec/cassettes/credits-valid.yml | 2 +- spec/cassettes/file-validate-check-valid.yml | 2 +- ...file-validate-delete-incorrect-file-id.yml | 2 +- spec/cassettes/file-validate-delete-valid.yml | 2 +- .../file-validate-get-incorrect-file-id.yml | 2 +- spec/cassettes/file-validate-get-valid.yml | 2 +- .../file-validate-incorrect-file-id.yml | 2 +- spec/cassettes/file-validate-send-valid.yml | 2 +- spec/cassettes/find-domain-valid-company.yml | 2 +- spec/cassettes/find-domain-valid-domain.yml | 2 +- .../find-email-valid-company-all-names.yml | 2 +- ...nd-email-valid-company-first-last-name.yml | 2 +- .../find-email-valid-company-first-name.yml | 2 +- .../find-email-valid-domain-all-names.yml | 2 +- ...ind-email-valid-domain-first-last-name.yml | 2 +- .../find-email-valid-domain-first-name.yml | 2 +- .../guessformat-valid-domain-all-names.yml | 2 +- .../guessformat-valid-domain-first-name.yml | 2 +- .../guessformat-valid-domain-last-name.yml | 2 +- .../guessformat-valid-domain-no-names.yml | 2 +- .../scoring-check-incorrect-file-id.yml | 2 +- spec/cassettes/scoring-check-valid.yml | 2 +- .../scoring-delete-incorrect-file-id.yml | 2 +- spec/cassettes/scoring-delete-valid.yml | 2 +- .../scoring-get-incorrect-file-id.yml | 2 +- spec/cassettes/scoring-get-valid.yml | 2 +- spec/cassettes/scoring-send-valid.yml | 2 +- spec/cassettes/validate-ip-valid-result.yml | 2 +- spec/cassettes/validate-valid-result.yml | 2 +- spec/mock_spec.rb | 2 ++ 37 files changed, 72 insertions(+), 37 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0f57030..0d4b28e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -89,7 +89,7 @@ jobs: bundler-cache: true - name: Configure RubyGems credentials - uses: rubygems/configure-rubygems-credentials@main + uses: rubygems/configure-rubygems-credentials@v2.1.0 with: api-token: ${{ secrets.RUBYGEMS_API_TOKEN }} diff --git a/README.md b/README.md index 40b645e..3d0f939 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,13 @@ # Zerobounce Ruby client for Zerobounce.net API. Developed based on [this version](https://github.com/afrase/zerobounce) by Aaron Frase. + +## Security + +- Keep API keys on a trusted server. Do not embed them in mobile apps or browser JavaScript that untrusted users can inspect. +- Custom API base URLs (when supported) must use `https://`. Do not pass end-user-controlled hosts into those settings. +- Request URLs include `api_key` as a query parameter (ZeroBounce API contract). Do not log full request URLs or enable payload debug logging in production. + ## Usage Add this line to your application's Gemfile: ```ruby diff --git a/lib/zerobounce/base_request.rb b/lib/zerobounce/base_request.rb index 84f951b..7f37dcf 100644 --- a/lib/zerobounce/base_request.rb +++ b/lib/zerobounce/base_request.rb @@ -41,6 +41,13 @@ def self.__safe_file_path__(filepath) canonical end + def self.__require_https__(url) + unless url.to_s.downcase.start_with?('https://') + raise ArgumentError, 'API URL must be an https:// URL' + end + url + end + def self._get(root, path, params, content_type='application/json') # puts path @@ -50,8 +57,9 @@ def self._get(root, path, params, content_type='application/json') params[:api_key] = Zerobounce.config.apikey url = "#{Zerobounce::BaseRequest.__root_without_trailing_slashes__(root)}/#{path}" + Zerobounce::BaseRequest.__require_https__(url) - response = RestClient.get(url, {params: params}) + response = RestClient::Request.execute(method: :get, url: url, timeout: 120, headers: { params: params }) return response end @@ -61,16 +69,22 @@ def self._post(root, path, params, content_type='application/json', filepath=nil params[:api_key] = Zerobounce.config.apikey url = "#{Zerobounce::BaseRequest.__root_without_trailing_slashes__(root)}/#{path}" + Zerobounce::BaseRequest.__require_https__(url) response = nil if filepath or content_type == 'multipart/form-data' params[:file] = File.new(Zerobounce::BaseRequest.__safe_file_path__(filepath), 'rb') params[:multipart] = true - response = RestClient.post(url, params) + response = RestClient::Request.execute(method: :post, url: url, payload: params, timeout: 120) elsif content_type == 'application/json' - response = RestClient.post(url, params.to_json, \ - content_type: :json, accept: :json) + response = RestClient::Request.execute( + method: :post, + url: url, + payload: params.to_json, + timeout: 120, + headers: { content_type: :json, accept: :json } + ) else # this shouldn't happen raise Error.new('Unknown content type specified in request.'\ diff --git a/spec/base_request_spec.rb b/spec/base_request_spec.rb index 8f8ff5a..96d5d73 100644 --- a/spec/base_request_spec.rb +++ b/spec/base_request_spec.rb @@ -7,6 +7,18 @@ # Test protected helpers via send let(:strip_trailing_slashes) { described_class.method(:__root_without_trailing_slashes__) } let(:safe_file_path) { described_class.method(:__safe_file_path__) } + let(:require_https) { described_class.method(:__require_https__) } + + describe '.__require_https__' do + it 'allows https URLs' do + expect { require_https.call('https://api.zerobounce.net/v2') }.not_to raise_error + end + + it 'rejects http and other schemes' do + expect { require_https.call('http://example.com') }.to raise_error(ArgumentError, /https:\/\//) + expect { require_https.call('file:///etc/passwd') }.to raise_error(ArgumentError, /https:\/\//) + end + end describe '.__root_without_trailing_slashes__' do it 'returns the string unchanged when there is no trailing slash' do diff --git a/spec/cassettes/activity-valid-result.yml b/spec/cassettes/activity-valid-result.yml index 806a3a6..8cff780 100644 --- a/spec/cassettes/activity-valid-result.yml +++ b/spec/cassettes/activity-valid-result.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/activity?api_key=99e7ef20ceea4480a173b07b1be75371&email=valid@example.com + uri: https://api.zerobounce.net/v2/activity?api_key=REDACTED&email=valid@example.com body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/api-usage-valid.yml b/spec/cassettes/api-usage-valid.yml index 36188ad..c44a4ea 100644 --- a/spec/cassettes/api-usage-valid.yml +++ b/spec/cassettes/api-usage-valid.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/getapiusage?api_key=99e7ef20ceea4480a173b07b1be75371&end_date=2023-09-04&start_date=2023-09-04 + uri: https://api.zerobounce.net/v2/getapiusage?api_key=REDACTED&end_date=2023-09-04&start_date=2023-09-04 body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/batch-validate-valid.yml b/spec/cassettes/batch-validate-valid.yml index b1fefee..c9855a0 100644 --- a/spec/cassettes/batch-validate-valid.yml +++ b/spec/cassettes/batch-validate-valid.yml @@ -5,7 +5,7 @@ http_interactions: uri: https://api.zerobounce.net/v2/validatebatch body: encoding: UTF-8 - string: '{"email_batch":[{"email_address":"disposable@example.com","ip_address":null},{"email_address":"invalid@example.com","ip_address":null},{"email_address":"valid@example.com","ip_address":null},{"email_address":"toxic@example.com","ip_address":null},{"email_address":"donotmail@example.com","ip_address":null},{"email_address":"spamtrap@example.com","ip_address":null}],"api_key":"99e7ef20ceea4480a173b07b1be75371"}' + string: '{"email_batch":[{"email_address":"disposable@example.com","ip_address":null},{"email_address":"invalid@example.com","ip_address":null},{"email_address":"valid@example.com","ip_address":null},{"email_address":"toxic@example.com","ip_address":null},{"email_address":"donotmail@example.com","ip_address":null},{"email_address":"spamtrap@example.com","ip_address":null}],"api_key":"REDACTED"}' headers: Accept: - application/json diff --git a/spec/cassettes/credits-valid.yml b/spec/cassettes/credits-valid.yml index 137ee71..e9fe0fc 100644 --- a/spec/cassettes/credits-valid.yml +++ b/spec/cassettes/credits-valid.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/getcredits?api_key=99e7ef20ceea4480a173b07b1be75371 + uri: https://api.zerobounce.net/v2/getcredits?api_key=REDACTED body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/file-validate-check-valid.yml b/spec/cassettes/file-validate-check-valid.yml index 3ca4fb9..2479e42 100644 --- a/spec/cassettes/file-validate-check-valid.yml +++ b/spec/cassettes/file-validate-check-valid.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://bulkapi.zerobounce.net/v2/filestatus?api_key=99e7ef20ceea4480a173b07b1be75371&file_id=84946fc8-3f89-428a-9d0d-382fbe18cb24 + uri: https://bulkapi.zerobounce.net/v2/filestatus?api_key=REDACTED&file_id=84946fc8-3f89-428a-9d0d-382fbe18cb24 body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/file-validate-delete-incorrect-file-id.yml b/spec/cassettes/file-validate-delete-incorrect-file-id.yml index f9a67a2..2cf3c38 100644 --- a/spec/cassettes/file-validate-delete-incorrect-file-id.yml +++ b/spec/cassettes/file-validate-delete-incorrect-file-id.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://bulkapi.zerobounce.net/v2/deletefile?api_key=99e7ef20ceea4480a173b07b1be75371&file_id=invalid-file-id + uri: https://bulkapi.zerobounce.net/v2/deletefile?api_key=REDACTED&file_id=invalid-file-id body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/file-validate-delete-valid.yml b/spec/cassettes/file-validate-delete-valid.yml index 6e063eb..2b63435 100644 --- a/spec/cassettes/file-validate-delete-valid.yml +++ b/spec/cassettes/file-validate-delete-valid.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://bulkapi.zerobounce.net/v2/deletefile?api_key=99e7ef20ceea4480a173b07b1be75371&file_id=84946fc8-3f89-428a-9d0d-382fbe18cb24 + uri: https://bulkapi.zerobounce.net/v2/deletefile?api_key=REDACTED&file_id=84946fc8-3f89-428a-9d0d-382fbe18cb24 body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/file-validate-get-incorrect-file-id.yml b/spec/cassettes/file-validate-get-incorrect-file-id.yml index 9c7d85c..2579663 100644 --- a/spec/cassettes/file-validate-get-incorrect-file-id.yml +++ b/spec/cassettes/file-validate-get-incorrect-file-id.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://bulkapi.zerobounce.net/v2/getfile?api_key=99e7ef20ceea4480a173b07b1be75371&file_id=invalid-file-id + uri: https://bulkapi.zerobounce.net/v2/getfile?api_key=REDACTED&file_id=invalid-file-id body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/file-validate-get-valid.yml b/spec/cassettes/file-validate-get-valid.yml index 86eedef..7f87689 100644 --- a/spec/cassettes/file-validate-get-valid.yml +++ b/spec/cassettes/file-validate-get-valid.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://bulkapi.zerobounce.net/v2/getfile?api_key=99e7ef20ceea4480a173b07b1be75371&file_id=84946fc8-3f89-428a-9d0d-382fbe18cb24 + uri: https://bulkapi.zerobounce.net/v2/getfile?api_key=REDACTED&file_id=84946fc8-3f89-428a-9d0d-382fbe18cb24 body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/file-validate-incorrect-file-id.yml b/spec/cassettes/file-validate-incorrect-file-id.yml index d36cbc6..7ff35d4 100644 --- a/spec/cassettes/file-validate-incorrect-file-id.yml +++ b/spec/cassettes/file-validate-incorrect-file-id.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://bulkapi.zerobounce.net/v2/filestatus?api_key=99e7ef20ceea4480a173b07b1be75371&file_id=invalid-file-id + uri: https://bulkapi.zerobounce.net/v2/filestatus?api_key=REDACTED&file_id=invalid-file-id body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/file-validate-send-valid.yml b/spec/cassettes/file-validate-send-valid.yml index 26c961c..15a1f3a 100644 --- a/spec/cassettes/file-validate-send-valid.yml +++ b/spec/cassettes/file-validate-send-valid.yml @@ -11,7 +11,7 @@ http_interactions: form-data; name=\"first_name_column\"\r\n\r\n2\r\n------RubyFormBoundary6jszTNsq8UxVbIjM\r\nContent-Disposition: form-data; name=\"last_name_column\"\r\n\r\n3\r\n------RubyFormBoundary6jszTNsq8UxVbIjM\r\nContent-Disposition: form-data; name=\"gender_column\"\r\n\r\n4\r\n------RubyFormBoundary6jszTNsq8UxVbIjM\r\nContent-Disposition: - form-data; name=\"api_key\"\r\n\r\n99e7ef20ceea4480a173b07b1be75371\r\n------RubyFormBoundary6jszTNsq8UxVbIjM\r\nContent-Disposition: + form-data; name=\"api_key\"\r\n\r\nREDACTED\r\n------RubyFormBoundary6jszTNsq8UxVbIjM\r\nContent-Disposition: form-data; name=\"file\"; filename=\"validation.csv\"\r\nContent-Type: text/csv\r\n\r\nemail,first,last,gender,ip\r\ndisposable@example.com,First,Last,male,127.0.0.1\r\ninvalid@example.com,First,Last,male,127.0.0.1\r\nvalid@example.com,First,Last,male,127.0.0.1\r\ntoxic@example.com,First,Last,male,127.0.0.1\r\ndonotmail@example.com,First,Last,male,127.0.0.1\r\nspamtrap@example.com,First,Last,male,127.0.0.1\r\nabuse@example.com,First,Last,male,127.0.0.1\r\nunknown@example.com,First,Last,male,127.0.0.1\r\ncatch_all@example.com,First,Last,male,127.0.0.1\r\nantispam_system@example.com,First,Last,male,127.0.0.1\r\ndoes_not_accept_mail@example.com,First,Last,male,127.0.0.1\r\nexception_occurred@example.com,First,Last,male,127.0.0.1\r\nfailed_smtp_connection@example.com,First,Last,male,127.0.0.1\r\nfailed_syntax_check@example.com,First,Last,male,127.0.0.1\r\nforcible_disconnect@example.com,First,Last,male,127.0.0.1\r\nglobal_suppression@example.com,First,Last,male,127.0.0.1\r\ngreylisted@example.com,First,Last,male,127.0.0.1\r\nleading_period_removed@example.com,First,Last,male,127.0.0.1\r\nmail_server_did_not_respond@example.com,First,Last,male,127.0.0.1\r\nmail_server_temporary_error@example.com,First,Last,male,127.0.0.1\r\nmailbox_quota_exceeded@example.com,First,Last,male,127.0.0.1\r\nmailbox_not_found@example.com,First,Last,male,127.0.0.1\r\nno_dns_entries@example.com,First,Last,male,127.0.0.1\r\npossible_trap@example.com,First,Last,male,127.0.0.1\r\npossible_typo@example.com,First,Last,male,127.0.0.1\r\nrole_based@example.com,First,Last,male,127.0.0.1\r\ntimeout_exceeded@example.com,First,Last,male,127.0.0.1\r\nunroutable_ip_address@example.com,First,Last,male,127.0.0.1\r\nfree_email@example.com,First,Last,male,127.0.0.1\r\nrole_based_catch_all@example.com,First,Last,male,127.0.0.1\r\n------RubyFormBoundary6jszTNsq8UxVbIjM--\r\n" headers: Accept: diff --git a/spec/cassettes/find-domain-valid-company.yml b/spec/cassettes/find-domain-valid-company.yml index c2e23aa..9c49284 100644 --- a/spec/cassettes/find-domain-valid-company.yml +++ b/spec/cassettes/find-domain-valid-company.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/guessformat?api_key=99e7ef20ceea4480a173b07b1be75371&company_name=Zero%20Bounce + uri: https://api.zerobounce.net/v2/guessformat?api_key=REDACTED&company_name=Zero%20Bounce body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/find-domain-valid-domain.yml b/spec/cassettes/find-domain-valid-domain.yml index cc4e023..6afa191 100644 --- a/spec/cassettes/find-domain-valid-domain.yml +++ b/spec/cassettes/find-domain-valid-domain.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/guessformat?api_key=99e7ef20ceea4480a173b07b1be75371&domain=zerobounce.net + uri: https://api.zerobounce.net/v2/guessformat?api_key=REDACTED&domain=zerobounce.net body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/find-email-valid-company-all-names.yml b/spec/cassettes/find-email-valid-company-all-names.yml index b843d37..9ebc926 100644 --- a/spec/cassettes/find-email-valid-company-all-names.yml +++ b/spec/cassettes/find-email-valid-company-all-names.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/guessformat?api_key=99e7ef20ceea4480a173b07b1be75371&company_name=Zero%20Bounce&first_name=John&last_name=Doe&middle_name=Deere + uri: https://api.zerobounce.net/v2/guessformat?api_key=REDACTED&company_name=Zero%20Bounce&first_name=John&last_name=Doe&middle_name=Deere body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/find-email-valid-company-first-last-name.yml b/spec/cassettes/find-email-valid-company-first-last-name.yml index eaac74f..af2275a 100644 --- a/spec/cassettes/find-email-valid-company-first-last-name.yml +++ b/spec/cassettes/find-email-valid-company-first-last-name.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/guessformat?api_key=99e7ef20ceea4480a173b07b1be75371&company_name=Zero%20Bounce&first_name=John&last_name=Doe + uri: https://api.zerobounce.net/v2/guessformat?api_key=REDACTED&company_name=Zero%20Bounce&first_name=John&last_name=Doe body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/find-email-valid-company-first-name.yml b/spec/cassettes/find-email-valid-company-first-name.yml index 39a5571..51a0d07 100644 --- a/spec/cassettes/find-email-valid-company-first-name.yml +++ b/spec/cassettes/find-email-valid-company-first-name.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/guessformat?api_key=99e7ef20ceea4480a173b07b1be75371&company_name=Zero%20Bounce&first_name=John + uri: https://api.zerobounce.net/v2/guessformat?api_key=REDACTED&company_name=Zero%20Bounce&first_name=John body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/find-email-valid-domain-all-names.yml b/spec/cassettes/find-email-valid-domain-all-names.yml index a057e44..516da3b 100644 --- a/spec/cassettes/find-email-valid-domain-all-names.yml +++ b/spec/cassettes/find-email-valid-domain-all-names.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/guessformat?api_key=99e7ef20ceea4480a173b07b1be75371&domain=zerobounce.net&first_name=John&last_name=Doe&middle_name=Deere + uri: https://api.zerobounce.net/v2/guessformat?api_key=REDACTED&domain=zerobounce.net&first_name=John&last_name=Doe&middle_name=Deere body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/find-email-valid-domain-first-last-name.yml b/spec/cassettes/find-email-valid-domain-first-last-name.yml index 6d91758..8c18cbe 100644 --- a/spec/cassettes/find-email-valid-domain-first-last-name.yml +++ b/spec/cassettes/find-email-valid-domain-first-last-name.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/guessformat?api_key=99e7ef20ceea4480a173b07b1be75371&domain=zerobounce.net&first_name=John&last_name=Doe + uri: https://api.zerobounce.net/v2/guessformat?api_key=REDACTED&domain=zerobounce.net&first_name=John&last_name=Doe body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/find-email-valid-domain-first-name.yml b/spec/cassettes/find-email-valid-domain-first-name.yml index 787397e..a2cac5e 100644 --- a/spec/cassettes/find-email-valid-domain-first-name.yml +++ b/spec/cassettes/find-email-valid-domain-first-name.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/guessformat?api_key=99e7ef20ceea4480a173b07b1be75371&domain=zerobounce.net&first_name=John + uri: https://api.zerobounce.net/v2/guessformat?api_key=REDACTED&domain=zerobounce.net&first_name=John body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/guessformat-valid-domain-all-names.yml b/spec/cassettes/guessformat-valid-domain-all-names.yml index 94bc1c2..e4b35a6 100644 --- a/spec/cassettes/guessformat-valid-domain-all-names.yml +++ b/spec/cassettes/guessformat-valid-domain-all-names.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/guessformat?api_key=99e7ef20ceea4480a173b07b1be75371&domain=zerobounce.net&first_name=John&last_name=Doe&middle_name=Deere + uri: https://api.zerobounce.net/v2/guessformat?api_key=REDACTED&domain=zerobounce.net&first_name=John&last_name=Doe&middle_name=Deere body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/guessformat-valid-domain-first-name.yml b/spec/cassettes/guessformat-valid-domain-first-name.yml index 878e084..3dc8099 100644 --- a/spec/cassettes/guessformat-valid-domain-first-name.yml +++ b/spec/cassettes/guessformat-valid-domain-first-name.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/guessformat?api_key=99e7ef20ceea4480a173b07b1be75371&domain=zerobounce.net&first_name=John + uri: https://api.zerobounce.net/v2/guessformat?api_key=REDACTED&domain=zerobounce.net&first_name=John body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/guessformat-valid-domain-last-name.yml b/spec/cassettes/guessformat-valid-domain-last-name.yml index ec2af8b..9769641 100644 --- a/spec/cassettes/guessformat-valid-domain-last-name.yml +++ b/spec/cassettes/guessformat-valid-domain-last-name.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/guessformat?api_key=99e7ef20ceea4480a173b07b1be75371&domain=zerobounce.net&last_name=Doe + uri: https://api.zerobounce.net/v2/guessformat?api_key=REDACTED&domain=zerobounce.net&last_name=Doe body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/guessformat-valid-domain-no-names.yml b/spec/cassettes/guessformat-valid-domain-no-names.yml index 4dc2ebd..4e528fd 100644 --- a/spec/cassettes/guessformat-valid-domain-no-names.yml +++ b/spec/cassettes/guessformat-valid-domain-no-names.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/guessformat?api_key=99e7ef20ceea4480a173b07b1be75371&domain=zerobounce.net + uri: https://api.zerobounce.net/v2/guessformat?api_key=REDACTED&domain=zerobounce.net body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/scoring-check-incorrect-file-id.yml b/spec/cassettes/scoring-check-incorrect-file-id.yml index 7a7f4a9..3cd5feb 100644 --- a/spec/cassettes/scoring-check-incorrect-file-id.yml +++ b/spec/cassettes/scoring-check-incorrect-file-id.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://bulkapi.zerobounce.net/v2/scoring/filestatus?api_key=99e7ef20ceea4480a173b07b1be75371&file_id=invalid-file-id + uri: https://bulkapi.zerobounce.net/v2/scoring/filestatus?api_key=REDACTED&file_id=invalid-file-id body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/scoring-check-valid.yml b/spec/cassettes/scoring-check-valid.yml index cfe9dc6..d04bd26 100644 --- a/spec/cassettes/scoring-check-valid.yml +++ b/spec/cassettes/scoring-check-valid.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://bulkapi.zerobounce.net/v2/scoring/filestatus?api_key=99e7ef20ceea4480a173b07b1be75371&file_id=1683108a-7951-4990-9463-fb653cb8394f + uri: https://bulkapi.zerobounce.net/v2/scoring/filestatus?api_key=REDACTED&file_id=1683108a-7951-4990-9463-fb653cb8394f body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/scoring-delete-incorrect-file-id.yml b/spec/cassettes/scoring-delete-incorrect-file-id.yml index 545dff3..a250da8 100644 --- a/spec/cassettes/scoring-delete-incorrect-file-id.yml +++ b/spec/cassettes/scoring-delete-incorrect-file-id.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://bulkapi.zerobounce.net/v2/scoring/deletefile?api_key=99e7ef20ceea4480a173b07b1be75371&file_id=invalid-file-id + uri: https://bulkapi.zerobounce.net/v2/scoring/deletefile?api_key=REDACTED&file_id=invalid-file-id body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/scoring-delete-valid.yml b/spec/cassettes/scoring-delete-valid.yml index 52966a3..fa41485 100644 --- a/spec/cassettes/scoring-delete-valid.yml +++ b/spec/cassettes/scoring-delete-valid.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://bulkapi.zerobounce.net/v2/scoring/deletefile?api_key=99e7ef20ceea4480a173b07b1be75371&file_id=1683108a-7951-4990-9463-fb653cb8394f + uri: https://bulkapi.zerobounce.net/v2/scoring/deletefile?api_key=REDACTED&file_id=1683108a-7951-4990-9463-fb653cb8394f body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/scoring-get-incorrect-file-id.yml b/spec/cassettes/scoring-get-incorrect-file-id.yml index 980c6f3..34b6c95 100644 --- a/spec/cassettes/scoring-get-incorrect-file-id.yml +++ b/spec/cassettes/scoring-get-incorrect-file-id.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://bulkapi.zerobounce.net/v2/scoring/getfile?api_key=99e7ef20ceea4480a173b07b1be75371&file_id=invalid-file-id + uri: https://bulkapi.zerobounce.net/v2/scoring/getfile?api_key=REDACTED&file_id=invalid-file-id body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/scoring-get-valid.yml b/spec/cassettes/scoring-get-valid.yml index 6a520bf..1b56036 100644 --- a/spec/cassettes/scoring-get-valid.yml +++ b/spec/cassettes/scoring-get-valid.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://bulkapi.zerobounce.net/v2/scoring/getfile?api_key=99e7ef20ceea4480a173b07b1be75371&file_id=1683108a-7951-4990-9463-fb653cb8394f + uri: https://bulkapi.zerobounce.net/v2/scoring/getfile?api_key=REDACTED&file_id=1683108a-7951-4990-9463-fb653cb8394f body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/scoring-send-valid.yml b/spec/cassettes/scoring-send-valid.yml index 85ed5a4..e7e3a56 100644 --- a/spec/cassettes/scoring-send-valid.yml +++ b/spec/cassettes/scoring-send-valid.yml @@ -8,7 +8,7 @@ http_interactions: string: "------RubyFormBoundary1HTDnvzcDRpRzA0D\r\nContent-Disposition: form-data; name=\"email_address_column\"\r\n\r\n1\r\n------RubyFormBoundary1HTDnvzcDRpRzA0D\r\nContent-Disposition: form-data; name=\"has_header_row\"\r\n\r\ntrue\r\n------RubyFormBoundary1HTDnvzcDRpRzA0D\r\nContent-Disposition: - form-data; name=\"api_key\"\r\n\r\n99e7ef20ceea4480a173b07b1be75371\r\n------RubyFormBoundary1HTDnvzcDRpRzA0D\r\nContent-Disposition: + form-data; name=\"api_key\"\r\n\r\nREDACTED\r\n------RubyFormBoundary1HTDnvzcDRpRzA0D\r\nContent-Disposition: form-data; name=\"file\"; filename=\"scoring.csv\"\r\nContent-Type: text/csv\r\n\r\nemail\r\ndisposable@example.com\r\ninvalid@example.com\r\nvalid@example.com\r\ntoxic@example.com\r\ndonotmail@example.com\r\nspamtrap@example.com\r\nabuse@example.com\r\nunknown@example.com\r\ncatch_all@example.com\r\nantispam_system@example.com\r\ndoes_not_accept_mail@example.com\r\nexception_occurred@example.com\r\nfailed_smtp_connection@example.com\r\nfailed_syntax_check@example.com\r\nforcible_disconnect@example.com\r\nglobal_suppression@example.com\r\ngreylisted@example.com\r\nleading_period_removed@example.com\r\nmail_server_did_not_respond@example.com\r\nmail_server_temporary_error@example.com\r\nmailbox_quota_exceeded@example.com\r\nmailbox_not_found@example.com\r\nno_dns_entries@example.com\r\npossible_trap@example.com\r\npossible_typo@example.com\r\nrole_based@example.com\r\ntimeout_exceeded@example.com\r\nunroutable_ip_address@example.com\r\nfree_email@example.com\r\nrole_based_catch_all@example.com\r\n------RubyFormBoundary1HTDnvzcDRpRzA0D--\r\n" headers: Accept: diff --git a/spec/cassettes/validate-ip-valid-result.yml b/spec/cassettes/validate-ip-valid-result.yml index 0135222..b834b0e 100644 --- a/spec/cassettes/validate-ip-valid-result.yml +++ b/spec/cassettes/validate-ip-valid-result.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/validate?api_key=99e7ef20ceea4480a173b07b1be75371&email=valid@example.com&ip_address=127.0.0.1 + uri: https://api.zerobounce.net/v2/validate?api_key=REDACTED&email=valid@example.com&ip_address=127.0.0.1 body: encoding: US-ASCII string: '' diff --git a/spec/cassettes/validate-valid-result.yml b/spec/cassettes/validate-valid-result.yml index 5775477..47c700f 100644 --- a/spec/cassettes/validate-valid-result.yml +++ b/spec/cassettes/validate-valid-result.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://api.zerobounce.net/v2/validate?api_key=99e7ef20ceea4480a173b07b1be75371&email=valid@example.com&ip_address + uri: https://api.zerobounce.net/v2/validate?api_key=REDACTED&email=valid@example.com&ip_address body: encoding: US-ASCII string: '' diff --git a/spec/mock_spec.rb b/spec/mock_spec.rb index a7eb2e4..dc06683 100644 --- a/spec/mock_spec.rb +++ b/spec/mock_spec.rb @@ -8,6 +8,8 @@ c.cassette_library_dir = 'spec/cassettes' c.hook_into :webmock c.ignore_localhost = true + c.filter_sensitive_data('') { ENV['ZEROBOUNCE_API_KEY'] } + c.filter_sensitive_data('') { 'REDACTED' } # Match requests by method and URI but ignore api_key so cassettes work with any key c.register_request_matcher :uri_ignoring_api_key do |request1, request2| return false if request1.method != request2.method