pwned 2.1.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4661790082f543ba897baf211da660c7a4f654444121f4ff3ba08542c08c412b
4
- data.tar.gz: f52a3f3cf36d461e8704a632f97829a5d9f871d9916a55687d4a0b2156b44b75
3
+ metadata.gz: f655789ebeb4d8fc8cdd1a105960358b8995ecb2d65d50542c124dd025add187
4
+ data.tar.gz: 32b7024253941258a9d93e3fd556c25d7dc5f1d91b55c414d547bce7cd81f042
5
5
  SHA512:
6
- metadata.gz: c114c3ca6e7667d1760ad2ae5dabcc7bf8d14b91e42788f7e36bba716eecd9bef6e1847e93dd12df4f8afed19460d26a068dc22ffb2270ceef8dc342f81690e0
7
- data.tar.gz: c19d20d765cd57e64468c27a3e8f134e53d8f6e9ae22497c2d94a315a584e2e19b1913d47b37e89c9525ce80d85d10d43437a623d211766aa7242dbe1144e906
6
+ metadata.gz: f298ab9734b71e795cb014986b93c37642539c45225add31f55a105a4238b0dcd57ae298682df0ad2ed69203d42f13181715dbcfeb1fe8f188a497e51f82cab9
7
+ data.tar.gz: c494a1fd491608e0bee4d47a97b356ae22887b2a041e33348a8784c14fbe68d5ab78451eb2b2e255e0b2f1702d41424b5a2e0b83549a93a3a9a2dd86abd1ad39
@@ -0,0 +1 @@
1
+ github: philnash
@@ -0,0 +1,45 @@
1
+ name: tests
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ runs-on: ubuntu-latest
8
+ strategy:
9
+ fail-fast: false
10
+ matrix:
11
+ ruby: [2.6, 2.7, 3.0, 3.1, head]
12
+ rails: [4.2.11.3, 5.0.7.2, 5.1.7, 5.2.4.4, 6.0.3.4, 6.1.0]
13
+ exclude:
14
+ # Ruby 3.0 and Rails 5 do not get along together.
15
+ - ruby: 3.0
16
+ rails: 5.0.7.2
17
+ - ruby: 3.0
18
+ rails: 5.1.7
19
+ - ruby: 3.0
20
+ rails: 5.2.4.4
21
+ - ruby: 3.1
22
+ rails: 5.0.7.2
23
+ - ruby: 3.1
24
+ rails: 5.1.7
25
+ - ruby: 3.1
26
+ rails: 5.2.4.4
27
+ - ruby: head
28
+ rails: 5.0.7.2
29
+ - ruby: head
30
+ rails: 5.1.7
31
+ - ruby: head
32
+ rails: 5.2.4.4
33
+ continue-on-error: ${{ endsWith(matrix.ruby, 'head') }}
34
+ env:
35
+ RAILS_VERSION: ${{ matrix.rails }}
36
+ steps:
37
+ - uses: actions/checkout@v2
38
+ - name: Set up Ruby ${{ matrix.ruby }}
39
+ uses: ruby/setup-ruby@v1
40
+ with:
41
+ ruby-version: ${{ matrix.ruby }}
42
+ - name: "Install dependencies (rails: ${{matrix.rails}})"
43
+ run: bundle install
44
+ - name: Run tests
45
+ run: bundle exec rspec
data/CHANGELOG.md CHANGED
@@ -1,6 +1,28 @@
1
1
  # Changelog for `Pwned`
2
2
 
3
- ## Ongoing [☰](https://github.com/philnash/pwned/compare/v2.0.2...master)
3
+ ## Ongoing [☰](https://github.com/philnash/pwned/compare/v2.4.0...master)
4
+
5
+ ## 2.4.0 (February 23, 2022) [☰](https://github.com/philnash/pwned/compare/v2.3.0...v2.4.0)
6
+
7
+ - Minor updates
8
+
9
+ - Adds `default_request_options` to set global defaults for the gem
10
+ - Adds Ruby 3.1 to the test matrix
11
+
12
+ ## 2.3.0 (August 30, 2021) [☰](https://github.com/philnash/pwned/compare/v2.2.0...v2.3.0)
13
+
14
+ - Minor updates
15
+
16
+ - Restores `Net::HTTP` default behaviour to use environment supplied HTTP
17
+ proxy
18
+ - Adds `ignore_env_proxy` to ignore any proxies set in the environment
19
+
20
+ ## 2.2.0 (March 27, 2021) [☰](https://github.com/philnash/pwned/compare/v2.1.0...v2.2.0)
21
+
22
+ - Minor updates
23
+
24
+ - Adds `:proxy` option to `request_options` to directly set a proxy on the
25
+ request. Fixes #21, thanks [dparpyani](https://github.com/dparpyani).
4
26
 
5
27
  ## 2.1.0 (July 8, 2020) [☰](https://github.com/philnash/pwned/compare/v2.0.2...v2.1.0)
6
28
 
data/README.md CHANGED
@@ -2,32 +2,37 @@
2
2
 
3
3
  An easy, Ruby way to use the Pwned Passwords API.
4
4
 
5
- [![Gem Version](https://badge.fury.io/rb/pwned.svg)](https://rubygems.org/gems/pwned) [![Build Status](https://travis-ci.org/philnash/pwned.svg?branch=master)](https://travis-ci.org/philnash/pwned) [![Maintainability](https://codeclimate.com/github/philnash/pwned/badges/gpa.svg)](https://codeclimate.com/github/philnash/pwned/maintainability) [![Inline docs](https://inch-ci.org/github/philnash/pwned.svg?branch=master)](https://inch-ci.org/github/philnash/pwned)
5
+ [![Gem Version](https://badge.fury.io/rb/pwned.svg)](https://rubygems.org/gems/pwned) ![Build Status](https://github.com/philnash/pwned/workflows/tests/badge.svg) [![Maintainability](https://codeclimate.com/github/philnash/pwned/badges/gpa.svg)](https://codeclimate.com/github/philnash/pwned/maintainability) [![Inline docs](https://inch-ci.org/github/philnash/pwned.svg?branch=master)](https://inch-ci.org/github/philnash/pwned)
6
6
 
7
7
  [API docs](https://www.rubydoc.info/gems/pwned) | [GitHub repo](https://github.com/philnash/pwned)
8
8
 
9
9
  ## Table of Contents
10
10
 
11
- - [Pwned](#pwned)
12
- - [Table of Contents](#table-of-contents)
13
- - [About](#about)
14
- - [Installation](#installation)
15
- - [Usage](#usage)
16
- - [Plain Ruby](#plain-ruby)
17
- - [Advanced](#advanced)
18
- - [ActiveRecord Validator](#activerecord-validator)
19
- - [I18n](#i18n)
20
- - [Threshold](#threshold)
21
- - [Network Error Handling](#network-error-handling)
22
- - [Custom Request Options](#custom-request-options)
23
- - [Using Asynchronously](#using-asynchronously)
24
- - [Devise](#devise)
25
- - [Command line](#command-line)
26
- - [How Pwned is Pi?](#how-pwned-is-pi)
27
- - [Development](#development)
28
- - [Contributing](#contributing)
29
- - [License](#license)
30
- - [Code of Conduct](#code-of-conduct)
11
+ * [Table of Contents](#table-of-contents)
12
+ * [About](#about)
13
+ * [Installation](#installation)
14
+ * [Usage](#usage)
15
+ * [Plain Ruby](#plain-ruby)
16
+ * [Custom request options](#custom-request-options)
17
+ * [HTTP Headers](#http-headers)
18
+ * [HTTP Proxy](#http-proxy)
19
+ * [ActiveRecord Validator](#activerecord-validator)
20
+ * [I18n](#i18n)
21
+ * [Threshold](#threshold)
22
+ * [Network Error Handling](#network-error-handling)
23
+ * [Custom Request Options](#custom-request-options-1)
24
+ * [HTTP Headers](#http-headers-1)
25
+ * [HTTP Proxy](#http-proxy-1)
26
+ * [Using Asynchronously](#using-asynchronously)
27
+ * [Devise](#devise)
28
+ * [Rodauth](#rodauth)
29
+ * [Command line](#command-line)
30
+ * [Unpwn](#unpwn)
31
+ * [How Pwned is Pi?](#how-pwned-is-pi)
32
+ * [Development](#development)
33
+ * [Contributing](#contributing)
34
+ * [License](#license)
35
+ * [Code of Conduct](#code-of-conduct)
31
36
 
32
37
  ## About
33
38
 
@@ -103,13 +108,57 @@ Pwned.pwned_count("password")
103
108
  #=> 3303003
104
109
  ```
105
110
 
106
- #### Advanced
111
+ #### Custom request options
107
112
 
108
- You can set http request options to be used with `Net::HTTP.start` when making the request to the API. These options are
109
- documented in the [`Net::HTTP.start` documentation](http://ruby-doc.org/stdlib-2.6.3/libdoc/net/http/rdoc/Net/HTTP.html#method-c-start). The `:headers` option defines defines HTTP headers. These headers must be string keys.
113
+ You can set HTTP request options to be used with `Net::HTTP.start` when making the request to the API. These options are documented in the [`Net::HTTP.start` documentation](https://ruby-doc.org/stdlib-3.0.0/libdoc/net/http/rdoc/Net/HTTP.html#method-c-start).
114
+
115
+ You can pass the options to the constructor:
116
+
117
+ ```ruby
118
+ password = Pwned::Password.new("password", read_timeout: 10)
119
+ ```
120
+
121
+ You can also specify global defaults:
110
122
 
111
123
  ```ruby
112
- password = Pwned::Password.new("password", headers: { 'User-Agent' => 'Super fun new user agent' }, read_timeout: 10)
124
+ Pwned.default_request_options = { read_timeout: 10 }
125
+ ```
126
+
127
+ ##### HTTP Headers
128
+
129
+ The `:headers` option defines defines HTTP headers. These headers must be string keys.
130
+
131
+ ```ruby
132
+ password = Pwned::Password.new("password", headers: {
133
+ 'User-Agent' => 'Super fun new user agent'
134
+ })
135
+ ```
136
+
137
+ ##### HTTP Proxy
138
+
139
+ An HTTP proxy can be set using the `http_proxy` or `HTTP_PROXY` environment variable. This is the same way that `Net::HTTP` handles HTTP proxies if no proxy options are given. See [`URI::Generic#find_proxy`](https://ruby-doc.org/stdlib-3.0.1/libdoc/uri/rdoc/URI/Generic.html#method-i-find_proxy) for full details on how Ruby detects a proxy from the environment.
140
+
141
+ ```ruby
142
+ # Set in the environment
143
+ ENV["http_proxy"] = "https://username:password@example.com:12345"
144
+
145
+ # Will use the above proxy
146
+ password = Pwned::Password.new("password")
147
+ ```
148
+
149
+ You can specify a custom HTTP proxy with the `:proxy` option:
150
+
151
+ ```ruby
152
+ password = Pwned::Password.new(
153
+ "password",
154
+ proxy: "https://username:password@example.com:12345"
155
+ )
156
+ ```
157
+
158
+ If you don't want to set a proxy and you don't want a proxy to be inferred from the environment, set the `:ignore_env_proxy` key:
159
+
160
+ ```ruby
161
+ password = Pwned::Password.new("password", ignore_env_proxy: true)
113
162
  ```
114
163
 
115
164
  ### ActiveRecord Validator
@@ -180,28 +229,82 @@ end
180
229
  #### Custom Request Options
181
230
 
182
231
  You can configure network requests made from the validator using `:request_options` (see [Net::HTTP.start](http://ruby-doc.org/stdlib-2.6.3/libdoc/net/http/rdoc/Net/HTTP.html#method-c-start) for the list of available options).
183
- In addition to these options, HTTP headers can be specified with the `:headers` key, e.g. `"User-Agent"`):
184
232
 
185
233
  ```ruby
186
234
  validates :password, not_pwned: {
187
- request_options: { read_timeout: 5, open_timeout: 1, headers: { "User-Agent" => "Super fun user agent" } }
235
+ request_options: {
236
+ read_timeout: 5,
237
+ open_timeout: 1
238
+ }
239
+ }
240
+ ```
241
+
242
+ These options override the globally defined default options (see above).
243
+
244
+ In addition to these options, you can also set the following:
245
+
246
+ ##### HTTP Headers
247
+
248
+ HTTP headers can be specified with the `:headers` key (e.g. `"User-Agent"`)
249
+
250
+ ```ruby
251
+ validates :password, not_pwned: {
252
+ request_options: {
253
+ headers: { "User-Agent" => "Super fun user agent" }
254
+ }
255
+ }
256
+ ```
257
+
258
+ ##### HTTP Proxy
259
+
260
+ An HTTP proxy can be set using the `http_proxy` or `HTTP_PROXY` environment variable. This is the same way that `Net::HTTP` handles HTTP proxies if no proxy options are given. See [`URI::Generic#find_proxy`](https://ruby-doc.org/stdlib-3.0.1/libdoc/uri/rdoc/URI/Generic.html#method-i-find_proxy) for full details on how Ruby detects a proxy from the environment.
261
+
262
+ ```ruby
263
+ # Set in the environment
264
+ ENV["http_proxy"] = "https://username:password@example.com:12345"
265
+
266
+ validates :password, not_pwned: true
267
+ ```
268
+
269
+ You can specify a custom HTTP proxy with the `:proxy` key:
270
+
271
+ ```ruby
272
+ validates :password, not_pwned: {
273
+ request_options: {
274
+ proxy: "https://username:password@example.com:12345"
275
+ }
276
+ }
277
+ ```
278
+
279
+ If you don't want to set a proxy and you don't want a proxy to be inferred from the environment, set the `:ignore_env_proxy` key:
280
+
281
+ ```ruby
282
+ validates :password, not_pwned: {
283
+ request_options: {
284
+ ignore_env_proxy: true
285
+ }
188
286
  }
189
287
  ```
190
288
 
191
289
  ### Using Asynchronously
192
290
 
193
- You may have a use case for hashing the password in advance, and then making the call to the Pwned api later
194
- (for example if you want to enqueue a job without storing the plaintext password):
291
+ You may have a use case for hashing the password in advance, and then making the call to the Pwned Passwords API later (for example if you want to enqueue a job without storing the plaintext password). To do this, you can hash the password with the `Pwned.hash_password` method and then initialize the `Pwned::HashedPassword` class with the hash, like this:
195
292
 
196
293
  ```ruby
197
294
  hashed_password = Pwned.hash_password(password)
198
295
  # some time later
199
- Pwned::HashPassword.new(hashed_password, request_options).pwned?
296
+ Pwned::HashedPassword.new(hashed_password, request_options).pwned?
200
297
  ```
201
298
 
299
+ The `Pwned::HashedPassword` constructor takes all the same options as the regular `Pwned::Password` contructor.
300
+
202
301
  ### Devise
203
302
 
204
- If you are using Devise I recommend you use the [devise-pwned_password extension](https://github.com/michaelbanfield/devise-pwned_password) which is now powered by this gem.
303
+ If you are using [Devise](https://github.com/heartcombo/devise) I recommend you use the [devise-pwned_password extension](https://github.com/michaelbanfield/devise-pwned_password) which is now powered by this gem.
304
+
305
+ ### Rodauth
306
+
307
+ If you are using [Rodauth](https://github.com/jeremyevans/rodauth) then you can use the [rodauth-pwned](https://github.com/janko/rodauth-pwned) feature which is powered by this gem.
205
308
 
206
309
  ### Command line
207
310
 
@@ -221,6 +324,10 @@ $ pwned --secret
221
324
 
222
325
  You will be prompted for the password, but it won't be displayed.
223
326
 
327
+ ### Unpwn
328
+
329
+ To cut down on unnecessary network requests, [the unpwn project](https://github.com/indirect/unpwn) uses a list of the top one million passwords to check passwords against. Only if a password is not included in the top million is it then checked against the Pwned Passwords API.
330
+
224
331
  ## How Pwned is Pi?
225
332
 
226
333
  [@daz](https://github.com/daz) [shared](https://twitter.com/dazonic/status/1074647842046660609) a fantastic example of using this gem to show how many times the digits of Pi have been used as passwords and leaked.
@@ -0,0 +1,13 @@
1
+ module DeepMerge
2
+ refine Hash do
3
+ def deep_merge(other)
4
+ self.merge(other) do |key, this_val, other_val|
5
+ if this_val.is_a?(Hash) && other_val.is_a?(Hash)
6
+ this_val.deep_merge(other_val)
7
+ else
8
+ other_val
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "pwned/password_base"
4
+ require "pwned/deep_merge"
5
+
4
6
 
5
7
  module Pwned
6
8
  ##
@@ -9,6 +11,7 @@ module Pwned
9
11
  # @see https://haveibeenpwned.com/API/v2#PwnedPasswords
10
12
  class HashedPassword
11
13
  include PasswordBase
14
+ using DeepMerge
12
15
  ##
13
16
  # Creates a new hashed password object.
14
17
  #
@@ -19,17 +22,22 @@ module Pwned
19
22
  #
20
23
  # @param hashed_password [String] The hash of the password you want to check against the API.
21
24
  # @param [Hash] request_options Options that can be passed to +Net::HTTP.start+ when
22
- # calling the API
25
+ # calling the API. This overrides any keys specified in +Pwned.default_request_options+.
23
26
  # @option request_options [Symbol] :headers ({ "User-Agent" => "Ruby Pwned::Password #{Pwned::VERSION}" })
24
27
  # HTTP headers to include in the request
28
+ # @option request_options [Symbol] :ignore_env_proxy (false) The library
29
+ # will try to infer an HTTP proxy from the `http_proxy` environment
30
+ # variable. If you do not want this behaviour, set this option to true.
25
31
  # @raise [TypeError] if the password is not a string.
26
32
  # @since 2.1.0
27
33
  def initialize(hashed_password, request_options={})
28
34
  raise TypeError, "hashed_password must be of type String" unless hashed_password.is_a? String
29
35
  @hashed_password = hashed_password.upcase
30
- @request_options = Hash(request_options).dup
31
- @request_headers = Hash(request_options.delete(:headers))
36
+ @request_options = Pwned.default_request_options.deep_merge(request_options)
37
+ @request_headers = Hash(@request_options.delete(:headers))
32
38
  @request_headers = DEFAULT_REQUEST_HEADERS.merge(@request_headers)
39
+ @request_proxy = URI(@request_options.delete(:proxy)) if @request_options.key?(:proxy)
40
+ @ignore_env_proxy = @request_options.delete(:ignore_env_proxy) || false
33
41
  end
34
42
  end
35
43
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "pwned/password_base"
4
+ require "pwned/deep_merge"
4
5
 
5
6
  module Pwned
6
7
  ##
@@ -9,6 +10,7 @@ module Pwned
9
10
  # @see https://haveibeenpwned.com/API/v2#PwnedPasswords
10
11
  class Password
11
12
  include PasswordBase
13
+ using DeepMerge
12
14
  ##
13
15
  # @return [String] the password that is being checked.
14
16
  # @since 1.0.0
@@ -24,19 +26,23 @@ module Pwned
24
26
  #
25
27
  # @param password [String] The password you want to check against the API.
26
28
  # @param [Hash] request_options Options that can be passed to +Net::HTTP.start+ when
27
- # calling the API
29
+ # calling the API. This overrides any keys specified in +Pwned.default_request_options+.
28
30
  # @option request_options [Symbol] :headers ({ "User-Agent" => "Ruby Pwned::Password #{Pwned::VERSION}" })
29
31
  # HTTP headers to include in the request
30
- # @return [Boolean] Whether the password appears in the data breaches or not.
32
+ # @option request_options [Symbol] :ignore_env_proxy (false) The library
33
+ # will try to infer an HTTP proxy from the `http_proxy` environment
34
+ # variable. If you do not want this behaviour, set this option to true.
31
35
  # @raise [TypeError] if the password is not a string.
32
36
  # @since 1.1.0
33
37
  def initialize(password, request_options={})
34
38
  raise TypeError, "password must be of type String" unless password.is_a? String
35
39
  @password = password
36
40
  @hashed_password = Pwned.hash_password(password)
37
- @request_options = Hash(request_options).dup
38
- @request_headers = Hash(request_options.delete(:headers))
41
+ @request_options = Pwned.default_request_options.deep_merge(request_options)
42
+ @request_headers = Hash(@request_options.delete(:headers))
39
43
  @request_headers = DEFAULT_REQUEST_HEADERS.merge(@request_headers)
44
+ @request_proxy = URI(@request_options.delete(:proxy)) if @request_options.key?(:proxy)
45
+ @ignore_env_proxy = @request_options.delete(:ignore_env_proxy) || false
40
46
  end
41
47
  end
42
48
  end
@@ -65,7 +65,7 @@ module Pwned
65
65
 
66
66
  private
67
67
 
68
- attr_reader :request_options, :request_headers
68
+ attr_reader :request_options, :request_headers, :request_proxy, :ignore_env_proxy
69
69
 
70
70
  def fetch_pwned_count
71
71
  for_each_response_line do |line|
@@ -108,7 +108,17 @@ module Pwned
108
108
  request.initialize_http_header(request_headers)
109
109
  request_options[:use_ssl] = true
110
110
 
111
- Net::HTTP.start(uri.host, uri.port, request_options) do |http|
111
+ environment_proxy = ignore_env_proxy ? nil : :ENV
112
+
113
+ Net::HTTP.start(
114
+ uri.host,
115
+ uri.port,
116
+ request_proxy&.host || environment_proxy,
117
+ request_proxy&.port,
118
+ request_proxy&.user,
119
+ request_proxy&.password,
120
+ request_options
121
+ ) do |http|
112
122
  http.request(request, &block)
113
123
  end
114
124
  end
@@ -128,6 +138,5 @@ module Pwned
128
138
 
129
139
  yield last_line unless last_line.empty?
130
140
  end
131
-
132
141
  end
133
142
  end
data/lib/pwned/version.rb CHANGED
@@ -3,5 +3,5 @@
3
3
  module Pwned
4
4
  ##
5
5
  # The current version of the +pwned+ gem.
6
- VERSION = "2.1.0"
6
+ VERSION = "2.4.0"
7
7
  end
data/lib/pwned.rb CHANGED
@@ -23,6 +23,29 @@ end
23
23
  # results for a password.
24
24
 
25
25
  module Pwned
26
+ @default_request_options = {}
27
+
28
+ ##
29
+ # The default request options passed to +Net::HTTP.start+ when calling the API.
30
+ #
31
+ # @return [Hash]
32
+ # @see Pwned::Password#initialize
33
+ def self.default_request_options
34
+ @default_request_options
35
+ end
36
+
37
+ ##
38
+ # Sets the default request options passed to +Net::HTTP.start+ when calling
39
+ # the API.
40
+ #
41
+ # The default options may be overridden in +Pwned::Password#new+.
42
+ #
43
+ # @param [Hash] request_options
44
+ # @see Pwned::Password#initialize
45
+ def self.default_request_options=(request_options)
46
+ @default_request_options = request_options
47
+ end
48
+
26
49
  ##
27
50
  # Returns +true+ when the password has been pwned.
28
51
  #
@@ -35,6 +58,9 @@ module Pwned
35
58
  # calling the API
36
59
  # @option request_options [Symbol] :headers ({ "User-Agent" => "Ruby Pwned::Password #{Pwned::VERSION}" })
37
60
  # HTTP headers to include in the request
61
+ # @option request_options [Symbol] :ignore_env_proxy (false) The library
62
+ # will try to infer an HTTP proxy from the `http_proxy` environment
63
+ # variable. If you do not want this behaviour, set this option to true.
38
64
  # @return [Boolean] Whether the password appears in the data breaches or not.
39
65
  # @since 1.1.0
40
66
  def self.pwned?(password, request_options={})
@@ -53,6 +79,9 @@ module Pwned
53
79
  # calling the API
54
80
  # @option request_options [Symbol] :headers ({ "User-Agent" => "Ruby Pwned::Password #{Pwned::VERSION}" })
55
81
  # HTTP headers to include in the request
82
+ # @option request_options [Symbol] :ignore_env_proxy (false) The library
83
+ # will try to infer an HTTP proxy from the `http_proxy` environment
84
+ # variable. If you do not want this behaviour, set this option to true.
56
85
  # @return [Integer] The number of times the password has appeared in the data
57
86
  # breaches.
58
87
  # @since 1.1.0
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwned
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Phil Nash
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-08 00:00:00.000000000 Z
11
+ date: 2022-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,9 +94,10 @@ executables:
94
94
  extensions: []
95
95
  extra_rdoc_files: []
96
96
  files:
97
+ - ".github/FUNDING.yml"
98
+ - ".github/workflows/tests.yml"
97
99
  - ".gitignore"
98
100
  - ".rspec"
99
- - ".travis.yml"
100
101
  - ".yardopts"
101
102
  - CHANGELOG.md
102
103
  - CODE_OF_CONDUCT.md
@@ -109,6 +110,7 @@ files:
109
110
  - bin/setup
110
111
  - lib/locale/en.yml
111
112
  - lib/pwned.rb
113
+ - lib/pwned/deep_merge.rb
112
114
  - lib/pwned/error.rb
113
115
  - lib/pwned/hashed_password.rb
114
116
  - lib/pwned/not_pwned_validator.rb
@@ -125,7 +127,7 @@ metadata:
125
127
  documentation_uri: https://www.rubydoc.info/gems/pwned
126
128
  homepage_uri: https://github.com/philnash/pwned
127
129
  source_code_uri: https://github.com/philnash/pwned
128
- post_install_message:
130
+ post_install_message:
129
131
  rdoc_options: []
130
132
  require_paths:
131
133
  - lib
@@ -140,8 +142,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
142
  - !ruby/object:Gem::Version
141
143
  version: '0'
142
144
  requirements: []
143
- rubygems_version: 3.0.3
144
- signing_key:
145
+ rubygems_version: 3.1.2
146
+ signing_key:
145
147
  specification_version: 4
146
148
  summary: Tools to use the Pwned Passwords API.
147
149
  test_files: []
data/.travis.yml DELETED
@@ -1,27 +0,0 @@
1
- sudo: false
2
- language: ruby
3
-
4
- env:
5
- matrix:
6
- - RAILS_VERSION=4.2.11.1
7
- - RAILS_VERSION=5.0.7.2
8
- - RAILS_VERSION=5.1.7
9
- - RAILS_VERSION=5.2.3
10
- - RAILS_VERSION=6.0.0
11
-
12
- rvm:
13
- - 2.7
14
- - 2.6
15
- - 2.5
16
- - 2.4
17
- - jruby
18
- - ruby-head
19
-
20
- before_install: gem install bundler
21
-
22
- matrix:
23
- allow_failures:
24
- - rvm: ruby-head
25
- exclude:
26
- - rvm: 2.4
27
- env: RAILS_VERSION=6.0.0