devise 3.5.10 → 4.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +256 -1135
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +254 -67
  5. data/app/controllers/devise/confirmations_controller.rb +3 -1
  6. data/app/controllers/devise/omniauth_callbacks_controller.rb +8 -6
  7. data/app/controllers/devise/passwords_controller.rb +7 -4
  8. data/app/controllers/devise/registrations_controller.rb +39 -18
  9. data/app/controllers/devise/sessions_controller.rb +9 -7
  10. data/app/controllers/devise/unlocks_controller.rb +4 -2
  11. data/app/controllers/devise_controller.rb +23 -10
  12. data/app/helpers/devise_helper.rb +12 -19
  13. data/app/mailers/devise/mailer.rb +6 -0
  14. data/app/views/devise/confirmations/new.html.erb +2 -2
  15. data/app/views/devise/mailer/email_changed.html.erb +7 -0
  16. data/app/views/devise/passwords/edit.html.erb +3 -3
  17. data/app/views/devise/passwords/new.html.erb +2 -2
  18. data/app/views/devise/registrations/edit.html.erb +9 -5
  19. data/app/views/devise/registrations/new.html.erb +4 -4
  20. data/app/views/devise/sessions/new.html.erb +4 -4
  21. data/app/views/devise/shared/_error_messages.html.erb +15 -0
  22. data/app/views/devise/shared/_links.html.erb +7 -7
  23. data/app/views/devise/unlocks/new.html.erb +2 -2
  24. data/config/locales/en.yml +4 -1
  25. data/lib/devise/controllers/helpers.rb +23 -20
  26. data/lib/devise/controllers/rememberable.rb +3 -1
  27. data/lib/devise/controllers/scoped_views.rb +2 -0
  28. data/lib/devise/controllers/sign_in_out.rb +34 -11
  29. data/lib/devise/controllers/store_location.rb +25 -7
  30. data/lib/devise/controllers/url_helpers.rb +2 -0
  31. data/lib/devise/delegator.rb +2 -0
  32. data/lib/devise/encryptor.rb +6 -4
  33. data/lib/devise/failure_app.rb +75 -37
  34. data/lib/devise/hooks/activatable.rb +2 -0
  35. data/lib/devise/hooks/csrf_cleaner.rb +2 -0
  36. data/lib/devise/hooks/forgetable.rb +2 -0
  37. data/lib/devise/hooks/lockable.rb +6 -1
  38. data/lib/devise/hooks/proxy.rb +3 -1
  39. data/lib/devise/hooks/rememberable.rb +2 -0
  40. data/lib/devise/hooks/timeoutable.rb +2 -0
  41. data/lib/devise/hooks/trackable.rb +2 -0
  42. data/lib/devise/mailers/helpers.rb +7 -4
  43. data/lib/devise/mapping.rb +2 -0
  44. data/lib/devise/models/authenticatable.rb +51 -26
  45. data/lib/devise/models/confirmable.rb +88 -27
  46. data/lib/devise/models/database_authenticatable.rb +88 -21
  47. data/lib/devise/models/lockable.rb +10 -4
  48. data/lib/devise/models/omniauthable.rb +2 -0
  49. data/lib/devise/models/recoverable.rb +31 -19
  50. data/lib/devise/models/registerable.rb +4 -0
  51. data/lib/devise/models/rememberable.rb +5 -10
  52. data/lib/devise/models/timeoutable.rb +2 -0
  53. data/lib/devise/models/trackable.rb +15 -1
  54. data/lib/devise/models/validatable.rb +10 -3
  55. data/lib/devise/models.rb +3 -1
  56. data/lib/devise/modules.rb +2 -0
  57. data/lib/devise/omniauth/config.rb +2 -0
  58. data/lib/devise/omniauth/url_helpers.rb +14 -5
  59. data/lib/devise/omniauth.rb +2 -0
  60. data/lib/devise/orm/active_record.rb +5 -1
  61. data/lib/devise/orm/mongoid.rb +6 -2
  62. data/lib/devise/parameter_filter.rb +4 -0
  63. data/lib/devise/parameter_sanitizer.rb +139 -65
  64. data/lib/devise/rails/routes.rb +44 -33
  65. data/lib/devise/rails/warden_compat.rb +3 -10
  66. data/lib/devise/rails.rb +7 -16
  67. data/lib/devise/secret_key_finder.rb +27 -0
  68. data/lib/devise/strategies/authenticatable.rb +3 -1
  69. data/lib/devise/strategies/base.rb +2 -0
  70. data/lib/devise/strategies/database_authenticatable.rb +11 -4
  71. data/lib/devise/strategies/rememberable.rb +2 -0
  72. data/lib/devise/test/controller_helpers.rb +165 -0
  73. data/lib/devise/test/integration_helpers.rb +63 -0
  74. data/lib/devise/test_helpers.rb +7 -124
  75. data/lib/devise/time_inflector.rb +2 -0
  76. data/lib/devise/token_generator.rb +3 -41
  77. data/lib/devise/version.rb +3 -1
  78. data/lib/devise.rb +61 -40
  79. data/lib/generators/active_record/devise_generator.rb +29 -10
  80. data/lib/generators/active_record/templates/migration.rb +4 -2
  81. data/lib/generators/active_record/templates/migration_existing.rb +4 -2
  82. data/lib/generators/devise/controllers_generator.rb +3 -1
  83. data/lib/generators/devise/devise_generator.rb +4 -2
  84. data/lib/generators/devise/install_generator.rb +17 -0
  85. data/lib/generators/devise/orm_helpers.rb +10 -21
  86. data/lib/generators/devise/views_generator.rb +7 -8
  87. data/lib/generators/mongoid/devise_generator.rb +7 -5
  88. data/lib/generators/templates/README +1 -8
  89. data/lib/generators/templates/controllers/confirmations_controller.rb +2 -0
  90. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +2 -0
  91. data/lib/generators/templates/controllers/passwords_controller.rb +2 -0
  92. data/lib/generators/templates/controllers/registrations_controller.rb +6 -4
  93. data/lib/generators/templates/controllers/sessions_controller.rb +4 -2
  94. data/lib/generators/templates/controllers/unlocks_controller.rb +2 -0
  95. data/lib/generators/templates/devise.rb +50 -20
  96. data/lib/generators/templates/markerb/email_changed.markerb +7 -0
  97. data/lib/generators/templates/markerb/password_change.markerb +2 -2
  98. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +5 -1
  99. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +10 -2
  100. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +4 -1
  101. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +11 -3
  102. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +11 -3
  103. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +7 -2
  104. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +4 -1
  105. metadata +13 -312
  106. data/.gitignore +0 -10
  107. data/.travis.yml +0 -44
  108. data/.yardopts +0 -9
  109. data/CODE_OF_CONDUCT.md +0 -22
  110. data/CONTRIBUTING.md +0 -16
  111. data/Gemfile +0 -30
  112. data/Gemfile.lock +0 -187
  113. data/Rakefile +0 -36
  114. data/devise.gemspec +0 -27
  115. data/devise.png +0 -0
  116. data/gemfiles/Gemfile.rails-3.2-stable +0 -29
  117. data/gemfiles/Gemfile.rails-3.2-stable.lock +0 -172
  118. data/gemfiles/Gemfile.rails-4.0-stable +0 -30
  119. data/gemfiles/Gemfile.rails-4.0-stable.lock +0 -166
  120. data/gemfiles/Gemfile.rails-4.1-stable +0 -30
  121. data/gemfiles/Gemfile.rails-4.1-stable.lock +0 -171
  122. data/gemfiles/Gemfile.rails-4.2-stable +0 -30
  123. data/gemfiles/Gemfile.rails-4.2-stable.lock +0 -193
  124. data/script/cached-bundle +0 -49
  125. data/script/s3-put +0 -71
  126. data/test/controllers/custom_registrations_controller_test.rb +0 -40
  127. data/test/controllers/custom_strategy_test.rb +0 -62
  128. data/test/controllers/helper_methods_test.rb +0 -21
  129. data/test/controllers/helpers_test.rb +0 -316
  130. data/test/controllers/inherited_controller_i18n_messages_test.rb +0 -51
  131. data/test/controllers/internal_helpers_test.rb +0 -129
  132. data/test/controllers/load_hooks_controller_test.rb +0 -19
  133. data/test/controllers/passwords_controller_test.rb +0 -31
  134. data/test/controllers/sessions_controller_test.rb +0 -103
  135. data/test/controllers/url_helpers_test.rb +0 -65
  136. data/test/delegator_test.rb +0 -19
  137. data/test/devise_test.rb +0 -107
  138. data/test/failure_app_test.rb +0 -315
  139. data/test/generators/active_record_generator_test.rb +0 -109
  140. data/test/generators/controllers_generator_test.rb +0 -48
  141. data/test/generators/devise_generator_test.rb +0 -39
  142. data/test/generators/install_generator_test.rb +0 -13
  143. data/test/generators/mongoid_generator_test.rb +0 -23
  144. data/test/generators/views_generator_test.rb +0 -103
  145. data/test/helpers/devise_helper_test.rb +0 -49
  146. data/test/integration/authenticatable_test.rb +0 -729
  147. data/test/integration/confirmable_test.rb +0 -324
  148. data/test/integration/database_authenticatable_test.rb +0 -95
  149. data/test/integration/http_authenticatable_test.rb +0 -105
  150. data/test/integration/lockable_test.rb +0 -239
  151. data/test/integration/omniauthable_test.rb +0 -135
  152. data/test/integration/recoverable_test.rb +0 -347
  153. data/test/integration/registerable_test.rb +0 -359
  154. data/test/integration/rememberable_test.rb +0 -214
  155. data/test/integration/timeoutable_test.rb +0 -184
  156. data/test/integration/trackable_test.rb +0 -92
  157. data/test/mailers/confirmation_instructions_test.rb +0 -115
  158. data/test/mailers/reset_password_instructions_test.rb +0 -96
  159. data/test/mailers/unlock_instructions_test.rb +0 -91
  160. data/test/mapping_test.rb +0 -134
  161. data/test/models/authenticatable_test.rb +0 -23
  162. data/test/models/confirmable_test.rb +0 -511
  163. data/test/models/database_authenticatable_test.rb +0 -269
  164. data/test/models/lockable_test.rb +0 -350
  165. data/test/models/omniauthable_test.rb +0 -7
  166. data/test/models/recoverable_test.rb +0 -251
  167. data/test/models/registerable_test.rb +0 -7
  168. data/test/models/rememberable_test.rb +0 -169
  169. data/test/models/serializable_test.rb +0 -49
  170. data/test/models/timeoutable_test.rb +0 -51
  171. data/test/models/trackable_test.rb +0 -41
  172. data/test/models/validatable_test.rb +0 -127
  173. data/test/models_test.rb +0 -153
  174. data/test/omniauth/config_test.rb +0 -57
  175. data/test/omniauth/url_helpers_test.rb +0 -54
  176. data/test/orm/active_record.rb +0 -10
  177. data/test/orm/mongoid.rb +0 -13
  178. data/test/parameter_sanitizer_test.rb +0 -81
  179. data/test/rails_app/Rakefile +0 -6
  180. data/test/rails_app/app/active_record/admin.rb +0 -6
  181. data/test/rails_app/app/active_record/shim.rb +0 -2
  182. data/test/rails_app/app/active_record/user.rb +0 -6
  183. data/test/rails_app/app/active_record/user_on_engine.rb +0 -7
  184. data/test/rails_app/app/active_record/user_on_main_app.rb +0 -7
  185. data/test/rails_app/app/active_record/user_without_email.rb +0 -8
  186. data/test/rails_app/app/controllers/admins/sessions_controller.rb +0 -6
  187. data/test/rails_app/app/controllers/admins_controller.rb +0 -6
  188. data/test/rails_app/app/controllers/application_controller.rb +0 -12
  189. data/test/rails_app/app/controllers/application_with_fake_engine.rb +0 -30
  190. data/test/rails_app/app/controllers/custom/registrations_controller.rb +0 -31
  191. data/test/rails_app/app/controllers/home_controller.rb +0 -25
  192. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +0 -2
  193. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +0 -2
  194. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +0 -14
  195. data/test/rails_app/app/controllers/users_controller.rb +0 -31
  196. data/test/rails_app/app/helpers/application_helper.rb +0 -3
  197. data/test/rails_app/app/mailers/users/from_proc_mailer.rb +0 -3
  198. data/test/rails_app/app/mailers/users/mailer.rb +0 -3
  199. data/test/rails_app/app/mailers/users/reply_to_mailer.rb +0 -4
  200. data/test/rails_app/app/mongoid/admin.rb +0 -29
  201. data/test/rails_app/app/mongoid/shim.rb +0 -23
  202. data/test/rails_app/app/mongoid/user.rb +0 -39
  203. data/test/rails_app/app/mongoid/user_on_engine.rb +0 -39
  204. data/test/rails_app/app/mongoid/user_on_main_app.rb +0 -39
  205. data/test/rails_app/app/mongoid/user_without_email.rb +0 -33
  206. data/test/rails_app/app/views/admins/index.html.erb +0 -1
  207. data/test/rails_app/app/views/admins/sessions/new.html.erb +0 -2
  208. data/test/rails_app/app/views/home/admin_dashboard.html.erb +0 -1
  209. data/test/rails_app/app/views/home/index.html.erb +0 -1
  210. data/test/rails_app/app/views/home/join.html.erb +0 -1
  211. data/test/rails_app/app/views/home/private.html.erb +0 -1
  212. data/test/rails_app/app/views/home/user_dashboard.html.erb +0 -1
  213. data/test/rails_app/app/views/layouts/application.html.erb +0 -24
  214. data/test/rails_app/app/views/users/edit_form.html.erb +0 -1
  215. data/test/rails_app/app/views/users/index.html.erb +0 -1
  216. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +0 -1
  217. data/test/rails_app/app/views/users/sessions/new.html.erb +0 -1
  218. data/test/rails_app/bin/bundle +0 -3
  219. data/test/rails_app/bin/rails +0 -4
  220. data/test/rails_app/bin/rake +0 -4
  221. data/test/rails_app/config/application.rb +0 -40
  222. data/test/rails_app/config/boot.rb +0 -14
  223. data/test/rails_app/config/database.yml +0 -18
  224. data/test/rails_app/config/environment.rb +0 -5
  225. data/test/rails_app/config/environments/development.rb +0 -30
  226. data/test/rails_app/config/environments/production.rb +0 -84
  227. data/test/rails_app/config/environments/test.rb +0 -41
  228. data/test/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  229. data/test/rails_app/config/initializers/devise.rb +0 -180
  230. data/test/rails_app/config/initializers/inflections.rb +0 -2
  231. data/test/rails_app/config/initializers/secret_token.rb +0 -8
  232. data/test/rails_app/config/initializers/session_store.rb +0 -1
  233. data/test/rails_app/config/routes.rb +0 -125
  234. data/test/rails_app/config.ru +0 -4
  235. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -71
  236. data/test/rails_app/db/schema.rb +0 -55
  237. data/test/rails_app/lib/shared_admin.rb +0 -17
  238. data/test/rails_app/lib/shared_user.rb +0 -29
  239. data/test/rails_app/lib/shared_user_without_email.rb +0 -26
  240. data/test/rails_app/lib/shared_user_without_omniauth.rb +0 -13
  241. data/test/rails_app/public/404.html +0 -26
  242. data/test/rails_app/public/422.html +0 -26
  243. data/test/rails_app/public/500.html +0 -26
  244. data/test/rails_app/public/favicon.ico +0 -0
  245. data/test/rails_test.rb +0 -9
  246. data/test/routes_test.rb +0 -264
  247. data/test/support/action_controller/record_identifier.rb +0 -10
  248. data/test/support/assertions.rb +0 -39
  249. data/test/support/helpers.rb +0 -77
  250. data/test/support/integration.rb +0 -92
  251. data/test/support/locale/en.yml +0 -8
  252. data/test/support/mongoid.yml +0 -6
  253. data/test/support/webrat/integrations/rails.rb +0 -24
  254. data/test/test_helper.rb +0 -34
  255. data/test/test_helpers_test.rb +0 -178
  256. data/test/test_models.rb +0 -33
  257. data/test/time_helpers.rb +0 -137
data/lib/devise.rb CHANGED
@@ -1,3 +1,5 @@
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'
@@ -12,19 +14,19 @@ module Devise
12
14
  autoload :FailureApp, 'devise/failure_app'
13
15
  autoload :OmniAuth, 'devise/omniauth'
14
16
  autoload :ParameterFilter, 'devise/parameter_filter'
15
- autoload :BaseSanitizer, 'devise/parameter_sanitizer'
16
17
  autoload :ParameterSanitizer, 'devise/parameter_sanitizer'
17
18
  autoload :TestHelpers, 'devise/test_helpers'
18
19
  autoload :TimeInflector, 'devise/time_inflector'
19
20
  autoload :TokenGenerator, 'devise/token_generator'
21
+ autoload :SecretKeyFinder, 'devise/secret_key_finder'
20
22
 
21
23
  module Controllers
22
- autoload :Helpers, 'devise/controllers/helpers'
23
- autoload :Rememberable, 'devise/controllers/rememberable'
24
- autoload :ScopedViews, 'devise/controllers/scoped_views'
25
- autoload :SignInOut, 'devise/controllers/sign_in_out'
26
- autoload :StoreLocation, 'devise/controllers/store_location'
27
- 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'
28
30
  end
29
31
 
30
32
  module Hooks
@@ -36,17 +38,22 @@ module Devise
36
38
  end
37
39
 
38
40
  module Strategies
39
- autoload :Base, 'devise/strategies/base'
41
+ autoload :Base, 'devise/strategies/base'
40
42
  autoload :Authenticatable, 'devise/strategies/authenticatable'
41
43
  end
42
44
 
45
+ module Test
46
+ autoload :ControllerHelpers, 'devise/test/controller_helpers'
47
+ autoload :IntegrationHelpers, 'devise/test/integration_helpers'
48
+ end
49
+
43
50
  # Constants which holds devise configuration for extensions. Those should
44
51
  # not be modified by the "end user" (this is why they are constants).
45
52
  ALL = []
46
- CONTROLLERS = ActiveSupport::OrderedHash.new
47
- ROUTES = ActiveSupport::OrderedHash.new
48
- STRATEGIES = ActiveSupport::OrderedHash.new
49
- URL_HELPERS = ActiveSupport::OrderedHash.new
53
+ CONTROLLERS = {}
54
+ ROUTES = {}
55
+ STRATEGIES = {}
56
+ URL_HELPERS = {}
50
57
 
51
58
  # Strategies that do not require user input.
52
59
  NO_INPUT = []
@@ -62,9 +69,9 @@ module Devise
62
69
  mattr_accessor :rememberable_options
63
70
  @@rememberable_options = {}
64
71
 
65
- # The number of times to encrypt password.
72
+ # The number of times to hash the password.
66
73
  mattr_accessor :stretches
67
- @@stretches = 10
74
+ @@stretches = 11
68
75
 
69
76
  # The default key used when authenticating over http auth.
70
77
  mattr_accessor :http_authentication_key
@@ -84,7 +91,7 @@ module Devise
84
91
 
85
92
  # Keys that should have whitespace stripped.
86
93
  mattr_accessor :strip_whitespace_keys
87
- @@strip_whitespace_keys = []
94
+ @@strip_whitespace_keys = [:email]
88
95
 
89
96
  # If http authentication is enabled by default.
90
97
  mattr_accessor :http_authenticatable
@@ -102,11 +109,11 @@ module Devise
102
109
  mattr_accessor :http_authentication_realm
103
110
  @@http_authentication_realm = "Application"
104
111
 
105
- # Email regex used to validate email formats. It simply asserts that
106
- # an one (and only one) @ exists in the given string. This is mainly
107
- # 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.
108
115
  mattr_accessor :email_regexp
109
- @@email_regexp = /\A[^@\s]+@([^@\s]+\.)+[^@\W]+\z/
116
+ @@email_regexp = /\A[^@\s]+@[^@\s]+\z/
110
117
 
111
118
  # Range validation for password length
112
119
  mattr_accessor :password_length
@@ -138,19 +145,22 @@ module Devise
138
145
  @@confirmation_keys = [:email]
139
146
 
140
147
  # Defines if email should be reconfirmable.
141
- # False by default for backwards compatibility.
142
148
  mattr_accessor :reconfirmable
143
- @@reconfirmable = false
149
+ @@reconfirmable = true
144
150
 
145
151
  # Time interval to timeout the user session without activity.
146
152
  mattr_accessor :timeout_in
147
153
  @@timeout_in = 30.minutes
148
154
 
149
- # Used to encrypt password. Please generate one with rake secret.
155
+ # Used to hash the password. Please generate one with rails secret.
150
156
  mattr_accessor :pepper
151
157
  @@pepper = nil
152
158
 
153
- # Used to enable sending notification to user when their password is changed
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.
154
164
  mattr_accessor :send_password_change_notification
155
165
  @@send_password_change_notification = false
156
166
 
@@ -203,7 +213,7 @@ module Devise
203
213
 
204
214
  # Skip session storage for the following strategies
205
215
  mattr_accessor :skip_session_storage
206
- @@skip_session_storage = []
216
+ @@skip_session_storage = [:http_auth]
207
217
 
208
218
  # Which formats should be treated as navigational.
209
219
  mattr_accessor :navigational_formats
@@ -215,7 +225,7 @@ module Devise
215
225
 
216
226
  # The default method used while signing out
217
227
  mattr_accessor :sign_out_via
218
- @@sign_out_via = :get
228
+ @@sign_out_via = :delete
219
229
 
220
230
  # The parent controller all Devise controllers inherits from.
221
231
  # Defaults to ApplicationController. This should be set early
@@ -244,15 +254,22 @@ module Devise
244
254
  mattr_accessor :clean_up_csrf_token_on_authentication
245
255
  @@clean_up_csrf_token_on_authentication = true
246
256
 
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
263
+
247
264
  # PRIVATE CONFIGURATION
248
265
 
249
266
  # Store scopes mappings.
250
267
  mattr_reader :mappings
251
- @@mappings = ActiveSupport::OrderedHash.new
268
+ @@mappings = {}
252
269
 
253
270
  # OmniAuth configurations.
254
271
  mattr_reader :omniauth_configs
255
- @@omniauth_configs = ActiveSupport::OrderedHash.new
272
+ @@omniauth_configs = {}
256
273
 
257
274
  # Define a set of modules that are called when a mapping is added.
258
275
  mattr_reader :helpers
@@ -276,14 +293,26 @@ module Devise
276
293
  mattr_accessor :token_generator
277
294
  @@token_generator = nil
278
295
 
279
- # Default way to setup Devise. Run rails generate devise_install to create
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.rails51? # :nodoc:
301
+ Rails.gem_version >= Gem::Version.new("5.1.x")
302
+ end
303
+
304
+ def self.activerecord51? # :nodoc:
305
+ defined?(ActiveRecord) && ActiveRecord.gem_version >= Gem::Version.new("5.1.x")
306
+ end
307
+
308
+ # Default way to set up Devise. Run rails generate devise_install to create
280
309
  # a fresh initializer with all configuration values.
281
310
  def self.setup
282
311
  yield self
283
312
  end
284
313
 
285
314
  class Getter
286
- def initialize name
315
+ def initialize(name)
287
316
  @name = name
288
317
  end
289
318
 
@@ -293,12 +322,8 @@ module Devise
293
322
  end
294
323
 
295
324
  def self.ref(arg)
296
- if defined?(ActiveSupport::Dependencies::ClassCache)
297
- ActiveSupport::Dependencies::reference(arg)
298
- Getter.new(arg)
299
- else
300
- ActiveSupport::Dependencies.ref(arg)
301
- end
325
+ ActiveSupport::Dependencies.reference(arg)
326
+ Getter.new(arg)
302
327
  end
303
328
 
304
329
  def self.available_router_name
@@ -419,7 +444,6 @@ module Devise
419
444
  # config.omniauth :github, APP_ID, APP_SECRET
420
445
  #
421
446
  def self.omniauth(provider, *args)
422
- @@helpers << Devise::OmniAuth::UrlHelpers
423
447
  config = Devise::OmniAuth::Config.new(provider, args)
424
448
  @@omniauth_configs[config.strategy_name.to_sym] = config
425
449
  end
@@ -457,10 +481,7 @@ module Devise
457
481
  mapping.to.serialize_into_session(record)
458
482
  end
459
483
 
460
- warden_config.serialize_from_session(mapping.name) do |key|
461
- # Previous versions contained an additional entry at the beginning of
462
- # key with the record's class name.
463
- args = key[-2, 2]
484
+ warden_config.serialize_from_session(mapping.name) do |args|
464
485
  mapping.to.serialize_from_session(*args)
465
486
  end
466
487
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails/generators/active_record'
2
4
  require 'generators/devise/orm_helpers'
3
5
 
@@ -6,14 +8,16 @@ module ActiveRecord
6
8
  class DeviseGenerator < ActiveRecord::Generators::Base
7
9
  argument :attributes, type: :array, default: [], banner: "field:type field:type"
8
10
 
11
+ class_option :primary_key_type, type: :string, desc: "The type for primary key"
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}.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", "db/migrate/devise_create_#{table_name}.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
 
@@ -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, null: false
54
- t.datetime :current_sign_in_at
55
- t.datetime :last_sign_in_at
56
- t.#{ip_column} :current_sign_in_ip
57
- t.#{ip_column} :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
@@ -75,17 +79,32 @@ RUBY
75
79
  end
76
80
 
77
81
  def inet?
78
- rails4? && postgresql?
82
+ postgresql?
79
83
  end
80
84
 
81
- def rails4?
82
- Rails.version.start_with? '4'
85
+ def rails5_and_up?
86
+ Rails::VERSION::MAJOR >= 5
83
87
  end
84
88
 
85
89
  def postgresql?
86
90
  config = ActiveRecord::Base.configurations[Rails.env]
87
91
  config && config['adapter'] == 'postgresql'
88
92
  end
93
+
94
+ def migration_version
95
+ if rails5_and_up?
96
+ "[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
97
+ end
98
+ end
99
+
100
+ def primary_key_type
101
+ primary_key_string if rails5_and_up?
102
+ end
103
+
104
+ def primary_key_string
105
+ key_string = options[:primary_key_type]
106
+ ", id: :#{key_string}" if key_string
107
+ end
89
108
  end
90
109
  end
91
110
  end
@@ -1,6 +1,8 @@
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| -%>
@@ -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| -%>
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails/generators/base'
2
4
 
3
5
  module Devise
@@ -16,7 +18,7 @@ module Devise
16
18
 
17
19
  This will create a controller class at app/controllers/users/sessions_controller.rb like this:
18
20
 
19
- class Users::ConfirmationsController < Devise::ConfirmationsController
21
+ class Users::SessionsController < Devise::SessionsController
20
22
  content...
21
23
  end
22
24
  DESC
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails/generators/named_base'
2
4
 
3
5
  module Devise
@@ -8,7 +10,7 @@ module Devise
8
10
  namespace "devise"
9
11
  source_root File.expand_path("../templates", __FILE__)
10
12
 
11
- desc "Generates a model with the given NAME (if one does not exist) with devise " <<
13
+ desc "Generates a model with the given NAME (if one does not exist) with devise " \
12
14
  "configuration plus a migration file and devise routes."
13
15
 
14
16
  hook_for :orm
@@ -16,7 +18,7 @@ module Devise
16
18
  class_option :routes, desc: "Generate routes", type: :boolean, default: true
17
19
 
18
20
  def add_devise_routes
19
- devise_route = "devise_for :#{plural_name}"
21
+ devise_route = "devise_for :#{plural_name}".dup
20
22
  devise_route << %Q(, class_name: "#{class_name}") if class_name.include?("::")
21
23
  devise_route << %Q(, skip: :all) unless options.routes?
22
24
  route devise_route
@@ -1,8 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails/generators/base'
2
4
  require 'securerandom'
3
5
 
4
6
  module Devise
5
7
  module Generators
8
+ MissingORMError = Class.new(Thor::Error)
9
+
6
10
  class InstallGenerator < Rails::Generators::Base
7
11
  source_root File.expand_path("../../templates", __FILE__)
8
12
 
@@ -10,6 +14,19 @@ module Devise
10
14
  class_option :orm
11
15
 
12
16
  def copy_initializer
17
+ unless options[:orm]
18
+ raise MissingORMError, <<-ERROR.strip_heredoc
19
+ An ORM must be set to install Devise in your application.
20
+
21
+ Be sure to have an ORM like Active Record or Mongoid loaded in your
22
+ app or configure your own at `config/application.rb`.
23
+
24
+ config.generators do |g|
25
+ g.orm :your_orm_gem
26
+ end
27
+ ERROR
28
+ end
29
+
13
30
  template "devise.rb", "config/initializers/devise.rb"
14
31
  end
15
32
 
@@ -1,38 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Devise
2
4
  module Generators
3
5
  module OrmHelpers
4
6
  def model_contents
5
7
  buffer = <<-CONTENT
6
8
  # Include default devise modules. Others available are:
7
- # :confirmable, :lockable, :timeoutable and :omniauthable
9
+ # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
8
10
  devise :database_authenticatable, :registerable,
9
- :recoverable, :rememberable, :trackable, :validatable
10
-
11
- CONTENT
12
- buffer += <<-CONTENT if needs_attr_accessible?
13
- # Setup accessible (or protected) attributes for your model
14
- attr_accessible :email, :password, :password_confirmation, :remember_me
11
+ :recoverable, :rememberable, :validatable
15
12
 
16
13
  CONTENT
17
14
  buffer
18
15
  end
19
16
 
20
- def needs_attr_accessible?
21
- rails_3? && !strong_parameters_enabled?
22
- end
23
-
24
- def rails_3?
25
- Rails::VERSION::MAJOR == 3
26
- end
27
-
28
- def strong_parameters_enabled?
29
- defined?(ActionController::StrongParameters)
30
- end
31
-
32
17
  private
33
18
 
34
19
  def model_exists?
35
- File.exists?(File.join(destination_root, model_path))
20
+ File.exist?(File.join(destination_root, model_path))
36
21
  end
37
22
 
38
23
  def migration_exists?(table_name)
@@ -40,7 +25,11 @@ CONTENT
40
25
  end
41
26
 
42
27
  def migration_path
43
- @migration_path ||= File.join("db", "migrate")
28
+ if Rails.version >= '5.0.3'
29
+ db_migrate_path
30
+ else
31
+ @migration_path ||= File.join("db", "migrate")
32
+ end
44
33
  end
45
34
 
46
35
  def model_path
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails/generators/base'
2
4
 
3
5
  module Devise
@@ -21,13 +23,6 @@ module Devise
21
23
  public_task :copy_views
22
24
  end
23
25
 
24
- # TODO: Add this to Rails itself
25
- module ClassMethods
26
- def hide!
27
- Rails::Generators.hide_namespace self.namespace
28
- end
29
- end
30
-
31
26
  def copy_views
32
27
  if options[:views]
33
28
  options[:views].each do |directory|
@@ -139,7 +134,11 @@ module Devise
139
134
  default: defined?(SimpleForm) ? "simple_form_for" : "form_for"
140
135
 
141
136
  hook_for :markerb, desc: "Generate markerb instead of erb mail views",
142
- default: defined?(Markerb) ? :markerb : :erb,
137
+ default: defined?(Markerb),
138
+ type: :boolean
139
+
140
+ hook_for :erb, desc: "Generate erb mail views",
141
+ default: !defined?(Markerb),
143
142
  type: :boolean
144
143
  end
145
144
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails/generators/named_base'
2
4
  require 'generators/devise/orm_helpers'
3
5
 
@@ -32,11 +34,11 @@ module Mongoid
32
34
  field :remember_created_at, type: Time
33
35
 
34
36
  ## Trackable
35
- field :sign_in_count, type: Integer, default: 0
36
- field :current_sign_in_at, type: Time
37
- field :last_sign_in_at, type: Time
38
- field :current_sign_in_ip, type: String
39
- field :last_sign_in_ip, type: String
37
+ # field :sign_in_count, type: Integer, default: 0
38
+ # field :current_sign_in_at, type: Time
39
+ # field :last_sign_in_at, type: Time
40
+ # field :current_sign_in_ip, type: String
41
+ # field :last_sign_in_ip, type: String
40
42
 
41
43
  ## Confirmable
42
44
  # field :confirmation_token, type: String
@@ -21,14 +21,7 @@ Some setup you must do manually if you haven't yet:
21
21
  <p class="notice"><%= notice %></p>
22
22
  <p class="alert"><%= alert %></p>
23
23
 
24
- 4. If you are deploying on Heroku with Rails 3.2 only, you may want to set:
25
-
26
- config.assets.initialize_on_precompile = false
27
-
28
- On config/application.rb forcing your application to not access the DB
29
- or load models when precompiling your assets.
30
-
31
- 5. You can copy Devise views (for customization) to your app by running:
24
+ 4. You can copy Devise views (for customization) to your app by running:
32
25
 
33
26
  rails g devise:views
34
27
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class <%= @scope_prefix %>ConfirmationsController < Devise::ConfirmationsController
2
4
  # GET /resource/confirmation/new
3
5
  # def new
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class <%= @scope_prefix %>OmniauthCallbacksController < Devise::OmniauthCallbacksController
2
4
  # You should configure your model like this:
3
5
  # devise :omniauthable, omniauth_providers: [:twitter]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class <%= @scope_prefix %>PasswordsController < Devise::PasswordsController
2
4
  # GET /resource/password/new
3
5
  # def new
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class <%= @scope_prefix %>RegistrationsController < Devise::RegistrationsController
2
- # before_filter :configure_sign_up_params, only: [:create]
3
- # before_filter :configure_account_update_params, only: [:update]
4
+ # before_action :configure_sign_up_params, only: [:create]
5
+ # before_action :configure_account_update_params, only: [:update]
4
6
 
5
7
  # GET /resource/sign_up
6
8
  # def new
@@ -40,12 +42,12 @@ class <%= @scope_prefix %>RegistrationsController < Devise::RegistrationsControl
40
42
 
41
43
  # If you have extra params to permit, append them to the sanitizer.
42
44
  # def configure_sign_up_params
43
- # devise_parameter_sanitizer.for(:sign_up) << :attribute
45
+ # devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute])
44
46
  # end
45
47
 
46
48
  # If you have extra params to permit, append them to the sanitizer.
47
49
  # def configure_account_update_params
48
- # devise_parameter_sanitizer.for(:account_update) << :attribute
50
+ # devise_parameter_sanitizer.permit(:account_update, keys: [:attribute])
49
51
  # end
50
52
 
51
53
  # The path used after sign up.
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class <%= @scope_prefix %>SessionsController < Devise::SessionsController
2
- # before_filter :configure_sign_in_params, only: [:create]
4
+ # before_action :configure_sign_in_params, only: [:create]
3
5
 
4
6
  # GET /resource/sign_in
5
7
  # def new
@@ -20,6 +22,6 @@ class <%= @scope_prefix %>SessionsController < Devise::SessionsController
20
22
 
21
23
  # If you have extra params to permit, append them to the sanitizer.
22
24
  # def configure_sign_in_params
23
- # devise_parameter_sanitizer.for(:sign_in) << :attribute
25
+ # devise_parameter_sanitizer.permit(:sign_in, keys: [:attribute])
24
26
  # end
25
27
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class <%= @scope_prefix %>UnlocksController < Devise::UnlocksController
2
4
  # GET /resource/unlock/new
3
5
  # def new