devise_token_auth_fork_dfabarbosa 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 (164) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +13 -0
  3. data/README.md +97 -0
  4. data/Rakefile +42 -0
  5. data/app/controllers/devise_token_auth/application_controller.rb +79 -0
  6. data/app/controllers/devise_token_auth/concerns/resource_finder.rb +44 -0
  7. data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +164 -0
  8. data/app/controllers/devise_token_auth/confirmations_controller.rb +39 -0
  9. data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +239 -0
  10. data/app/controllers/devise_token_auth/passwords_controller.rb +188 -0
  11. data/app/controllers/devise_token_auth/registrations_controller.rb +204 -0
  12. data/app/controllers/devise_token_auth/sessions_controller.rb +131 -0
  13. data/app/controllers/devise_token_auth/token_validations_controller.rb +31 -0
  14. data/app/controllers/devise_token_auth/unlocks_controller.rb +89 -0
  15. data/app/models/devise_token_auth/concerns/active_record_support.rb +34 -0
  16. data/app/models/devise_token_auth/concerns/mongoid_support.rb +19 -0
  17. data/app/models/devise_token_auth/concerns/user.rb +262 -0
  18. data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +28 -0
  19. data/app/validators/devise_token_auth/email_validator.rb +23 -0
  20. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  21. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  22. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  23. data/app/views/devise_token_auth/omniauth_external_window.html.erb +38 -0
  24. data/config/locales/da-DK.yml +50 -0
  25. data/config/locales/de.yml +49 -0
  26. data/config/locales/en.yml +50 -0
  27. data/config/locales/es.yml +49 -0
  28. data/config/locales/fr.yml +49 -0
  29. data/config/locales/it.yml +46 -0
  30. data/config/locales/ja.yml +46 -0
  31. data/config/locales/nl.yml +30 -0
  32. data/config/locales/pl.yml +48 -0
  33. data/config/locales/pt-BR.yml +46 -0
  34. data/config/locales/pt.yml +48 -0
  35. data/config/locales/ro.yml +46 -0
  36. data/config/locales/ru.yml +50 -0
  37. data/config/locales/sq.yml +46 -0
  38. data/config/locales/sv.yml +50 -0
  39. data/config/locales/uk.yml +59 -0
  40. data/config/locales/vi.yml +50 -0
  41. data/config/locales/zh-CN.yml +46 -0
  42. data/config/locales/zh-HK.yml +48 -0
  43. data/config/locales/zh-TW.yml +48 -0
  44. data/lib/devise_token_auth.rb +13 -0
  45. data/lib/devise_token_auth/blacklist.rb +2 -0
  46. data/lib/devise_token_auth/controllers/helpers.rb +161 -0
  47. data/lib/devise_token_auth/controllers/url_helpers.rb +10 -0
  48. data/lib/devise_token_auth/engine.rb +90 -0
  49. data/lib/devise_token_auth/errors.rb +8 -0
  50. data/lib/devise_token_auth/rails/routes.rb +116 -0
  51. data/lib/devise_token_auth/url.rb +41 -0
  52. data/lib/devise_token_auth/version.rb +5 -0
  53. data/lib/generators/devise_token_auth/USAGE +31 -0
  54. data/lib/generators/devise_token_auth/install_generator.rb +91 -0
  55. data/lib/generators/devise_token_auth/install_generator_helpers.rb +98 -0
  56. data/lib/generators/devise_token_auth/install_mongoid_generator.rb +46 -0
  57. data/lib/generators/devise_token_auth/install_views_generator.rb +18 -0
  58. data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +50 -0
  59. data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +56 -0
  60. data/lib/generators/devise_token_auth/templates/user.rb.erb +9 -0
  61. data/lib/generators/devise_token_auth/templates/user_mongoid.rb.erb +63 -0
  62. data/lib/tasks/devise_token_auth_tasks.rake +6 -0
  63. data/test/controllers/custom/custom_confirmations_controller_test.rb +25 -0
  64. data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +33 -0
  65. data/test/controllers/custom/custom_passwords_controller_test.rb +79 -0
  66. data/test/controllers/custom/custom_registrations_controller_test.rb +63 -0
  67. data/test/controllers/custom/custom_sessions_controller_test.rb +39 -0
  68. data/test/controllers/custom/custom_token_validations_controller_test.rb +42 -0
  69. data/test/controllers/demo_group_controller_test.rb +151 -0
  70. data/test/controllers/demo_mang_controller_test.rb +284 -0
  71. data/test/controllers/demo_user_controller_test.rb +629 -0
  72. data/test/controllers/devise_token_auth/confirmations_controller_test.rb +127 -0
  73. data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +376 -0
  74. data/test/controllers/devise_token_auth/passwords_controller_test.rb +666 -0
  75. data/test/controllers/devise_token_auth/registrations_controller_test.rb +907 -0
  76. data/test/controllers/devise_token_auth/sessions_controller_test.rb +541 -0
  77. data/test/controllers/devise_token_auth/token_validations_controller_test.rb +102 -0
  78. data/test/controllers/devise_token_auth/unlocks_controller_test.rb +196 -0
  79. data/test/controllers/overrides/confirmations_controller_test.rb +47 -0
  80. data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +53 -0
  81. data/test/controllers/overrides/passwords_controller_test.rb +64 -0
  82. data/test/controllers/overrides/registrations_controller_test.rb +46 -0
  83. data/test/controllers/overrides/sessions_controller_test.rb +35 -0
  84. data/test/controllers/overrides/token_validations_controller_test.rb +43 -0
  85. data/test/dummy/README.rdoc +28 -0
  86. data/test/dummy/app/active_record/lockable_user.rb +7 -0
  87. data/test/dummy/app/active_record/mang.rb +5 -0
  88. data/test/dummy/app/active_record/only_email_user.rb +7 -0
  89. data/test/dummy/app/active_record/scoped_user.rb +9 -0
  90. data/test/dummy/app/active_record/unconfirmable_user.rb +9 -0
  91. data/test/dummy/app/active_record/unregisterable_user.rb +9 -0
  92. data/test/dummy/app/active_record/user.rb +6 -0
  93. data/test/dummy/app/controllers/application_controller.rb +18 -0
  94. data/test/dummy/app/controllers/auth_origin_controller.rb +7 -0
  95. data/test/dummy/app/controllers/custom/confirmations_controller.rb +13 -0
  96. data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +13 -0
  97. data/test/dummy/app/controllers/custom/passwords_controller.rb +39 -0
  98. data/test/dummy/app/controllers/custom/registrations_controller.rb +39 -0
  99. data/test/dummy/app/controllers/custom/sessions_controller.rb +29 -0
  100. data/test/dummy/app/controllers/custom/token_validations_controller.rb +19 -0
  101. data/test/dummy/app/controllers/demo_group_controller.rb +15 -0
  102. data/test/dummy/app/controllers/demo_mang_controller.rb +14 -0
  103. data/test/dummy/app/controllers/demo_user_controller.rb +27 -0
  104. data/test/dummy/app/controllers/overrides/confirmations_controller.rb +28 -0
  105. data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +16 -0
  106. data/test/dummy/app/controllers/overrides/passwords_controller.rb +35 -0
  107. data/test/dummy/app/controllers/overrides/registrations_controller.rb +29 -0
  108. data/test/dummy/app/controllers/overrides/sessions_controller.rb +36 -0
  109. data/test/dummy/app/controllers/overrides/token_validations_controller.rb +23 -0
  110. data/test/dummy/app/helpers/application_helper.rb +1058 -0
  111. data/test/dummy/app/models/concerns/favorite_color.rb +19 -0
  112. data/test/dummy/app/mongoid/lockable_user.rb +38 -0
  113. data/test/dummy/app/mongoid/mang.rb +53 -0
  114. data/test/dummy/app/mongoid/only_email_user.rb +33 -0
  115. data/test/dummy/app/mongoid/scoped_user.rb +57 -0
  116. data/test/dummy/app/mongoid/unconfirmable_user.rb +51 -0
  117. data/test/dummy/app/mongoid/unregisterable_user.rb +54 -0
  118. data/test/dummy/app/mongoid/user.rb +56 -0
  119. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  120. data/test/dummy/config.ru +18 -0
  121. data/test/dummy/config/application.rb +48 -0
  122. data/test/dummy/config/application.yml.bk +0 -0
  123. data/test/dummy/config/boot.rb +11 -0
  124. data/test/dummy/config/environment.rb +7 -0
  125. data/test/dummy/config/environments/development.rb +46 -0
  126. data/test/dummy/config/environments/production.rb +84 -0
  127. data/test/dummy/config/environments/test.rb +50 -0
  128. data/test/dummy/config/initializers/assets.rb +10 -0
  129. data/test/dummy/config/initializers/backtrace_silencers.rb +9 -0
  130. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  131. data/test/dummy/config/initializers/devise.rb +17 -0
  132. data/test/dummy/config/initializers/devise_token_auth.rb +24 -0
  133. data/test/dummy/config/initializers/figaro.rb +3 -0
  134. data/test/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  135. data/test/dummy/config/initializers/inflections.rb +18 -0
  136. data/test/dummy/config/initializers/mime_types.rb +6 -0
  137. data/test/dummy/config/initializers/omniauth.rb +10 -0
  138. data/test/dummy/config/initializers/session_store.rb +5 -0
  139. data/test/dummy/config/initializers/wrap_parameters.rb +16 -0
  140. data/test/dummy/config/routes.rb +55 -0
  141. data/test/dummy/config/spring.rb +3 -0
  142. data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +65 -0
  143. data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +64 -0
  144. data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +8 -0
  145. data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +7 -0
  146. data/test/dummy/db/migrate/20141222035835_devise_token_auth_create_only_email_users.rb +62 -0
  147. data/test/dummy/db/migrate/20141222053502_devise_token_auth_create_unregisterable_users.rb +63 -0
  148. data/test/dummy/db/migrate/20150708104536_devise_token_auth_create_unconfirmable_users.rb +63 -0
  149. data/test/dummy/db/migrate/20160103235141_devise_token_auth_create_scoped_users.rb +63 -0
  150. data/test/dummy/db/migrate/20160629184441_devise_token_auth_create_lockable_users.rb +63 -0
  151. data/test/dummy/db/schema.rb +200 -0
  152. data/test/dummy/lib/migration_database_helper.rb +43 -0
  153. data/test/factories/users.rb +40 -0
  154. data/test/lib/devise_token_auth/blacklist_test.rb +11 -0
  155. data/test/lib/devise_token_auth/url_test.rb +26 -0
  156. data/test/lib/generators/devise_token_auth/install_generator_test.rb +217 -0
  157. data/test/lib/generators/devise_token_auth/install_generator_with_namespace_test.rb +222 -0
  158. data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +25 -0
  159. data/test/models/concerns/mongoid_support_test.rb +31 -0
  160. data/test/models/only_email_user_test.rb +37 -0
  161. data/test/models/user_test.rb +140 -0
  162. data/test/support/controllers/routes.rb +43 -0
  163. data/test/test_helper.rb +103 -0
  164. metadata +437 -0
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeviseTokenAuth
4
+ class ConfirmationsController < DeviseTokenAuth::ApplicationController
5
+ def show
6
+ @resource = resource_class.confirm_by_token(params[:confirmation_token])
7
+
8
+ if @resource.persisted?
9
+ expiry = nil
10
+ if defined?(@resource.sign_in_count) && @resource.sign_in_count > 0
11
+ expiry = (Time.zone.now + 1.second).to_i
12
+ end
13
+
14
+ client_id, token = @resource.create_token expiry: expiry
15
+
16
+ sign_in(@resource)
17
+ @resource.save!
18
+
19
+ yield @resource if block_given?
20
+
21
+ redirect_header_options = { account_confirmation_success: true }
22
+ redirect_headers = build_redirect_headers(token,
23
+ client_id,
24
+ redirect_header_options)
25
+
26
+ # give redirect value from params priority
27
+ @redirect_url = params[:redirect_url]
28
+
29
+ # fall back to default value if provided
30
+ @redirect_url ||= DeviseTokenAuth.default_confirm_success_url
31
+
32
+
33
+ redirect_to(@resource.build_auth_url(@redirect_url, redirect_headers))
34
+ else
35
+ raise ActionController::RoutingError, 'Not Found'
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,239 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeviseTokenAuth
4
+ class OmniauthCallbacksController < DeviseTokenAuth::ApplicationController
5
+ attr_reader :auth_params
6
+ skip_before_action :set_user_by_token, raise: false
7
+ skip_after_action :update_auth_header
8
+
9
+ # intermediary route for successful omniauth authentication. omniauth does
10
+ # not support multiple models, so we must resort to this terrible hack.
11
+ def redirect_callbacks
12
+
13
+ # derive target redirect route from 'resource_class' param, which was set
14
+ # before authentication.
15
+ devise_mapping = [request.env['omniauth.params']['namespace_name'],
16
+ request.env['omniauth.params']['resource_class'].underscore.gsub('/', '_')].compact.join('_')
17
+ path = "#{Devise.mappings[devise_mapping.to_sym].fullpath}/#{params[:provider]}/callback"
18
+ klass = request.scheme == 'https' ? URI::HTTPS : URI::HTTP
19
+ redirect_route = klass.build(host: request.host, port: request.port, path: path).to_s
20
+
21
+ # preserve omniauth info for success route. ignore 'extra' in twitter
22
+ # auth response to avoid CookieOverflow.
23
+ session['dta.omniauth.auth'] = request.env['omniauth.auth'].except('extra')
24
+ session['dta.omniauth.params'] = request.env['omniauth.params']
25
+
26
+ redirect_to redirect_route
27
+ end
28
+
29
+ def omniauth_success
30
+ get_resource_from_auth_hash
31
+ set_token_on_resource
32
+ create_auth_params
33
+
34
+ if confirmable_enabled?
35
+ # don't send confirmation email!!!
36
+ @resource.skip_confirmation!
37
+ end
38
+
39
+ sign_in(:user, @resource, store: false, bypass: false)
40
+
41
+ @resource.save!
42
+
43
+ yield @resource if block_given?
44
+
45
+ render_data_or_redirect('deliverCredentials', @auth_params.as_json, @resource.as_json)
46
+ end
47
+
48
+ def omniauth_failure
49
+ @error = params[:message]
50
+ render_data_or_redirect('authFailure', error: @error)
51
+ end
52
+
53
+ protected
54
+
55
+ # this will be determined differently depending on the action that calls
56
+ # it. redirect_callbacks is called upon returning from successful omniauth
57
+ # authentication, and the target params live in an omniauth-specific
58
+ # request.env variable. this variable is then persisted thru the redirect
59
+ # using our own dta.omniauth.params session var. the omniauth_success
60
+ # method will access that session var and then destroy it immediately
61
+ # after use. In the failure case, finally, the omniauth params
62
+ # are added as query params in our monkey patch to OmniAuth in engine.rb
63
+ def omniauth_params
64
+ unless defined?(@_omniauth_params)
65
+ if request.env['omniauth.params'] && request.env['omniauth.params'].any?
66
+ @_omniauth_params = request.env['omniauth.params']
67
+ elsif session['dta.omniauth.params'] && session['dta.omniauth.params'].any?
68
+ @_omniauth_params ||= session.delete('dta.omniauth.params')
69
+ @_omniauth_params
70
+ elsif params['omniauth_window_type']
71
+ @_omniauth_params = params.slice('omniauth_window_type', 'auth_origin_url', 'resource_class', 'origin')
72
+ else
73
+ @_omniauth_params = {}
74
+ end
75
+ end
76
+ @_omniauth_params
77
+
78
+ end
79
+
80
+ # break out provider attribute assignment for easy method extension
81
+ def assign_provider_attrs(user, auth_hash)
82
+ attrs = auth_hash['info'].slice(*user.attribute_names)
83
+ user.assign_attributes(attrs)
84
+ end
85
+
86
+ # derive allowed params from the standard devise parameter sanitizer
87
+ def whitelisted_params
88
+ whitelist = params_for_resource(:sign_up)
89
+
90
+ whitelist.inject({}) do |coll, key|
91
+ param = omniauth_params[key.to_s]
92
+ coll[key] = param if param
93
+ coll
94
+ end
95
+ end
96
+
97
+ def resource_class(mapping = nil)
98
+ if omniauth_params['resource_class']
99
+ omniauth_params['resource_class'].constantize
100
+ elsif params['resource_class']
101
+ params['resource_class'].constantize
102
+ else
103
+ raise 'No resource_class found'
104
+ end
105
+ end
106
+
107
+ def resource_name
108
+ resource_class
109
+ end
110
+
111
+ def omniauth_window_type
112
+ omniauth_params['omniauth_window_type']
113
+ end
114
+
115
+ def auth_origin_url
116
+ omniauth_params['auth_origin_url'] || omniauth_params['origin']
117
+ end
118
+
119
+ # in the success case, omniauth_window_type is in the omniauth_params.
120
+ # in the failure case, it is in a query param. See monkey patch above
121
+ def omniauth_window_type
122
+ omniauth_params.nil? ? params['omniauth_window_type'] : omniauth_params['omniauth_window_type']
123
+ end
124
+
125
+ # this sesison value is set by the redirect_callbacks method. its purpose
126
+ # is to persist the omniauth auth hash value thru a redirect. the value
127
+ # must be destroyed immediatly after it is accessed by omniauth_success
128
+ def auth_hash
129
+ @_auth_hash ||= session.delete('dta.omniauth.auth')
130
+ @_auth_hash
131
+ end
132
+
133
+ # ensure that this controller responds to :devise_controller? conditionals.
134
+ # this is used primarily for access to the parameter sanitizers.
135
+ def assert_is_devise_resource!
136
+ true
137
+ end
138
+
139
+ # necessary for access to devise_parameter_sanitizers
140
+ def devise_mapping
141
+ if omniauth_params
142
+ Devise.mappings[[omniauth_params['namespace_name'],
143
+ omniauth_params['resource_class'].underscore].compact.join('_').to_sym]
144
+ else
145
+ request.env['devise.mapping']
146
+ end
147
+ end
148
+
149
+ def set_random_password
150
+ # set crazy password for new oauth users. this is only used to prevent
151
+ # access via email sign-in.
152
+ p = SecureRandom.urlsafe_base64(nil, false)
153
+ @resource.password = p
154
+ @resource.password_confirmation = p
155
+ end
156
+
157
+ def create_auth_params
158
+ @auth_params = {
159
+ auth_token: @token,
160
+ client_id: @client_id,
161
+ uid: @resource.uid,
162
+ expiry: @expiry,
163
+ config: @config
164
+ }
165
+ @auth_params.merge!(oauth_registration: true) if @oauth_registration
166
+ @auth_params
167
+ end
168
+
169
+ def set_token_on_resource
170
+ @config = omniauth_params['config_name']
171
+ @client_id, @token, @expiry = @resource.create_token
172
+ end
173
+
174
+ def render_data(message, data)
175
+ @data = data.merge(message: message)
176
+ render layout: nil, template: 'devise_token_auth/omniauth_external_window'
177
+ end
178
+
179
+ def render_data_or_redirect(message, data, user_data = {})
180
+
181
+ # We handle inAppBrowser and newWindow the same, but it is nice
182
+ # to support values in case people need custom implementations for each case
183
+ # (For example, nbrustein does not allow new users to be created if logging in with
184
+ # an inAppBrowser)
185
+ #
186
+ # See app/views/devise_token_auth/omniauth_external_window.html.erb to understand
187
+ # why we can handle these both the same. The view is setup to handle both cases
188
+ # at the same time.
189
+ if ['inAppBrowser', 'newWindow'].include?(omniauth_window_type)
190
+ render_data(message, user_data.merge(data))
191
+
192
+ elsif auth_origin_url # default to same-window implementation, which forwards back to auth_origin_url
193
+
194
+ # build and redirect to destination url
195
+ redirect_to DeviseTokenAuth::Url.generate(auth_origin_url, data.merge(blank: true))
196
+ else
197
+
198
+ # there SHOULD always be an auth_origin_url, but if someone does something silly
199
+ # like coming straight to this url or refreshing the page at the wrong time, there may not be one.
200
+ # In that case, just render in plain text the error message if there is one or otherwise
201
+ # a generic message.
202
+ fallback_render data[:error] || 'An error occurred'
203
+ end
204
+ end
205
+
206
+ def fallback_render(text)
207
+ render inline: %Q(
208
+
209
+ <html>
210
+ <head></head>
211
+ <body>
212
+ #{text}
213
+ </body>
214
+ </html>)
215
+ end
216
+
217
+ def get_resource_from_auth_hash
218
+ # find or create user by provider and provider uid
219
+ @resource = resource_class.where(
220
+ uid: auth_hash['uid'],
221
+ provider: auth_hash['provider']
222
+ ).first_or_initialize
223
+
224
+ if @resource.new_record?
225
+ @oauth_registration = true
226
+ set_random_password
227
+ end
228
+
229
+ # sync user info with provider, update/generate auth token
230
+ assign_provider_attrs(@resource, auth_hash)
231
+
232
+ # assign any additional (whitelisted) attributes
233
+ extra_params = whitelisted_params
234
+ @resource.assign_attributes(extra_params) if extra_params
235
+
236
+ @resource
237
+ end
238
+ end
239
+ end
@@ -0,0 +1,188 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeviseTokenAuth
4
+ class PasswordsController < DeviseTokenAuth::ApplicationController
5
+ before_action :set_user_by_token, only: [:update]
6
+ before_action :validate_redirect_url_param, only: [:create, :edit]
7
+ skip_after_action :update_auth_header, only: [:create, :edit]
8
+
9
+ # this action is responsible for generating password reset tokens and
10
+ # sending emails
11
+ def create
12
+ return render_create_error_missing_email unless resource_params[:email]
13
+
14
+ @email = get_case_insensitive_field_from_resource_params(:email)
15
+ @resource = find_resource(:uid, @email)
16
+
17
+ if @resource
18
+ yield @resource if block_given?
19
+ @resource.send_reset_password_instructions(
20
+ email: @email,
21
+ provider: 'email',
22
+ redirect_url: @redirect_url,
23
+ client_config: params[:config_name]
24
+ )
25
+
26
+ if @resource.errors.empty?
27
+ return render_create_success
28
+ else
29
+ render_create_error @resource.errors
30
+ end
31
+ else
32
+ render_not_found_error
33
+ end
34
+ end
35
+
36
+ # this is where users arrive after visiting the password reset confirmation link
37
+ def edit
38
+ # if a user is not found, return nil
39
+ @resource = resource_class.with_reset_password_token(resource_params[:reset_password_token])
40
+
41
+ if @resource && @resource.reset_password_period_valid?
42
+ client_id, token = @resource.create_token
43
+
44
+ # ensure that user is confirmed
45
+ @resource.skip_confirmation! if confirmable_enabled? && !@resource.confirmed_at
46
+
47
+ # allow user to change password once without current_password
48
+ @resource.allow_password_change = true if recoverable_enabled?
49
+
50
+ @resource.save!
51
+
52
+ yield @resource if block_given?
53
+
54
+ redirect_header_options = { reset_password: true }
55
+ redirect_headers = build_redirect_headers(token,
56
+ client_id,
57
+ redirect_header_options)
58
+ redirect_to(@resource.build_auth_url(@redirect_url,
59
+ redirect_headers))
60
+ else
61
+ render_edit_error
62
+ end
63
+ end
64
+
65
+ def update
66
+ # make sure user is authorized
67
+ return render_update_error_unauthorized unless @resource
68
+
69
+ # make sure account doesn't use oauth2 provider
70
+ unless @resource.provider == 'email'
71
+ return render_update_error_password_not_required
72
+ end
73
+
74
+ # ensure that password params were sent
75
+ unless password_resource_params[:password] && password_resource_params[:password_confirmation]
76
+ return render_update_error_missing_password
77
+ end
78
+
79
+ if @resource.send(resource_update_method, password_resource_params)
80
+ @resource.allow_password_change = false if recoverable_enabled?
81
+ @resource.save!
82
+
83
+ yield @resource if block_given?
84
+ return render_update_success
85
+ else
86
+ return render_update_error
87
+ end
88
+ end
89
+
90
+ protected
91
+
92
+ def resource_update_method
93
+ allow_password_change = recoverable_enabled? && @resource.allow_password_change == true
94
+ if DeviseTokenAuth.check_current_password_before_update == false || allow_password_change
95
+ 'update_attributes'
96
+ else
97
+ 'update_with_password'
98
+ end
99
+ end
100
+
101
+ def render_create_error_missing_email
102
+ render_error(401, I18n.t('devise_token_auth.passwords.missing_email'))
103
+ end
104
+
105
+ def render_create_error_missing_redirect_url
106
+ render_error(401, I18n.t('devise_token_auth.passwords.missing_redirect_url'))
107
+ end
108
+
109
+ def render_error_not_allowed_redirect_url
110
+ response = {
111
+ status: 'error',
112
+ data: resource_data
113
+ }
114
+ message = I18n.t('devise_token_auth.passwords.not_allowed_redirect_url', redirect_url: @redirect_url)
115
+ render_error(422, message, response)
116
+ end
117
+
118
+ def render_create_success
119
+ render json: {
120
+ success: true,
121
+ message: I18n.t('devise_token_auth.passwords.sended', email: @email)
122
+ }
123
+ end
124
+
125
+ def render_create_error(errors)
126
+ render json: {
127
+ success: false,
128
+ errors: errors
129
+ }, status: 400
130
+ end
131
+
132
+ def render_edit_error
133
+ raise ActionController::RoutingError, 'Not Found'
134
+ end
135
+
136
+ def render_update_error_unauthorized
137
+ render_error(401, 'Unauthorized')
138
+ end
139
+
140
+ def render_update_error_password_not_required
141
+ render_error(422, I18n.t('devise_token_auth.passwords.password_not_required', provider: @resource.provider.humanize))
142
+ end
143
+
144
+ def render_update_error_missing_password
145
+ render_error(422, I18n.t('devise_token_auth.passwords.missing_passwords'))
146
+ end
147
+
148
+ def render_update_success
149
+ render json: {
150
+ success: true,
151
+ data: resource_data,
152
+ message: I18n.t('devise_token_auth.passwords.successfully_updated')
153
+ }
154
+ end
155
+
156
+ def render_update_error
157
+ render json: {
158
+ success: false,
159
+ errors: resource_errors
160
+ }, status: 422
161
+ end
162
+
163
+ private
164
+
165
+ def resource_params
166
+ params.permit(:email, :reset_password_token)
167
+ end
168
+
169
+ def password_resource_params
170
+ params.permit(*params_for_resource(:account_update))
171
+ end
172
+
173
+ def render_not_found_error
174
+ render_error(404, I18n.t('devise_token_auth.passwords.user_not_found', email: @email))
175
+ end
176
+
177
+ def validate_redirect_url_param
178
+ # give redirect value from params priority
179
+ @redirect_url = params.fetch(
180
+ :redirect_url,
181
+ DeviseTokenAuth.default_password_reset_url
182
+ )
183
+
184
+ return render_create_error_missing_redirect_url unless @redirect_url
185
+ return render_error_not_allowed_redirect_url if blacklisted_redirect_url?
186
+ end
187
+ end
188
+ end