cloudfoundry-devise 1.5.2
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/.gitignore +12 -0
- data/.travis.yml +13 -0
- data/CHANGELOG.rdoc +755 -0
- data/Gemfile +35 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +366 -0
- data/Rakefile +34 -0
- data/app/controllers/devise/confirmations_controller.rb +46 -0
- data/app/controllers/devise/omniauth_callbacks_controller.rb +26 -0
- data/app/controllers/devise/passwords_controller.rb +50 -0
- data/app/controllers/devise/registrations_controller.rb +114 -0
- data/app/controllers/devise/sessions_controller.rb +49 -0
- data/app/controllers/devise/unlocks_controller.rb +34 -0
- data/app/helpers/devise_helper.rb +25 -0
- data/app/mailers/devise/mailer.rb +15 -0
- data/app/views/devise/confirmations/new.html.erb +12 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise/passwords/edit.html.erb +16 -0
- data/app/views/devise/passwords/new.html.erb +12 -0
- data/app/views/devise/registrations/edit.html.erb +25 -0
- data/app/views/devise/registrations/new.html.erb +18 -0
- data/app/views/devise/sessions/new.html.erb +17 -0
- data/app/views/devise/shared/_links.erb +25 -0
- data/app/views/devise/unlocks/new.html.erb +12 -0
- data/cloudfoundry-devise.gemspec +25 -0
- data/config/locales/en.yml +59 -0
- data/lib/devise.rb +453 -0
- data/lib/devise/controllers/helpers.rb +260 -0
- data/lib/devise/controllers/internal_helpers.rb +161 -0
- data/lib/devise/controllers/rememberable.rb +52 -0
- data/lib/devise/controllers/scoped_views.rb +33 -0
- data/lib/devise/controllers/shared_helpers.rb +26 -0
- data/lib/devise/controllers/url_helpers.rb +53 -0
- data/lib/devise/delegator.rb +16 -0
- data/lib/devise/encryptors/authlogic_sha512.rb +19 -0
- data/lib/devise/encryptors/base.rb +20 -0
- data/lib/devise/encryptors/clearance_sha1.rb +17 -0
- data/lib/devise/encryptors/restful_authentication_sha1.rb +22 -0
- data/lib/devise/encryptors/sha1.rb +25 -0
- data/lib/devise/encryptors/sha512.rb +25 -0
- data/lib/devise/failure_app.rb +149 -0
- data/lib/devise/hooks/activatable.rb +11 -0
- data/lib/devise/hooks/forgetable.rb +9 -0
- data/lib/devise/hooks/rememberable.rb +6 -0
- data/lib/devise/hooks/timeoutable.rb +24 -0
- data/lib/devise/hooks/trackable.rb +9 -0
- data/lib/devise/mailers/helpers.rb +86 -0
- data/lib/devise/mapping.rb +175 -0
- data/lib/devise/models.rb +91 -0
- data/lib/devise/models/authenticatable.rb +181 -0
- data/lib/devise/models/confirmable.rb +220 -0
- data/lib/devise/models/database_authenticatable.rb +122 -0
- data/lib/devise/models/encryptable.rb +72 -0
- data/lib/devise/models/lockable.rb +169 -0
- data/lib/devise/models/omniauthable.rb +23 -0
- data/lib/devise/models/recoverable.rb +136 -0
- data/lib/devise/models/registerable.rb +21 -0
- data/lib/devise/models/rememberable.rb +114 -0
- data/lib/devise/models/serializable.rb +43 -0
- data/lib/devise/models/timeoutable.rb +45 -0
- data/lib/devise/models/token_authenticatable.rb +72 -0
- data/lib/devise/models/trackable.rb +30 -0
- data/lib/devise/models/validatable.rb +62 -0
- data/lib/devise/modules.rb +30 -0
- data/lib/devise/omniauth.rb +28 -0
- data/lib/devise/omniauth/config.rb +45 -0
- data/lib/devise/omniauth/url_helpers.rb +33 -0
- data/lib/devise/orm/active_record.rb +44 -0
- data/lib/devise/orm/mongoid.rb +31 -0
- data/lib/devise/param_filter.rb +41 -0
- data/lib/devise/path_checker.rb +18 -0
- data/lib/devise/rails.rb +73 -0
- data/lib/devise/rails/routes.rb +385 -0
- data/lib/devise/rails/warden_compat.rb +120 -0
- data/lib/devise/schema.rb +109 -0
- data/lib/devise/strategies/authenticatable.rb +155 -0
- data/lib/devise/strategies/base.rb +15 -0
- data/lib/devise/strategies/database_authenticatable.rb +21 -0
- data/lib/devise/strategies/rememberable.rb +53 -0
- data/lib/devise/strategies/token_authenticatable.rb +57 -0
- data/lib/devise/test_helpers.rb +90 -0
- data/lib/devise/version.rb +3 -0
- data/lib/generators/active_record/devise_generator.rb +71 -0
- data/lib/generators/active_record/templates/migration.rb +29 -0
- data/lib/generators/active_record/templates/migration_existing.rb +26 -0
- data/lib/generators/devise/devise_generator.rb +22 -0
- data/lib/generators/devise/install_generator.rb +24 -0
- data/lib/generators/devise/orm_helpers.rb +31 -0
- data/lib/generators/devise/views_generator.rb +98 -0
- data/lib/generators/mongoid/devise_generator.rb +60 -0
- data/lib/generators/templates/README +32 -0
- data/lib/generators/templates/devise.rb +215 -0
- data/lib/generators/templates/markerb/confirmation_instructions.markerb +5 -0
- data/lib/generators/templates/markerb/reset_password_instructions.markerb +8 -0
- data/lib/generators/templates/markerb/unlock_instructions.markerb +7 -0
- data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +15 -0
- data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +19 -0
- data/lib/generators/templates/simple_form_for/passwords/new.html.erb +15 -0
- data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +22 -0
- data/lib/generators/templates/simple_form_for/registrations/new.html.erb +17 -0
- data/lib/generators/templates/simple_form_for/sessions/new.html.erb +15 -0
- data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +15 -0
- data/test/controllers/helpers_test.rb +254 -0
- data/test/controllers/internal_helpers_test.rb +96 -0
- data/test/controllers/sessions_controller_test.rb +16 -0
- data/test/controllers/url_helpers_test.rb +59 -0
- data/test/delegator_test.rb +19 -0
- data/test/devise_test.rb +72 -0
- data/test/encryptors_test.rb +30 -0
- data/test/failure_app_test.rb +207 -0
- data/test/generators/active_record_generator_test.rb +47 -0
- data/test/generators/devise_generator_test.rb +39 -0
- data/test/generators/install_generator_test.rb +13 -0
- data/test/generators/mongoid_generator_test.rb +23 -0
- data/test/generators/views_generator_test.rb +52 -0
- data/test/helpers/devise_helper_test.rb +51 -0
- data/test/indifferent_hash.rb +33 -0
- data/test/integration/authenticatable_test.rb +590 -0
- data/test/integration/confirmable_test.rb +262 -0
- data/test/integration/database_authenticatable_test.rb +82 -0
- data/test/integration/http_authenticatable_test.rb +82 -0
- data/test/integration/lockable_test.rb +212 -0
- data/test/integration/omniauthable_test.rb +133 -0
- data/test/integration/recoverable_test.rb +287 -0
- data/test/integration/registerable_test.rb +335 -0
- data/test/integration/rememberable_test.rb +158 -0
- data/test/integration/timeoutable_test.rb +98 -0
- data/test/integration/token_authenticatable_test.rb +148 -0
- data/test/integration/trackable_test.rb +92 -0
- data/test/mailers/confirmation_instructions_test.rb +95 -0
- data/test/mailers/reset_password_instructions_test.rb +83 -0
- data/test/mailers/unlock_instructions_test.rb +77 -0
- data/test/mapping_test.rb +128 -0
- data/test/models/confirmable_test.rb +334 -0
- data/test/models/database_authenticatable_test.rb +167 -0
- data/test/models/encryptable_test.rb +67 -0
- data/test/models/lockable_test.rb +225 -0
- data/test/models/recoverable_test.rb +198 -0
- data/test/models/rememberable_test.rb +168 -0
- data/test/models/serializable_test.rb +38 -0
- data/test/models/timeoutable_test.rb +42 -0
- data/test/models/token_authenticatable_test.rb +49 -0
- data/test/models/trackable_test.rb +5 -0
- data/test/models/validatable_test.rb +113 -0
- data/test/models_test.rb +109 -0
- data/test/omniauth/config_test.rb +57 -0
- data/test/omniauth/url_helpers_test.rb +58 -0
- data/test/orm/active_record.rb +9 -0
- data/test/orm/mongoid.rb +14 -0
- data/test/rails_app/Rakefile +10 -0
- data/test/rails_app/app/active_record/admin.rb +6 -0
- data/test/rails_app/app/active_record/shim.rb +2 -0
- data/test/rails_app/app/active_record/user.rb +6 -0
- data/test/rails_app/app/controllers/admins/sessions_controller.rb +6 -0
- data/test/rails_app/app/controllers/admins_controller.rb +6 -0
- data/test/rails_app/app/controllers/application_controller.rb +8 -0
- data/test/rails_app/app/controllers/home_controller.rb +25 -0
- data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
- data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
- data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +14 -0
- data/test/rails_app/app/controllers/users_controller.rb +23 -0
- data/test/rails_app/app/helpers/application_helper.rb +3 -0
- data/test/rails_app/app/mailers/users/mailer.rb +3 -0
- data/test/rails_app/app/mongoid/admin.rb +24 -0
- data/test/rails_app/app/mongoid/shim.rb +24 -0
- data/test/rails_app/app/mongoid/user.rb +45 -0
- data/test/rails_app/app/views/admins/index.html.erb +1 -0
- data/test/rails_app/app/views/admins/sessions/new.html.erb +2 -0
- data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -0
- data/test/rails_app/app/views/home/index.html.erb +1 -0
- data/test/rails_app/app/views/home/join.html.erb +1 -0
- data/test/rails_app/app/views/home/private.html.erb +1 -0
- data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -0
- data/test/rails_app/app/views/layouts/application.html.erb +24 -0
- data/test/rails_app/app/views/users/index.html.erb +1 -0
- data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +1 -0
- data/test/rails_app/app/views/users/sessions/new.html.erb +1 -0
- data/test/rails_app/config.ru +4 -0
- data/test/rails_app/config/application.rb +41 -0
- data/test/rails_app/config/boot.rb +8 -0
- data/test/rails_app/config/database.yml +18 -0
- data/test/rails_app/config/environment.rb +5 -0
- data/test/rails_app/config/environments/development.rb +18 -0
- data/test/rails_app/config/environments/production.rb +33 -0
- data/test/rails_app/config/environments/test.rb +33 -0
- data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
- data/test/rails_app/config/initializers/devise.rb +197 -0
- data/test/rails_app/config/initializers/inflections.rb +2 -0
- data/test/rails_app/config/initializers/secret_token.rb +2 -0
- data/test/rails_app/config/routes.rb +87 -0
- data/test/rails_app/db/migrate/20100401102949_create_tables.rb +71 -0
- data/test/rails_app/db/schema.rb +52 -0
- data/test/rails_app/lib/shared_admin.rb +10 -0
- data/test/rails_app/lib/shared_user.rb +26 -0
- data/test/rails_app/public/404.html +26 -0
- data/test/rails_app/public/422.html +26 -0
- data/test/rails_app/public/500.html +26 -0
- data/test/rails_app/public/favicon.ico +0 -0
- data/test/rails_app/script/rails +10 -0
- data/test/routes_test.rb +240 -0
- data/test/support/assertions.rb +27 -0
- data/test/support/helpers.rb +109 -0
- data/test/support/integration.rb +88 -0
- data/test/support/locale/en.yml +4 -0
- data/test/support/webrat/integrations/rails.rb +24 -0
- data/test/test_helper.rb +27 -0
- data/test/test_helpers_test.rb +134 -0
- metadata +295 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'devise/omniauth'
|
|
2
|
+
|
|
3
|
+
module Devise
|
|
4
|
+
module Models
|
|
5
|
+
# Adds OmniAuth support to your model.
|
|
6
|
+
#
|
|
7
|
+
# == Options
|
|
8
|
+
#
|
|
9
|
+
# Oauthable adds the following options to devise_for:
|
|
10
|
+
#
|
|
11
|
+
# * +omniauth_providers+: Which providers are avaialble to this model. It expects an array:
|
|
12
|
+
#
|
|
13
|
+
# devise_for :database_authenticatable, :omniauthable, :omniauth_providers => [:twitter]
|
|
14
|
+
#
|
|
15
|
+
module Omniauthable
|
|
16
|
+
extend ActiveSupport::Concern
|
|
17
|
+
|
|
18
|
+
module ClassMethods
|
|
19
|
+
Devise::Models.config(self, :omniauth_providers)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
module Devise
|
|
2
|
+
module Models
|
|
3
|
+
|
|
4
|
+
# Recoverable takes care of reseting the user password and send reset instructions.
|
|
5
|
+
#
|
|
6
|
+
# ==Options
|
|
7
|
+
#
|
|
8
|
+
# Recoverable adds the following options to devise_for:
|
|
9
|
+
#
|
|
10
|
+
# * +reset_password_keys+: the keys you want to use when recovering the password for an account
|
|
11
|
+
#
|
|
12
|
+
# == Examples
|
|
13
|
+
#
|
|
14
|
+
# # resets the user password and save the record, true if valid passwords are given, otherwise false
|
|
15
|
+
# User.find(1).reset_password!('password123', 'password123')
|
|
16
|
+
#
|
|
17
|
+
# # only resets the user password, without saving the record
|
|
18
|
+
# user = User.find(1)
|
|
19
|
+
# user.reset_password('password123', 'password123')
|
|
20
|
+
#
|
|
21
|
+
# # creates a new token and send it with instructions about how to reset the password
|
|
22
|
+
# User.find(1).send_reset_password_instructions
|
|
23
|
+
#
|
|
24
|
+
module Recoverable
|
|
25
|
+
extend ActiveSupport::Concern
|
|
26
|
+
|
|
27
|
+
# Update password saving the record and clearing token. Returns true if
|
|
28
|
+
# the passwords are valid and the record was saved, false otherwise.
|
|
29
|
+
def reset_password!(new_password, new_password_confirmation)
|
|
30
|
+
self.password = new_password
|
|
31
|
+
self.password_confirmation = new_password_confirmation
|
|
32
|
+
|
|
33
|
+
if valid?
|
|
34
|
+
clear_reset_password_token
|
|
35
|
+
after_password_reset
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
save
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Resets reset password token and send reset password instructions by email
|
|
42
|
+
def send_reset_password_instructions
|
|
43
|
+
generate_reset_password_token! if should_generate_token?
|
|
44
|
+
self.devise_mailer.reset_password_instructions(self).deliver
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Checks if the reset password token sent is within the limit time.
|
|
48
|
+
# We do this by calculating if the difference between today and the
|
|
49
|
+
# sending date does not exceed the confirm in time configured.
|
|
50
|
+
# Returns true if the resource is not responding to reset_password_sent_at at all.
|
|
51
|
+
# reset_password_within is a model configuration, must always be an integer value.
|
|
52
|
+
#
|
|
53
|
+
# Example:
|
|
54
|
+
#
|
|
55
|
+
# # reset_password_within = 1.day and reset_password_sent_at = today
|
|
56
|
+
# reset_password_period_valid? # returns true
|
|
57
|
+
#
|
|
58
|
+
# # reset_password_within = 5.days and reset_password_sent_at = 4.days.ago
|
|
59
|
+
# reset_password_period_valid? # returns true
|
|
60
|
+
#
|
|
61
|
+
# # reset_password_within = 5.days and reset_password_sent_at = 5.days.ago
|
|
62
|
+
# reset_password_period_valid? # returns false
|
|
63
|
+
#
|
|
64
|
+
# # reset_password_within = 0.days
|
|
65
|
+
# reset_password_period_valid? # will always return false
|
|
66
|
+
#
|
|
67
|
+
def reset_password_period_valid?
|
|
68
|
+
reset_password_sent_at && reset_password_sent_at.utc >= self.class.reset_password_within.ago
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
protected
|
|
72
|
+
|
|
73
|
+
def should_generate_token?
|
|
74
|
+
reset_password_token.nil? || !reset_password_period_valid?
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Generates a new random token for reset password
|
|
78
|
+
def generate_reset_password_token
|
|
79
|
+
self.reset_password_token = self.class.reset_password_token
|
|
80
|
+
self.reset_password_sent_at = Time.now.utc
|
|
81
|
+
self.reset_password_token
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Resets the reset password token with and save the record without
|
|
85
|
+
# validating
|
|
86
|
+
def generate_reset_password_token!
|
|
87
|
+
generate_reset_password_token && save(:validate => false)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Removes reset_password token
|
|
91
|
+
def clear_reset_password_token
|
|
92
|
+
self.reset_password_token = nil
|
|
93
|
+
self.reset_password_sent_at = nil
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def after_password_reset
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
module ClassMethods
|
|
100
|
+
# Attempt to find a user by its email. If a record is found, send new
|
|
101
|
+
# password instructions to it. If not user is found, returns a new user
|
|
102
|
+
# with an email not found error.
|
|
103
|
+
# Attributes must contain the user email
|
|
104
|
+
def send_reset_password_instructions(attributes={})
|
|
105
|
+
recoverable = find_or_initialize_with_errors(reset_password_keys, attributes, :not_found)
|
|
106
|
+
recoverable.send_reset_password_instructions if recoverable.persisted?
|
|
107
|
+
recoverable
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Generate a token checking if one does not already exist in the database.
|
|
111
|
+
def reset_password_token
|
|
112
|
+
generate_token(:reset_password_token)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Attempt to find a user by its reset_password_token to reset its
|
|
116
|
+
# password. If a user is found and token is still valid, reset its password and automatically
|
|
117
|
+
# try saving the record. If not user is found, returns a new user
|
|
118
|
+
# containing an error in reset_password_token attribute.
|
|
119
|
+
# Attributes must contain reset_password_token, password and confirmation
|
|
120
|
+
def reset_password_by_token(attributes={})
|
|
121
|
+
recoverable = find_or_initialize_with_error_by(:reset_password_token, attributes[:reset_password_token])
|
|
122
|
+
if recoverable.persisted?
|
|
123
|
+
if recoverable.reset_password_period_valid?
|
|
124
|
+
recoverable.reset_password!(attributes[:password], attributes[:password_confirmation])
|
|
125
|
+
else
|
|
126
|
+
recoverable.errors.add(:reset_password_token, :expired)
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
recoverable
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
Devise::Models.config(self, :reset_password_keys, :reset_password_within)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Devise
|
|
2
|
+
module Models
|
|
3
|
+
# Registerable is responsible for everything related to registering a new
|
|
4
|
+
# resource (ie user sign up).
|
|
5
|
+
module Registerable
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
module ClassMethods
|
|
9
|
+
# A convenience method that receives both parameters and session to
|
|
10
|
+
# initialize a user. This can be used by OAuth, for example, to send
|
|
11
|
+
# in the user token and be stored on initialization.
|
|
12
|
+
#
|
|
13
|
+
# By default discards all information sent by the session by calling
|
|
14
|
+
# new with params.
|
|
15
|
+
def new_with_session(params, session)
|
|
16
|
+
new(params)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
require 'devise/strategies/rememberable'
|
|
2
|
+
require 'devise/hooks/rememberable'
|
|
3
|
+
require 'devise/hooks/forgetable'
|
|
4
|
+
|
|
5
|
+
module Devise
|
|
6
|
+
module Models
|
|
7
|
+
# Rememberable manages generating and clearing token for remember the user
|
|
8
|
+
# from a saved cookie. Rememberable also has utility methods for dealing
|
|
9
|
+
# with serializing the user into the cookie and back from the cookie, trying
|
|
10
|
+
# to lookup the record based on the saved information.
|
|
11
|
+
# You probably wouldn't use rememberable methods directly, they are used
|
|
12
|
+
# mostly internally for handling the remember token.
|
|
13
|
+
#
|
|
14
|
+
# == Options
|
|
15
|
+
#
|
|
16
|
+
# Rememberable adds the following options in devise_for:
|
|
17
|
+
#
|
|
18
|
+
# * +remember_for+: the time you want the user will be remembered without
|
|
19
|
+
# asking for credentials. After this time the user will be blocked and
|
|
20
|
+
# will have to enter his credentials again. This configuration is also
|
|
21
|
+
# used to calculate the expires time for the cookie created to remember
|
|
22
|
+
# the user. By default remember_for is 2.weeks.
|
|
23
|
+
#
|
|
24
|
+
# * +extend_remember_period+: if true, extends the user's remember period
|
|
25
|
+
# when remembered via cookie. False by default.
|
|
26
|
+
#
|
|
27
|
+
# * +cookie_options+: configuration options passed to the created cookie.
|
|
28
|
+
#
|
|
29
|
+
# == Examples
|
|
30
|
+
#
|
|
31
|
+
# User.find(1).remember_me! # regenerating the token
|
|
32
|
+
# User.find(1).forget_me! # clearing the token
|
|
33
|
+
#
|
|
34
|
+
# # generating info to put into cookies
|
|
35
|
+
# User.serialize_into_cookie(user)
|
|
36
|
+
#
|
|
37
|
+
# # lookup the user based on the incoming cookie information
|
|
38
|
+
# User.serialize_from_cookie(cookie_string)
|
|
39
|
+
module Rememberable
|
|
40
|
+
extend ActiveSupport::Concern
|
|
41
|
+
|
|
42
|
+
attr_accessor :remember_me, :extend_remember_period
|
|
43
|
+
|
|
44
|
+
# Generate a new remember token and save the record without validations
|
|
45
|
+
# unless remember_across_browsers is true and the user already has a valid token.
|
|
46
|
+
def remember_me!(extend_period=false)
|
|
47
|
+
self.remember_created_at = Time.now.utc if generate_remember_timestamp?(extend_period)
|
|
48
|
+
save(:validate => false)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# If the record is persisted, remove the remember token (but only if
|
|
52
|
+
# it exists), and save the record without validations.
|
|
53
|
+
def forget_me!
|
|
54
|
+
if persisted?
|
|
55
|
+
self.remember_token = nil if respond_to?(:remember_token=)
|
|
56
|
+
self.remember_created_at = nil
|
|
57
|
+
save(:validate => false)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Remember token should be expired if expiration time not overpass now.
|
|
62
|
+
def remember_expired?
|
|
63
|
+
remember_created_at.nil? || (remember_expires_at <= Time.now.utc)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Remember token expires at created time + remember_for configuration
|
|
67
|
+
def remember_expires_at
|
|
68
|
+
remember_created_at + self.class.remember_for
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def rememberable_value
|
|
72
|
+
if respond_to?(:authenticatable_salt) && (salt = authenticatable_salt)
|
|
73
|
+
salt
|
|
74
|
+
else
|
|
75
|
+
raise "The #{self.class.name} class does not respond to remember_token and " <<
|
|
76
|
+
"authenticatable_salt returns nil. In order to use rememberable, you must " <<
|
|
77
|
+
"add a remember_token field to your model or ensure a password is always set."
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def cookie_options
|
|
82
|
+
self.class.cookie_options
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
protected
|
|
86
|
+
|
|
87
|
+
# Generate a timestamp if extend_remember_period is true, if no remember_token
|
|
88
|
+
# exists, or if an existing remember token has expired.
|
|
89
|
+
def generate_remember_timestamp?(extend_period) #:nodoc:
|
|
90
|
+
extend_period || remember_created_at.nil? || remember_expired?
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
module ClassMethods
|
|
94
|
+
# Create the cookie key using the record id and remember_token
|
|
95
|
+
def serialize_into_cookie(record)
|
|
96
|
+
[record.to_key, record.rememberable_value]
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Recreate the user based on the stored cookie
|
|
100
|
+
def serialize_from_cookie(id, remember_token)
|
|
101
|
+
record = to_adapter.get(id)
|
|
102
|
+
record if record && record.rememberable_value == remember_token && !record.remember_expired?
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Generate a token checking if one does not already exist in the database.
|
|
106
|
+
def remember_token
|
|
107
|
+
generate_token(:remember_token)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
Devise::Models.config(self, :remember_for, :extend_remember_period, :cookie_options)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module Devise
|
|
2
|
+
module Models
|
|
3
|
+
# This module redefine to_xml and serializable_hash in models for more
|
|
4
|
+
# secure defaults. By default, it removes from the serializable model
|
|
5
|
+
# all attributes that are *not* accessible. You can remove this default
|
|
6
|
+
# by using :force_except and passing a new list of attributes you want
|
|
7
|
+
# to exempt. All attributes given to :except will simply add names to
|
|
8
|
+
# exempt to Devise internal list.
|
|
9
|
+
module Serializable
|
|
10
|
+
extend ActiveSupport::Concern
|
|
11
|
+
|
|
12
|
+
# TODO: to_xml does not call serializable_hash. Hopefully someone will fix this in AR.
|
|
13
|
+
%w(to_xml serializable_hash).each do |method|
|
|
14
|
+
class_eval <<-RUBY, __FILE__, __LINE__
|
|
15
|
+
def #{method}(options=nil)
|
|
16
|
+
options ||= {}
|
|
17
|
+
if options.key?(:force_except)
|
|
18
|
+
options[:except] = options.delete(:force_except)
|
|
19
|
+
super(options)
|
|
20
|
+
elsif self.class.blacklist_keys?
|
|
21
|
+
except = Array(options[:except])
|
|
22
|
+
super(options.merge(:except => except + self.class.blacklist_keys))
|
|
23
|
+
else
|
|
24
|
+
super
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
RUBY
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
module ClassMethods
|
|
31
|
+
# Return true if we can retrieve blacklist keys from the record.
|
|
32
|
+
def blacklist_keys?
|
|
33
|
+
@has_except_keys ||= respond_to?(:accessible_attributes) && !accessible_attributes.to_a.empty?
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Returns keys that should be removed when serializing the record.
|
|
37
|
+
def blacklist_keys
|
|
38
|
+
@blacklist_keys ||= to_adapter.column_names.map(&:to_s) - accessible_attributes.to_a.map(&:to_s)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require 'devise/hooks/timeoutable'
|
|
2
|
+
|
|
3
|
+
module Devise
|
|
4
|
+
module Models
|
|
5
|
+
# Timeoutable takes care of veryfing whether a user session has already
|
|
6
|
+
# expired or not. When a session expires after the configured time, the user
|
|
7
|
+
# will be asked for credentials again, it means, he/she will be redirected
|
|
8
|
+
# to the sign in page.
|
|
9
|
+
#
|
|
10
|
+
# == Options
|
|
11
|
+
#
|
|
12
|
+
# Timeoutable adds the following options to devise_for:
|
|
13
|
+
#
|
|
14
|
+
# * +timeout_in+: the interval to timeout the user session without activity.
|
|
15
|
+
#
|
|
16
|
+
# == Examples
|
|
17
|
+
#
|
|
18
|
+
# user.timedout?(30.minutes.ago)
|
|
19
|
+
#
|
|
20
|
+
module Timeoutable
|
|
21
|
+
extend ActiveSupport::Concern
|
|
22
|
+
|
|
23
|
+
# Checks whether the user session has expired based on configured time.
|
|
24
|
+
def timedout?(last_access)
|
|
25
|
+
return false if remember_exists_and_not_expired?
|
|
26
|
+
!timeout_in.nil? && last_access && last_access <= timeout_in.ago
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def timeout_in
|
|
30
|
+
self.class.timeout_in
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def remember_exists_and_not_expired?
|
|
36
|
+
return false unless respond_to?(:remember_created_at)
|
|
37
|
+
remember_created_at && !remember_expired?
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
module ClassMethods
|
|
41
|
+
Devise::Models.config(self, :timeout_in)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
require 'devise/strategies/token_authenticatable'
|
|
2
|
+
|
|
3
|
+
module Devise
|
|
4
|
+
module Models
|
|
5
|
+
# The TokenAuthenticatable module is responsible for generating an authentication token and
|
|
6
|
+
# validating the authenticity of the same while signing in.
|
|
7
|
+
#
|
|
8
|
+
# This module only provides a few helpers to help you manage the token, but it is up to you
|
|
9
|
+
# to choose how to use it. For example, if you want to have a new token every time the user
|
|
10
|
+
# saves his account, you can do the following:
|
|
11
|
+
#
|
|
12
|
+
# before_save :reset_authentication_token
|
|
13
|
+
#
|
|
14
|
+
# On the other hand, if you want to generate token unless one exists, you should use instead:
|
|
15
|
+
#
|
|
16
|
+
# before_save :ensure_authentication_token
|
|
17
|
+
#
|
|
18
|
+
# If you want to delete the token after it is used, you can do so in the
|
|
19
|
+
# after_token_authentication callback.
|
|
20
|
+
#
|
|
21
|
+
# == Options
|
|
22
|
+
#
|
|
23
|
+
# TokenAuthenticatable adds the following options to devise_for:
|
|
24
|
+
#
|
|
25
|
+
# * +token_authentication_key+: Defines name of the authentication token params key. E.g. /users/sign_in?some_key=...
|
|
26
|
+
#
|
|
27
|
+
# * +stateless_token+: By default, when you sign up with a token, Devise will store the user in session
|
|
28
|
+
# as any other authentication strategy. You can set stateless_token to true to avoid this.
|
|
29
|
+
#
|
|
30
|
+
module TokenAuthenticatable
|
|
31
|
+
extend ActiveSupport::Concern
|
|
32
|
+
|
|
33
|
+
# Generate new authentication token (a.k.a. "single access token").
|
|
34
|
+
def reset_authentication_token
|
|
35
|
+
self.authentication_token = self.class.authentication_token
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Generate new authentication token and save the record.
|
|
39
|
+
def reset_authentication_token!
|
|
40
|
+
reset_authentication_token
|
|
41
|
+
save(:validate => false)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Generate authentication token unless already exists.
|
|
45
|
+
def ensure_authentication_token
|
|
46
|
+
reset_authentication_token if authentication_token.blank?
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Generate authentication token unless already exists and save the record.
|
|
50
|
+
def ensure_authentication_token!
|
|
51
|
+
reset_authentication_token! if authentication_token.blank?
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Hook called after token authentication.
|
|
55
|
+
def after_token_authentication
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
module ClassMethods
|
|
59
|
+
def find_for_token_authentication(conditions)
|
|
60
|
+
find_for_authentication(:authentication_token => conditions[token_authentication_key])
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Generate a token checking if one does not already exist in the database.
|
|
64
|
+
def authentication_token
|
|
65
|
+
generate_token(:authentication_token)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
::Devise::Models.config(self, :token_authentication_key, :stateless_token)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|