devise 3.5.1 → 4.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (257) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +281 -1066
  3. data/MIT-LICENSE +2 -1
  4. data/README.md +292 -97
  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 +10 -7
  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 +25 -12
  12. data/app/helpers/devise_helper.rb +23 -18
  13. data/app/mailers/devise/mailer.rb +13 -3
  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/mailer/password_change.html.erb +3 -0
  17. data/app/views/devise/passwords/edit.html.erb +5 -5
  18. data/app/views/devise/passwords/new.html.erb +2 -2
  19. data/app/views/devise/registrations/edit.html.erb +9 -5
  20. data/app/views/devise/registrations/new.html.erb +4 -4
  21. data/app/views/devise/sessions/new.html.erb +4 -4
  22. data/app/views/devise/shared/_error_messages.html.erb +15 -0
  23. data/app/views/devise/shared/_links.html.erb +8 -8
  24. data/app/views/devise/unlocks/new.html.erb +2 -2
  25. data/config/locales/en.yml +7 -2
  26. data/lib/devise/controllers/helpers.rb +42 -33
  27. data/lib/devise/controllers/rememberable.rb +11 -2
  28. data/lib/devise/controllers/scoped_views.rb +2 -0
  29. data/lib/devise/controllers/sign_in_out.rb +40 -21
  30. data/lib/devise/controllers/store_location.rb +25 -7
  31. data/lib/devise/controllers/url_helpers.rb +3 -1
  32. data/lib/devise/delegator.rb +2 -0
  33. data/lib/devise/encryptor.rb +6 -4
  34. data/lib/devise/failure_app.rb +84 -28
  35. data/lib/devise/hooks/activatable.rb +2 -0
  36. data/lib/devise/hooks/csrf_cleaner.rb +2 -0
  37. data/lib/devise/hooks/forgetable.rb +2 -0
  38. data/lib/devise/hooks/lockable.rb +4 -2
  39. data/lib/devise/hooks/proxy.rb +3 -1
  40. data/lib/devise/hooks/rememberable.rb +2 -0
  41. data/lib/devise/hooks/timeoutable.rb +7 -7
  42. data/lib/devise/hooks/trackable.rb +2 -0
  43. data/lib/devise/mailers/helpers.rb +7 -4
  44. data/lib/devise/mapping.rb +3 -1
  45. data/lib/devise/models/authenticatable.rb +63 -33
  46. data/lib/devise/models/confirmable.rb +108 -35
  47. data/lib/devise/models/database_authenticatable.rb +102 -22
  48. data/lib/devise/models/lockable.rb +24 -6
  49. data/lib/devise/models/omniauthable.rb +2 -0
  50. data/lib/devise/models/recoverable.rb +34 -26
  51. data/lib/devise/models/registerable.rb +4 -0
  52. data/lib/devise/models/rememberable.rb +42 -26
  53. data/lib/devise/models/timeoutable.rb +2 -6
  54. data/lib/devise/models/trackable.rb +15 -1
  55. data/lib/devise/models/validatable.rb +10 -3
  56. data/lib/devise/models.rb +3 -1
  57. data/lib/devise/modules.rb +2 -0
  58. data/lib/devise/omniauth/config.rb +2 -0
  59. data/lib/devise/omniauth/url_helpers.rb +14 -5
  60. data/lib/devise/omniauth.rb +4 -5
  61. data/lib/devise/orm/active_record.rb +5 -1
  62. data/lib/devise/orm/mongoid.rb +6 -2
  63. data/lib/devise/parameter_filter.rb +4 -0
  64. data/lib/devise/parameter_sanitizer.rb +139 -65
  65. data/lib/devise/rails/deprecated_constant_accessor.rb +39 -0
  66. data/lib/devise/rails/routes.rb +71 -51
  67. data/lib/devise/rails/warden_compat.rb +3 -10
  68. data/lib/devise/rails.rb +7 -16
  69. data/lib/devise/secret_key_finder.rb +27 -0
  70. data/lib/devise/strategies/authenticatable.rb +5 -3
  71. data/lib/devise/strategies/base.rb +2 -0
  72. data/lib/devise/strategies/database_authenticatable.rb +11 -4
  73. data/lib/devise/strategies/rememberable.rb +5 -6
  74. data/lib/devise/test/controller_helpers.rb +167 -0
  75. data/lib/devise/test/integration_helpers.rb +63 -0
  76. data/lib/devise/test_helpers.rb +7 -124
  77. data/lib/devise/time_inflector.rb +2 -0
  78. data/lib/devise/token_generator.rb +3 -41
  79. data/lib/devise/version.rb +3 -1
  80. data/lib/devise.rb +69 -46
  81. data/lib/generators/active_record/devise_generator.rb +46 -12
  82. data/lib/generators/active_record/templates/migration.rb +4 -2
  83. data/lib/generators/active_record/templates/migration_existing.rb +4 -2
  84. data/lib/generators/devise/controllers_generator.rb +3 -1
  85. data/lib/generators/devise/devise_generator.rb +5 -3
  86. data/lib/generators/devise/install_generator.rb +18 -5
  87. data/lib/generators/devise/orm_helpers.rb +10 -21
  88. data/lib/generators/devise/views_generator.rb +21 -11
  89. data/lib/generators/mongoid/devise_generator.rb +7 -5
  90. data/lib/generators/templates/README +9 -8
  91. data/lib/generators/templates/controllers/README +1 -1
  92. data/lib/generators/templates/controllers/confirmations_controller.rb +2 -0
  93. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +3 -1
  94. data/lib/generators/templates/controllers/passwords_controller.rb +2 -0
  95. data/lib/generators/templates/controllers/registrations_controller.rb +6 -4
  96. data/lib/generators/templates/controllers/sessions_controller.rb +4 -2
  97. data/lib/generators/templates/controllers/unlocks_controller.rb +2 -0
  98. data/lib/generators/templates/devise.rb +65 -23
  99. data/lib/generators/templates/markerb/confirmation_instructions.markerb +1 -1
  100. data/lib/generators/templates/markerb/email_changed.markerb +7 -0
  101. data/lib/generators/templates/markerb/password_change.markerb +3 -0
  102. data/lib/generators/templates/markerb/reset_password_instructions.markerb +1 -1
  103. data/lib/generators/templates/markerb/unlock_instructions.markerb +1 -1
  104. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +5 -1
  105. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +10 -2
  106. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +4 -1
  107. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +11 -3
  108. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +11 -3
  109. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +7 -2
  110. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +4 -1
  111. metadata +21 -306
  112. data/.gitignore +0 -10
  113. data/.travis.yml +0 -45
  114. data/.yardopts +0 -9
  115. data/CONTRIBUTING.md +0 -14
  116. data/Gemfile +0 -29
  117. data/Gemfile.lock +0 -191
  118. data/Rakefile +0 -36
  119. data/devise.gemspec +0 -29
  120. data/devise.png +0 -0
  121. data/gemfiles/Gemfile.rails-3.2-stable +0 -29
  122. data/gemfiles/Gemfile.rails-3.2-stable.lock +0 -169
  123. data/gemfiles/Gemfile.rails-4.0-stable +0 -29
  124. data/gemfiles/Gemfile.rails-4.0-stable.lock +0 -163
  125. data/gemfiles/Gemfile.rails-4.1-stable +0 -29
  126. data/gemfiles/Gemfile.rails-4.1-stable.lock +0 -169
  127. data/gemfiles/Gemfile.rails-4.2-stable +0 -29
  128. data/gemfiles/Gemfile.rails-4.2-stable.lock +0 -191
  129. data/script/cached-bundle +0 -49
  130. data/script/s3-put +0 -71
  131. data/test/controllers/custom_registrations_controller_test.rb +0 -40
  132. data/test/controllers/custom_strategy_test.rb +0 -62
  133. data/test/controllers/helpers_test.rb +0 -316
  134. data/test/controllers/inherited_controller_i18n_messages_test.rb +0 -51
  135. data/test/controllers/internal_helpers_test.rb +0 -129
  136. data/test/controllers/load_hooks_controller_test.rb +0 -19
  137. data/test/controllers/passwords_controller_test.rb +0 -31
  138. data/test/controllers/sessions_controller_test.rb +0 -103
  139. data/test/controllers/url_helpers_test.rb +0 -65
  140. data/test/delegator_test.rb +0 -19
  141. data/test/devise_test.rb +0 -107
  142. data/test/failure_app_test.rb +0 -298
  143. data/test/generators/active_record_generator_test.rb +0 -109
  144. data/test/generators/controllers_generator_test.rb +0 -48
  145. data/test/generators/devise_generator_test.rb +0 -39
  146. data/test/generators/install_generator_test.rb +0 -13
  147. data/test/generators/mongoid_generator_test.rb +0 -23
  148. data/test/generators/views_generator_test.rb +0 -96
  149. data/test/helpers/devise_helper_test.rb +0 -49
  150. data/test/integration/authenticatable_test.rb +0 -729
  151. data/test/integration/confirmable_test.rb +0 -324
  152. data/test/integration/database_authenticatable_test.rb +0 -95
  153. data/test/integration/http_authenticatable_test.rb +0 -105
  154. data/test/integration/lockable_test.rb +0 -239
  155. data/test/integration/omniauthable_test.rb +0 -133
  156. data/test/integration/recoverable_test.rb +0 -347
  157. data/test/integration/registerable_test.rb +0 -359
  158. data/test/integration/rememberable_test.rb +0 -176
  159. data/test/integration/timeoutable_test.rb +0 -189
  160. data/test/integration/trackable_test.rb +0 -92
  161. data/test/mailers/confirmation_instructions_test.rb +0 -115
  162. data/test/mailers/reset_password_instructions_test.rb +0 -96
  163. data/test/mailers/unlock_instructions_test.rb +0 -91
  164. data/test/mapping_test.rb +0 -134
  165. data/test/models/authenticatable_test.rb +0 -23
  166. data/test/models/confirmable_test.rb +0 -468
  167. data/test/models/database_authenticatable_test.rb +0 -249
  168. data/test/models/lockable_test.rb +0 -328
  169. data/test/models/omniauthable_test.rb +0 -7
  170. data/test/models/recoverable_test.rb +0 -228
  171. data/test/models/registerable_test.rb +0 -7
  172. data/test/models/rememberable_test.rb +0 -204
  173. data/test/models/serializable_test.rb +0 -49
  174. data/test/models/timeoutable_test.rb +0 -51
  175. data/test/models/trackable_test.rb +0 -41
  176. data/test/models/validatable_test.rb +0 -127
  177. data/test/models_test.rb +0 -144
  178. data/test/omniauth/config_test.rb +0 -57
  179. data/test/omniauth/url_helpers_test.rb +0 -54
  180. data/test/orm/active_record.rb +0 -10
  181. data/test/orm/mongoid.rb +0 -13
  182. data/test/parameter_sanitizer_test.rb +0 -81
  183. data/test/rails_app/Rakefile +0 -6
  184. data/test/rails_app/app/active_record/admin.rb +0 -6
  185. data/test/rails_app/app/active_record/shim.rb +0 -2
  186. data/test/rails_app/app/active_record/user.rb +0 -6
  187. data/test/rails_app/app/active_record/user_on_engine.rb +0 -7
  188. data/test/rails_app/app/active_record/user_on_main_app.rb +0 -7
  189. data/test/rails_app/app/controllers/admins/sessions_controller.rb +0 -6
  190. data/test/rails_app/app/controllers/admins_controller.rb +0 -11
  191. data/test/rails_app/app/controllers/application_controller.rb +0 -12
  192. data/test/rails_app/app/controllers/application_with_fake_engine.rb +0 -30
  193. data/test/rails_app/app/controllers/custom/registrations_controller.rb +0 -31
  194. data/test/rails_app/app/controllers/home_controller.rb +0 -25
  195. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +0 -2
  196. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +0 -2
  197. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +0 -14
  198. data/test/rails_app/app/controllers/users_controller.rb +0 -31
  199. data/test/rails_app/app/helpers/application_helper.rb +0 -3
  200. data/test/rails_app/app/mailers/users/from_proc_mailer.rb +0 -3
  201. data/test/rails_app/app/mailers/users/mailer.rb +0 -3
  202. data/test/rails_app/app/mailers/users/reply_to_mailer.rb +0 -4
  203. data/test/rails_app/app/mongoid/admin.rb +0 -29
  204. data/test/rails_app/app/mongoid/shim.rb +0 -23
  205. data/test/rails_app/app/mongoid/user.rb +0 -39
  206. data/test/rails_app/app/mongoid/user_on_engine.rb +0 -39
  207. data/test/rails_app/app/mongoid/user_on_main_app.rb +0 -39
  208. data/test/rails_app/app/views/admins/index.html.erb +0 -1
  209. data/test/rails_app/app/views/admins/sessions/new.html.erb +0 -2
  210. data/test/rails_app/app/views/home/admin_dashboard.html.erb +0 -1
  211. data/test/rails_app/app/views/home/index.html.erb +0 -1
  212. data/test/rails_app/app/views/home/join.html.erb +0 -1
  213. data/test/rails_app/app/views/home/private.html.erb +0 -1
  214. data/test/rails_app/app/views/home/user_dashboard.html.erb +0 -1
  215. data/test/rails_app/app/views/layouts/application.html.erb +0 -24
  216. data/test/rails_app/app/views/users/edit_form.html.erb +0 -1
  217. data/test/rails_app/app/views/users/index.html.erb +0 -1
  218. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +0 -1
  219. data/test/rails_app/app/views/users/sessions/new.html.erb +0 -1
  220. data/test/rails_app/bin/bundle +0 -3
  221. data/test/rails_app/bin/rails +0 -4
  222. data/test/rails_app/bin/rake +0 -4
  223. data/test/rails_app/config/application.rb +0 -40
  224. data/test/rails_app/config/boot.rb +0 -14
  225. data/test/rails_app/config/database.yml +0 -18
  226. data/test/rails_app/config/environment.rb +0 -5
  227. data/test/rails_app/config/environments/development.rb +0 -30
  228. data/test/rails_app/config/environments/production.rb +0 -84
  229. data/test/rails_app/config/environments/test.rb +0 -41
  230. data/test/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  231. data/test/rails_app/config/initializers/devise.rb +0 -180
  232. data/test/rails_app/config/initializers/inflections.rb +0 -2
  233. data/test/rails_app/config/initializers/secret_token.rb +0 -8
  234. data/test/rails_app/config/initializers/session_store.rb +0 -1
  235. data/test/rails_app/config/routes.rb +0 -122
  236. data/test/rails_app/config.ru +0 -4
  237. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -71
  238. data/test/rails_app/db/schema.rb +0 -55
  239. data/test/rails_app/lib/shared_admin.rb +0 -17
  240. data/test/rails_app/lib/shared_user.rb +0 -29
  241. data/test/rails_app/lib/shared_user_without_omniauth.rb +0 -13
  242. data/test/rails_app/public/404.html +0 -26
  243. data/test/rails_app/public/422.html +0 -26
  244. data/test/rails_app/public/500.html +0 -26
  245. data/test/rails_app/public/favicon.ico +0 -0
  246. data/test/rails_test.rb +0 -9
  247. data/test/routes_test.rb +0 -264
  248. data/test/support/action_controller/record_identifier.rb +0 -10
  249. data/test/support/assertions.rb +0 -39
  250. data/test/support/helpers.rb +0 -73
  251. data/test/support/integration.rb +0 -92
  252. data/test/support/locale/en.yml +0 -8
  253. data/test/support/mongoid.yml +0 -6
  254. data/test/support/webrat/integrations/rails.rb +0 -24
  255. data/test/test_helper.rb +0 -34
  256. data/test/test_helpers_test.rb +0 -178
  257. data/test/test_models.rb +0 -33
@@ -1,25 +1,25 @@
1
1
  <%- if controller_name != 'sessions' %>
2
2
  <%= link_to "Log in", new_session_path(resource_name) %><br />
3
- <% end -%>
3
+ <% end %>
4
4
 
5
5
  <%- if devise_mapping.registerable? && controller_name != 'registrations' %>
6
6
  <%= link_to "Sign up", new_registration_path(resource_name) %><br />
7
- <% end -%>
7
+ <% end %>
8
8
 
9
9
  <%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
10
10
  <%= link_to "Forgot your password?", new_password_path(resource_name) %><br />
11
- <% end -%>
11
+ <% end %>
12
12
 
13
13
  <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
14
14
  <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %><br />
15
- <% end -%>
15
+ <% end %>
16
16
 
17
17
  <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
18
18
  <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br />
19
- <% end -%>
19
+ <% end %>
20
20
 
21
21
  <%- if devise_mapping.omniauthable? %>
22
22
  <%- resource_class.omniauth_providers.each do |provider| %>
23
- <%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider) %><br />
24
- <% end -%>
25
- <% end -%>
23
+ <%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider), method: :post %><br />
24
+ <% end %>
25
+ <% end %>
@@ -1,11 +1,11 @@
1
1
  <h2>Resend unlock instructions</h2>
2
2
 
3
3
  <%= form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %>
4
- <%= devise_error_messages! %>
4
+ <%= render "devise/shared/error_messages", resource: resource %>
5
5
 
6
6
  <div class="field">
7
7
  <%= f.label :email %><br />
8
- <%= f.email_field :email, autofocus: true %>
8
+ <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
9
9
  </div>
10
10
 
11
11
  <div class="actions">
@@ -1,4 +1,4 @@
1
- # Additional translations at https://github.com/plataformatec/devise/wiki/I18n
1
+ # Additional translations at https://github.com/heartcombo/devise/wiki/I18n
2
2
 
3
3
  en:
4
4
  devise:
@@ -23,6 +23,10 @@ en:
23
23
  subject: "Reset password instructions"
24
24
  unlock_instructions:
25
25
  subject: "Unlock instructions"
26
+ email_changed:
27
+ subject: "Email Changed"
28
+ password_change:
29
+ subject: "Password Changed"
26
30
  omniauth_callbacks:
27
31
  failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
28
32
  success: "Successfully authenticated from %{kind} account."
@@ -38,8 +42,9 @@ en:
38
42
  signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
39
43
  signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
40
44
  signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
41
- update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
45
+ update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirmation link to confirm your new email address."
42
46
  updated: "Your account has been updated successfully."
47
+ updated_but_not_signed_in: "Your account has been updated successfully, but since your password was changed, you need to sign in again."
43
48
  sessions:
44
49
  signed_in: "Signed in successfully."
45
50
  signed_out: "Signed out successfully."
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Devise
2
4
  module Controllers
3
5
  # Those helpers are convenience methods added to ApplicationController.
@@ -7,7 +9,9 @@ module Devise
7
9
  include Devise::Controllers::StoreLocation
8
10
 
9
11
  included do
10
- helper_method :warden, :signed_in?, :devise_controller?
12
+ if respond_to?(:helper_method)
13
+ helper_method :warden, :signed_in?, :devise_controller?
14
+ end
11
15
  end
12
16
 
13
17
  module ClassMethods
@@ -28,18 +32,18 @@ module Devise
28
32
  # current_bloggers # Currently signed in user and admin
29
33
  #
30
34
  # Use:
31
- # before_filter :authenticate_blogger! # Redirects unless either a user or an admin are authenticated
32
- # before_filter ->{ authenticate_blogger! :admin } # Redirects to the admin login page
35
+ # before_action :authenticate_blogger! # Redirects unless either a user or an admin are authenticated
36
+ # before_action ->{ authenticate_blogger! :admin } # Redirects to the admin login page
33
37
  # current_blogger :user # Preferably returns a User if one is signed in
34
38
  #
35
- def devise_group(group_name, opts={})
39
+ def devise_group(group_name, opts = {})
36
40
  mappings = "[#{ opts[:contains].map { |m| ":#{m}" }.join(',') }]"
37
41
 
38
42
  class_eval <<-METHODS, __FILE__, __LINE__ + 1
39
- def authenticate_#{group_name}!(favourite=nil, opts={})
43
+ def authenticate_#{group_name}!(favorite = nil, opts = {})
40
44
  unless #{group_name}_signed_in?
41
45
  mappings = #{mappings}
42
- mappings.unshift mappings.delete(favourite.to_sym) if favourite
46
+ mappings.unshift mappings.delete(favorite.to_sym) if favorite
43
47
  mappings.each do |mapping|
44
48
  opts[:scope] = mapping
45
49
  warden.authenticate!(opts) if !devise_controller? || opts.delete(:force)
@@ -53,9 +57,9 @@ module Devise
53
57
  end
54
58
  end
55
59
 
56
- def current_#{group_name}(favourite=nil)
60
+ def current_#{group_name}(favorite = nil)
57
61
  mappings = #{mappings}
58
- mappings.unshift mappings.delete(favourite.to_sym) if favourite
62
+ mappings.unshift mappings.delete(favorite.to_sym) if favorite
59
63
  mappings.each do |mapping|
60
64
  current = warden.authenticate(scope: mapping)
61
65
  return current if current
@@ -69,7 +73,9 @@ module Devise
69
73
  end.compact
70
74
  end
71
75
 
72
- helper_method "current_#{group_name}", "current_#{group_name.to_s.pluralize}", "#{group_name}_signed_in?"
76
+ if respond_to?(:helper_method)
77
+ helper_method "current_#{group_name}", "current_#{group_name.to_s.pluralize}", "#{group_name}_signed_in?"
78
+ end
73
79
  METHODS
74
80
  end
75
81
 
@@ -80,7 +86,7 @@ module Devise
80
86
  end
81
87
 
82
88
  # Define authentication filters and accessor helpers based on mappings.
83
- # These filters should be used inside the controllers as before_filters,
89
+ # These filters should be used inside the controllers as before_actions,
84
90
  # so you can control the scope of the user who should be signed in to
85
91
  # access that specific controller/action.
86
92
  # Example:
@@ -100,14 +106,14 @@ module Devise
100
106
  # admin_session # Session data available only to the admin scope
101
107
  #
102
108
  # Use:
103
- # before_filter :authenticate_user! # Tell devise to use :user map
104
- # before_filter :authenticate_admin! # Tell devise to use :admin map
109
+ # before_action :authenticate_user! # Tell devise to use :user map
110
+ # before_action :authenticate_admin! # Tell devise to use :admin map
105
111
  #
106
112
  def self.define_helpers(mapping) #:nodoc:
107
113
  mapping = mapping.name
108
114
 
109
115
  class_eval <<-METHODS, __FILE__, __LINE__ + 1
110
- def authenticate_#{mapping}!(opts={})
116
+ def authenticate_#{mapping}!(opts = {})
111
117
  opts[:scope] = :#{mapping}
112
118
  warden.authenticate!(opts) if !devise_controller? || opts.delete(:force)
113
119
  end
@@ -126,33 +132,31 @@ module Devise
126
132
  METHODS
127
133
 
128
134
  ActiveSupport.on_load(:action_controller) do
129
- helper_method "current_#{mapping}", "#{mapping}_signed_in?", "#{mapping}_session"
135
+ if respond_to?(:helper_method)
136
+ helper_method "current_#{mapping}", "#{mapping}_signed_in?", "#{mapping}_session"
137
+ end
130
138
  end
131
139
  end
132
140
 
133
141
  # The main accessor for the warden proxy instance
134
142
  def warden
135
- request.env['warden']
143
+ request.env['warden'] or raise MissingWarden
136
144
  end
137
145
 
138
146
  # Return true if it's a devise_controller. false to all controllers unless
139
147
  # the controllers defined inside devise. Useful if you want to apply a before
140
148
  # filter to all controllers, except the ones in devise:
141
149
  #
142
- # before_filter :my_filter, unless: :devise_controller?
150
+ # before_action :my_filter, unless: :devise_controller?
143
151
  def devise_controller?
144
152
  is_a?(::DeviseController)
145
153
  end
146
154
 
147
- # Setup a param sanitizer to filter parameters using strong_parameters. See
155
+ # Set up a param sanitizer to filter parameters using strong_parameters. See
148
156
  # lib/devise/parameter_sanitizer.rb for more info. Override this
149
157
  # method in your application controller to use your own parameter sanitizer.
150
158
  def devise_parameter_sanitizer
151
- @devise_parameter_sanitizer ||= if defined?(ActionController::StrongParameters)
152
- Devise::ParameterSanitizer.new(resource_class, resource_name, params)
153
- else
154
- Devise::BaseSanitizer.new(resource_class, resource_name, params)
155
- end
159
+ @devise_parameter_sanitizer ||= Devise::ParameterSanitizer.new(resource_class, resource_name, params)
156
160
  end
157
161
 
158
162
  # Tell warden that params authentication is allowed for that specific page.
@@ -190,10 +194,10 @@ module Devise
190
194
  # root path. For a user scope, you can define the default url in
191
195
  # the following way:
192
196
  #
193
- # map.user_root '/users', controller: 'users' # creates user_root_path
197
+ # get '/users' => 'users#index', as: :user_root # creates user_root_path
194
198
  #
195
- # map.namespace :user do |user|
196
- # user.root controller: 'users' # creates user_root_path
199
+ # namespace :user do
200
+ # root 'users#index' # creates user_root_path
197
201
  # end
198
202
  #
199
203
  # If the resource root path is not defined, root_path is used. However,
@@ -248,7 +252,7 @@ module Devise
248
252
  # Overwrite Rails' handle unverified request to sign out all scopes,
249
253
  # clear run strategies and remove cached variables.
250
254
  def handle_unverified_request
251
- super # call the default behaviour which resets/nullifies/raises
255
+ super # call the default behavior which resets/nullifies/raises
252
256
  request.env["devise.skip_storage"] = true
253
257
  sign_out_all_scopes(false)
254
258
  end
@@ -264,21 +268,26 @@ module Devise
264
268
  # Check if flash messages should be emitted. Default is to do it on
265
269
  # navigational formats
266
270
  def is_flashing_format?
267
- is_navigational_format?
271
+ request.respond_to?(:flash) && is_navigational_format?
268
272
  end
269
273
 
270
274
  private
271
275
 
272
- def expire_session_data_after_sign_in!
273
- ActiveSupport::Deprecation.warn "expire_session_data_after_sign_in! is deprecated " \
274
- "in favor of expire_data_after_sign_in!"
275
- expire_data_after_sign_in!
276
- end
277
-
278
276
  def expire_data_after_sign_out!
279
277
  Devise.mappings.each { |_,m| instance_variable_set("@current_#{m.name}", nil) }
280
278
  super
281
279
  end
282
280
  end
283
281
  end
282
+
283
+ class MissingWarden < StandardError
284
+ def initialize
285
+ super "Devise could not find the `Warden::Proxy` instance on your request environment.\n" + \
286
+ "Make sure that your application is loading Devise and Warden as expected and that " + \
287
+ "the `Warden::Manager` middleware is present in your middleware stack.\n" + \
288
+ "If you are seeing this on one of your tests, ensure that your tests are either " + \
289
+ "executing the Rails middleware stack or that your tests are using the `Devise::Test::ControllerHelpers` " + \
290
+ "module to inject the `request.env['warden']` object for you."
291
+ end
292
+ end
284
293
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Devise
2
4
  module Controllers
3
5
  # A module that may be optionally included in a controller in order
@@ -9,11 +11,18 @@ module Devise
9
11
  Rails.configuration.session_options.slice(:path, :domain, :secure)
10
12
  end
11
13
 
14
+ def remember_me_is_active?(resource)
15
+ return false unless resource.respond_to?(:remember_me)
16
+ scope = Devise::Mapping.find_scope!(resource)
17
+ _, token, generated_at = cookies.signed[remember_key(resource, scope)]
18
+ resource.remember_me?(token, generated_at)
19
+ end
20
+
12
21
  # Remembers the given resource by setting up a cookie
13
22
  def remember_me(resource)
14
- return if env["devise.skip_storage"]
23
+ return if request.env["devise.skip_storage"]
15
24
  scope = Devise::Mapping.find_scope!(resource)
16
- resource.remember_me!(resource.extend_remember_period)
25
+ resource.remember_me!
17
26
  cookies.signed[remember_key(resource, scope)] = remember_cookie_values(resource)
18
27
  end
19
28
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Devise
2
4
  module Controllers
3
5
  module ScopedViews
@@ -1,31 +1,34 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Devise
2
4
  module Controllers
3
5
  # Provide sign in and sign out functionality.
4
6
  # Included by default in all controllers.
5
7
  module SignInOut
6
8
  # Return true if the given scope is signed in session. If no scope given, return
7
- # true if any scope is signed in. Does not run authentication hooks.
8
- def signed_in?(scope=nil)
9
+ # true if any scope is signed in. This will run authentication hooks, which may
10
+ # cause exceptions to be thrown from this method; if you simply want to check
11
+ # if a scope has already previously been authenticated without running
12
+ # authentication hooks, you can directly call `warden.authenticated?(scope: scope)`
13
+ def signed_in?(scope = nil)
9
14
  [scope || Devise.mappings.keys].flatten.any? do |_scope|
10
15
  warden.authenticate?(scope: _scope)
11
16
  end
12
17
  end
13
18
 
14
19
  # Sign in a user that already was authenticated. This helper is useful for logging
15
- # users in after sign up.
16
- #
17
- # All options given to sign_in is passed forward to the set_user method in warden.
18
- # The only exception is the :bypass option, which bypass warden callbacks and stores
19
- # the user straight in session. This option is useful in cases the user is already
20
- # signed in, but we want to refresh the credentials in session.
20
+ # users in after sign up. All options given to sign_in is passed forward
21
+ # to the set_user method in warden.
22
+ # If you are using a custom warden strategy and the timeoutable module, you have to
23
+ # set `env["devise.skip_timeout"] = true` in the request to use this method, like we do
24
+ # in the sessions controller: https://github.com/heartcombo/devise/blob/master/app/controllers/devise/sessions_controller.rb#L7
21
25
  #
22
26
  # Examples:
23
27
  #
24
28
  # sign_in :user, @user # sign_in(scope, resource)
25
29
  # sign_in @user # sign_in(resource)
26
- # sign_in @user, event: :authentication # sign_in(resource, options)
27
- # sign_in @user, store: false # sign_in(resource, options)
28
- # sign_in @user, bypass: true # sign_in(resource, options)
30
+ # sign_in @user, event: :authentication # sign_in(resource, options)
31
+ # sign_in @user, store: false # sign_in(resource, options)
29
32
  #
30
33
  def sign_in(resource_or_scope, *args)
31
34
  options = args.extract_options!
@@ -35,6 +38,13 @@ module Devise
35
38
  expire_data_after_sign_in!
36
39
 
37
40
  if options[:bypass]
41
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION.strip_heredoc, caller)
42
+ [Devise] bypass option is deprecated and it will be removed in future version of Devise.
43
+ Please use bypass_sign_in method instead.
44
+ Example:
45
+
46
+ bypass_sign_in(user)
47
+ DEPRECATION
38
48
  warden.session_serializer.store(resource, scope)
39
49
  elsif warden.user(scope) == resource && !options.delete(:force)
40
50
  # Do nothing. User already signed in and we are not forcing it.
@@ -44,6 +54,20 @@ module Devise
44
54
  end
45
55
  end
46
56
 
57
+ # Sign in a user bypassing the warden callbacks and stores the user
58
+ # straight in session. This option is useful in cases the user is already
59
+ # signed in, but we want to refresh the credentials in session.
60
+ #
61
+ # Examples:
62
+ #
63
+ # bypass_sign_in @user, scope: :user
64
+ # bypass_sign_in @user
65
+ def bypass_sign_in(resource, scope: nil)
66
+ scope ||= Devise::Mapping.find_scope!(resource)
67
+ expire_data_after_sign_in!
68
+ warden.session_serializer.store(resource, scope)
69
+ end
70
+
47
71
  # Sign out a given user or scope. This helper is useful for signing out a user
48
72
  # after deleting accounts. Returns true if there was a logout and false if there
49
73
  # is no user logged in on the referred scope
@@ -53,12 +77,11 @@ module Devise
53
77
  # sign_out :user # sign_out(scope)
54
78
  # sign_out @user # sign_out(resource)
55
79
  #
56
- def sign_out(resource_or_scope=nil)
80
+ def sign_out(resource_or_scope = nil)
57
81
  return sign_out_all_scopes unless resource_or_scope
58
82
  scope = Devise::Mapping.find_scope!(resource_or_scope)
59
83
  user = warden.user(scope: scope, run_callbacks: false) # If there is no user
60
84
 
61
- warden.raw_session.inspect # Without this inspect here. The session does not clear.
62
85
  warden.logout(scope)
63
86
  warden.clear_strategies_cache!(scope: scope)
64
87
  instance_variable_set(:"@current_#{scope}", nil)
@@ -69,7 +92,7 @@ module Devise
69
92
  # Sign out all active users or scopes. This helper is useful for signing out all roles
70
93
  # in one click. This signs out ALL scopes in warden. Returns true if there was at least one logout
71
94
  # and false if there was no user logged in on all scopes.
72
- def sign_out_all_scopes(lock=true)
95
+ def sign_out_all_scopes(lock = true)
73
96
  users = Devise.mappings.keys.map { |s| warden.user(scope: s, run_callbacks: false) }
74
97
 
75
98
  warden.logout
@@ -83,20 +106,16 @@ module Devise
83
106
  private
84
107
 
85
108
  def expire_data_after_sign_in!
109
+ # TODO: remove once Rails 5.2+ and forward are only supported.
86
110
  # session.keys will return an empty array if the session is not yet loaded.
87
111
  # This is a bug in both Rack and Rails.
88
112
  # A call to #empty? forces the session to be loaded.
89
113
  session.empty?
90
- session.keys.grep(/^devise\./).each { |k| session.delete(k) }
91
- end
92
114
 
93
- def expire_data_after_sign_out!
94
- # session.keys will return an empty array if the session is not yet loaded.
95
- # This is a bug in both Rack and Rails.
96
- # A call to #empty? forces the session to be loaded.
97
- session.empty?
98
115
  session.keys.grep(/^devise\./).each { |k| session.delete(k) }
99
116
  end
117
+
118
+ alias :expire_data_after_sign_out! :expire_data_after_sign_in!
100
119
  end
101
120
  end
102
121
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "uri"
2
4
 
3
5
  module Devise
@@ -29,16 +31,13 @@ module Devise
29
31
  # Example:
30
32
  #
31
33
  # store_location_for(:user, dashboard_path)
32
- # redirect_to user_omniauth_authorize_path(:facebook)
34
+ # redirect_to user_facebook_omniauth_authorize_path
33
35
  #
34
36
  def store_location_for(resource_or_scope, location)
35
37
  session_key = stored_location_key_for(resource_or_scope)
36
- uri = parse_uri(location)
37
- if uri
38
- path = [uri.path.sub(/\A\/+/, '/'), uri.query].compact.join('?')
39
- path = [path, uri.fragment].compact.join('#')
40
- session[session_key] = path
41
- end
38
+
39
+ path = extract_path_from_location(location)
40
+ session[session_key] = path if path
42
41
  end
43
42
 
44
43
  private
@@ -53,6 +52,25 @@ module Devise
53
52
  scope = Devise::Mapping.find_scope!(resource_or_scope)
54
53
  "#{scope}_return_to"
55
54
  end
55
+
56
+ def extract_path_from_location(location)
57
+ uri = parse_uri(location)
58
+
59
+ if uri
60
+ path = remove_domain_from_uri(uri)
61
+ path = add_fragment_back_to_path(uri, path)
62
+
63
+ path
64
+ end
65
+ end
66
+
67
+ def remove_domain_from_uri(uri)
68
+ [uri.path.sub(/\A\/+/, '/'), uri.query].compact.join('?')
69
+ end
70
+
71
+ def add_fragment_back_to_path(uri, path)
72
+ [path, uri.fragment].compact.join('#')
73
+ end
56
74
  end
57
75
  end
58
76
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Devise
2
4
  module Controllers
3
5
  # Create url helpers to be used with resource/scope configuration. Acts as
@@ -32,7 +34,7 @@ module Devise
32
34
  end
33
35
  end
34
36
 
35
- def self.generate_helpers!(routes=nil)
37
+ def self.generate_helpers!(routes = nil)
36
38
  routes ||= begin
37
39
  mappings = Devise.mappings.values.map(&:used_helpers).flatten.uniq
38
40
  Devise::URL_HELPERS.slice(*mappings)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Devise
2
4
  # Checks the scope in the given environment and returns the associated failure app.
3
5
  class Delegator
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bcrypt'
2
4
 
3
5
  module Devise
@@ -9,14 +11,14 @@ module Devise
9
11
  ::BCrypt::Password.create(password, cost: klass.stretches).to_s
10
12
  end
11
13
 
12
- def self.compare(klass, encrypted_password, password)
13
- return false if encrypted_password.blank?
14
- bcrypt = ::BCrypt::Password.new(encrypted_password)
14
+ def self.compare(klass, hashed_password, password)
15
+ return false if hashed_password.blank?
16
+ bcrypt = ::BCrypt::Password.new(hashed_password)
15
17
  if klass.pepper.present?
16
18
  password = "#{password}#{klass.pepper}"
17
19
  end
18
20
  password = ::BCrypt::Engine.hash_secret(password, bcrypt.salt)
19
- Devise.secure_compare(password, encrypted_password)
21
+ Devise.secure_compare(password, hashed_password)
20
22
  end
21
23
  end
22
24
  end