devise 3.0.0 → 4.8.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 +7 -0
- data/CHANGELOG.md +351 -0
- data/MIT-LICENSE +2 -1
- data/README.md +422 -130
- data/app/controllers/devise/confirmations_controller.rb +17 -6
- data/app/controllers/devise/omniauth_callbacks_controller.rb +12 -6
- data/app/controllers/devise/passwords_controller.rb +23 -8
- data/app/controllers/devise/registrations_controller.rb +70 -28
- data/app/controllers/devise/sessions_controller.rb +49 -17
- data/app/controllers/devise/unlocks_controller.rb +11 -4
- data/app/controllers/devise_controller.rb +74 -34
- data/app/helpers/devise_helper.rb +23 -18
- data/app/mailers/devise/mailer.rb +25 -10
- data/app/views/devise/confirmations/new.html.erb +9 -5
- data/app/views/devise/mailer/confirmation_instructions.html.erb +1 -1
- data/app/views/devise/mailer/email_changed.html.erb +7 -0
- data/app/views/devise/mailer/password_change.html.erb +3 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +1 -1
- data/app/views/devise/mailer/unlock_instructions.html.erb +1 -1
- data/app/views/devise/passwords/edit.html.erb +16 -7
- data/app/views/devise/passwords/new.html.erb +9 -5
- data/app/views/devise/registrations/edit.html.erb +29 -15
- data/app/views/devise/registrations/new.html.erb +20 -9
- data/app/views/devise/sessions/new.html.erb +19 -10
- data/app/views/devise/shared/_error_messages.html.erb +15 -0
- data/app/views/devise/shared/{_links.erb → _links.html.erb} +10 -10
- data/app/views/devise/unlocks/new.html.erb +9 -5
- data/config/locales/en.yml +26 -20
- data/lib/devise/controllers/helpers.rb +122 -125
- data/lib/devise/controllers/rememberable.rb +14 -14
- data/lib/devise/controllers/scoped_views.rb +3 -1
- data/lib/devise/controllers/sign_in_out.rb +121 -0
- data/lib/devise/controllers/store_location.rb +76 -0
- data/lib/devise/controllers/url_helpers.rb +10 -8
- data/lib/devise/delegator.rb +2 -0
- data/lib/devise/encryptor.rb +24 -0
- data/lib/devise/failure_app.rb +132 -42
- data/lib/devise/hooks/activatable.rb +7 -6
- data/lib/devise/hooks/csrf_cleaner.rb +9 -0
- data/lib/devise/hooks/forgetable.rb +3 -1
- data/lib/devise/hooks/lockable.rb +5 -3
- data/lib/devise/hooks/proxy.rb +23 -0
- data/lib/devise/hooks/rememberable.rb +7 -4
- data/lib/devise/hooks/timeoutable.rb +18 -8
- data/lib/devise/hooks/trackable.rb +3 -1
- data/lib/devise/mailers/helpers.rb +15 -18
- data/lib/devise/mapping.rb +9 -3
- data/lib/devise/models/authenticatable.rb +102 -80
- data/lib/devise/models/confirmable.rb +154 -72
- data/lib/devise/models/database_authenticatable.rb +125 -25
- data/lib/devise/models/lockable.rb +50 -29
- data/lib/devise/models/omniauthable.rb +3 -1
- data/lib/devise/models/recoverable.rb +72 -50
- data/lib/devise/models/registerable.rb +4 -0
- data/lib/devise/models/rememberable.rb +65 -32
- data/lib/devise/models/timeoutable.rb +4 -8
- data/lib/devise/models/trackable.rb +20 -4
- data/lib/devise/models/validatable.rb +16 -9
- data/lib/devise/models.rb +6 -13
- data/lib/devise/modules.rb +12 -11
- data/lib/devise/omniauth/config.rb +2 -0
- data/lib/devise/omniauth/url_helpers.rb +14 -5
- data/lib/devise/omniauth.rb +4 -5
- data/lib/devise/orm/active_record.rb +5 -1
- data/lib/devise/orm/mongoid.rb +6 -2
- data/lib/devise/parameter_filter.rb +4 -0
- data/lib/devise/parameter_sanitizer.rb +144 -34
- data/lib/devise/rails/deprecated_constant_accessor.rb +39 -0
- data/lib/devise/rails/routes.rb +191 -127
- data/lib/devise/rails/warden_compat.rb +2 -1
- data/lib/devise/rails.rb +13 -20
- data/lib/devise/secret_key_finder.rb +27 -0
- data/lib/devise/strategies/authenticatable.rb +21 -22
- data/lib/devise/strategies/base.rb +3 -1
- data/lib/devise/strategies/database_authenticatable.rb +15 -4
- data/lib/devise/strategies/rememberable.rb +15 -3
- data/lib/devise/test/controller_helpers.rb +167 -0
- data/lib/devise/test/integration_helpers.rb +63 -0
- data/lib/devise/test_helpers.rb +7 -123
- data/lib/devise/time_inflector.rb +4 -2
- data/lib/devise/token_generator.rb +32 -0
- data/lib/devise/version.rb +3 -1
- data/lib/devise.rb +124 -78
- data/lib/generators/active_record/devise_generator.rb +64 -15
- data/lib/generators/active_record/templates/migration.rb +9 -8
- data/lib/generators/active_record/templates/migration_existing.rb +9 -8
- data/lib/generators/devise/controllers_generator.rb +46 -0
- data/lib/generators/devise/devise_generator.rb +10 -6
- data/lib/generators/devise/install_generator.rb +19 -1
- data/lib/generators/devise/orm_helpers.rb +17 -9
- data/lib/generators/devise/views_generator.rb +51 -28
- data/lib/generators/mongoid/devise_generator.rb +24 -24
- data/lib/generators/templates/README +13 -12
- data/lib/generators/templates/controllers/README +14 -0
- data/lib/generators/templates/controllers/confirmations_controller.rb +30 -0
- data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +30 -0
- data/lib/generators/templates/controllers/passwords_controller.rb +34 -0
- data/lib/generators/templates/controllers/registrations_controller.rb +62 -0
- data/lib/generators/templates/controllers/sessions_controller.rb +27 -0
- data/lib/generators/templates/controllers/unlocks_controller.rb +30 -0
- data/lib/generators/templates/devise.rb +118 -53
- data/lib/generators/templates/markerb/confirmation_instructions.markerb +1 -1
- data/lib/generators/templates/markerb/email_changed.markerb +7 -0
- data/lib/generators/templates/markerb/password_change.markerb +3 -0
- data/lib/generators/templates/markerb/reset_password_instructions.markerb +1 -1
- data/lib/generators/templates/markerb/unlock_instructions.markerb +1 -1
- data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +6 -2
- data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +12 -4
- data/lib/generators/templates/simple_form_for/passwords/new.html.erb +5 -2
- data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +14 -6
- data/lib/generators/templates/simple_form_for/registrations/new.html.erb +12 -4
- data/lib/generators/templates/simple_form_for/sessions/new.html.erb +11 -6
- data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +5 -2
- metadata +73 -294
- data/.gitignore +0 -10
- data/.travis.yml +0 -20
- data/.yardopts +0 -9
- data/CHANGELOG.rdoc +0 -941
- data/CONTRIBUTING.md +0 -14
- data/Gemfile +0 -31
- data/Gemfile.lock +0 -159
- data/Rakefile +0 -35
- data/app/views/devise/_links.erb +0 -3
- data/devise.gemspec +0 -26
- data/devise.png +0 -0
- data/gemfiles/Gemfile.rails-3.2.x +0 -31
- data/gemfiles/Gemfile.rails-3.2.x.lock +0 -156
- data/lib/devise/models/token_authenticatable.rb +0 -89
- data/lib/devise/strategies/token_authenticatable.rb +0 -91
- data/test/controllers/custom_strategy_test.rb +0 -62
- data/test/controllers/helpers_test.rb +0 -253
- data/test/controllers/internal_helpers_test.rb +0 -120
- data/test/controllers/passwords_controller_test.rb +0 -32
- data/test/controllers/sessions_controller_test.rb +0 -99
- data/test/controllers/url_helpers_test.rb +0 -59
- data/test/delegator_test.rb +0 -19
- data/test/devise_test.rb +0 -83
- data/test/failure_app_test.rb +0 -221
- data/test/generators/active_record_generator_test.rb +0 -73
- data/test/generators/devise_generator_test.rb +0 -39
- data/test/generators/install_generator_test.rb +0 -13
- data/test/generators/mongoid_generator_test.rb +0 -23
- data/test/generators/views_generator_test.rb +0 -67
- data/test/helpers/devise_helper_test.rb +0 -51
- data/test/integration/authenticatable_test.rb +0 -699
- data/test/integration/confirmable_test.rb +0 -299
- data/test/integration/database_authenticatable_test.rb +0 -84
- data/test/integration/http_authenticatable_test.rb +0 -115
- data/test/integration/lockable_test.rb +0 -242
- data/test/integration/omniauthable_test.rb +0 -133
- data/test/integration/recoverable_test.rb +0 -335
- data/test/integration/registerable_test.rb +0 -349
- data/test/integration/rememberable_test.rb +0 -165
- data/test/integration/timeoutable_test.rb +0 -150
- data/test/integration/token_authenticatable_test.rb +0 -205
- data/test/integration/trackable_test.rb +0 -92
- data/test/mailers/confirmation_instructions_test.rb +0 -111
- data/test/mailers/reset_password_instructions_test.rb +0 -92
- data/test/mailers/unlock_instructions_test.rb +0 -87
- data/test/mapping_test.rb +0 -127
- data/test/models/authenticatable_test.rb +0 -13
- data/test/models/confirmable_test.rb +0 -452
- data/test/models/database_authenticatable_test.rb +0 -226
- data/test/models/lockable_test.rb +0 -282
- data/test/models/omniauthable_test.rb +0 -7
- data/test/models/recoverable_test.rb +0 -222
- data/test/models/registerable_test.rb +0 -7
- data/test/models/rememberable_test.rb +0 -175
- data/test/models/serializable_test.rb +0 -49
- data/test/models/timeoutable_test.rb +0 -46
- data/test/models/token_authenticatable_test.rb +0 -55
- data/test/models/trackable_test.rb +0 -13
- data/test/models/validatable_test.rb +0 -127
- data/test/models_test.rb +0 -163
- data/test/omniauth/config_test.rb +0 -57
- data/test/omniauth/url_helpers_test.rb +0 -54
- data/test/orm/active_record.rb +0 -10
- data/test/orm/mongoid.rb +0 -13
- data/test/parameter_sanitizer_test.rb +0 -58
- data/test/rails_app/Rakefile +0 -6
- data/test/rails_app/app/active_record/admin.rb +0 -6
- data/test/rails_app/app/active_record/shim.rb +0 -2
- data/test/rails_app/app/active_record/user.rb +0 -6
- data/test/rails_app/app/controllers/admins/sessions_controller.rb +0 -6
- data/test/rails_app/app/controllers/admins_controller.rb +0 -11
- data/test/rails_app/app/controllers/application_controller.rb +0 -9
- data/test/rails_app/app/controllers/home_controller.rb +0 -25
- data/test/rails_app/app/controllers/publisher/registrations_controller.rb +0 -2
- data/test/rails_app/app/controllers/publisher/sessions_controller.rb +0 -2
- data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +0 -14
- data/test/rails_app/app/controllers/users_controller.rb +0 -31
- data/test/rails_app/app/helpers/application_helper.rb +0 -3
- data/test/rails_app/app/mailers/users/mailer.rb +0 -12
- data/test/rails_app/app/mongoid/admin.rb +0 -29
- data/test/rails_app/app/mongoid/shim.rb +0 -23
- data/test/rails_app/app/mongoid/user.rb +0 -42
- data/test/rails_app/app/views/admins/index.html.erb +0 -1
- data/test/rails_app/app/views/admins/sessions/new.html.erb +0 -2
- data/test/rails_app/app/views/home/admin_dashboard.html.erb +0 -1
- data/test/rails_app/app/views/home/index.html.erb +0 -1
- data/test/rails_app/app/views/home/join.html.erb +0 -1
- data/test/rails_app/app/views/home/private.html.erb +0 -1
- data/test/rails_app/app/views/home/user_dashboard.html.erb +0 -1
- data/test/rails_app/app/views/layouts/application.html.erb +0 -24
- data/test/rails_app/app/views/users/edit_form.html.erb +0 -1
- data/test/rails_app/app/views/users/index.html.erb +0 -1
- data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +0 -1
- data/test/rails_app/app/views/users/sessions/new.html.erb +0 -1
- data/test/rails_app/bin/bundle +0 -3
- data/test/rails_app/bin/rails +0 -4
- data/test/rails_app/bin/rake +0 -4
- data/test/rails_app/config/application.rb +0 -40
- data/test/rails_app/config/boot.rb +0 -8
- data/test/rails_app/config/database.yml +0 -18
- data/test/rails_app/config/environment.rb +0 -5
- data/test/rails_app/config/environments/development.rb +0 -34
- data/test/rails_app/config/environments/production.rb +0 -84
- data/test/rails_app/config/environments/test.rb +0 -36
- data/test/rails_app/config/initializers/backtrace_silencers.rb +0 -7
- data/test/rails_app/config/initializers/devise.rb +0 -178
- data/test/rails_app/config/initializers/inflections.rb +0 -2
- data/test/rails_app/config/initializers/secret_token.rb +0 -8
- data/test/rails_app/config/initializers/session_store.rb +0 -1
- data/test/rails_app/config/routes.rb +0 -104
- data/test/rails_app/config.ru +0 -4
- data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -74
- data/test/rails_app/db/schema.rb +0 -52
- data/test/rails_app/lib/shared_admin.rb +0 -14
- data/test/rails_app/lib/shared_user.rb +0 -25
- data/test/rails_app/public/404.html +0 -26
- data/test/rails_app/public/422.html +0 -26
- data/test/rails_app/public/500.html +0 -26
- data/test/rails_app/public/favicon.ico +0 -0
- data/test/routes_test.rb +0 -250
- data/test/support/assertions.rb +0 -40
- data/test/support/helpers.rb +0 -91
- data/test/support/integration.rb +0 -92
- data/test/support/locale/en.yml +0 -4
- data/test/support/webrat/integrations/rails.rb +0 -24
- data/test/test_helper.rb +0 -34
- data/test/test_helpers_test.rb +0 -151
- data/test/test_models.rb +0 -26
data/lib/devise.rb
CHANGED
|
@@ -1,25 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'rails'
|
|
2
4
|
require 'active_support/core_ext/numeric/time'
|
|
3
5
|
require 'active_support/dependencies'
|
|
4
6
|
require 'orm_adapter'
|
|
5
7
|
require 'set'
|
|
6
8
|
require 'securerandom'
|
|
9
|
+
require 'responders'
|
|
7
10
|
|
|
8
11
|
module Devise
|
|
9
12
|
autoload :Delegator, 'devise/delegator'
|
|
13
|
+
autoload :Encryptor, 'devise/encryptor'
|
|
10
14
|
autoload :FailureApp, 'devise/failure_app'
|
|
11
15
|
autoload :OmniAuth, 'devise/omniauth'
|
|
12
16
|
autoload :ParameterFilter, 'devise/parameter_filter'
|
|
13
|
-
autoload :BaseSanitizer, 'devise/parameter_sanitizer'
|
|
14
17
|
autoload :ParameterSanitizer, 'devise/parameter_sanitizer'
|
|
15
18
|
autoload :TestHelpers, 'devise/test_helpers'
|
|
16
19
|
autoload :TimeInflector, 'devise/time_inflector'
|
|
20
|
+
autoload :TokenGenerator, 'devise/token_generator'
|
|
21
|
+
autoload :SecretKeyFinder, 'devise/secret_key_finder'
|
|
17
22
|
|
|
18
23
|
module Controllers
|
|
19
|
-
autoload :Helpers,
|
|
20
|
-
autoload :Rememberable,
|
|
21
|
-
autoload :ScopedViews,
|
|
22
|
-
autoload :
|
|
24
|
+
autoload :Helpers, 'devise/controllers/helpers'
|
|
25
|
+
autoload :Rememberable, 'devise/controllers/rememberable'
|
|
26
|
+
autoload :ScopedViews, 'devise/controllers/scoped_views'
|
|
27
|
+
autoload :SignInOut, 'devise/controllers/sign_in_out'
|
|
28
|
+
autoload :StoreLocation, 'devise/controllers/store_location'
|
|
29
|
+
autoload :UrlHelpers, 'devise/controllers/url_helpers'
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
module Hooks
|
|
33
|
+
autoload :Proxy, 'devise/hooks/proxy'
|
|
23
34
|
end
|
|
24
35
|
|
|
25
36
|
module Mailers
|
|
@@ -27,17 +38,22 @@ module Devise
|
|
|
27
38
|
end
|
|
28
39
|
|
|
29
40
|
module Strategies
|
|
30
|
-
autoload :Base,
|
|
41
|
+
autoload :Base, 'devise/strategies/base'
|
|
31
42
|
autoload :Authenticatable, 'devise/strategies/authenticatable'
|
|
32
43
|
end
|
|
33
44
|
|
|
45
|
+
module Test
|
|
46
|
+
autoload :ControllerHelpers, 'devise/test/controller_helpers'
|
|
47
|
+
autoload :IntegrationHelpers, 'devise/test/integration_helpers'
|
|
48
|
+
end
|
|
49
|
+
|
|
34
50
|
# Constants which holds devise configuration for extensions. Those should
|
|
35
51
|
# not be modified by the "end user" (this is why they are constants).
|
|
36
52
|
ALL = []
|
|
37
|
-
CONTROLLERS =
|
|
38
|
-
ROUTES =
|
|
39
|
-
STRATEGIES =
|
|
40
|
-
URL_HELPERS =
|
|
53
|
+
CONTROLLERS = {}
|
|
54
|
+
ROUTES = {}
|
|
55
|
+
STRATEGIES = {}
|
|
56
|
+
URL_HELPERS = {}
|
|
41
57
|
|
|
42
58
|
# Strategies that do not require user input.
|
|
43
59
|
NO_INPUT = []
|
|
@@ -45,13 +61,17 @@ module Devise
|
|
|
45
61
|
# True values used to check params
|
|
46
62
|
TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE']
|
|
47
63
|
|
|
64
|
+
# Secret key used by the key generator
|
|
65
|
+
mattr_accessor :secret_key
|
|
66
|
+
@@secret_key = nil
|
|
67
|
+
|
|
48
68
|
# Custom domain or key for cookies. Not set by default
|
|
49
69
|
mattr_accessor :rememberable_options
|
|
50
70
|
@@rememberable_options = {}
|
|
51
71
|
|
|
52
|
-
# The number of times to
|
|
72
|
+
# The number of times to hash the password.
|
|
53
73
|
mattr_accessor :stretches
|
|
54
|
-
@@stretches =
|
|
74
|
+
@@stretches = 12
|
|
55
75
|
|
|
56
76
|
# The default key used when authenticating over http auth.
|
|
57
77
|
mattr_accessor :http_authentication_key
|
|
@@ -59,7 +79,7 @@ module Devise
|
|
|
59
79
|
|
|
60
80
|
# Keys used when authenticating a user.
|
|
61
81
|
mattr_accessor :authentication_keys
|
|
62
|
-
@@authentication_keys = [
|
|
82
|
+
@@authentication_keys = [:email]
|
|
63
83
|
|
|
64
84
|
# Request keys used when authenticating a user.
|
|
65
85
|
mattr_accessor :request_keys
|
|
@@ -67,11 +87,11 @@ module Devise
|
|
|
67
87
|
|
|
68
88
|
# Keys that should be case-insensitive.
|
|
69
89
|
mattr_accessor :case_insensitive_keys
|
|
70
|
-
@@case_insensitive_keys = [
|
|
90
|
+
@@case_insensitive_keys = [:email]
|
|
71
91
|
|
|
72
92
|
# Keys that should have whitespace stripped.
|
|
73
93
|
mattr_accessor :strip_whitespace_keys
|
|
74
|
-
@@strip_whitespace_keys = []
|
|
94
|
+
@@strip_whitespace_keys = [:email]
|
|
75
95
|
|
|
76
96
|
# If http authentication is enabled by default.
|
|
77
97
|
mattr_accessor :http_authenticatable
|
|
@@ -89,11 +109,11 @@ module Devise
|
|
|
89
109
|
mattr_accessor :http_authentication_realm
|
|
90
110
|
@@http_authentication_realm = "Application"
|
|
91
111
|
|
|
92
|
-
# Email regex used to validate email formats. It
|
|
93
|
-
#
|
|
94
|
-
#
|
|
112
|
+
# Email regex used to validate email formats. It asserts that there are no
|
|
113
|
+
# @ symbols or whitespaces in either the localpart or the domain, and that
|
|
114
|
+
# there is a single @ symbol separating the localpart and the domain.
|
|
95
115
|
mattr_accessor :email_regexp
|
|
96
|
-
@@email_regexp = /\A[^@\s]+@
|
|
116
|
+
@@email_regexp = /\A[^@\s]+@[^@\s]+\z/
|
|
97
117
|
|
|
98
118
|
# Range validation for password length
|
|
99
119
|
mattr_accessor :password_length
|
|
@@ -107,6 +127,10 @@ module Devise
|
|
|
107
127
|
mattr_accessor :extend_remember_period
|
|
108
128
|
@@extend_remember_period = false
|
|
109
129
|
|
|
130
|
+
# If true, all the remember me tokens are going to be invalidated when the user signs out.
|
|
131
|
+
mattr_accessor :expire_all_remember_me_on_sign_out
|
|
132
|
+
@@expire_all_remember_me_on_sign_out = true
|
|
133
|
+
|
|
110
134
|
# Time interval you can access your account before confirming your account.
|
|
111
135
|
# nil - allows unconfirmed access for unlimited time
|
|
112
136
|
mattr_accessor :allow_unconfirmed_access_for
|
|
@@ -118,25 +142,28 @@ module Devise
|
|
|
118
142
|
|
|
119
143
|
# Defines which key will be used when confirming an account.
|
|
120
144
|
mattr_accessor :confirmation_keys
|
|
121
|
-
@@confirmation_keys = [
|
|
145
|
+
@@confirmation_keys = [:email]
|
|
122
146
|
|
|
123
147
|
# Defines if email should be reconfirmable.
|
|
124
|
-
# False by default for backwards compatibility.
|
|
125
148
|
mattr_accessor :reconfirmable
|
|
126
|
-
@@reconfirmable =
|
|
149
|
+
@@reconfirmable = true
|
|
127
150
|
|
|
128
151
|
# Time interval to timeout the user session without activity.
|
|
129
152
|
mattr_accessor :timeout_in
|
|
130
153
|
@@timeout_in = 30.minutes
|
|
131
154
|
|
|
132
|
-
#
|
|
133
|
-
mattr_accessor :expire_auth_token_on_timeout
|
|
134
|
-
@@expire_auth_token_on_timeout = false
|
|
135
|
-
|
|
136
|
-
# Used to encrypt password. Please generate one with rake secret.
|
|
155
|
+
# Used to hash the password. Please generate one with rails secret.
|
|
137
156
|
mattr_accessor :pepper
|
|
138
157
|
@@pepper = nil
|
|
139
158
|
|
|
159
|
+
# Used to send notification to the original user email when their email is changed.
|
|
160
|
+
mattr_accessor :send_email_changed_notification
|
|
161
|
+
@@send_email_changed_notification = false
|
|
162
|
+
|
|
163
|
+
# Used to enable sending notification to user when their password is changed.
|
|
164
|
+
mattr_accessor :send_password_change_notification
|
|
165
|
+
@@send_password_change_notification = false
|
|
166
|
+
|
|
140
167
|
# Scoped views. Since it relies on fallbacks to render default views, it's
|
|
141
168
|
# turned off by default.
|
|
142
169
|
mattr_accessor :scoped_views
|
|
@@ -149,7 +176,7 @@ module Devise
|
|
|
149
176
|
|
|
150
177
|
# Defines which key will be used when locking and unlocking an account
|
|
151
178
|
mattr_accessor :unlock_keys
|
|
152
|
-
@@unlock_keys = [
|
|
179
|
+
@@unlock_keys = [:email]
|
|
153
180
|
|
|
154
181
|
# Defines which strategy can be used to unlock an account.
|
|
155
182
|
# Values: :email, :time, :both
|
|
@@ -166,12 +193,16 @@ module Devise
|
|
|
166
193
|
|
|
167
194
|
# Defines which key will be used when recovering the password for an account
|
|
168
195
|
mattr_accessor :reset_password_keys
|
|
169
|
-
@@reset_password_keys = [
|
|
196
|
+
@@reset_password_keys = [:email]
|
|
170
197
|
|
|
171
198
|
# Time interval you can reset your password with a reset password key
|
|
172
199
|
mattr_accessor :reset_password_within
|
|
173
200
|
@@reset_password_within = 6.hours
|
|
174
201
|
|
|
202
|
+
# When set to false, resetting a password does not automatically sign in a user
|
|
203
|
+
mattr_accessor :sign_in_after_reset_password
|
|
204
|
+
@@sign_in_after_reset_password = true
|
|
205
|
+
|
|
175
206
|
# The default scope which is used by warden.
|
|
176
207
|
mattr_accessor :default_scope
|
|
177
208
|
@@default_scope = nil
|
|
@@ -180,13 +211,9 @@ module Devise
|
|
|
180
211
|
mattr_accessor :mailer_sender
|
|
181
212
|
@@mailer_sender = nil
|
|
182
213
|
|
|
183
|
-
# Authentication token params key name of choice. E.g. /users/sign_in?some_key=...
|
|
184
|
-
mattr_accessor :token_authentication_key
|
|
185
|
-
@@token_authentication_key = :auth_token
|
|
186
|
-
|
|
187
214
|
# Skip session storage for the following strategies
|
|
188
215
|
mattr_accessor :skip_session_storage
|
|
189
|
-
@@skip_session_storage = []
|
|
216
|
+
@@skip_session_storage = [:http_auth]
|
|
190
217
|
|
|
191
218
|
# Which formats should be treated as navigational.
|
|
192
219
|
mattr_accessor :navigational_formats
|
|
@@ -198,7 +225,7 @@ module Devise
|
|
|
198
225
|
|
|
199
226
|
# The default method used while signing out
|
|
200
227
|
mattr_accessor :sign_out_via
|
|
201
|
-
@@sign_out_via = :
|
|
228
|
+
@@sign_out_via = :delete
|
|
202
229
|
|
|
203
230
|
# The parent controller all Devise controllers inherits from.
|
|
204
231
|
# Defaults to ApplicationController. This should be set early
|
|
@@ -213,37 +240,36 @@ module Devise
|
|
|
213
240
|
@@parent_mailer = "ActionMailer::Base"
|
|
214
241
|
|
|
215
242
|
# The router Devise should use to generate routes. Defaults
|
|
216
|
-
# to :main_app. Should be
|
|
243
|
+
# to :main_app. Should be overridden by engines in order
|
|
217
244
|
# to provide custom routes.
|
|
218
245
|
mattr_accessor :router_name
|
|
219
246
|
@@router_name = nil
|
|
220
247
|
|
|
221
|
-
# Set the
|
|
248
|
+
# Set the OmniAuth path prefix so it can be overridden when
|
|
222
249
|
# Devise is used in a mountable engine
|
|
223
250
|
mattr_accessor :omniauth_path_prefix
|
|
224
251
|
@@omniauth_path_prefix = nil
|
|
225
252
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
def self.use_salt_as_remember_token=(value)
|
|
231
|
-
warn "\n[DEVISE] Devise.use_salt_as_remember_token is deprecated and has no effect. Please remove it.\n"
|
|
232
|
-
end
|
|
253
|
+
# Set if we should clean up the CSRF Token on authentication
|
|
254
|
+
mattr_accessor :clean_up_csrf_token_on_authentication
|
|
255
|
+
@@clean_up_csrf_token_on_authentication = true
|
|
233
256
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
257
|
+
# When false, Devise will not attempt to reload routes on eager load.
|
|
258
|
+
# This can reduce the time taken to boot the app but if your application
|
|
259
|
+
# requires the Devise mappings to be loaded during boot time the application
|
|
260
|
+
# won't boot properly.
|
|
261
|
+
mattr_accessor :reload_routes
|
|
262
|
+
@@reload_routes = true
|
|
237
263
|
|
|
238
264
|
# PRIVATE CONFIGURATION
|
|
239
265
|
|
|
240
266
|
# Store scopes mappings.
|
|
241
267
|
mattr_reader :mappings
|
|
242
|
-
@@mappings =
|
|
268
|
+
@@mappings = {}
|
|
243
269
|
|
|
244
|
-
#
|
|
270
|
+
# OmniAuth configurations.
|
|
245
271
|
mattr_reader :omniauth_configs
|
|
246
|
-
@@omniauth_configs =
|
|
272
|
+
@@omniauth_configs = {}
|
|
247
273
|
|
|
248
274
|
# Define a set of modules that are called when a mapping is added.
|
|
249
275
|
mattr_reader :helpers
|
|
@@ -253,20 +279,36 @@ module Devise
|
|
|
253
279
|
# Private methods to interface with Warden.
|
|
254
280
|
mattr_accessor :warden_config
|
|
255
281
|
@@warden_config = nil
|
|
256
|
-
@@
|
|
282
|
+
@@warden_config_blocks = []
|
|
257
283
|
|
|
258
284
|
# When true, enter in paranoid mode to avoid user enumeration.
|
|
259
285
|
mattr_accessor :paranoid
|
|
260
286
|
@@paranoid = false
|
|
261
287
|
|
|
262
|
-
#
|
|
288
|
+
# When true, warn user if they just used next-to-last attempt of authentication
|
|
289
|
+
mattr_accessor :last_attempt_warning
|
|
290
|
+
@@last_attempt_warning = true
|
|
291
|
+
|
|
292
|
+
# Stores the token generator
|
|
293
|
+
mattr_accessor :token_generator
|
|
294
|
+
@@token_generator = nil
|
|
295
|
+
|
|
296
|
+
# When set to false, changing a password does not automatically sign in a user
|
|
297
|
+
mattr_accessor :sign_in_after_change_password
|
|
298
|
+
@@sign_in_after_change_password = true
|
|
299
|
+
|
|
300
|
+
def self.activerecord51? # :nodoc:
|
|
301
|
+
defined?(ActiveRecord) && ActiveRecord.gem_version >= Gem::Version.new("5.1.x")
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
# Default way to set up Devise. Run rails generate devise_install to create
|
|
263
305
|
# a fresh initializer with all configuration values.
|
|
264
306
|
def self.setup
|
|
265
307
|
yield self
|
|
266
308
|
end
|
|
267
309
|
|
|
268
310
|
class Getter
|
|
269
|
-
def initialize
|
|
311
|
+
def initialize(name)
|
|
270
312
|
@name = name
|
|
271
313
|
end
|
|
272
314
|
|
|
@@ -276,12 +318,8 @@ module Devise
|
|
|
276
318
|
end
|
|
277
319
|
|
|
278
320
|
def self.ref(arg)
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
Getter.new(arg)
|
|
282
|
-
else
|
|
283
|
-
ActiveSupport::Dependencies.ref(arg)
|
|
284
|
-
end
|
|
321
|
+
ActiveSupport::Dependencies.reference(arg)
|
|
322
|
+
Getter.new(arg)
|
|
285
323
|
end
|
|
286
324
|
|
|
287
325
|
def self.available_router_name
|
|
@@ -312,7 +350,12 @@ module Devise
|
|
|
312
350
|
mapping
|
|
313
351
|
end
|
|
314
352
|
|
|
315
|
-
#
|
|
353
|
+
# Register available devise modules. For the standard modules that Devise provides, this method is
|
|
354
|
+
# called from lib/devise/modules.rb. Third-party modules need to be added explicitly using this method.
|
|
355
|
+
#
|
|
356
|
+
# Note that adding a module using this method does not cause it to be used in the authentication
|
|
357
|
+
# process. That requires that the module be listed in the arguments passed to the 'devise' method
|
|
358
|
+
# in the model class definition.
|
|
316
359
|
#
|
|
317
360
|
# == Options:
|
|
318
361
|
#
|
|
@@ -320,6 +363,7 @@ module Devise
|
|
|
320
363
|
# +controller+ - Symbol representing the name of an existing or custom *controller* for this module.
|
|
321
364
|
# +route+ - Symbol representing the named *route* helper for this module.
|
|
322
365
|
# +strategy+ - Symbol representing if this module got a custom *strategy*.
|
|
366
|
+
# +insert_at+ - Integer representing the order in which this module's model will be included
|
|
323
367
|
#
|
|
324
368
|
# All values, except :model, accept also a boolean and will have the same name as the given module
|
|
325
369
|
# name.
|
|
@@ -327,12 +371,14 @@ module Devise
|
|
|
327
371
|
# == Examples:
|
|
328
372
|
#
|
|
329
373
|
# Devise.add_module(:party_module)
|
|
330
|
-
# Devise.add_module(:party_module, :
|
|
331
|
-
# Devise.add_module(:party_module, :
|
|
374
|
+
# Devise.add_module(:party_module, strategy: true, controller: :sessions)
|
|
375
|
+
# Devise.add_module(:party_module, model: 'party_module/model')
|
|
376
|
+
# Devise.add_module(:party_module, insert_at: 0)
|
|
332
377
|
#
|
|
333
378
|
def self.add_module(module_name, options = {})
|
|
334
|
-
|
|
335
|
-
|
|
379
|
+
options.assert_valid_keys(:strategy, :model, :controller, :route, :no_input, :insert_at)
|
|
380
|
+
|
|
381
|
+
ALL.insert (options[:insert_at] || -1), module_name
|
|
336
382
|
|
|
337
383
|
if strategy = options[:strategy]
|
|
338
384
|
strategy = (strategy == true ? module_name : strategy)
|
|
@@ -377,7 +423,7 @@ module Devise
|
|
|
377
423
|
# Sets warden configuration using a block that will be invoked on warden
|
|
378
424
|
# initialization.
|
|
379
425
|
#
|
|
380
|
-
# Devise.
|
|
426
|
+
# Devise.setup do |config|
|
|
381
427
|
# config.allow_unconfirmed_access_for = 2.days
|
|
382
428
|
#
|
|
383
429
|
# config.warden do |manager|
|
|
@@ -386,15 +432,14 @@ module Devise
|
|
|
386
432
|
# end
|
|
387
433
|
# end
|
|
388
434
|
def self.warden(&block)
|
|
389
|
-
@@
|
|
435
|
+
@@warden_config_blocks << block
|
|
390
436
|
end
|
|
391
437
|
|
|
392
|
-
# Specify an
|
|
438
|
+
# Specify an OmniAuth provider.
|
|
393
439
|
#
|
|
394
440
|
# config.omniauth :github, APP_ID, APP_SECRET
|
|
395
441
|
#
|
|
396
442
|
def self.omniauth(provider, *args)
|
|
397
|
-
@@helpers << Devise::OmniAuth::UrlHelpers
|
|
398
443
|
config = Devise::OmniAuth::Config.new(provider, args)
|
|
399
444
|
@@omniauth_configs[config.strategy_name.to_sym] = config
|
|
400
445
|
end
|
|
@@ -417,8 +462,8 @@ module Devise
|
|
|
417
462
|
Devise::Controllers::UrlHelpers.generate_helpers!
|
|
418
463
|
end
|
|
419
464
|
|
|
420
|
-
# A method used internally to setup warden manager
|
|
421
|
-
#
|
|
465
|
+
# A method used internally to complete the setup of warden manager after routes are loaded.
|
|
466
|
+
# See lib/devise/rails/routes.rb - ActionDispatch::Routing::RouteSet#finalize_with_devise!
|
|
422
467
|
def self.configure_warden! #:nodoc:
|
|
423
468
|
@@warden_configured ||= begin
|
|
424
469
|
warden_config.failure_app = Devise::Delegator.new
|
|
@@ -426,28 +471,29 @@ module Devise
|
|
|
426
471
|
warden_config.intercept_401 = false
|
|
427
472
|
|
|
428
473
|
Devise.mappings.each_value do |mapping|
|
|
429
|
-
warden_config.scope_defaults mapping.name, :
|
|
474
|
+
warden_config.scope_defaults mapping.name, strategies: mapping.strategies
|
|
430
475
|
|
|
431
476
|
warden_config.serialize_into_session(mapping.name) do |record|
|
|
432
477
|
mapping.to.serialize_into_session(record)
|
|
433
478
|
end
|
|
434
479
|
|
|
435
|
-
warden_config.serialize_from_session(mapping.name) do |
|
|
436
|
-
# Previous versions contained an additional entry at the beginning of
|
|
437
|
-
# key with the record's class name.
|
|
438
|
-
args = key[-2, 2]
|
|
480
|
+
warden_config.serialize_from_session(mapping.name) do |args|
|
|
439
481
|
mapping.to.serialize_from_session(*args)
|
|
440
482
|
end
|
|
441
483
|
end
|
|
442
484
|
|
|
443
|
-
@@
|
|
485
|
+
@@warden_config_blocks.map { |block| block.call Devise.warden_config }
|
|
444
486
|
true
|
|
445
487
|
end
|
|
446
488
|
end
|
|
447
489
|
|
|
448
490
|
# Generate a friendly string randomly to be used as token.
|
|
449
|
-
|
|
450
|
-
|
|
491
|
+
# By default, length is 20 characters.
|
|
492
|
+
def self.friendly_token(length = 20)
|
|
493
|
+
# To calculate real characters, we must perform this operation.
|
|
494
|
+
# See SecureRandom.urlsafe_base64
|
|
495
|
+
rlength = (length * 3) / 4
|
|
496
|
+
SecureRandom.urlsafe_base64(rlength).tr('lIO0', 'sxyz')
|
|
451
497
|
end
|
|
452
498
|
|
|
453
499
|
# constant-time comparison algorithm to prevent timing attacks
|
|
@@ -1,24 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'rails/generators/active_record'
|
|
2
4
|
require 'generators/devise/orm_helpers'
|
|
3
5
|
|
|
4
6
|
module ActiveRecord
|
|
5
7
|
module Generators
|
|
6
8
|
class DeviseGenerator < ActiveRecord::Generators::Base
|
|
7
|
-
argument :attributes, :
|
|
9
|
+
argument :attributes, type: :array, default: [], banner: "field:type field:type"
|
|
10
|
+
|
|
11
|
+
class_option :primary_key_type, type: :string, desc: "The type for primary key"
|
|
8
12
|
|
|
9
13
|
include Devise::Generators::OrmHelpers
|
|
10
14
|
source_root File.expand_path("../templates", __FILE__)
|
|
11
15
|
|
|
12
16
|
def copy_devise_migration
|
|
13
17
|
if (behavior == :invoke && model_exists?) || (behavior == :revoke && migration_exists?(table_name))
|
|
14
|
-
migration_template "migration_existing.rb", "
|
|
18
|
+
migration_template "migration_existing.rb", "#{migration_path}/add_devise_to_#{table_name}.rb", migration_version: migration_version
|
|
15
19
|
else
|
|
16
|
-
migration_template "migration.rb", "
|
|
20
|
+
migration_template "migration.rb", "#{migration_path}/devise_create_#{table_name}.rb", migration_version: migration_version
|
|
17
21
|
end
|
|
18
22
|
end
|
|
19
23
|
|
|
20
24
|
def generate_model
|
|
21
|
-
invoke "active_record:model", [name], :
|
|
25
|
+
invoke "active_record:model", [name], migration: false unless model_exists? && behavior == :invoke
|
|
22
26
|
end
|
|
23
27
|
|
|
24
28
|
def inject_devise_content
|
|
@@ -39,8 +43,8 @@ module ActiveRecord
|
|
|
39
43
|
def migration_data
|
|
40
44
|
<<RUBY
|
|
41
45
|
## Database authenticatable
|
|
42
|
-
t.string :email, :
|
|
43
|
-
t.string :encrypted_password, :
|
|
46
|
+
t.string :email, null: false, default: ""
|
|
47
|
+
t.string :encrypted_password, null: false, default: ""
|
|
44
48
|
|
|
45
49
|
## Recoverable
|
|
46
50
|
t.string :reset_password_token
|
|
@@ -50,11 +54,11 @@ module ActiveRecord
|
|
|
50
54
|
t.datetime :remember_created_at
|
|
51
55
|
|
|
52
56
|
## Trackable
|
|
53
|
-
t.integer :sign_in_count, :
|
|
54
|
-
t.datetime :current_sign_in_at
|
|
55
|
-
t.datetime :last_sign_in_at
|
|
56
|
-
t
|
|
57
|
-
t
|
|
57
|
+
# t.integer :sign_in_count, default: 0, null: false
|
|
58
|
+
# t.datetime :current_sign_in_at
|
|
59
|
+
# t.datetime :last_sign_in_at
|
|
60
|
+
# t.#{ip_column} :current_sign_in_ip
|
|
61
|
+
# t.#{ip_column} :last_sign_in_ip
|
|
58
62
|
|
|
59
63
|
## Confirmable
|
|
60
64
|
# t.string :confirmation_token
|
|
@@ -63,14 +67,59 @@ module ActiveRecord
|
|
|
63
67
|
# t.string :unconfirmed_email # Only if using reconfirmable
|
|
64
68
|
|
|
65
69
|
## Lockable
|
|
66
|
-
# t.integer :failed_attempts, :
|
|
70
|
+
# t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
|
|
67
71
|
# t.string :unlock_token # Only if unlock strategy is :email or :both
|
|
68
72
|
# t.datetime :locked_at
|
|
69
|
-
|
|
70
|
-
## Token authenticatable
|
|
71
|
-
# t.string :authentication_token
|
|
72
73
|
RUBY
|
|
73
74
|
end
|
|
75
|
+
|
|
76
|
+
def ip_column
|
|
77
|
+
# Padded with spaces so it aligns nicely with the rest of the columns.
|
|
78
|
+
"%-8s" % (inet? ? "inet" : "string")
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def inet?
|
|
82
|
+
postgresql?
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def rails5_and_up?
|
|
86
|
+
Rails::VERSION::MAJOR >= 5
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def rails61_and_up?
|
|
90
|
+
Rails::VERSION::MAJOR > 6 || (Rails::VERSION::MAJOR == 6 && Rails::VERSION::MINOR >= 1)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def postgresql?
|
|
94
|
+
ar_config && ar_config['adapter'] == 'postgresql'
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def ar_config
|
|
98
|
+
if ActiveRecord::Base.configurations.respond_to?(:configs_for)
|
|
99
|
+
if rails61_and_up?
|
|
100
|
+
ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: "primary").configuration_hash
|
|
101
|
+
else
|
|
102
|
+
ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: "primary").config
|
|
103
|
+
end
|
|
104
|
+
else
|
|
105
|
+
ActiveRecord::Base.configurations[Rails.env]
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def migration_version
|
|
110
|
+
if rails5_and_up?
|
|
111
|
+
"[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def primary_key_type
|
|
116
|
+
primary_key_string if rails5_and_up?
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def primary_key_string
|
|
120
|
+
key_string = options[:primary_key_type]
|
|
121
|
+
", id: :#{key_string}" if key_string
|
|
122
|
+
end
|
|
74
123
|
end
|
|
75
124
|
end
|
|
76
125
|
end
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class DeviseCreate<%= table_name.camelize %> < ActiveRecord::Migration<%= migration_version %>
|
|
2
4
|
def change
|
|
3
|
-
create_table
|
|
5
|
+
create_table :<%= table_name %><%= primary_key_type %> do |t|
|
|
4
6
|
<%= migration_data -%>
|
|
5
7
|
|
|
6
8
|
<% attributes.each do |attribute| -%>
|
|
7
9
|
t.<%= attribute.type %> :<%= attribute.name %>
|
|
8
10
|
<% end -%>
|
|
9
11
|
|
|
10
|
-
t.timestamps
|
|
12
|
+
t.timestamps null: false
|
|
11
13
|
end
|
|
12
14
|
|
|
13
|
-
add_index :<%= table_name %>, :email, :
|
|
14
|
-
add_index :<%= table_name %>, :reset_password_token, :
|
|
15
|
-
# add_index :<%= table_name %>, :confirmation_token, :
|
|
16
|
-
# add_index :<%= table_name %>, :unlock_token, :
|
|
17
|
-
# add_index :<%= table_name %>, :authentication_token, :unique => true
|
|
15
|
+
add_index :<%= table_name %>, :email, unique: true
|
|
16
|
+
add_index :<%= table_name %>, :reset_password_token, unique: true
|
|
17
|
+
# add_index :<%= table_name %>, :confirmation_token, unique: true
|
|
18
|
+
# add_index :<%= table_name %>, :unlock_token, unique: true
|
|
18
19
|
end
|
|
19
20
|
end
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class AddDeviseTo<%= table_name.camelize %> < ActiveRecord::Migration<%= migration_version %>
|
|
2
4
|
def self.up
|
|
3
|
-
change_table
|
|
5
|
+
change_table :<%= table_name %> do |t|
|
|
4
6
|
<%= migration_data -%>
|
|
5
7
|
|
|
6
8
|
<% attributes.each do |attribute| -%>
|
|
@@ -8,14 +10,13 @@ class AddDeviseTo<%= table_name.camelize %> < ActiveRecord::Migration
|
|
|
8
10
|
<% end -%>
|
|
9
11
|
|
|
10
12
|
# Uncomment below if timestamps were not included in your original model.
|
|
11
|
-
# t.timestamps
|
|
13
|
+
# t.timestamps null: false
|
|
12
14
|
end
|
|
13
15
|
|
|
14
|
-
add_index :<%= table_name %>, :email, :
|
|
15
|
-
add_index :<%= table_name %>, :reset_password_token, :
|
|
16
|
-
# add_index :<%= table_name %>, :confirmation_token, :
|
|
17
|
-
# add_index :<%= table_name %>, :unlock_token, :
|
|
18
|
-
# add_index :<%= table_name %>, :authentication_token, :unique => true
|
|
16
|
+
add_index :<%= table_name %>, :email, unique: true
|
|
17
|
+
add_index :<%= table_name %>, :reset_password_token, unique: true
|
|
18
|
+
# add_index :<%= table_name %>, :confirmation_token, unique: true
|
|
19
|
+
# add_index :<%= table_name %>, :unlock_token, unique: true
|
|
19
20
|
end
|
|
20
21
|
|
|
21
22
|
def self.down
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rails/generators/base'
|
|
4
|
+
|
|
5
|
+
module Devise
|
|
6
|
+
module Generators
|
|
7
|
+
class ControllersGenerator < Rails::Generators::Base
|
|
8
|
+
CONTROLLERS = %w(confirmations passwords registrations sessions unlocks omniauth_callbacks).freeze
|
|
9
|
+
|
|
10
|
+
desc <<-DESC.strip_heredoc
|
|
11
|
+
Create inherited Devise controllers in your app/controllers folder.
|
|
12
|
+
|
|
13
|
+
Use -c to specify which controller you want to overwrite.
|
|
14
|
+
If you do no specify a controller, all controllers will be created.
|
|
15
|
+
For example:
|
|
16
|
+
|
|
17
|
+
rails generate devise:controllers users -c=sessions
|
|
18
|
+
|
|
19
|
+
This will create a controller class at app/controllers/users/sessions_controller.rb like this:
|
|
20
|
+
|
|
21
|
+
class Users::SessionsController < Devise::SessionsController
|
|
22
|
+
content...
|
|
23
|
+
end
|
|
24
|
+
DESC
|
|
25
|
+
|
|
26
|
+
source_root File.expand_path("../../templates/controllers", __FILE__)
|
|
27
|
+
argument :scope, required: true,
|
|
28
|
+
desc: "The scope to create controllers in, e.g. users, admins"
|
|
29
|
+
class_option :controllers, aliases: "-c", type: :array,
|
|
30
|
+
desc: "Select specific controllers to generate (#{CONTROLLERS.join(', ')})"
|
|
31
|
+
|
|
32
|
+
def create_controllers
|
|
33
|
+
@scope_prefix = scope.blank? ? '' : (scope.camelize + '::')
|
|
34
|
+
controllers = options[:controllers] || CONTROLLERS
|
|
35
|
+
controllers.each do |name|
|
|
36
|
+
template "#{name}_controller.rb",
|
|
37
|
+
"app/controllers/#{scope}/#{name}_controller.rb"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def show_readme
|
|
42
|
+
readme "README" if behavior == :invoke
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|