protected 1.0.0 → 1.0.1
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.
- data/MIT-LICENSE +1 -1
- data/app/models/protected/user.rb +1 -3
- data/config/initializers/devise.rb +2 -2
- data/config/locales/devise.en.yml +1 -0
- data/lib/generators/protected/templates/devise.rb +2 -2
- data/lib/protected.rb +10 -0
- data/lib/protected/password_archiveable.rb +64 -0
- data/lib/protected/version.rb +1 -1
- metadata +5 -4
data/MIT-LICENSE
CHANGED
@@ -69,9 +69,7 @@ module Protected
|
|
69
69
|
require File.dirname(__FILE__) + '/../../../lib/protected/password_utils'
|
70
70
|
|
71
71
|
class User < ActiveRecord::Base
|
72
|
-
|
73
|
-
# :maximum_attempts => 4, :unlock_strategy => :none
|
74
|
-
devise :database_authenticatable, :recoverable, :trackable, :validatable, :lockable, :timeoutable,
|
72
|
+
devise :database_authenticatable, :recoverable, :trackable, :validatable, :lockable, :timeoutable, :password_archivable,
|
75
73
|
:maximum_attempts => 4, :unlock_strategy => :none
|
76
74
|
|
77
75
|
has_many :old_passwords, :as => :password_archivable, :dependent => :destroy
|
@@ -156,8 +156,8 @@ Devise.setup do |config|
|
|
156
156
|
# and :restful_authentication_sha1 (then you should set stretches to 10, and copy
|
157
157
|
# REST_AUTH_SITE_KEY to pepper)
|
158
158
|
config.encryptor = :bcrypt
|
159
|
-
|
160
|
-
|
159
|
+
config.password_archiving_count = 5
|
160
|
+
config.deny_old_passwords = true
|
161
161
|
|
162
162
|
# ==> Configuration for :token_authenticatable
|
163
163
|
# Defines name of the authentication token params key
|
@@ -174,8 +174,8 @@ Devise.setup do |config|
|
|
174
174
|
# REST_AUTH_SITE_KEY to pepper)
|
175
175
|
# config.encryptor = :sha512
|
176
176
|
config.encryptor = :bcrypt
|
177
|
-
|
178
|
-
|
177
|
+
config.password_archiving_count = 5
|
178
|
+
config.deny_old_passwords = true
|
179
179
|
|
180
180
|
# ==> Configuration for :token_authenticatable
|
181
181
|
# Defines name of the authentication token params key
|
data/lib/protected.rb
CHANGED
@@ -1,4 +1,14 @@
|
|
1
1
|
require "protected/engine"
|
2
|
+
require 'devise'
|
3
|
+
module Devise
|
4
|
+
# How often save old passwords in archive
|
5
|
+
mattr_accessor :password_archiving_count
|
6
|
+
@@password_archiving_count = 5
|
2
7
|
|
8
|
+
# Deny old password (true, false, count)
|
9
|
+
mattr_accessor :deny_old_passwords
|
10
|
+
@@deny_old_passwords = true
|
11
|
+
end
|
3
12
|
module Protected
|
4
13
|
end
|
14
|
+
Devise.add_module :password_archivable, :model => "#{File.dirname(__FILE__)}/protected/password_archiveable"
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Devise
|
2
|
+
module Models
|
3
|
+
|
4
|
+
# PasswordArchivable
|
5
|
+
module PasswordArchivable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
has_many :old_passwords, :as => :password_archivable, :dependent => :destroy, :order => 'id DESC'
|
10
|
+
before_update :archive_password
|
11
|
+
validate :validate_password_archive
|
12
|
+
end
|
13
|
+
|
14
|
+
def validate_password_archive
|
15
|
+
self.errors.add(:password, :taken_in_past) if encrypted_password_changed? and password_archive_included?
|
16
|
+
end
|
17
|
+
|
18
|
+
# validate is the password used in the past
|
19
|
+
def password_archive_included?
|
20
|
+
unless self.class.deny_old_passwords.is_a? Fixnum
|
21
|
+
if self.class.deny_old_passwords.is_a? TrueClass and self.class.password_archiving_count > 0
|
22
|
+
self.class.deny_old_passwords = self.class.password_archiving_count
|
23
|
+
else
|
24
|
+
self.class.deny_old_passwords = 0
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
if self.class.deny_old_passwords > 0 and not self.password.nil?
|
29
|
+
self.old_passwords.order('created_at DESC').limit(self.class.deny_old_passwords).each do |old_password|
|
30
|
+
dummy = self.class.new
|
31
|
+
dummy.encrypted_password = old_password.encrypted_password
|
32
|
+
dummy.password_salt = old_password.password_salt if dummy.respond_to?(:password_salt)
|
33
|
+
return true if dummy.valid_password?(self.password)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
false
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
# archive the last password before save and delete all to old passwords from archive
|
43
|
+
def archive_password
|
44
|
+
if self.encrypted_password_changed?
|
45
|
+
if self.class.password_archiving_count.to_i > 0
|
46
|
+
if self.respond_to?(:password_salt_change) and not self.password_salt_change.nil?
|
47
|
+
self.old_passwords.create! :encrypted_password => self.encrypted_password_change.first, :password_salt => self.password_salt_change.first
|
48
|
+
else
|
49
|
+
self.old_passwords.create! :encrypted_password => self.encrypted_password_change.first
|
50
|
+
end
|
51
|
+
self.old_passwords.order('created_at DESC').offset(self.class.password_archiving_count).destroy_all
|
52
|
+
else
|
53
|
+
self.old_passwords.destroy_all
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
module ClassMethods
|
59
|
+
::Devise::Models.config(self, :password_archiving_count, :deny_old_passwords)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
data/lib/protected/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protected
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-05-
|
13
|
+
date: 2012-05-23 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rack
|
@@ -373,6 +373,7 @@ files:
|
|
373
373
|
- lib/generators/protected/views/views_generator.rb
|
374
374
|
- lib/protected/devise_recoverable_extensions.rb
|
375
375
|
- lib/protected/engine.rb
|
376
|
+
- lib/protected/password_archiveable.rb
|
376
377
|
- lib/protected/password_utils.rb
|
377
378
|
- lib/protected/version.rb
|
378
379
|
- lib/protected.rb
|
@@ -394,7 +395,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
394
395
|
version: '0'
|
395
396
|
segments:
|
396
397
|
- 0
|
397
|
-
hash: -
|
398
|
+
hash: -1272936797958317662
|
398
399
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
399
400
|
none: false
|
400
401
|
requirements:
|
@@ -403,7 +404,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
403
404
|
version: '0'
|
404
405
|
segments:
|
405
406
|
- 0
|
406
|
-
hash: -
|
407
|
+
hash: -1272936797958317662
|
407
408
|
requirements: []
|
408
409
|
rubyforge_project:
|
409
410
|
rubygems_version: 1.8.21
|