deviseOne 1.0.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 (246) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.travis.yml +38 -0
  4. data/.yardopts +9 -0
  5. data/CHANGELOG.md +1117 -0
  6. data/CONTRIBUTING.md +14 -0
  7. data/Gemfile +29 -0
  8. data/Gemfile.lock +199 -0
  9. data/MIT-LICENSE +20 -0
  10. data/README.md +529 -0
  11. data/Rakefile +35 -0
  12. data/app/controllers/devise/confirmations_controller.rb +47 -0
  13. data/app/controllers/devise/omniauth_callbacks_controller.rb +30 -0
  14. data/app/controllers/devise/passwords_controller.rb +71 -0
  15. data/app/controllers/devise/registrations_controller.rb +143 -0
  16. data/app/controllers/devise/sessions_controller.rb +166 -0
  17. data/app/controllers/devise/unlocks_controller.rb +46 -0
  18. data/app/controllers/devise_controller.rb +193 -0
  19. data/app/helpers/devise_helper.rb +25 -0
  20. data/app/mailers/devise/mailer.rb +20 -0
  21. data/app/views/devise/confirmations/new.html.erb +16 -0
  22. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  23. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  24. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  25. data/app/views/devise/passwords/edit.html.erb +25 -0
  26. data/app/views/devise/passwords/new.html.erb +16 -0
  27. data/app/views/devise/registrations/edit.html.erb +39 -0
  28. data/app/views/devise/registrations/new.html.erb +29 -0
  29. data/app/views/devise/sessions/new.html.erb +27 -0
  30. data/app/views/devise/shared/_links.html.erb +21 -0
  31. data/app/views/devise/unlocks/new.html.erb +16 -0
  32. data/config/locales/en.yml +70 -0
  33. data/devise.gemspec +33 -0
  34. data/devise.png +0 -0
  35. data/gemfiles/Gemfile.rails-3.2-stable +29 -0
  36. data/gemfiles/Gemfile.rails-3.2-stable.lock +169 -0
  37. data/gemfiles/Gemfile.rails-4.0-stable +29 -0
  38. data/gemfiles/Gemfile.rails-4.0-stable.lock +165 -0
  39. data/gemfiles/Gemfile.rails-4.1-stable +29 -0
  40. data/gemfiles/Gemfile.rails-4.1-stable.lock +170 -0
  41. data/lib/devise.rb +499 -0
  42. data/lib/devise/controllers/helpers.rb +284 -0
  43. data/lib/devise/controllers/rememberable.rb +47 -0
  44. data/lib/devise/controllers/scoped_views.rb +17 -0
  45. data/lib/devise/controllers/sign_in_out.rb +102 -0
  46. data/lib/devise/controllers/store_location.rb +58 -0
  47. data/lib/devise/controllers/url_helpers.rb +69 -0
  48. data/lib/devise/delegator.rb +16 -0
  49. data/lib/devise/failure_app.rb +212 -0
  50. data/lib/devise/hooks/activatable.rb +10 -0
  51. data/lib/devise/hooks/csrf_cleaner.rb +7 -0
  52. data/lib/devise/hooks/forgetable.rb +9 -0
  53. data/lib/devise/hooks/lockable.rb +7 -0
  54. data/lib/devise/hooks/proxy.rb +21 -0
  55. data/lib/devise/hooks/rememberable.rb +7 -0
  56. data/lib/devise/hooks/timeoutable.rb +35 -0
  57. data/lib/devise/hooks/trackable.rb +9 -0
  58. data/lib/devise/mailers/helpers.rb +90 -0
  59. data/lib/devise/mapping.rb +175 -0
  60. data/lib/devise/models.rb +119 -0
  61. data/lib/devise/models/authenticatable.rb +290 -0
  62. data/lib/devise/models/confirmable.rb +305 -0
  63. data/lib/devise/models/database_authenticatable.rb +164 -0
  64. data/lib/devise/models/lockable.rb +196 -0
  65. data/lib/devise/models/omniauthable.rb +27 -0
  66. data/lib/devise/models/recoverable.rb +157 -0
  67. data/lib/devise/models/registerable.rb +25 -0
  68. data/lib/devise/models/rememberable.rb +142 -0
  69. data/lib/devise/models/timeoutable.rb +49 -0
  70. data/lib/devise/models/trackable.rb +38 -0
  71. data/lib/devise/models/validatable.rb +66 -0
  72. data/lib/devise/modules.rb +28 -0
  73. data/lib/devise/omniauth.rb +28 -0
  74. data/lib/devise/omniauth/config.rb +45 -0
  75. data/lib/devise/omniauth/url_helpers.rb +18 -0
  76. data/lib/devise/orm/active_record.rb +3 -0
  77. data/lib/devise/orm/mongoid.rb +3 -0
  78. data/lib/devise/parameter_filter.rb +40 -0
  79. data/lib/devise/parameter_sanitizer.rb +99 -0
  80. data/lib/devise/rails.rb +56 -0
  81. data/lib/devise/rails/routes.rb +495 -0
  82. data/lib/devise/rails/warden_compat.rb +22 -0
  83. data/lib/devise/strategies/authenticatable.rb +173 -0
  84. data/lib/devise/strategies/base.rb +20 -0
  85. data/lib/devise/strategies/database_authenticatable.rb +24 -0
  86. data/lib/devise/strategies/rememberable.rb +59 -0
  87. data/lib/devise/test_helpers.rb +132 -0
  88. data/lib/devise/time_inflector.rb +14 -0
  89. data/lib/devise/token_generator.rb +70 -0
  90. data/lib/devise/version.rb +3 -0
  91. data/lib/generators/active_record/devise_generator.rb +91 -0
  92. data/lib/generators/active_record/templates/migration.rb +18 -0
  93. data/lib/generators/active_record/templates/migration_existing.rb +25 -0
  94. data/lib/generators/devise/controllers_generator.rb +44 -0
  95. data/lib/generators/devise/devise_generator.rb +26 -0
  96. data/lib/generators/devise/install_generator.rb +29 -0
  97. data/lib/generators/devise/orm_helpers.rb +51 -0
  98. data/lib/generators/devise/views_generator.rb +135 -0
  99. data/lib/generators/mongoid/devise_generator.rb +55 -0
  100. data/lib/generators/templates/README +35 -0
  101. data/lib/generators/templates/controllers/README +14 -0
  102. data/lib/generators/templates/controllers/confirmations_controller.rb +28 -0
  103. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +28 -0
  104. data/lib/generators/templates/controllers/passwords_controller.rb +32 -0
  105. data/lib/generators/templates/controllers/registrations_controller.rb +60 -0
  106. data/lib/generators/templates/controllers/sessions_controller.rb +25 -0
  107. data/lib/generators/templates/controllers/unlocks_controller.rb +28 -0
  108. data/lib/generators/templates/devise.rb +263 -0
  109. data/lib/generators/templates/markerb/confirmation_instructions.markerb +5 -0
  110. data/lib/generators/templates/markerb/reset_password_instructions.markerb +8 -0
  111. data/lib/generators/templates/markerb/unlock_instructions.markerb +7 -0
  112. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +16 -0
  113. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +19 -0
  114. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +15 -0
  115. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +27 -0
  116. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +17 -0
  117. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +15 -0
  118. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +16 -0
  119. data/script/cached-bundle +49 -0
  120. data/script/s3-put +71 -0
  121. data/test/controllers/custom_registrations_controller_test.rb +35 -0
  122. data/test/controllers/custom_strategy_test.rb +62 -0
  123. data/test/controllers/helpers_test.rb +316 -0
  124. data/test/controllers/internal_helpers_test.rb +129 -0
  125. data/test/controllers/load_hooks_controller_test.rb +19 -0
  126. data/test/controllers/passwords_controller_test.rb +31 -0
  127. data/test/controllers/sessions_controller_test.rb +102 -0
  128. data/test/controllers/url_helpers_test.rb +65 -0
  129. data/test/delegator_test.rb +19 -0
  130. data/test/devise_test.rb +107 -0
  131. data/test/failure_app_test.rb +275 -0
  132. data/test/generators/active_record_generator_test.rb +109 -0
  133. data/test/generators/controllers_generator_test.rb +48 -0
  134. data/test/generators/devise_generator_test.rb +39 -0
  135. data/test/generators/install_generator_test.rb +13 -0
  136. data/test/generators/mongoid_generator_test.rb +23 -0
  137. data/test/generators/views_generator_test.rb +96 -0
  138. data/test/helpers/devise_helper_test.rb +49 -0
  139. data/test/integration/authenticatable_test.rb +731 -0
  140. data/test/integration/confirmable_test.rb +324 -0
  141. data/test/integration/database_authenticatable_test.rb +94 -0
  142. data/test/integration/http_authenticatable_test.rb +105 -0
  143. data/test/integration/lockable_test.rb +239 -0
  144. data/test/integration/omniauthable_test.rb +133 -0
  145. data/test/integration/recoverable_test.rb +334 -0
  146. data/test/integration/registerable_test.rb +361 -0
  147. data/test/integration/rememberable_test.rb +176 -0
  148. data/test/integration/timeoutable_test.rb +189 -0
  149. data/test/integration/trackable_test.rb +92 -0
  150. data/test/mailers/confirmation_instructions_test.rb +115 -0
  151. data/test/mailers/reset_password_instructions_test.rb +96 -0
  152. data/test/mailers/unlock_instructions_test.rb +91 -0
  153. data/test/mapping_test.rb +128 -0
  154. data/test/models/authenticatable_test.rb +23 -0
  155. data/test/models/confirmable_test.rb +461 -0
  156. data/test/models/database_authenticatable_test.rb +249 -0
  157. data/test/models/lockable_test.rb +328 -0
  158. data/test/models/omniauthable_test.rb +7 -0
  159. data/test/models/recoverable_test.rb +205 -0
  160. data/test/models/registerable_test.rb +7 -0
  161. data/test/models/rememberable_test.rb +198 -0
  162. data/test/models/serializable_test.rb +49 -0
  163. data/test/models/timeoutable_test.rb +51 -0
  164. data/test/models/trackable_test.rb +41 -0
  165. data/test/models/validatable_test.rb +127 -0
  166. data/test/models_test.rb +144 -0
  167. data/test/omniauth/config_test.rb +57 -0
  168. data/test/omniauth/url_helpers_test.rb +54 -0
  169. data/test/orm/active_record.rb +10 -0
  170. data/test/orm/mongoid.rb +13 -0
  171. data/test/parameter_sanitizer_test.rb +81 -0
  172. data/test/rails_app/Rakefile +6 -0
  173. data/test/rails_app/app/active_record/admin.rb +6 -0
  174. data/test/rails_app/app/active_record/shim.rb +2 -0
  175. data/test/rails_app/app/active_record/user.rb +6 -0
  176. data/test/rails_app/app/active_record/user_on_engine.rb +7 -0
  177. data/test/rails_app/app/active_record/user_on_main_app.rb +7 -0
  178. data/test/rails_app/app/controllers/admins/sessions_controller.rb +6 -0
  179. data/test/rails_app/app/controllers/admins_controller.rb +11 -0
  180. data/test/rails_app/app/controllers/application_controller.rb +12 -0
  181. data/test/rails_app/app/controllers/application_with_fake_engine.rb +30 -0
  182. data/test/rails_app/app/controllers/custom/registrations_controller.rb +21 -0
  183. data/test/rails_app/app/controllers/home_controller.rb +25 -0
  184. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
  185. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
  186. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +14 -0
  187. data/test/rails_app/app/controllers/users_controller.rb +31 -0
  188. data/test/rails_app/app/helpers/application_helper.rb +3 -0
  189. data/test/rails_app/app/mailers/users/from_proc_mailer.rb +3 -0
  190. data/test/rails_app/app/mailers/users/mailer.rb +3 -0
  191. data/test/rails_app/app/mailers/users/reply_to_mailer.rb +4 -0
  192. data/test/rails_app/app/mongoid/admin.rb +29 -0
  193. data/test/rails_app/app/mongoid/shim.rb +23 -0
  194. data/test/rails_app/app/mongoid/user.rb +39 -0
  195. data/test/rails_app/app/mongoid/user_on_engine.rb +39 -0
  196. data/test/rails_app/app/mongoid/user_on_main_app.rb +39 -0
  197. data/test/rails_app/app/views/admins/index.html.erb +1 -0
  198. data/test/rails_app/app/views/admins/sessions/new.html.erb +2 -0
  199. data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -0
  200. data/test/rails_app/app/views/home/index.html.erb +1 -0
  201. data/test/rails_app/app/views/home/join.html.erb +1 -0
  202. data/test/rails_app/app/views/home/private.html.erb +1 -0
  203. data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -0
  204. data/test/rails_app/app/views/layouts/application.html.erb +24 -0
  205. data/test/rails_app/app/views/users/edit_form.html.erb +1 -0
  206. data/test/rails_app/app/views/users/index.html.erb +1 -0
  207. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +1 -0
  208. data/test/rails_app/app/views/users/sessions/new.html.erb +1 -0
  209. data/test/rails_app/bin/bundle +3 -0
  210. data/test/rails_app/bin/rails +4 -0
  211. data/test/rails_app/bin/rake +4 -0
  212. data/test/rails_app/config.ru +4 -0
  213. data/test/rails_app/config/application.rb +40 -0
  214. data/test/rails_app/config/boot.rb +14 -0
  215. data/test/rails_app/config/database.yml +18 -0
  216. data/test/rails_app/config/environment.rb +5 -0
  217. data/test/rails_app/config/environments/development.rb +30 -0
  218. data/test/rails_app/config/environments/production.rb +80 -0
  219. data/test/rails_app/config/environments/test.rb +36 -0
  220. data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  221. data/test/rails_app/config/initializers/devise.rb +180 -0
  222. data/test/rails_app/config/initializers/inflections.rb +2 -0
  223. data/test/rails_app/config/initializers/secret_token.rb +8 -0
  224. data/test/rails_app/config/initializers/session_store.rb +1 -0
  225. data/test/rails_app/config/routes.rb +122 -0
  226. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +71 -0
  227. data/test/rails_app/db/schema.rb +55 -0
  228. data/test/rails_app/lib/shared_admin.rb +17 -0
  229. data/test/rails_app/lib/shared_user.rb +29 -0
  230. data/test/rails_app/lib/shared_user_without_omniauth.rb +13 -0
  231. data/test/rails_app/public/404.html +26 -0
  232. data/test/rails_app/public/422.html +26 -0
  233. data/test/rails_app/public/500.html +26 -0
  234. data/test/rails_app/public/favicon.ico +0 -0
  235. data/test/routes_test.rb +264 -0
  236. data/test/support/action_controller/record_identifier.rb +10 -0
  237. data/test/support/assertions.rb +39 -0
  238. data/test/support/helpers.rb +73 -0
  239. data/test/support/integration.rb +92 -0
  240. data/test/support/locale/en.yml +8 -0
  241. data/test/support/mongoid.yml +6 -0
  242. data/test/support/webrat/integrations/rails.rb +24 -0
  243. data/test/test_helper.rb +34 -0
  244. data/test/test_helpers_test.rb +163 -0
  245. data/test/test_models.rb +33 -0
  246. metadata +531 -0
@@ -0,0 +1,284 @@
1
+ module Devise
2
+ module Controllers
3
+ # Those helpers are convenience methods added to ApplicationController.
4
+ module Helpers
5
+ extend ActiveSupport::Concern
6
+ include Devise::Controllers::SignInOut
7
+ include Devise::Controllers::StoreLocation
8
+
9
+ included do
10
+ helper_method :warden, :signed_in?, :devise_controller?
11
+ end
12
+
13
+ module ClassMethods
14
+ # Define authentication filters and accessor helpers for a group of mappings.
15
+ # These methods are useful when you are working with multiple mappings that
16
+ # share some functionality. They are pretty much the same as the ones
17
+ # defined for normal mappings.
18
+ #
19
+ # Example:
20
+ #
21
+ # inside BlogsController (or any other controller, it doesn't matter which):
22
+ # devise_group :blogger, contains: [:user, :admin]
23
+ #
24
+ # Generated methods:
25
+ # authenticate_blogger! # Redirects unless user or admin are signed in
26
+ # blogger_signed_in? # Checks whether there is either a user or an admin signed in
27
+ # current_blogger # Currently signed in user or admin
28
+ # current_bloggers # Currently signed in user and admin
29
+ #
30
+ # 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
33
+ # current_blogger :user # Preferably returns a User if one is signed in
34
+ #
35
+ def devise_group(group_name, opts={})
36
+ mappings = "[#{ opts[:contains].map { |m| ":#{m}" }.join(',') }]"
37
+
38
+ class_eval <<-METHODS, __FILE__, __LINE__ + 1
39
+ def authenticate_#{group_name}!(favourite=nil, opts={})
40
+ unless #{group_name}_signed_in?
41
+ mappings = #{mappings}
42
+ mappings.unshift mappings.delete(favourite.to_sym) if favourite
43
+ mappings.each do |mapping|
44
+ opts[:scope] = mapping
45
+ warden.authenticate!(opts) if !devise_controller? || opts.delete(:force)
46
+ end
47
+ end
48
+ end
49
+
50
+ def #{group_name}_signed_in?
51
+ #{mappings}.any? do |mapping|
52
+ warden.authenticate?(scope: mapping)
53
+ end
54
+ end
55
+
56
+ def current_#{group_name}(favourite=nil)
57
+ mappings = #{mappings}
58
+ mappings.unshift mappings.delete(favourite.to_sym) if favourite
59
+ mappings.each do |mapping|
60
+ current = warden.authenticate(scope: mapping)
61
+ return current if current
62
+ end
63
+ nil
64
+ end
65
+
66
+ def current_#{group_name.to_s.pluralize}
67
+ #{mappings}.map do |mapping|
68
+ warden.authenticate(scope: mapping)
69
+ end.compact
70
+ end
71
+
72
+ helper_method "current_#{group_name}", "current_#{group_name.to_s.pluralize}", "#{group_name}_signed_in?"
73
+ METHODS
74
+ end
75
+
76
+ def log_process_action(payload)
77
+ payload[:status] ||= 401 unless payload[:exception]
78
+ super
79
+ end
80
+ end
81
+
82
+ # Define authentication filters and accessor helpers based on mappings.
83
+ # These filters should be used inside the controllers as before_filters,
84
+ # so you can control the scope of the user who should be signed in to
85
+ # access that specific controller/action.
86
+ # Example:
87
+ #
88
+ # Roles:
89
+ # User
90
+ # Admin
91
+ #
92
+ # Generated methods:
93
+ # authenticate_user! # Signs user in or redirect
94
+ # authenticate_admin! # Signs admin in or redirect
95
+ # user_signed_in? # Checks whether there is a user signed in or not
96
+ # admin_signed_in? # Checks whether there is an admin signed in or not
97
+ # current_user # Current signed in user
98
+ # current_admin # Current signed in admin
99
+ # user_session # Session data available only to the user scope
100
+ # admin_session # Session data available only to the admin scope
101
+ #
102
+ # Use:
103
+ # before_filter :authenticate_user! # Tell devise to use :user map
104
+ # before_filter :authenticate_admin! # Tell devise to use :admin map
105
+ #
106
+ def self.define_helpers(mapping) #:nodoc:
107
+ mapping = mapping.name
108
+
109
+ class_eval <<-METHODS, __FILE__, __LINE__ + 1
110
+ def authenticate_#{mapping}!(opts={})
111
+ opts[:scope] = :#{mapping}
112
+ warden.authenticate!(opts) if !devise_controller? || opts.delete(:force)
113
+ end
114
+
115
+ def #{mapping}_signed_in?
116
+ !!current_#{mapping}
117
+ end
118
+
119
+ def current_#{mapping}
120
+ @current_#{mapping} ||= warden.authenticate(scope: :#{mapping})
121
+ end
122
+
123
+ def #{mapping}_session
124
+ current_#{mapping} && warden.session(:#{mapping})
125
+ end
126
+ METHODS
127
+
128
+ ActiveSupport.on_load(:action_controller) do
129
+ helper_method "current_#{mapping}", "#{mapping}_signed_in?", "#{mapping}_session"
130
+ end
131
+ end
132
+
133
+ # The main accessor for the warden proxy instance
134
+ def warden
135
+ request.env['warden']
136
+ end
137
+
138
+ # Return true if it's a devise_controller. false to all controllers unless
139
+ # the controllers defined inside devise. Useful if you want to apply a before
140
+ # filter to all controllers, except the ones in devise:
141
+ #
142
+ # before_filter :my_filter, unless: :devise_controller?
143
+ def devise_controller?
144
+ is_a?(::DeviseController)
145
+ end
146
+
147
+ # Setup a param sanitizer to filter parameters using strong_parameters. See
148
+ # lib/devise/parameter_sanitizer.rb for more info. Override this
149
+ # method in your application controller to use your own parameter sanitizer.
150
+ 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
156
+ end
157
+
158
+ # Tell warden that params authentication is allowed for that specific page.
159
+ def allow_params_authentication!
160
+ request.env["devise.allow_params_authentication"] = true
161
+ end
162
+
163
+ # The scope root url to be used when they're signed in. By default, it first
164
+ # tries to find a resource_root_path, otherwise it uses the root_path.
165
+ def signed_in_root_path(resource_or_scope)
166
+ scope = Devise::Mapping.find_scope!(resource_or_scope)
167
+ router_name = Devise.mappings[scope].router_name
168
+
169
+ home_path = "#{scope}_root_path"
170
+
171
+ context = router_name ? send(router_name) : self
172
+
173
+ if context.respond_to?(home_path, true)
174
+ context.send(home_path)
175
+ elsif context.respond_to?(:root_path)
176
+ context.root_path
177
+ elsif respond_to?(:root_path)
178
+ root_path
179
+ else
180
+ "/"
181
+ end
182
+ end
183
+
184
+ # The default url to be used after signing in. This is used by all Devise
185
+ # controllers and you can overwrite it in your ApplicationController to
186
+ # provide a custom hook for a custom resource.
187
+ #
188
+ # By default, it first tries to find a valid resource_return_to key in the
189
+ # session, then it fallbacks to resource_root_path, otherwise it uses the
190
+ # root path. For a user scope, you can define the default url in
191
+ # the following way:
192
+ #
193
+ # map.user_root '/users', controller: 'users' # creates user_root_path
194
+ #
195
+ # map.namespace :user do |user|
196
+ # user.root controller: 'users' # creates user_root_path
197
+ # end
198
+ #
199
+ # If the resource root path is not defined, root_path is used. However,
200
+ # if this default is not enough, you can customize it, for example:
201
+ #
202
+ # def after_sign_in_path_for(resource)
203
+ # stored_location_for(resource) ||
204
+ # if resource.is_a?(User) && resource.can_publish?
205
+ # publisher_url
206
+ # else
207
+ # super
208
+ # end
209
+ # end
210
+ #
211
+ def after_sign_in_path_for(resource_or_scope)
212
+ stored_location_for(resource_or_scope) || signed_in_root_path(resource_or_scope)
213
+ end
214
+
215
+ # Method used by sessions controller to sign out a user. You can overwrite
216
+ # it in your ApplicationController to provide a custom hook for a custom
217
+ # scope. Notice that differently from +after_sign_in_path_for+ this method
218
+ # receives a symbol with the scope, and not the resource.
219
+ #
220
+ # By default it is the root_path.
221
+ def after_sign_out_path_for(resource_or_scope)
222
+ scope = Devise::Mapping.find_scope!(resource_or_scope)
223
+ router_name = Devise.mappings[scope].router_name
224
+ context = router_name ? send(router_name) : self
225
+ context.respond_to?(:root_path) ? context.root_path : "/"
226
+ end
227
+
228
+ # Sign in a user and tries to redirect first to the stored location and
229
+ # then to the url specified by after_sign_in_path_for. It accepts the same
230
+ # parameters as the sign_in method.
231
+ def sign_in_and_redirect(resource_or_scope, *args)
232
+ options = args.extract_options!
233
+ scope = Devise::Mapping.find_scope!(resource_or_scope)
234
+ resource = args.last || resource_or_scope
235
+ sign_in(scope, resource, options)
236
+ redirect_to after_sign_in_path_for(resource)
237
+ end
238
+
239
+ # Sign out a user and tries to redirect to the url specified by
240
+ # after_sign_out_path_for.
241
+ def sign_out_and_redirect(resource_or_scope)
242
+ scope = Devise::Mapping.find_scope!(resource_or_scope)
243
+ redirect_path = after_sign_out_path_for(scope)
244
+ Devise.sign_out_all_scopes ? sign_out : sign_out(scope)
245
+ redirect_to redirect_path
246
+ end
247
+
248
+ # Overwrite Rails' handle unverified request to sign out all scopes,
249
+ # clear run strategies and remove cached variables.
250
+ def handle_unverified_request
251
+ super # call the default behaviour which resets/nullifies/raises
252
+ request.env["devise.skip_storage"] = true
253
+ sign_out_all_scopes(false)
254
+ end
255
+
256
+ def request_format
257
+ @request_format ||= request.format.try(:ref)
258
+ end
259
+
260
+ def is_navigational_format?
261
+ Devise.navigational_formats.include?(request_format)
262
+ end
263
+
264
+ # Check if flash messages should be emitted. Default is to do it on
265
+ # navigational formats
266
+ def is_flashing_format?
267
+ is_navigational_format?
268
+ end
269
+
270
+ private
271
+
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
+ def expire_data_after_sign_out!
279
+ Devise.mappings.each { |_,m| instance_variable_set("@current_#{m.name}", nil) }
280
+ super
281
+ end
282
+ end
283
+ end
284
+ end
@@ -0,0 +1,47 @@
1
+ module Devise
2
+ module Controllers
3
+ # A module that may be optionally included in a controller in order
4
+ # to provide remember me behavior. Useful when signing in is done
5
+ # through a callback, like in OmniAuth.
6
+ module Rememberable
7
+ # Return default cookie values retrieved from session options.
8
+ def self.cookie_values
9
+ Rails.configuration.session_options.slice(:path, :domain, :secure)
10
+ end
11
+
12
+ # Remembers the given resource by setting up a cookie
13
+ def remember_me(resource)
14
+ return if env["devise.skip_storage"]
15
+ scope = Devise::Mapping.find_scope!(resource)
16
+ resource.remember_me!(resource.extend_remember_period)
17
+ cookies.signed[remember_key(resource, scope)] = remember_cookie_values(resource)
18
+ end
19
+
20
+ # Forgets the given resource by deleting a cookie
21
+ def forget_me(resource)
22
+ scope = Devise::Mapping.find_scope!(resource)
23
+ resource.forget_me!
24
+ cookies.delete(remember_key(resource, scope), forget_cookie_values(resource))
25
+ end
26
+
27
+ protected
28
+
29
+ def forget_cookie_values(resource)
30
+ Devise::Controllers::Rememberable.cookie_values.merge!(resource.rememberable_options)
31
+ end
32
+
33
+ def remember_cookie_values(resource)
34
+ options = { httponly: true }
35
+ options.merge!(forget_cookie_values(resource))
36
+ options.merge!(
37
+ value: resource.class.serialize_into_cookie(resource),
38
+ expires: resource.remember_expires_at
39
+ )
40
+ end
41
+
42
+ def remember_key(resource, scope)
43
+ resource.rememberable_options.fetch(:key, "remember_#{scope}_token")
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,17 @@
1
+ module Devise
2
+ module Controllers
3
+ module ScopedViews
4
+ extend ActiveSupport::Concern
5
+
6
+ module ClassMethods
7
+ def scoped_views?
8
+ defined?(@scoped_views) ? @scoped_views : Devise.scoped_views
9
+ end
10
+
11
+ def scoped_views=(value)
12
+ @scoped_views = value
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,102 @@
1
+ module Devise
2
+ module Controllers
3
+ # Provide sign in and sign out functionality.
4
+ # Included by default in all controllers.
5
+ module SignInOut
6
+ # 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
+ [ scope || Devise.mappings.keys ].flatten.any? do |_scope|
10
+ warden.authenticate?(scope: _scope)
11
+ end
12
+ end
13
+
14
+ # 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.
21
+ #
22
+ # Examples:
23
+ #
24
+ # sign_in :user, @user # sign_in(scope, resource)
25
+ # 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)
29
+ #
30
+ def sign_in(resource_or_scope, *args)
31
+ options = args.extract_options!
32
+ scope = Devise::Mapping.find_scope!(resource_or_scope)
33
+ resource = args.last || resource_or_scope
34
+
35
+ expire_data_after_sign_in!
36
+
37
+ if options[:bypass]
38
+ warden.session_serializer.store(resource, scope)
39
+ elsif warden.user(scope) == resource && !options.delete(:force)
40
+ # Do nothing. User already signed in and we are not forcing it.
41
+ true
42
+ else
43
+ warden.set_user(resource, options.merge!(scope: scope))
44
+ end
45
+ end
46
+
47
+ # Sign out a given user or scope. This helper is useful for signing out a user
48
+ # after deleting accounts. Returns true if there was a logout and false if there
49
+ # is no user logged in on the referred scope
50
+ #
51
+ # Examples:
52
+ #
53
+ # sign_out :user # sign_out(scope)
54
+ # sign_out @user # sign_out(resource)
55
+ #
56
+ def sign_out(resource_or_scope=nil)
57
+ return sign_out_all_scopes unless resource_or_scope
58
+ scope = Devise::Mapping.find_scope!(resource_or_scope)
59
+ user = warden.user(scope: scope, run_callbacks: false) # If there is no user
60
+
61
+ warden.raw_session.inspect # Without this inspect here. The session does not clear.
62
+ warden.logout(scope)
63
+ warden.clear_strategies_cache!(scope: scope)
64
+ instance_variable_set(:"@current_#{scope}", nil)
65
+
66
+ !!user
67
+ end
68
+
69
+ # Sign out all active users or scopes. This helper is useful for signing out all roles
70
+ # in one click. This signs out ALL scopes in warden. Returns true if there was at least one logout
71
+ # and false if there was no user logged in on all scopes.
72
+ def sign_out_all_scopes(lock=true)
73
+ users = Devise.mappings.keys.map { |s| warden.user(scope: s, run_callbacks: false) }
74
+
75
+ warden.logout
76
+ expire_data_after_sign_out!
77
+ warden.clear_strategies_cache!
78
+ warden.lock! if lock
79
+
80
+ users.any?
81
+ end
82
+
83
+ private
84
+
85
+ def expire_data_after_sign_in!
86
+ # session.keys will return an empty array if the session is not yet loaded.
87
+ # This is a bug in both Rack and Rails.
88
+ # A call to #empty? forces the session to be loaded.
89
+ session.empty?
90
+ session.keys.grep(/^devise\./).each { |k| session.delete(k) }
91
+ end
92
+
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
+ session.keys.grep(/^devise\./).each { |k| session.delete(k) }
99
+ end
100
+ end
101
+ end
102
+ end