Skip to content

Commit 4465f98

Browse files
Remove legacy salt in password setter
1 parent b552599 commit 4465f98

9 files changed

Lines changed: 60 additions & 6 deletions

File tree

lib/devise-argon2/model.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ def valid_password?(password)
3838
is_valid
3939
end
4040

41+
def password=(new_password)
42+
self.password_salt = nil if migrate_hash_from_devise_argon2_v1?
43+
super
44+
end
45+
4146
protected
4247

4348
def password_digest(password)

spec/devise-argon2_spec.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,4 +302,38 @@ def work_factors(hash)
302302
)
303303
end
304304
end
305+
306+
describe 'password reset' do
307+
NEW_PASSWORD = 'new password'
308+
309+
shared_examples 'ways of resetting the password' do
310+
it 'can be done via password_reset' do
311+
user.reset_password(NEW_PASSWORD, NEW_PASSWORD)
312+
expect(user.valid_password?(NEW_PASSWORD)).to be true
313+
end
314+
315+
it 'can be done via password=' do
316+
user.password = NEW_PASSWORD
317+
expect(user.valid_password?(NEW_PASSWORD)).to be true
318+
end
319+
end
320+
321+
context 'encrypted_password is hashed with the current version of devise-argon2' do
322+
include_examples 'ways of resetting the password'
323+
end
324+
325+
context 'encrypted_password is hashed with version 1 of devise-argon2' do
326+
let(:user) { OldUser.new(password: CORRECT_PASSWORD) }
327+
328+
before do
329+
Devise.argon2_options.merge!({ migrate_from_devise_argon2_v1: true })
330+
user.password_salt = 'devise-argon2 v1 salt'
331+
user.encrypted_password = ::Argon2::Password.create(
332+
"#{CORRECT_PASSWORD}#{user.password_salt}#{Devise.pepper}"
333+
)
334+
end
335+
336+
include_examples 'ways of resetting the password'
337+
end
338+
end
305339
end
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
class OldUser < ActiveRecord::Base
2-
devise :database_authenticatable, :argon2
2+
devise :database_authenticatable, :recoverable, :argon2
33
end
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
class User < ActiveRecord::Base
2-
devise :database_authenticatable, :argon2
2+
devise :database_authenticatable, :recoverable, :argon2
33
end

spec/rails_app/app/mongoid/old_user.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
class OldUser
22
include Mongoid::Document
33

4-
devise :database_authenticatable, :argon2
4+
devise :database_authenticatable, :recoverable, :argon2
55

66
field :email, type: String, default: ""
77
field :encrypted_password, type: String, default: ""

spec/rails_app/app/mongoid/user.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
class User
22
include Mongoid::Document
33

4-
devise :database_authenticatable, :argon2
4+
devise :database_authenticatable, :recoverable, :argon2
55

66
field :email, type: String, default: ""
77
field :encrypted_password, type: String, default: ""
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class AddRecoverableFieldsToUsers < ActiveRecord::Migration[7.2]
2+
def change
3+
add_column :users, :reset_password_token, :string
4+
add_column :users, :reset_password_sent_at, :datetime
5+
end
6+
end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class AddRecoverableFieldsToOldUsers < ActiveRecord::Migration[7.2]
2+
def change
3+
add_column :old_users, :reset_password_token, :string
4+
add_column :old_users, :reset_password_sent_at, :datetime
5+
end
6+
end

spec/rails_app/db/schema.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@
1010
#
1111
# It's strongly recommended that you check this file into your version control system.
1212

13-
ActiveRecord::Schema.define(version: 2023_10_04_084147) do
13+
ActiveRecord::Schema.define(version: 2025_03_19_085738) do
1414
create_table "old_users", force: :cascade do |t|
1515
t.string "email", default: "", null: false
1616
t.string "encrypted_password", default: "", null: false
1717
t.string "password_salt"
1818
t.datetime "created_at", null: false
1919
t.datetime "updated_at", null: false
20+
t.string "reset_password_token"
21+
t.datetime "reset_password_sent_at"
2022
t.index ["email"], name: "index_old_users_on_email", unique: true
2123
end
2224

@@ -25,7 +27,8 @@
2527
t.string "encrypted_password", default: "", null: false
2628
t.datetime "created_at", null: false
2729
t.datetime "updated_at", null: false
30+
t.string "reset_password_token"
31+
t.datetime "reset_password_sent_at"
2832
t.index ["email"], name: "index_users_on_email", unique: true
2933
end
30-
3134
end

0 commit comments

Comments
 (0)