pwned 2.2.0 → 2.3.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 +4 -4
- data/CHANGELOG.md +9 -1
- data/README.md +113 -30
- data/lib/pwned/hashed_password.rb +4 -0
- data/lib/pwned/password.rb +4 -1
- data/lib/pwned/password_base.rb +4 -3
- data/lib/pwned/version.rb +1 -1
- data/lib/pwned.rb +6 -0
- metadata +3 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: f4b8270eaf162b50ef112371c2e35dd41141dec39e4e11d5a76936119e2ca569
         | 
| 4 | 
            +
              data.tar.gz: fdec9b67cc6465fa64062697253e6cf078ddb2b2deb71cf829a919dca7953f48
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 7ec757852674e3e44ac71a71ed5c31d3503b5f0547871f940d56e8e2d8838b0b89e36742c0e10108f1c00fddc54016454d3ba77348cddd7be659d1ed4fdaf71a
         | 
| 7 | 
            +
              data.tar.gz: 304b59ce60639f57c7a3a81c5e0f172dc8de9a2128018abe636be7f6d88074af59ac193d2538f86c298d4f8a537b0152bdcab6efb8cf4a27d5c6a13c64b9e311
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,6 +1,14 @@ | |
| 1 1 | 
             
            # Changelog for `Pwned`
         | 
| 2 2 |  | 
| 3 | 
            -
            ## Ongoing [☰](https://github.com/philnash/pwned/compare/v2.0 | 
| 3 | 
            +
            ## Ongoing [☰](https://github.com/philnash/pwned/compare/v2.2.0...master)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ## 2.3.0 (August 30, 2021) [☰](https://github.com/philnash/pwned/compare/v2.2.0...v2.3.0)
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            - Minor updates
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              - Restores `Net::HTTP` default behaviour to use environment supplied HTTP
         | 
| 10 | 
            +
                proxy
         | 
| 11 | 
            +
              - Adds `ignore_env_proxy` to ignore any proxies set in the environment
         | 
| 4 12 |  | 
| 5 13 | 
             
            ## 2.2.0 (March 27, 2021) [☰](https://github.com/philnash/pwned/compare/v2.1.0...v2.2.0)
         | 
| 6 14 |  | 
    
        data/README.md
    CHANGED
    
    | @@ -8,28 +8,31 @@ An easy, Ruby way to use the Pwned Passwords API. | |
| 8 8 |  | 
| 9 9 | 
             
            ## Table of Contents
         | 
| 10 10 |  | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
               | 
| 16 | 
            -
                 | 
| 17 | 
            -
                   | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
                 | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
               | 
| 29 | 
            -
               | 
| 30 | 
            -
               | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 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)
         | 
| 33 36 |  | 
| 34 37 | 
             
            ## About
         | 
| 35 38 |  | 
| @@ -105,13 +108,49 @@ Pwned.pwned_count("password") | |
| 105 108 | 
             
            #=> 3303003
         | 
| 106 109 | 
             
            ```
         | 
| 107 110 |  | 
| 108 | 
            -
            ####  | 
| 111 | 
            +
            #### Custom request options
         | 
| 109 112 |  | 
| 110 | 
            -
            You can set http request options to be used with `Net::HTTP.start` when making the request to the API. These options are
         | 
| 111 | 
            -
            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). For example:
         | 
| 112 114 |  | 
| 113 115 | 
             
            ```ruby
         | 
| 114 | 
            -
            password = Pwned::Password.new("password",  | 
| 116 | 
            +
            password = Pwned::Password.new("password", read_timeout: 10)
         | 
| 117 | 
            +
            ```
         | 
| 118 | 
            +
             | 
| 119 | 
            +
            ##### HTTP Headers
         | 
| 120 | 
            +
             | 
| 121 | 
            +
            The `:headers` option defines defines HTTP headers. These headers must be string keys.
         | 
| 122 | 
            +
             | 
| 123 | 
            +
            ```ruby
         | 
| 124 | 
            +
            password = Pwned::Password.new("password", headers: {
         | 
| 125 | 
            +
              'User-Agent' => 'Super fun new user agent'
         | 
| 126 | 
            +
            })
         | 
| 127 | 
            +
            ```
         | 
| 128 | 
            +
             | 
| 129 | 
            +
            ##### HTTP Proxy
         | 
| 130 | 
            +
             | 
| 131 | 
            +
            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.
         | 
| 132 | 
            +
             | 
| 133 | 
            +
            ```ruby
         | 
| 134 | 
            +
            # Set in the environment
         | 
| 135 | 
            +
            ENV["http_proxy"] = "https://username:password@example.com:12345"
         | 
| 136 | 
            +
             | 
| 137 | 
            +
            # Will use the above proxy
         | 
| 138 | 
            +
            password = Pwned::Password.new("password")
         | 
| 139 | 
            +
            ```
         | 
| 140 | 
            +
             | 
| 141 | 
            +
            You can specify a custom HTTP proxy with the `:proxy` option:
         | 
| 142 | 
            +
             | 
| 143 | 
            +
            ```ruby
         | 
| 144 | 
            +
            password = Pwned::Password.new(
         | 
| 145 | 
            +
              "password",
         | 
| 146 | 
            +
              proxy: "https://username:password@example.com:12345"
         | 
| 147 | 
            +
            )
         | 
| 148 | 
            +
            ```
         | 
| 149 | 
            +
             | 
| 150 | 
            +
            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:
         | 
| 151 | 
            +
             | 
| 152 | 
            +
            ```ruby
         | 
| 153 | 
            +
            password = Pwned::Password.new("password", ignore_env_proxy: true)
         | 
| 115 154 | 
             
            ```
         | 
| 116 155 |  | 
| 117 156 | 
             
            ### ActiveRecord Validator
         | 
| @@ -181,20 +220,62 @@ end | |
| 181 220 |  | 
| 182 221 | 
             
            #### Custom Request Options
         | 
| 183 222 |  | 
| 184 | 
            -
            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).
         | 
| 185 | 
            -
            In addition to these options, HTTP headers can be specified with the `:headers` key (e.g. `"User-Agent"`) and proxy can be specified with the `:proxy` key:
         | 
| 223 | 
            +
            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). 
         | 
| 186 224 |  | 
| 187 225 | 
             
            ```ruby
         | 
| 188 226 | 
             
              validates :password, not_pwned: {
         | 
| 189 227 | 
             
                request_options: {
         | 
| 190 228 | 
             
                  read_timeout: 5,
         | 
| 191 | 
            -
                  open_timeout: 1 | 
| 192 | 
            -
             | 
| 229 | 
            +
                  open_timeout: 1
         | 
| 230 | 
            +
                }
         | 
| 231 | 
            +
              }
         | 
| 232 | 
            +
            ```
         | 
| 233 | 
            +
             | 
| 234 | 
            +
            In addition to these options, you can also set the following:
         | 
| 235 | 
            +
             | 
| 236 | 
            +
            ##### HTTP Headers
         | 
| 237 | 
            +
             | 
| 238 | 
            +
            HTTP headers can be specified with the `:headers` key (e.g. `"User-Agent"`)
         | 
| 239 | 
            +
             | 
| 240 | 
            +
            ```ruby
         | 
| 241 | 
            +
              validates :password, not_pwned: {
         | 
| 242 | 
            +
                request_options: {
         | 
| 243 | 
            +
                  headers: { "User-Agent" => "Super fun user agent" }
         | 
| 244 | 
            +
                }
         | 
| 245 | 
            +
              }
         | 
| 246 | 
            +
            ```
         | 
| 247 | 
            +
             | 
| 248 | 
            +
            ##### HTTP Proxy
         | 
| 249 | 
            +
             | 
| 250 | 
            +
            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.
         | 
| 251 | 
            +
             | 
| 252 | 
            +
            ```ruby
         | 
| 253 | 
            +
              # Set in the environment
         | 
| 254 | 
            +
              ENV["http_proxy"] = "https://username:password@example.com:12345"
         | 
| 255 | 
            +
             | 
| 256 | 
            +
              validates :password, not_pwned: true
         | 
| 257 | 
            +
            ```
         | 
| 258 | 
            +
             | 
| 259 | 
            +
            You can specify a custom HTTP proxy with the `:proxy` key:
         | 
| 260 | 
            +
             | 
| 261 | 
            +
            ```ruby
         | 
| 262 | 
            +
              validates :password, not_pwned: {
         | 
| 263 | 
            +
                request_options: {
         | 
| 193 264 | 
             
                  proxy: "https://username:password@example.com:12345"
         | 
| 194 265 | 
             
                }
         | 
| 195 266 | 
             
              }
         | 
| 196 267 | 
             
            ```
         | 
| 197 268 |  | 
| 269 | 
            +
            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:
         | 
| 270 | 
            +
             | 
| 271 | 
            +
            ```ruby
         | 
| 272 | 
            +
              validates :password, not_pwned: {
         | 
| 273 | 
            +
                request_options: {
         | 
| 274 | 
            +
                  ignore_env_proxy: true
         | 
| 275 | 
            +
                }
         | 
| 276 | 
            +
              }
         | 
| 277 | 
            +
            ```
         | 
| 278 | 
            +
             | 
| 198 279 | 
             
            ### Using Asynchronously
         | 
| 199 280 |  | 
| 200 281 | 
             
            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::HashPassword` class with the hash, like this:
         | 
| @@ -205,6 +286,8 @@ hashed_password = Pwned.hash_password(password) | |
| 205 286 | 
             
            Pwned::HashPassword.new(hashed_password, request_options).pwned?
         | 
| 206 287 | 
             
            ```
         | 
| 207 288 |  | 
| 289 | 
            +
            The `Pwned::HashPassword` constructor takes all the same options as the regular `Pwned::Password` contructor.
         | 
| 290 | 
            +
             | 
| 208 291 | 
             
            ### Devise
         | 
| 209 292 |  | 
| 210 293 | 
             
            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.
         | 
| @@ -22,6 +22,9 @@ module Pwned | |
| 22 22 | 
             
                #   calling the API
         | 
| 23 23 | 
             
                # @option request_options [Symbol] :headers ({ "User-Agent" => "Ruby Pwned::Password #{Pwned::VERSION}" })
         | 
| 24 24 | 
             
                #   HTTP headers to include in the request
         | 
| 25 | 
            +
                # @option request_options [Symbol] :ignore_env_proxy (false) The library
         | 
| 26 | 
            +
                #   will try to infer an HTTP proxy from the `http_proxy` environment
         | 
| 27 | 
            +
                #   variable. If you do not want this behaviour, set this option to true.
         | 
| 25 28 | 
             
                # @raise [TypeError] if the password is not a string.
         | 
| 26 29 | 
             
                # @since 2.1.0
         | 
| 27 30 | 
             
                def initialize(hashed_password, request_options={})
         | 
| @@ -31,6 +34,7 @@ module Pwned | |
| 31 34 | 
             
                  @request_headers = Hash(request_options.delete(:headers))
         | 
| 32 35 | 
             
                  @request_headers = DEFAULT_REQUEST_HEADERS.merge(@request_headers)
         | 
| 33 36 | 
             
                  @request_proxy = URI(request_options.delete(:proxy)) if request_options.key?(:proxy)
         | 
| 37 | 
            +
                  @ignore_env_proxy = request_options.delete(:ignore_env_proxy) || false
         | 
| 34 38 | 
             
                end
         | 
| 35 39 | 
             
              end
         | 
| 36 40 | 
             
            end
         | 
    
        data/lib/pwned/password.rb
    CHANGED
    
    | @@ -27,7 +27,9 @@ module Pwned | |
| 27 27 | 
             
                #   calling the API
         | 
| 28 28 | 
             
                # @option request_options [Symbol] :headers ({ "User-Agent" => "Ruby Pwned::Password #{Pwned::VERSION}" })
         | 
| 29 29 | 
             
                #   HTTP headers to include in the request
         | 
| 30 | 
            -
                # @ | 
| 30 | 
            +
                # @option request_options [Symbol] :ignore_env_proxy (false) The library
         | 
| 31 | 
            +
                #   will try to infer an HTTP proxy from the `http_proxy` environment
         | 
| 32 | 
            +
                #   variable. If you do not want this behaviour, set this option to true.
         | 
| 31 33 | 
             
                # @raise [TypeError] if the password is not a string.
         | 
| 32 34 | 
             
                # @since 1.1.0
         | 
| 33 35 | 
             
                def initialize(password, request_options={})
         | 
| @@ -38,6 +40,7 @@ module Pwned | |
| 38 40 | 
             
                  @request_headers = Hash(request_options.delete(:headers))
         | 
| 39 41 | 
             
                  @request_headers = DEFAULT_REQUEST_HEADERS.merge(@request_headers)
         | 
| 40 42 | 
             
                  @request_proxy = URI(request_options.delete(:proxy)) if request_options.key?(:proxy)
         | 
| 43 | 
            +
                  @ignore_env_proxy = request_options.delete(:ignore_env_proxy) || false
         | 
| 41 44 | 
             
                end
         | 
| 42 45 | 
             
              end
         | 
| 43 46 | 
             
            end
         | 
    
        data/lib/pwned/password_base.rb
    CHANGED
    
    | @@ -65,7 +65,7 @@ module Pwned | |
| 65 65 |  | 
| 66 66 | 
             
                private
         | 
| 67 67 |  | 
| 68 | 
            -
                attr_reader :request_options, :request_headers, :request_proxy
         | 
| 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,10 +108,12 @@ module Pwned | |
| 108 108 | 
             
                  request.initialize_http_header(request_headers)
         | 
| 109 109 | 
             
                  request_options[:use_ssl] = true
         | 
| 110 110 |  | 
| 111 | 
            +
                  environment_proxy = ignore_env_proxy ? nil : :ENV
         | 
| 112 | 
            +
             | 
| 111 113 | 
             
                  Net::HTTP.start(
         | 
| 112 114 | 
             
                    uri.host,
         | 
| 113 115 | 
             
                    uri.port,
         | 
| 114 | 
            -
                    request_proxy&.host,
         | 
| 116 | 
            +
                    request_proxy&.host || environment_proxy,
         | 
| 115 117 | 
             
                    request_proxy&.port,
         | 
| 116 118 | 
             
                    request_proxy&.user,
         | 
| 117 119 | 
             
                    request_proxy&.password,
         | 
| @@ -136,6 +138,5 @@ module Pwned | |
| 136 138 |  | 
| 137 139 | 
             
                  yield last_line unless last_line.empty?
         | 
| 138 140 | 
             
                end
         | 
| 139 | 
            -
             | 
| 140 141 | 
             
              end
         | 
| 141 142 | 
             
            end
         | 
    
        data/lib/pwned/version.rb
    CHANGED
    
    
    
        data/lib/pwned.rb
    CHANGED
    
    | @@ -35,6 +35,9 @@ module Pwned | |
| 35 35 | 
             
              #   calling the API
         | 
| 36 36 | 
             
              # @option request_options [Symbol] :headers ({ "User-Agent" => "Ruby Pwned::Password #{Pwned::VERSION}" })
         | 
| 37 37 | 
             
              #   HTTP headers to include in the request
         | 
| 38 | 
            +
              # @option request_options [Symbol] :ignore_env_proxy (false) The library
         | 
| 39 | 
            +
              #   will try to infer an HTTP proxy from the `http_proxy` environment
         | 
| 40 | 
            +
              #   variable. If you do not want this behaviour, set this option to true.
         | 
| 38 41 | 
             
              # @return [Boolean] Whether the password appears in the data breaches or not.
         | 
| 39 42 | 
             
              # @since 1.1.0
         | 
| 40 43 | 
             
              def self.pwned?(password, request_options={})
         | 
| @@ -53,6 +56,9 @@ module Pwned | |
| 53 56 | 
             
              #   calling the API
         | 
| 54 57 | 
             
              # @option request_options [Symbol] :headers ({ "User-Agent" => "Ruby Pwned::Password #{Pwned::VERSION}" })
         | 
| 55 58 | 
             
              #   HTTP headers to include in the request
         | 
| 59 | 
            +
              # @option request_options [Symbol] :ignore_env_proxy (false) The library
         | 
| 60 | 
            +
              #   will try to infer an HTTP proxy from the `http_proxy` environment
         | 
| 61 | 
            +
              #   variable. If you do not want this behaviour, set this option to true.
         | 
| 56 62 | 
             
              # @return [Integer] The number of times the password has appeared in the data
         | 
| 57 63 | 
             
              #   breaches.
         | 
| 58 64 | 
             
              # @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. | 
| 4 | 
            +
              version: 2.3.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Phil Nash
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2021- | 
| 11 | 
            +
            date: 2021-08-30 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -141,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 141 141 | 
             
                - !ruby/object:Gem::Version
         | 
| 142 142 | 
             
                  version: '0'
         | 
| 143 143 | 
             
            requirements: []
         | 
| 144 | 
            -
            rubygems_version: 3.2 | 
| 144 | 
            +
            rubygems_version: 3.1.2
         | 
| 145 145 | 
             
            signing_key:
         | 
| 146 146 | 
             
            specification_version: 4
         | 
| 147 147 | 
             
            summary: Tools to use the Pwned Passwords API.
         |