rodauth 1.3.0 → 1.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 +4 -4
- data/CHANGELOG +4 -0
- data/README.rdoc +1 -0
- data/doc/release_notes/1.4.0.txt +11 -0
- data/doc/update_password_hash.rdoc +7 -0
- data/lib/rodauth/features/base.rb +19 -13
- data/lib/rodauth/features/login_password_requirements_base.rb +1 -1
- data/lib/rodauth/features/update_password_hash.rb +29 -0
- data/lib/rodauth/version.rb +1 -1
- data/spec/update_password_hash_spec.rb +40 -0
- metadata +8 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: eedc388675de95e1b6d8f6281bc57cefb262eec9
         | 
| 4 | 
            +
              data.tar.gz: 725710de442759eba54e3a2245e2ed08af52d479
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: c354d87afa1dac53d2589b2626a17841e33b3f3041145cf88ccaef9ad4a4041a94b1a5140b88e7fb43af7de8efde7ad26f34fec0a5f79b962617656eccb10a35
         | 
| 7 | 
            +
              data.tar.gz: acc6f4b368095dafb9d102642b5da105405475fd73fae8e31c162fe086cb8f7baf849052a9274d6e64f5988b98bf7e4319595c8a746190b1edd6dd529414ded6
         | 
    
        data/CHANGELOG
    CHANGED
    
    
    
        data/README.rdoc
    CHANGED
    
    
| @@ -0,0 +1,11 @@ | |
| 1 | 
            +
            = New Features
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            * A update_password_hash feature has been added, which will update
         | 
| 4 | 
            +
              the password hash for the account whenever the account's current 
         | 
| 5 | 
            +
              password hash has a cost different from the currently configured
         | 
| 6 | 
            +
              password hash cost.
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              This allows you to increase the password hash cost for all
         | 
| 9 | 
            +
              accounts or for certain types of accounts, and have the password
         | 
| 10 | 
            +
              hashes automatically updated to use the new cost the next time the
         | 
| 11 | 
            +
              correct password is provided for the account.
         | 
| @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            = Documentation for Update Password Hash Feature
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            The update password hash feature updates the hash for the password whenever
         | 
| 4 | 
            +
            the hash cost changes.  For example, if you have a cost of 8, and later
         | 
| 5 | 
            +
            increase the cost to 10, anytime the user authenticates correctly with
         | 
| 6 | 
            +
            their password, their password hash will change from one that uses a cost
         | 
| 7 | 
            +
            of 8 to one that uses a cost of 10.
         | 
| @@ -246,20 +246,12 @@ module Rodauth | |
| 246 246 | 
             
                end
         | 
| 247 247 |  | 
| 248 248 | 
             
                def password_match?(password)
         | 
| 249 | 
            -
                  if  | 
| 250 | 
            -
                     | 
| 251 | 
            -
                  elsif use_database_authentication_functions?
         | 
| 252 | 
            -
                    id = account_id
         | 
| 253 | 
            -
                    if salt = db.get(Sequel.function(function_name(:rodauth_get_salt), id))
         | 
| 254 | 
            -
                      hash = BCrypt::Engine.hash_secret(password, salt)
         | 
| 255 | 
            -
                      db.get(Sequel.function(function_name(:rodauth_valid_password_hash), id, hash))
         | 
| 256 | 
            -
                    end
         | 
| 257 | 
            -
                  else
         | 
| 258 | 
            -
                    # :nocov:
         | 
| 259 | 
            -
                    if hash = password_hash_ds.get(password_hash_column)
         | 
| 249 | 
            +
                  if hash = get_password_hash
         | 
| 250 | 
            +
                    if account_password_hash_column || !use_database_authentication_functions?
         | 
| 260 251 | 
             
                      BCrypt::Password.new(hash) == password
         | 
| 261 | 
            -
                     | 
| 262 | 
            -
             | 
| 252 | 
            +
                    else
         | 
| 253 | 
            +
                      db.get(Sequel.function(function_name(:rodauth_valid_password_hash), account_id, BCrypt::Engine.hash_secret(password, hash)))
         | 
| 254 | 
            +
                    end 
         | 
| 263 255 | 
             
                  end
         | 
| 264 256 | 
             
                end
         | 
| 265 257 |  | 
| @@ -358,6 +350,20 @@ module Rodauth | |
| 358 350 | 
             
                  end
         | 
| 359 351 | 
             
                end
         | 
| 360 352 |  | 
| 353 | 
            +
                # Get the password hash for the user.  When using database authentication functions,
         | 
| 354 | 
            +
                # note that only the salt is returned.
         | 
| 355 | 
            +
                def get_password_hash
         | 
| 356 | 
            +
                  if account_password_hash_column
         | 
| 357 | 
            +
                    account[account_password_hash_column]
         | 
| 358 | 
            +
                  elsif use_database_authentication_functions?
         | 
| 359 | 
            +
                    db.get(Sequel.function(function_name(:rodauth_get_salt), account_id))
         | 
| 360 | 
            +
                  else
         | 
| 361 | 
            +
                    # :nocov:
         | 
| 362 | 
            +
                    password_hash_ds.get(password_hash_column)
         | 
| 363 | 
            +
                    # :nocov:
         | 
| 364 | 
            +
                  end
         | 
| 365 | 
            +
                end
         | 
| 366 | 
            +
             | 
| 361 367 | 
             
                def _account_from_login(login)
         | 
| 362 368 | 
             
                  ds = db[accounts_table].where(login_column=>login)
         | 
| 363 369 | 
             
                  ds = ds.select(*account_select) if account_select
         | 
| @@ -56,7 +56,7 @@ module Rodauth | |
| 56 56 | 
             
                    update_account(account_password_hash_column=>hash)
         | 
| 57 57 | 
             
                  elsif password_hash_ds.update(password_hash_column=>hash) == 0
         | 
| 58 58 | 
             
                    # This shouldn't raise a uniqueness error, as the update should only fail for a new user,
         | 
| 59 | 
            -
                    # and an existing user  | 
| 59 | 
            +
                    # and an existing user should always have a valid password hash row.  If this does
         | 
| 60 60 | 
             
                    # fail, retrying it will cause problems, it will override a concurrently running update
         | 
| 61 61 | 
             
                    # with potentially a different password.
         | 
| 62 62 | 
             
                    db[password_hash_table].insert(password_hash_id_column=>account_id, password_hash_column=>hash)
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            # frozen-string-literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Rodauth
         | 
| 4 | 
            +
              UpdatePasswordHash = Feature.define(:update_password_hash) do
         | 
| 5 | 
            +
                depends :login_password_requirements_base
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                def password_match?(password)
         | 
| 8 | 
            +
                  if (result = super) && update_password_hash?
         | 
| 9 | 
            +
                    set_password(password)
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  result
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                private
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def update_password_hash?
         | 
| 18 | 
            +
                  password_hash_cost != @current_password_hash_cost
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                def get_password_hash
         | 
| 22 | 
            +
                  if hash = super
         | 
| 23 | 
            +
                    @current_password_hash_cost = hash.split('$')[2].to_i
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  hash
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
            end
         | 
    
        data/lib/rodauth/version.rb
    CHANGED
    
    
| @@ -0,0 +1,40 @@ | |
| 1 | 
            +
            require File.expand_path("spec_helper", File.dirname(__FILE__))
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe 'Rodauth update_password feature' do
         | 
| 4 | 
            +
              [false, true].each do |ph|
         | 
| 5 | 
            +
                it "should support updating passwords for accounts #{'with account_password_hash_column' if ph} if hash cost changes" do
         | 
| 6 | 
            +
                  cost = BCrypt::Engine::MIN_COST
         | 
| 7 | 
            +
                  rodauth do
         | 
| 8 | 
            +
                    enable :login, :logout, :update_password_hash
         | 
| 9 | 
            +
                    account_password_hash_column :ph if ph
         | 
| 10 | 
            +
                    password_hash_cost{cost}
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                  roda do |r|
         | 
| 13 | 
            +
                    r.rodauth
         | 
| 14 | 
            +
                    next unless session[:account_id]
         | 
| 15 | 
            +
                    rodauth.account_from_session
         | 
| 16 | 
            +
                    r.root{rodauth.send(:get_password_hash)}
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  login
         | 
| 20 | 
            +
                  content = page.html
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  logout
         | 
| 23 | 
            +
                  login
         | 
| 24 | 
            +
                  page.current_path.must_equal '/'
         | 
| 25 | 
            +
                  content.must_equal page.html
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  cost += 1
         | 
| 28 | 
            +
                  logout
         | 
| 29 | 
            +
                  login
         | 
| 30 | 
            +
                  new_content = page.html
         | 
| 31 | 
            +
                  page.current_path.must_equal '/'
         | 
| 32 | 
            +
                  content.wont_equal new_content
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  logout
         | 
| 35 | 
            +
                  login
         | 
| 36 | 
            +
                  page.current_path.must_equal '/'
         | 
| 37 | 
            +
                  new_content.must_equal page.html
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rodauth
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.4.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Jeremy Evans
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2016- | 
| 11 | 
            +
            date: 2016-08-18 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: sequel
         | 
| @@ -224,10 +224,12 @@ extra_rdoc_files: | |
| 224 224 | 
             
            - doc/verify_account_grace_period.rdoc
         | 
| 225 225 | 
             
            - doc/confirm_password.rdoc
         | 
| 226 226 | 
             
            - doc/verify_change_login.rdoc
         | 
| 227 | 
            +
            - doc/update_password_hash.rdoc
         | 
| 227 228 | 
             
            - doc/release_notes/1.0.0.txt
         | 
| 228 229 | 
             
            - doc/release_notes/1.1.0.txt
         | 
| 229 230 | 
             
            - doc/release_notes/1.2.0.txt
         | 
| 230 231 | 
             
            - doc/release_notes/1.3.0.txt
         | 
| 232 | 
            +
            - doc/release_notes/1.4.0.txt
         | 
| 231 233 | 
             
            files:
         | 
| 232 234 | 
             
            - CHANGELOG
         | 
| 233 235 | 
             
            - MIT-LICENSE
         | 
| @@ -256,12 +258,14 @@ files: | |
| 256 258 | 
             
            - doc/release_notes/1.1.0.txt
         | 
| 257 259 | 
             
            - doc/release_notes/1.2.0.txt
         | 
| 258 260 | 
             
            - doc/release_notes/1.3.0.txt
         | 
| 261 | 
            +
            - doc/release_notes/1.4.0.txt
         | 
| 259 262 | 
             
            - doc/remember.rdoc
         | 
| 260 263 | 
             
            - doc/reset_password.rdoc
         | 
| 261 264 | 
             
            - doc/session_expiration.rdoc
         | 
| 262 265 | 
             
            - doc/single_session.rdoc
         | 
| 263 266 | 
             
            - doc/sms_codes.rdoc
         | 
| 264 267 | 
             
            - doc/two_factor_base.rdoc
         | 
| 268 | 
            +
            - doc/update_password_hash.rdoc
         | 
| 265 269 | 
             
            - doc/verify_account.rdoc
         | 
| 266 270 | 
             
            - doc/verify_account_grace_period.rdoc
         | 
| 267 271 | 
             
            - doc/verify_change_login.rdoc
         | 
| @@ -292,6 +296,7 @@ files: | |
| 292 296 | 
             
            - lib/rodauth/features/single_session.rb
         | 
| 293 297 | 
             
            - lib/rodauth/features/sms_codes.rb
         | 
| 294 298 | 
             
            - lib/rodauth/features/two_factor_base.rb
         | 
| 299 | 
            +
            - lib/rodauth/features/update_password_hash.rb
         | 
| 295 300 | 
             
            - lib/rodauth/features/verify_account.rb
         | 
| 296 301 | 
             
            - lib/rodauth/features/verify_account_grace_period.rb
         | 
| 297 302 | 
             
            - lib/rodauth/features/verify_change_login.rb
         | 
| @@ -321,6 +326,7 @@ files: | |
| 321 326 | 
             
            - spec/single_session_spec.rb
         | 
| 322 327 | 
             
            - spec/spec_helper.rb
         | 
| 323 328 | 
             
            - spec/two_factor_spec.rb
         | 
| 329 | 
            +
            - spec/update_password_hash_spec.rb
         | 
| 324 330 | 
             
            - spec/verify_account_grace_period_spec.rb
         | 
| 325 331 | 
             
            - spec/verify_account_spec.rb
         | 
| 326 332 | 
             
            - spec/verify_change_login_spec.rb
         |