namxam-devise 1.1.0.win
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/CHANGELOG.rdoc +455 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +118 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +311 -0
- data/Rakefile +55 -0
- data/TODO +3 -0
- data/app/controllers/devise/confirmations_controller.rb +33 -0
- data/app/controllers/devise/passwords_controller.rb +41 -0
- data/app/controllers/devise/registrations_controller.rb +57 -0
- data/app/controllers/devise/sessions_controller.rb +23 -0
- data/app/controllers/devise/unlocks_controller.rb +34 -0
- data/app/helpers/devise_helper.rb +17 -0
- data/app/mailers/devise/mailer.rb +71 -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 +19 -0
- data/app/views/devise/unlocks/new.html.erb +12 -0
- data/config/locales/en.yml +39 -0
- data/lib/devise.rb +290 -0
- data/lib/devise/controllers/helpers.rb +231 -0
- data/lib/devise/controllers/internal_helpers.rb +98 -0
- data/lib/devise/controllers/scoped_views.rb +35 -0
- data/lib/devise/controllers/url_helpers.rb +41 -0
- data/lib/devise/encryptors/authlogic_sha512.rb +19 -0
- data/lib/devise/encryptors/base.rb +20 -0
- data/lib/devise/encryptors/bcrypt.rb +19 -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 +107 -0
- data/lib/devise/hooks/activatable.rb +11 -0
- data/lib/devise/hooks/forgetable.rb +11 -0
- data/lib/devise/hooks/rememberable.rb +35 -0
- data/lib/devise/hooks/timeoutable.rb +22 -0
- data/lib/devise/hooks/trackable.rb +9 -0
- data/lib/devise/mapping.rb +103 -0
- data/lib/devise/models.rb +80 -0
- data/lib/devise/models/authenticatable.rb +126 -0
- data/lib/devise/models/confirmable.rb +164 -0
- data/lib/devise/models/database_authenticatable.rb +110 -0
- data/lib/devise/models/lockable.rb +165 -0
- data/lib/devise/models/recoverable.rb +81 -0
- data/lib/devise/models/registerable.rb +8 -0
- data/lib/devise/models/rememberable.rb +104 -0
- data/lib/devise/models/timeoutable.rb +26 -0
- data/lib/devise/models/token_authenticatable.rb +60 -0
- data/lib/devise/models/trackable.rb +30 -0
- data/lib/devise/models/validatable.rb +53 -0
- data/lib/devise/modules.rb +23 -0
- data/lib/devise/orm/active_record.rb +36 -0
- data/lib/devise/orm/mongoid.rb +29 -0
- data/lib/devise/path_checker.rb +18 -0
- data/lib/devise/rails.rb +69 -0
- data/lib/devise/rails/routes.rb +248 -0
- data/lib/devise/rails/warden_compat.rb +39 -0
- data/lib/devise/schema.rb +97 -0
- data/lib/devise/strategies/authenticatable.rb +111 -0
- data/lib/devise/strategies/base.rb +33 -0
- data/lib/devise/strategies/database_authenticatable.rb +21 -0
- data/lib/devise/strategies/rememberable.rb +43 -0
- data/lib/devise/strategies/token_authenticatable.rb +49 -0
- data/lib/devise/test_helpers.rb +90 -0
- data/lib/devise/version.rb +3 -0
- data/lib/generators/active_record/devise_generator.rb +28 -0
- data/lib/generators/active_record/templates/migration.rb +29 -0
- data/lib/generators/devise/devise_generator.rb +17 -0
- data/lib/generators/devise/install_generator.rb +24 -0
- data/lib/generators/devise/orm_helpers.rb +23 -0
- data/lib/generators/devise/templates/README +25 -0
- data/lib/generators/devise/templates/devise.rb +139 -0
- data/lib/generators/devise/views_generator.rb +63 -0
- data/lib/generators/devise_install_generator.rb +4 -0
- data/lib/generators/devise_views_generator.rb +4 -0
- data/lib/generators/mongoid/devise_generator.rb +17 -0
- data/test/controllers/helpers_test.rb +213 -0
- data/test/controllers/internal_helpers_test.rb +51 -0
- data/test/controllers/url_helpers_test.rb +58 -0
- data/test/devise_test.rb +65 -0
- data/test/encryptors_test.rb +30 -0
- data/test/failure_app_test.rb +123 -0
- data/test/integration/authenticatable_test.rb +344 -0
- data/test/integration/confirmable_test.rb +104 -0
- data/test/integration/database_authenticatable_test.rb +38 -0
- data/test/integration/http_authenticatable_test.rb +49 -0
- data/test/integration/lockable_test.rb +109 -0
- data/test/integration/recoverable_test.rb +141 -0
- data/test/integration/registerable_test.rb +153 -0
- data/test/integration/rememberable_test.rb +91 -0
- data/test/integration/timeoutable_test.rb +80 -0
- data/test/integration/token_authenticatable_test.rb +88 -0
- data/test/integration/trackable_test.rb +64 -0
- data/test/mailers/confirmation_instructions_test.rb +80 -0
- data/test/mailers/reset_password_instructions_test.rb +68 -0
- data/test/mailers/unlock_instructions_test.rb +62 -0
- data/test/mapping_test.rb +85 -0
- data/test/models/confirmable_test.rb +221 -0
- data/test/models/database_authenticatable_test.rb +148 -0
- data/test/models/lockable_test.rb +188 -0
- data/test/models/recoverable_test.rb +138 -0
- data/test/models/rememberable_test.rb +176 -0
- data/test/models/timeoutable_test.rb +28 -0
- data/test/models/token_authenticatable_test.rb +37 -0
- data/test/models/trackable_test.rb +5 -0
- data/test/models/validatable_test.rb +99 -0
- data/test/models_test.rb +77 -0
- data/test/orm/active_record.rb +9 -0
- data/test/orm/mongoid.rb +10 -0
- data/test/rails_app/app/active_record/admin.rb +3 -0
- data/test/rails_app/app/active_record/shim.rb +2 -0
- data/test/rails_app/app/active_record/user.rb +7 -0
- data/test/rails_app/app/controllers/admins_controller.rb +6 -0
- data/test/rails_app/app/controllers/application_controller.rb +9 -0
- data/test/rails_app/app/controllers/home_controller.rb +7 -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/sessions_controller.rb +6 -0
- data/test/rails_app/app/controllers/users_controller.rb +18 -0
- data/test/rails_app/app/helpers/application_helper.rb +3 -0
- data/test/rails_app/app/mongoid/admin.rb +6 -0
- data/test/rails_app/app/mongoid/shim.rb +16 -0
- data/test/rails_app/app/mongoid/user.rb +10 -0
- data/test/rails_app/config/application.rb +35 -0
- data/test/rails_app/config/boot.rb +13 -0
- data/test/rails_app/config/environment.rb +5 -0
- data/test/rails_app/config/environments/development.rb +19 -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 +136 -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 +47 -0
- data/test/rails_app/db/migrate/20100401102949_create_tables.rb +27 -0
- data/test/rails_app/db/schema.rb +86 -0
- data/test/routes_test.rb +146 -0
- data/test/support/assertions.rb +24 -0
- data/test/support/helpers.rb +54 -0
- data/test/support/integration.rb +88 -0
- data/test/support/test_silencer.rb +5 -0
- data/test/support/webrat/integrations/rails.rb +32 -0
- data/test/test_helper.rb +21 -0
- data/test/test_helpers_test.rb +72 -0
- metadata +230 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<h2>Sign in</h2>
|
|
2
|
+
|
|
3
|
+
<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
|
|
4
|
+
<p><%= f.label :email %><br />
|
|
5
|
+
<%= f.text_field :email %></p>
|
|
6
|
+
|
|
7
|
+
<p><%= f.label :password %><br />
|
|
8
|
+
<%= f.password_field :password %></p>
|
|
9
|
+
|
|
10
|
+
<% if devise_mapping.rememberable? -%>
|
|
11
|
+
<p><%= f.check_box :remember_me %> <%= f.label :remember_me %></p>
|
|
12
|
+
<% end -%>
|
|
13
|
+
|
|
14
|
+
<p><%= f.submit "Sign in" %></p>
|
|
15
|
+
<% end %>
|
|
16
|
+
|
|
17
|
+
<%= render :partial => "devise/shared/links" %>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<%- if controller_name != 'sessions' %>
|
|
2
|
+
<%= link_to "Sign in", new_session_path(resource_name) %><br />
|
|
3
|
+
<% end -%>
|
|
4
|
+
|
|
5
|
+
<%- if devise_mapping.registerable? && controller_name != 'registrations' %>
|
|
6
|
+
<%= link_to "Sign up", new_registration_path(resource_name) %><br />
|
|
7
|
+
<% end -%>
|
|
8
|
+
|
|
9
|
+
<%- if devise_mapping.recoverable? && controller_name != 'passwords' %>
|
|
10
|
+
<%= link_to "Forgot your password?", new_password_path(resource_name) %><br />
|
|
11
|
+
<% end -%>
|
|
12
|
+
|
|
13
|
+
<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
|
|
14
|
+
<%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %><br />
|
|
15
|
+
<% end -%>
|
|
16
|
+
|
|
17
|
+
<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
|
|
18
|
+
<%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br />
|
|
19
|
+
<% end -%>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<h2>Resend unlock instructions</h2>
|
|
2
|
+
|
|
3
|
+
<%= form_for(resource, :as => resource_name, :url => unlock_path(resource_name), :html => { :method => :post }) do |f| %>
|
|
4
|
+
<%= devise_error_messages! %>
|
|
5
|
+
|
|
6
|
+
<p><%= f.label :email %><br />
|
|
7
|
+
<%= f.text_field :email %></p>
|
|
8
|
+
|
|
9
|
+
<p><%= f.submit "Resend unlock instructions" %></p>
|
|
10
|
+
<% end %>
|
|
11
|
+
|
|
12
|
+
<%= render :partial => "devise/shared/links" %>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
en:
|
|
2
|
+
errors:
|
|
3
|
+
messages:
|
|
4
|
+
not_found: "not found"
|
|
5
|
+
already_confirmed: "was already confirmed"
|
|
6
|
+
not_locked: "was not locked"
|
|
7
|
+
|
|
8
|
+
devise:
|
|
9
|
+
failure:
|
|
10
|
+
unauthenticated: 'You need to sign in or sign up before continuing.'
|
|
11
|
+
unconfirmed: 'You have to confirm your account before continuing.'
|
|
12
|
+
locked: 'Your account is locked.'
|
|
13
|
+
invalid: 'Invalid email or password.'
|
|
14
|
+
invalid_token: 'Invalid authentication token.'
|
|
15
|
+
timeout: 'Your session expired, please sign in again to continue.'
|
|
16
|
+
inactive: 'Your account was not activated yet.'
|
|
17
|
+
sessions:
|
|
18
|
+
signed_in: 'Signed in successfully.'
|
|
19
|
+
signed_out: 'Signed out successfully.'
|
|
20
|
+
passwords:
|
|
21
|
+
send_instructions: 'You will receive an email with instructions about how to reset your password in a few minutes.'
|
|
22
|
+
updated: 'Your password was changed successfully. You are now signed in.'
|
|
23
|
+
confirmations:
|
|
24
|
+
send_instructions: 'You will receive an email with instructions about how to confirm your account in a few minutes.'
|
|
25
|
+
confirmed: 'Your account was successfully confirmed. You are now signed in.'
|
|
26
|
+
registrations:
|
|
27
|
+
signed_up: 'You have signed up successfully. If enabled, a confirmation was sent to your e-mail.'
|
|
28
|
+
updated: 'You updated your account successfully.'
|
|
29
|
+
destroyed: 'Bye! Your account was successfully cancelled. We hope to see you again soon.'
|
|
30
|
+
unlocks:
|
|
31
|
+
send_instructions: 'You will receive an email with instructions about how to unlock your account in a few minutes.'
|
|
32
|
+
unlocked: 'Your account was successfully unlocked. You are now signed in.'
|
|
33
|
+
mailer:
|
|
34
|
+
confirmation_instructions:
|
|
35
|
+
subject: 'Confirmation instructions'
|
|
36
|
+
reset_password_instructions:
|
|
37
|
+
subject: 'Reset password instructions'
|
|
38
|
+
unlock_instructions:
|
|
39
|
+
subject: 'Unlock Instructions'
|
data/lib/devise.rb
ADDED
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
require 'active_support/core_ext/numeric/time'
|
|
2
|
+
require 'active_support/dependencies'
|
|
3
|
+
|
|
4
|
+
module Devise
|
|
5
|
+
autoload :FailureApp, 'devise/failure_app'
|
|
6
|
+
autoload :PathChecker, 'devise/path_checker'
|
|
7
|
+
autoload :Schema, 'devise/schema'
|
|
8
|
+
autoload :TestHelpers, 'devise/test_helpers'
|
|
9
|
+
|
|
10
|
+
module Controllers
|
|
11
|
+
autoload :Helpers, 'devise/controllers/helpers'
|
|
12
|
+
autoload :InternalHelpers, 'devise/controllers/internal_helpers'
|
|
13
|
+
autoload :ScopedViews, 'devise/controllers/scoped_views'
|
|
14
|
+
autoload :UrlHelpers, 'devise/controllers/url_helpers'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
module Encryptors
|
|
18
|
+
autoload :Base, 'devise/encryptors/base'
|
|
19
|
+
#autoload :Bcrypt, 'devise/encryptors/bcrypt'
|
|
20
|
+
autoload :AuthlogicSha512, 'devise/encryptors/authlogic_sha512'
|
|
21
|
+
autoload :ClearanceSha1, 'devise/encryptors/clearance_sha1'
|
|
22
|
+
autoload :RestfulAuthenticationSha1, 'devise/encryptors/restful_authentication_sha1'
|
|
23
|
+
autoload :Sha512, 'devise/encryptors/sha512'
|
|
24
|
+
autoload :Sha1, 'devise/encryptors/sha1'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
module Strategies
|
|
28
|
+
autoload :Base, 'devise/strategies/base'
|
|
29
|
+
autoload :Authenticatable, 'devise/strategies/authenticatable'
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Constants which holds devise configuration for extensions. Those should
|
|
33
|
+
# not be modified by the "end user".
|
|
34
|
+
ALL = []
|
|
35
|
+
CONTROLLERS = ActiveSupport::OrderedHash.new
|
|
36
|
+
ROUTES = ActiveSupport::OrderedHash.new
|
|
37
|
+
STRATEGIES = ActiveSupport::OrderedHash.new
|
|
38
|
+
|
|
39
|
+
# True values used to check params
|
|
40
|
+
TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE']
|
|
41
|
+
|
|
42
|
+
# Declare encryptors length which are used in migrations.
|
|
43
|
+
ENCRYPTORS_LENGTH = {
|
|
44
|
+
:sha1 => 40,
|
|
45
|
+
:sha512 => 128,
|
|
46
|
+
:clearance_sha1 => 40,
|
|
47
|
+
:restful_authentication_sha1 => 40,
|
|
48
|
+
:authlogic_sha512 => 128,
|
|
49
|
+
:bcrypt => 60
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
# Custom domain for cookies. Not set by default
|
|
53
|
+
mattr_accessor :cookie_domain
|
|
54
|
+
@@cookie_domain = false
|
|
55
|
+
|
|
56
|
+
# Used to encrypt password. Please generate one with rake secret.
|
|
57
|
+
mattr_accessor :pepper
|
|
58
|
+
@@pepper = nil
|
|
59
|
+
|
|
60
|
+
# The number of times to encrypt password.
|
|
61
|
+
mattr_accessor :stretches
|
|
62
|
+
@@stretches = 10
|
|
63
|
+
|
|
64
|
+
# Keys used when authenticating an user.
|
|
65
|
+
mattr_accessor :authentication_keys
|
|
66
|
+
@@authentication_keys = [ :email ]
|
|
67
|
+
|
|
68
|
+
# If http authentication is enabled by default.
|
|
69
|
+
mattr_accessor :http_authenticatable
|
|
70
|
+
@@http_authenticatable = true
|
|
71
|
+
|
|
72
|
+
# If http authentication is used for ajax requests. True by default.
|
|
73
|
+
mattr_accessor :http_authenticatable_on_xhr
|
|
74
|
+
@@http_authenticatable_on_xhr = true
|
|
75
|
+
|
|
76
|
+
# If params authenticatable is enabled by default.
|
|
77
|
+
mattr_accessor :params_authenticatable
|
|
78
|
+
@@params_authenticatable = true
|
|
79
|
+
|
|
80
|
+
# The realm used in Http Basic Authentication.
|
|
81
|
+
mattr_accessor :http_authentication_realm
|
|
82
|
+
@@http_authentication_realm = "Application"
|
|
83
|
+
|
|
84
|
+
# Email regex used to validate email formats. Adapted from authlogic.
|
|
85
|
+
mattr_accessor :email_regexp
|
|
86
|
+
@@email_regexp = /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i
|
|
87
|
+
|
|
88
|
+
# Range validation for password length
|
|
89
|
+
mattr_accessor :password_length
|
|
90
|
+
@@password_length = 6..20
|
|
91
|
+
|
|
92
|
+
# Time interval where the remember me token is valid.
|
|
93
|
+
mattr_accessor :remember_for
|
|
94
|
+
@@remember_for = 2.weeks
|
|
95
|
+
|
|
96
|
+
# If a valid remember token can be re-used between multiple browsers.
|
|
97
|
+
mattr_accessor :remember_across_browsers
|
|
98
|
+
@@remember_across_browsers = true
|
|
99
|
+
|
|
100
|
+
# Time interval you can access your account before confirming your account.
|
|
101
|
+
mattr_accessor :confirm_within
|
|
102
|
+
@@confirm_within = 0.days
|
|
103
|
+
|
|
104
|
+
# Time interval to timeout the user session without activity.
|
|
105
|
+
mattr_accessor :timeout_in
|
|
106
|
+
@@timeout_in = 30.minutes
|
|
107
|
+
|
|
108
|
+
# Used to define the password encryption algorithm.
|
|
109
|
+
mattr_accessor :encryptor
|
|
110
|
+
@@encryptor = nil
|
|
111
|
+
|
|
112
|
+
# Store scopes mappings.
|
|
113
|
+
mattr_accessor :mappings
|
|
114
|
+
@@mappings = ActiveSupport::OrderedHash.new
|
|
115
|
+
|
|
116
|
+
# Tells if devise should apply the schema in ORMs where devise declaration
|
|
117
|
+
# and schema belongs to the same class (as Datamapper and Mongoid).
|
|
118
|
+
mattr_accessor :apply_schema
|
|
119
|
+
@@apply_schema = true
|
|
120
|
+
|
|
121
|
+
# Scoped views. Since it relies on fallbacks to render default views, it's
|
|
122
|
+
# turned off by default.
|
|
123
|
+
mattr_accessor :scoped_views
|
|
124
|
+
@@scoped_views = false
|
|
125
|
+
|
|
126
|
+
# Defines which strategy can be used to lock an account.
|
|
127
|
+
# Values: :failed_attempts, :none
|
|
128
|
+
mattr_accessor :lock_strategy
|
|
129
|
+
@@lock_strategy = :failed_attempts
|
|
130
|
+
|
|
131
|
+
# Defines which strategy can be used to unlock an account.
|
|
132
|
+
# Values: :email, :time, :both
|
|
133
|
+
mattr_accessor :unlock_strategy
|
|
134
|
+
@@unlock_strategy = :both
|
|
135
|
+
|
|
136
|
+
# Number of authentication tries before locking an account
|
|
137
|
+
mattr_accessor :maximum_attempts
|
|
138
|
+
@@maximum_attempts = 20
|
|
139
|
+
|
|
140
|
+
# Time interval to unlock the account if :time is defined as unlock_strategy.
|
|
141
|
+
mattr_accessor :unlock_in
|
|
142
|
+
@@unlock_in = 1.hour
|
|
143
|
+
|
|
144
|
+
# The default scope which is used by warden.
|
|
145
|
+
mattr_accessor :default_scope
|
|
146
|
+
@@default_scope = nil
|
|
147
|
+
|
|
148
|
+
# Address which sends Devise e-mails.
|
|
149
|
+
mattr_accessor :mailer_sender
|
|
150
|
+
@@mailer_sender = nil
|
|
151
|
+
|
|
152
|
+
# Authentication token params key name of choice. E.g. /users/sign_in?some_key=...
|
|
153
|
+
mattr_accessor :token_authentication_key
|
|
154
|
+
@@token_authentication_key = :auth_token
|
|
155
|
+
|
|
156
|
+
# Which formats should be treated as navigational.
|
|
157
|
+
mattr_accessor :navigational_formats
|
|
158
|
+
@@navigational_formats = [:html]
|
|
159
|
+
|
|
160
|
+
# Private methods to interface with Warden.
|
|
161
|
+
mattr_accessor :warden_config
|
|
162
|
+
@@warden_config = nil
|
|
163
|
+
@@warden_config_block = nil
|
|
164
|
+
|
|
165
|
+
# When set to true, signing out an user signs out all other scopes.
|
|
166
|
+
mattr_accessor :sign_out_all_scopes
|
|
167
|
+
@@sign_out_all_scopes = false
|
|
168
|
+
|
|
169
|
+
def self.use_default_scope=(*)
|
|
170
|
+
ActiveSupport::Deprecation.warn "config.use_default_scope is deprecated and removed from Devise. " <<
|
|
171
|
+
"If you are using non conventional routes in Devise, all you need to do is to pass the devise " <<
|
|
172
|
+
"scope in the router DSL:\n\n as :user do\n get \"sign_in\", :to => \"devise/sessions\"\n end\n\n" <<
|
|
173
|
+
"The method :as is also aliased to :devise_scope. Choose the one you prefer.", caller
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# Default way to setup Devise. Run rails generate devise_install to create
|
|
177
|
+
# a fresh initializer with all configuration values.
|
|
178
|
+
def self.setup
|
|
179
|
+
yield self
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# Get the mailer class from the mailer reference object.
|
|
183
|
+
def self.mailer
|
|
184
|
+
@@mailer_ref.get
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# Set the mailer reference object to access the mailer.
|
|
188
|
+
def self.mailer=(class_name)
|
|
189
|
+
@@mailer_ref = ActiveSupport::Dependencies.ref(class_name)
|
|
190
|
+
end
|
|
191
|
+
self.mailer = "Devise::Mailer"
|
|
192
|
+
|
|
193
|
+
# Small method that adds a mapping to Devise.
|
|
194
|
+
def self.add_mapping(resource, options)
|
|
195
|
+
mapping = Devise::Mapping.new(resource, options)
|
|
196
|
+
self.mappings[mapping.name] = mapping
|
|
197
|
+
self.default_scope ||= mapping.name
|
|
198
|
+
mapping
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# Make Devise aware of an 3rd party Devise-module. For convenience.
|
|
202
|
+
#
|
|
203
|
+
# == Options:
|
|
204
|
+
#
|
|
205
|
+
# +model+ - String representing the load path to a custom *model* for this module (to autoload.)
|
|
206
|
+
# +controller+ - Symbol representing the name of an exisiting or custom *controller* for this module.
|
|
207
|
+
# +route+ - Symbol representing the named *route* helper for this module.
|
|
208
|
+
# +flash+ - Symbol representing the *flash messages* used by this helper.
|
|
209
|
+
# +strategy+ - Symbol representing if this module got a custom *strategy*.
|
|
210
|
+
#
|
|
211
|
+
# All values, except :model, accept also a boolean and will have the same name as the given module
|
|
212
|
+
# name.
|
|
213
|
+
#
|
|
214
|
+
# == Examples:
|
|
215
|
+
#
|
|
216
|
+
# Devise.add_module(:party_module)
|
|
217
|
+
# Devise.add_module(:party_module, :strategy => true, :controller => :sessions)
|
|
218
|
+
# Devise.add_module(:party_module, :model => 'party_module/model')
|
|
219
|
+
#
|
|
220
|
+
def self.add_module(module_name, options = {})
|
|
221
|
+
ALL << module_name
|
|
222
|
+
options.assert_valid_keys(:strategy, :model, :controller, :route)
|
|
223
|
+
|
|
224
|
+
config = {
|
|
225
|
+
:strategy => STRATEGIES,
|
|
226
|
+
:route => ROUTES,
|
|
227
|
+
:controller => CONTROLLERS
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
config.each do |key, value|
|
|
231
|
+
next unless options[key]
|
|
232
|
+
name = (options[key] == true ? module_name : options[key])
|
|
233
|
+
|
|
234
|
+
if value.is_a?(Hash)
|
|
235
|
+
value[module_name] = name
|
|
236
|
+
else
|
|
237
|
+
value << name unless value.include?(name)
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
if options[:model]
|
|
242
|
+
model_path = (options[:model] == true ? "devise/models/#{module_name}" : options[:model])
|
|
243
|
+
Devise::Models.send(:autoload, module_name.to_s.camelize.to_sym, model_path)
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
Devise::Mapping.add_module module_name
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
# Sets warden configuration using a block that will be invoked on warden
|
|
250
|
+
# initialization.
|
|
251
|
+
#
|
|
252
|
+
# Devise.initialize do |config|
|
|
253
|
+
# config.confirm_within = 2.days
|
|
254
|
+
#
|
|
255
|
+
# config.warden do |manager|
|
|
256
|
+
# # Configure warden to use other strategies, like oauth.
|
|
257
|
+
# manager.oauth(:twitter)
|
|
258
|
+
# end
|
|
259
|
+
# end
|
|
260
|
+
def self.warden(&block)
|
|
261
|
+
@@warden_config_block = block
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
# A method used internally to setup warden manager from the Rails initialize
|
|
265
|
+
# block.
|
|
266
|
+
def self.configure_warden! #:nodoc:
|
|
267
|
+
@@warden_configured ||= begin
|
|
268
|
+
warden_config.failure_app = Devise::FailureApp
|
|
269
|
+
warden_config.default_scope = Devise.default_scope
|
|
270
|
+
|
|
271
|
+
Devise.mappings.each_value do |mapping|
|
|
272
|
+
warden_config.scope_defaults mapping.name, :strategies => mapping.strategies
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
@@warden_config_block.try :call, Devise.warden_config
|
|
276
|
+
true
|
|
277
|
+
end
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
# Generate a friendly string randomically to be used as token.
|
|
281
|
+
def self.friendly_token
|
|
282
|
+
ActiveSupport::SecureRandom.base64(15).tr('+/=', '-_ ').strip.delete("\n")
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
require 'warden'
|
|
287
|
+
require 'devise/mapping'
|
|
288
|
+
require 'devise/models'
|
|
289
|
+
require 'devise/modules'
|
|
290
|
+
require 'devise/rails'
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
module Devise
|
|
2
|
+
module Controllers
|
|
3
|
+
# Those helpers are convenience methods added to ApplicationController.
|
|
4
|
+
module Helpers
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
included do
|
|
8
|
+
helper_method :warden, :signed_in?, :devise_controller?, :anybody_signed_in?,
|
|
9
|
+
*Devise.mappings.keys.map { |m| [:"current_#{m}", :"#{m}_signed_in?", :"#{m}_session"] }.flatten
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# The main accessor for the warden proxy instance
|
|
13
|
+
def warden
|
|
14
|
+
request.env['warden']
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Return true if it's a devise_controller. false to all controllers unless
|
|
18
|
+
# the controllers defined inside devise. Useful if you want to apply a before
|
|
19
|
+
# filter to all controller, except the ones in devise:
|
|
20
|
+
#
|
|
21
|
+
# before_filter :my_filter, :unless => { |c| c.devise_controller? }
|
|
22
|
+
def devise_controller?
|
|
23
|
+
false
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Check if the given scope is signed in session, without running
|
|
27
|
+
# authentication hooks.
|
|
28
|
+
def signed_in?(scope)
|
|
29
|
+
warden.authenticate?(:scope => scope)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Check if the any scope is signed in session, without running
|
|
33
|
+
# authentication hooks.
|
|
34
|
+
def anybody_signed_in?
|
|
35
|
+
Devise.mappings.keys.any? { |scope| signed_in?(scope) }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Sign in an user that already was authenticated. This helper is useful for logging
|
|
39
|
+
# users in after sign up.
|
|
40
|
+
#
|
|
41
|
+
# Examples:
|
|
42
|
+
#
|
|
43
|
+
# sign_in :user, @user # sign_in(scope, resource)
|
|
44
|
+
# sign_in @user # sign_in(resource)
|
|
45
|
+
#
|
|
46
|
+
def sign_in(resource_or_scope, resource=nil)
|
|
47
|
+
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
|
48
|
+
resource ||= resource_or_scope
|
|
49
|
+
warden.set_user(resource, :scope => scope)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Sign out a given user or scope. This helper is useful for signing out an user
|
|
53
|
+
# after deleting accounts.
|
|
54
|
+
#
|
|
55
|
+
# Examples:
|
|
56
|
+
#
|
|
57
|
+
# sign_out :user # sign_out(scope)
|
|
58
|
+
# sign_out @user # sign_out(resource)
|
|
59
|
+
#
|
|
60
|
+
def sign_out(resource_or_scope)
|
|
61
|
+
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
|
62
|
+
warden.user(scope) # Without loading user here, before_logout hook is not called
|
|
63
|
+
warden.raw_session.inspect # Without this inspect here. The session does not clear.
|
|
64
|
+
warden.logout(scope)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Sign out all active users or scopes. This helper is useful for signing out all roles
|
|
68
|
+
# in one click.
|
|
69
|
+
def sign_out_all_scopes
|
|
70
|
+
# Not "warden.logout" since we need to sign_out only devise-defined scopes.
|
|
71
|
+
scopes = Devise.mappings.keys
|
|
72
|
+
scopes.each { |scope| warden.user(scope) }
|
|
73
|
+
warden.raw_session.inspect
|
|
74
|
+
warden.logout(*scopes)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Returns and delete the url stored in the session for the given scope. Useful
|
|
78
|
+
# for giving redirect backs after sign up:
|
|
79
|
+
#
|
|
80
|
+
# Example:
|
|
81
|
+
#
|
|
82
|
+
# redirect_to stored_location_for(:user) || root_path
|
|
83
|
+
#
|
|
84
|
+
def stored_location_for(resource_or_scope)
|
|
85
|
+
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
|
86
|
+
session.delete(:"#{scope}_return_to")
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# The default url to be used after signing in. This is used by all Devise
|
|
90
|
+
# controllers and you can overwrite it in your ApplicationController to
|
|
91
|
+
# provide a custom hook for a custom resource.
|
|
92
|
+
#
|
|
93
|
+
# By default, it first tries to find a resource_root_path, otherwise it
|
|
94
|
+
# uses the root path. For a user scope, you can define the default url in
|
|
95
|
+
# the following way:
|
|
96
|
+
#
|
|
97
|
+
# map.user_root '/users', :controller => 'users' # creates user_root_path
|
|
98
|
+
#
|
|
99
|
+
# map.namespace :user do |user|
|
|
100
|
+
# user.root :controller => 'users' # creates user_root_path
|
|
101
|
+
# end
|
|
102
|
+
#
|
|
103
|
+
#
|
|
104
|
+
# If the resource root path is not defined, root_path is used. However,
|
|
105
|
+
# if this default is not enough, you can customize it, for example:
|
|
106
|
+
#
|
|
107
|
+
# def after_sign_in_path_for(resource)
|
|
108
|
+
# if resource.is_a?(User) && resource.can_publish?
|
|
109
|
+
# publisher_url
|
|
110
|
+
# else
|
|
111
|
+
# super
|
|
112
|
+
# end
|
|
113
|
+
# end
|
|
114
|
+
#
|
|
115
|
+
def after_sign_in_path_for(resource_or_scope)
|
|
116
|
+
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
|
117
|
+
home_path = :"#{scope}_root_path"
|
|
118
|
+
respond_to?(home_path, true) ? send(home_path) : root_path
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# The default url to be used after updating a resource. This is used by all Devise
|
|
122
|
+
# controllers and you can overwrite it in your ApplicationController to
|
|
123
|
+
# provide a custom hook for a custom resource.
|
|
124
|
+
#
|
|
125
|
+
# By default, it first tries to find a resource_root_path, otherwise it
|
|
126
|
+
# uses the root path. For a user scope, you can define the default url in
|
|
127
|
+
# the following way:
|
|
128
|
+
#
|
|
129
|
+
# map.user_root '/users', :controller => 'users' # creates user_root_path
|
|
130
|
+
#
|
|
131
|
+
# map.resources :users do |users|
|
|
132
|
+
# users.root # creates user_root_path
|
|
133
|
+
# end
|
|
134
|
+
#
|
|
135
|
+
#
|
|
136
|
+
# If none of these are defined, root_path is used. However, if this default
|
|
137
|
+
# is not enough, you can customize it, for example:
|
|
138
|
+
#
|
|
139
|
+
# def after_update_path_for(resource)
|
|
140
|
+
# if resource.is_a?(User) && resource.can_publish?
|
|
141
|
+
# publisher_url
|
|
142
|
+
# else
|
|
143
|
+
# super
|
|
144
|
+
# end
|
|
145
|
+
# end
|
|
146
|
+
#
|
|
147
|
+
def after_update_path_for(resource_or_scope)
|
|
148
|
+
after_sign_in_path_for(resource_or_scope)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Method used by sessions controller to sign out an user. You can overwrite
|
|
152
|
+
# it in your ApplicationController to provide a custom hook for a custom
|
|
153
|
+
# scope. Notice that differently from +after_sign_in_path_for+ this method
|
|
154
|
+
# receives a symbol with the scope, and not the resource.
|
|
155
|
+
#
|
|
156
|
+
# By default is the root_path.
|
|
157
|
+
def after_sign_out_path_for(resource_or_scope)
|
|
158
|
+
root_path
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Sign in an user and tries to redirect first to the stored location and
|
|
162
|
+
# then to the url specified by after_sign_in_path_for.
|
|
163
|
+
#
|
|
164
|
+
# If just a symbol is given, consider that the user was already signed in
|
|
165
|
+
# through other means and just perform the redirection.
|
|
166
|
+
def sign_in_and_redirect(resource_or_scope, resource=nil)
|
|
167
|
+
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
|
168
|
+
resource ||= resource_or_scope
|
|
169
|
+
sign_in(scope, resource) unless warden.user(scope) == resource
|
|
170
|
+
redirect_to stored_location_for(scope) || after_sign_in_path_for(resource)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Sign out an user and tries to redirect to the url specified by
|
|
174
|
+
# after_sign_out_path_for.
|
|
175
|
+
def sign_out_and_redirect(resource_or_scope)
|
|
176
|
+
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
|
177
|
+
if Devise.sign_out_all_scopes
|
|
178
|
+
sign_out_all_scopes
|
|
179
|
+
else
|
|
180
|
+
sign_out(scope)
|
|
181
|
+
end
|
|
182
|
+
redirect_to after_sign_out_path_for(scope)
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# Define authentication filters and accessor helpers based on mappings.
|
|
186
|
+
# These filters should be used inside the controllers as before_filters,
|
|
187
|
+
# so you can control the scope of the user who should be signed in to
|
|
188
|
+
# access that specific controller/action.
|
|
189
|
+
# Example:
|
|
190
|
+
#
|
|
191
|
+
# Roles:
|
|
192
|
+
# User
|
|
193
|
+
# Admin
|
|
194
|
+
#
|
|
195
|
+
# Generated methods:
|
|
196
|
+
# authenticate_user! # Signs user in or redirect
|
|
197
|
+
# authenticate_admin! # Signs admin in or redirect
|
|
198
|
+
# user_signed_in? # Checks whether there is an user signed in or not
|
|
199
|
+
# admin_signed_in? # Checks whether there is an admin signed in or not
|
|
200
|
+
# current_user # Current signed in user
|
|
201
|
+
# current_admin # Currend signed in admin
|
|
202
|
+
# user_session # Session data available only to the user scope
|
|
203
|
+
# admin_session # Session data available only to the admin scope
|
|
204
|
+
#
|
|
205
|
+
# Use:
|
|
206
|
+
# before_filter :authenticate_user! # Tell devise to use :user map
|
|
207
|
+
# before_filter :authenticate_admin! # Tell devise to use :admin map
|
|
208
|
+
#
|
|
209
|
+
Devise.mappings.each_key do |mapping|
|
|
210
|
+
class_eval <<-METHODS, __FILE__, __LINE__ + 1
|
|
211
|
+
def authenticate_#{mapping}!
|
|
212
|
+
warden.authenticate!(:scope => :#{mapping})
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
def #{mapping}_signed_in?
|
|
216
|
+
warden.authenticate?(:scope => :#{mapping})
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def current_#{mapping}
|
|
220
|
+
@current_#{mapping} ||= warden.authenticate(:scope => :#{mapping})
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def #{mapping}_session
|
|
224
|
+
current_#{mapping} && warden.session(:#{mapping})
|
|
225
|
+
end
|
|
226
|
+
METHODS
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|