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.
Files changed (242) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +351 -0
  3. data/MIT-LICENSE +2 -1
  4. data/README.md +422 -130
  5. data/app/controllers/devise/confirmations_controller.rb +17 -6
  6. data/app/controllers/devise/omniauth_callbacks_controller.rb +12 -6
  7. data/app/controllers/devise/passwords_controller.rb +23 -8
  8. data/app/controllers/devise/registrations_controller.rb +70 -28
  9. data/app/controllers/devise/sessions_controller.rb +49 -17
  10. data/app/controllers/devise/unlocks_controller.rb +11 -4
  11. data/app/controllers/devise_controller.rb +74 -34
  12. data/app/helpers/devise_helper.rb +23 -18
  13. data/app/mailers/devise/mailer.rb +25 -10
  14. data/app/views/devise/confirmations/new.html.erb +9 -5
  15. data/app/views/devise/mailer/confirmation_instructions.html.erb +1 -1
  16. data/app/views/devise/mailer/email_changed.html.erb +7 -0
  17. data/app/views/devise/mailer/password_change.html.erb +3 -0
  18. data/app/views/devise/mailer/reset_password_instructions.html.erb +1 -1
  19. data/app/views/devise/mailer/unlock_instructions.html.erb +1 -1
  20. data/app/views/devise/passwords/edit.html.erb +16 -7
  21. data/app/views/devise/passwords/new.html.erb +9 -5
  22. data/app/views/devise/registrations/edit.html.erb +29 -15
  23. data/app/views/devise/registrations/new.html.erb +20 -9
  24. data/app/views/devise/sessions/new.html.erb +19 -10
  25. data/app/views/devise/shared/_error_messages.html.erb +15 -0
  26. data/app/views/devise/shared/{_links.erb → _links.html.erb} +10 -10
  27. data/app/views/devise/unlocks/new.html.erb +9 -5
  28. data/config/locales/en.yml +26 -20
  29. data/lib/devise/controllers/helpers.rb +122 -125
  30. data/lib/devise/controllers/rememberable.rb +14 -14
  31. data/lib/devise/controllers/scoped_views.rb +3 -1
  32. data/lib/devise/controllers/sign_in_out.rb +121 -0
  33. data/lib/devise/controllers/store_location.rb +76 -0
  34. data/lib/devise/controllers/url_helpers.rb +10 -8
  35. data/lib/devise/delegator.rb +2 -0
  36. data/lib/devise/encryptor.rb +24 -0
  37. data/lib/devise/failure_app.rb +132 -42
  38. data/lib/devise/hooks/activatable.rb +7 -6
  39. data/lib/devise/hooks/csrf_cleaner.rb +9 -0
  40. data/lib/devise/hooks/forgetable.rb +3 -1
  41. data/lib/devise/hooks/lockable.rb +5 -3
  42. data/lib/devise/hooks/proxy.rb +23 -0
  43. data/lib/devise/hooks/rememberable.rb +7 -4
  44. data/lib/devise/hooks/timeoutable.rb +18 -8
  45. data/lib/devise/hooks/trackable.rb +3 -1
  46. data/lib/devise/mailers/helpers.rb +15 -18
  47. data/lib/devise/mapping.rb +9 -3
  48. data/lib/devise/models/authenticatable.rb +102 -80
  49. data/lib/devise/models/confirmable.rb +154 -72
  50. data/lib/devise/models/database_authenticatable.rb +125 -25
  51. data/lib/devise/models/lockable.rb +50 -29
  52. data/lib/devise/models/omniauthable.rb +3 -1
  53. data/lib/devise/models/recoverable.rb +72 -50
  54. data/lib/devise/models/registerable.rb +4 -0
  55. data/lib/devise/models/rememberable.rb +65 -32
  56. data/lib/devise/models/timeoutable.rb +4 -8
  57. data/lib/devise/models/trackable.rb +20 -4
  58. data/lib/devise/models/validatable.rb +16 -9
  59. data/lib/devise/models.rb +6 -13
  60. data/lib/devise/modules.rb +12 -11
  61. data/lib/devise/omniauth/config.rb +2 -0
  62. data/lib/devise/omniauth/url_helpers.rb +14 -5
  63. data/lib/devise/omniauth.rb +4 -5
  64. data/lib/devise/orm/active_record.rb +5 -1
  65. data/lib/devise/orm/mongoid.rb +6 -2
  66. data/lib/devise/parameter_filter.rb +4 -0
  67. data/lib/devise/parameter_sanitizer.rb +144 -34
  68. data/lib/devise/rails/deprecated_constant_accessor.rb +39 -0
  69. data/lib/devise/rails/routes.rb +191 -127
  70. data/lib/devise/rails/warden_compat.rb +2 -1
  71. data/lib/devise/rails.rb +13 -20
  72. data/lib/devise/secret_key_finder.rb +27 -0
  73. data/lib/devise/strategies/authenticatable.rb +21 -22
  74. data/lib/devise/strategies/base.rb +3 -1
  75. data/lib/devise/strategies/database_authenticatable.rb +15 -4
  76. data/lib/devise/strategies/rememberable.rb +15 -3
  77. data/lib/devise/test/controller_helpers.rb +167 -0
  78. data/lib/devise/test/integration_helpers.rb +63 -0
  79. data/lib/devise/test_helpers.rb +7 -123
  80. data/lib/devise/time_inflector.rb +4 -2
  81. data/lib/devise/token_generator.rb +32 -0
  82. data/lib/devise/version.rb +3 -1
  83. data/lib/devise.rb +124 -78
  84. data/lib/generators/active_record/devise_generator.rb +64 -15
  85. data/lib/generators/active_record/templates/migration.rb +9 -8
  86. data/lib/generators/active_record/templates/migration_existing.rb +9 -8
  87. data/lib/generators/devise/controllers_generator.rb +46 -0
  88. data/lib/generators/devise/devise_generator.rb +10 -6
  89. data/lib/generators/devise/install_generator.rb +19 -1
  90. data/lib/generators/devise/orm_helpers.rb +17 -9
  91. data/lib/generators/devise/views_generator.rb +51 -28
  92. data/lib/generators/mongoid/devise_generator.rb +24 -24
  93. data/lib/generators/templates/README +13 -12
  94. data/lib/generators/templates/controllers/README +14 -0
  95. data/lib/generators/templates/controllers/confirmations_controller.rb +30 -0
  96. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +30 -0
  97. data/lib/generators/templates/controllers/passwords_controller.rb +34 -0
  98. data/lib/generators/templates/controllers/registrations_controller.rb +62 -0
  99. data/lib/generators/templates/controllers/sessions_controller.rb +27 -0
  100. data/lib/generators/templates/controllers/unlocks_controller.rb +30 -0
  101. data/lib/generators/templates/devise.rb +118 -53
  102. data/lib/generators/templates/markerb/confirmation_instructions.markerb +1 -1
  103. data/lib/generators/templates/markerb/email_changed.markerb +7 -0
  104. data/lib/generators/templates/markerb/password_change.markerb +3 -0
  105. data/lib/generators/templates/markerb/reset_password_instructions.markerb +1 -1
  106. data/lib/generators/templates/markerb/unlock_instructions.markerb +1 -1
  107. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +6 -2
  108. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +12 -4
  109. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +5 -2
  110. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +14 -6
  111. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +12 -4
  112. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +11 -6
  113. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +5 -2
  114. metadata +73 -294
  115. data/.gitignore +0 -10
  116. data/.travis.yml +0 -20
  117. data/.yardopts +0 -9
  118. data/CHANGELOG.rdoc +0 -941
  119. data/CONTRIBUTING.md +0 -14
  120. data/Gemfile +0 -31
  121. data/Gemfile.lock +0 -159
  122. data/Rakefile +0 -35
  123. data/app/views/devise/_links.erb +0 -3
  124. data/devise.gemspec +0 -26
  125. data/devise.png +0 -0
  126. data/gemfiles/Gemfile.rails-3.2.x +0 -31
  127. data/gemfiles/Gemfile.rails-3.2.x.lock +0 -156
  128. data/lib/devise/models/token_authenticatable.rb +0 -89
  129. data/lib/devise/strategies/token_authenticatable.rb +0 -91
  130. data/test/controllers/custom_strategy_test.rb +0 -62
  131. data/test/controllers/helpers_test.rb +0 -253
  132. data/test/controllers/internal_helpers_test.rb +0 -120
  133. data/test/controllers/passwords_controller_test.rb +0 -32
  134. data/test/controllers/sessions_controller_test.rb +0 -99
  135. data/test/controllers/url_helpers_test.rb +0 -59
  136. data/test/delegator_test.rb +0 -19
  137. data/test/devise_test.rb +0 -83
  138. data/test/failure_app_test.rb +0 -221
  139. data/test/generators/active_record_generator_test.rb +0 -73
  140. data/test/generators/devise_generator_test.rb +0 -39
  141. data/test/generators/install_generator_test.rb +0 -13
  142. data/test/generators/mongoid_generator_test.rb +0 -23
  143. data/test/generators/views_generator_test.rb +0 -67
  144. data/test/helpers/devise_helper_test.rb +0 -51
  145. data/test/integration/authenticatable_test.rb +0 -699
  146. data/test/integration/confirmable_test.rb +0 -299
  147. data/test/integration/database_authenticatable_test.rb +0 -84
  148. data/test/integration/http_authenticatable_test.rb +0 -115
  149. data/test/integration/lockable_test.rb +0 -242
  150. data/test/integration/omniauthable_test.rb +0 -133
  151. data/test/integration/recoverable_test.rb +0 -335
  152. data/test/integration/registerable_test.rb +0 -349
  153. data/test/integration/rememberable_test.rb +0 -165
  154. data/test/integration/timeoutable_test.rb +0 -150
  155. data/test/integration/token_authenticatable_test.rb +0 -205
  156. data/test/integration/trackable_test.rb +0 -92
  157. data/test/mailers/confirmation_instructions_test.rb +0 -111
  158. data/test/mailers/reset_password_instructions_test.rb +0 -92
  159. data/test/mailers/unlock_instructions_test.rb +0 -87
  160. data/test/mapping_test.rb +0 -127
  161. data/test/models/authenticatable_test.rb +0 -13
  162. data/test/models/confirmable_test.rb +0 -452
  163. data/test/models/database_authenticatable_test.rb +0 -226
  164. data/test/models/lockable_test.rb +0 -282
  165. data/test/models/omniauthable_test.rb +0 -7
  166. data/test/models/recoverable_test.rb +0 -222
  167. data/test/models/registerable_test.rb +0 -7
  168. data/test/models/rememberable_test.rb +0 -175
  169. data/test/models/serializable_test.rb +0 -49
  170. data/test/models/timeoutable_test.rb +0 -46
  171. data/test/models/token_authenticatable_test.rb +0 -55
  172. data/test/models/trackable_test.rb +0 -13
  173. data/test/models/validatable_test.rb +0 -127
  174. data/test/models_test.rb +0 -163
  175. data/test/omniauth/config_test.rb +0 -57
  176. data/test/omniauth/url_helpers_test.rb +0 -54
  177. data/test/orm/active_record.rb +0 -10
  178. data/test/orm/mongoid.rb +0 -13
  179. data/test/parameter_sanitizer_test.rb +0 -58
  180. data/test/rails_app/Rakefile +0 -6
  181. data/test/rails_app/app/active_record/admin.rb +0 -6
  182. data/test/rails_app/app/active_record/shim.rb +0 -2
  183. data/test/rails_app/app/active_record/user.rb +0 -6
  184. data/test/rails_app/app/controllers/admins/sessions_controller.rb +0 -6
  185. data/test/rails_app/app/controllers/admins_controller.rb +0 -11
  186. data/test/rails_app/app/controllers/application_controller.rb +0 -9
  187. data/test/rails_app/app/controllers/home_controller.rb +0 -25
  188. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +0 -2
  189. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +0 -2
  190. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +0 -14
  191. data/test/rails_app/app/controllers/users_controller.rb +0 -31
  192. data/test/rails_app/app/helpers/application_helper.rb +0 -3
  193. data/test/rails_app/app/mailers/users/mailer.rb +0 -12
  194. data/test/rails_app/app/mongoid/admin.rb +0 -29
  195. data/test/rails_app/app/mongoid/shim.rb +0 -23
  196. data/test/rails_app/app/mongoid/user.rb +0 -42
  197. data/test/rails_app/app/views/admins/index.html.erb +0 -1
  198. data/test/rails_app/app/views/admins/sessions/new.html.erb +0 -2
  199. data/test/rails_app/app/views/home/admin_dashboard.html.erb +0 -1
  200. data/test/rails_app/app/views/home/index.html.erb +0 -1
  201. data/test/rails_app/app/views/home/join.html.erb +0 -1
  202. data/test/rails_app/app/views/home/private.html.erb +0 -1
  203. data/test/rails_app/app/views/home/user_dashboard.html.erb +0 -1
  204. data/test/rails_app/app/views/layouts/application.html.erb +0 -24
  205. data/test/rails_app/app/views/users/edit_form.html.erb +0 -1
  206. data/test/rails_app/app/views/users/index.html.erb +0 -1
  207. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +0 -1
  208. data/test/rails_app/app/views/users/sessions/new.html.erb +0 -1
  209. data/test/rails_app/bin/bundle +0 -3
  210. data/test/rails_app/bin/rails +0 -4
  211. data/test/rails_app/bin/rake +0 -4
  212. data/test/rails_app/config/application.rb +0 -40
  213. data/test/rails_app/config/boot.rb +0 -8
  214. data/test/rails_app/config/database.yml +0 -18
  215. data/test/rails_app/config/environment.rb +0 -5
  216. data/test/rails_app/config/environments/development.rb +0 -34
  217. data/test/rails_app/config/environments/production.rb +0 -84
  218. data/test/rails_app/config/environments/test.rb +0 -36
  219. data/test/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  220. data/test/rails_app/config/initializers/devise.rb +0 -178
  221. data/test/rails_app/config/initializers/inflections.rb +0 -2
  222. data/test/rails_app/config/initializers/secret_token.rb +0 -8
  223. data/test/rails_app/config/initializers/session_store.rb +0 -1
  224. data/test/rails_app/config/routes.rb +0 -104
  225. data/test/rails_app/config.ru +0 -4
  226. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -74
  227. data/test/rails_app/db/schema.rb +0 -52
  228. data/test/rails_app/lib/shared_admin.rb +0 -14
  229. data/test/rails_app/lib/shared_user.rb +0 -25
  230. data/test/rails_app/public/404.html +0 -26
  231. data/test/rails_app/public/422.html +0 -26
  232. data/test/rails_app/public/500.html +0 -26
  233. data/test/rails_app/public/favicon.ico +0 -0
  234. data/test/routes_test.rb +0 -250
  235. data/test/support/assertions.rb +0 -40
  236. data/test/support/helpers.rb +0 -91
  237. data/test/support/integration.rb +0 -92
  238. data/test/support/locale/en.yml +0 -4
  239. data/test/support/webrat/integrations/rails.rb +0 -24
  240. data/test/test_helper.rb +0 -34
  241. data/test/test_helpers_test.rb +0 -151
  242. 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, 'devise/controllers/helpers'
20
- autoload :Rememberable, 'devise/controllers/rememberable'
21
- autoload :ScopedViews, 'devise/controllers/scoped_views'
22
- autoload :UrlHelpers, 'devise/controllers/url_helpers'
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, 'devise/strategies/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 = ActiveSupport::OrderedHash.new
38
- ROUTES = ActiveSupport::OrderedHash.new
39
- STRATEGIES = ActiveSupport::OrderedHash.new
40
- URL_HELPERS = ActiveSupport::OrderedHash.new
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 encrypt password.
72
+ # The number of times to hash the password.
53
73
  mattr_accessor :stretches
54
- @@stretches = 10
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 = [ :email ]
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 = [ :email ]
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 simply asserts that
93
- # an one (and only one) @ exists in the given string. This is mainly
94
- # to give user feedback and not to assert the e-mail validity.
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]+@([^@\s]+\.)+[^@\s]+\z/
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 = [ :email ]
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 = false
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
- # Authentication token expiration on timeout
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 = [ :email ]
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 = [ :email ]
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 = :get
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 overriden by engines in order
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 omniauth path prefix so it can be overriden when
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
- def self.encryptor=(value)
227
- warn "\n[DEVISE] To select a encryption which isn't bcrypt, you should use devise-encryptable gem.\n"
228
- end
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
- def self.apply_schema=(value)
235
- warn "\n[DEVISE] Devise.apply_schema is deprecated and has no effect. Please remove it.\n"
236
- end
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 = ActiveSupport::OrderedHash.new
268
+ @@mappings = {}
243
269
 
244
- # Omniauth configurations.
270
+ # OmniAuth configurations.
245
271
  mattr_reader :omniauth_configs
246
- @@omniauth_configs = ActiveSupport::OrderedHash.new
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
- @@warden_config_block = nil
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
- # Default way to setup Devise. Run rails generate devise_install to create
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 name
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
- if defined?(ActiveSupport::Dependencies::ClassCache)
280
- ActiveSupport::Dependencies::reference(arg)
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
- # Make Devise aware of an 3rd party Devise-module (like invitable). For convenience.
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, :strategy => true, :controller => :sessions)
331
- # Devise.add_module(:party_module, :model => 'party_module/model')
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
- ALL << module_name
335
- options.assert_valid_keys(:strategy, :model, :controller, :route, :no_input)
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.initialize do |config|
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
- @@warden_config_block = block
435
+ @@warden_config_blocks << block
390
436
  end
391
437
 
392
- # Specify an omniauth provider.
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 from the Rails initialize
421
- # block.
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, :strategies => mapping.strategies
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 |key|
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
- @@warden_config_block.try :call, Devise.warden_config
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
- def self.friendly_token
450
- SecureRandom.base64(15).tr('+/=lIO0', 'pqrsxyz')
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, :type => :array, :default => [], :banner => "field:type field:type"
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", "db/migrate/add_devise_to_#{table_name}"
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", "db/migrate/devise_create_#{table_name}"
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], :migration => false unless model_exists? && behavior == :invoke
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, :null => false, :default => ""
43
- t.string :encrypted_password, :null => false, :default => ""
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, :default => 0
54
- t.datetime :current_sign_in_at
55
- t.datetime :last_sign_in_at
56
- t.string :current_sign_in_ip
57
- t.string :last_sign_in_ip
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, :default => 0 # Only if lock strategy is :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
- class DeviseCreate<%= table_name.camelize %> < ActiveRecord::Migration
1
+ # frozen_string_literal: true
2
+
3
+ class DeviseCreate<%= table_name.camelize %> < ActiveRecord::Migration<%= migration_version %>
2
4
  def change
3
- create_table(:<%= table_name %>) do |t|
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, :unique => true
14
- add_index :<%= table_name %>, :reset_password_token, :unique => true
15
- # add_index :<%= table_name %>, :confirmation_token, :unique => true
16
- # add_index :<%= table_name %>, :unlock_token, :unique => true
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
- class AddDeviseTo<%= table_name.camelize %> < ActiveRecord::Migration
1
+ # frozen_string_literal: true
2
+
3
+ class AddDeviseTo<%= table_name.camelize %> < ActiveRecord::Migration<%= migration_version %>
2
4
  def self.up
3
- change_table(:<%= table_name %>) do |t|
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, :unique => true
15
- add_index :<%= table_name %>, :reset_password_token, :unique => true
16
- # add_index :<%= table_name %>, :confirmation_token, :unique => true
17
- # add_index :<%= table_name %>, :unlock_token, :unique => true
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