sidecar_token_auth 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +13 -0
  3. data/README.md +12 -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 +162 -0
  8. data/app/controllers/devise_token_auth/confirmations_controller.rb +90 -0
  9. data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +287 -0
  10. data/app/controllers/devise_token_auth/passwords_controller.rb +206 -0
  11. data/app/controllers/devise_token_auth/registrations_controller.rb +283 -0
  12. data/app/controllers/devise_token_auth/sessions_controller.rb +245 -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 +16 -0
  16. data/app/models/devise_token_auth/concerns/confirmable_support.rb +28 -0
  17. data/app/models/devise_token_auth/concerns/mongoid_support.rb +19 -0
  18. data/app/models/devise_token_auth/concerns/tokens_serialization.rb +19 -0
  19. data/app/models/devise_token_auth/concerns/user.rb +257 -0
  20. data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +31 -0
  21. data/app/validators/devise_token_auth_email_validator.rb +23 -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_token_auth/omniauth_external_window.html.erb +38 -0
  26. data/config/locales/da-DK.yml +52 -0
  27. data/config/locales/de.yml +51 -0
  28. data/config/locales/en.yml +60 -0
  29. data/config/locales/es.yml +51 -0
  30. data/config/locales/fr.yml +51 -0
  31. data/config/locales/he.yml +52 -0
  32. data/config/locales/it.yml +48 -0
  33. data/config/locales/ja.yml +48 -0
  34. data/config/locales/ko.yml +51 -0
  35. data/config/locales/nl.yml +32 -0
  36. data/config/locales/pl.yml +51 -0
  37. data/config/locales/pt-BR.yml +48 -0
  38. data/config/locales/pt.yml +51 -0
  39. data/config/locales/ro.yml +48 -0
  40. data/config/locales/ru.yml +52 -0
  41. data/config/locales/sq.yml +48 -0
  42. data/config/locales/sv.yml +52 -0
  43. data/config/locales/uk.yml +61 -0
  44. data/config/locales/vi.yml +52 -0
  45. data/config/locales/zh-CN.yml +48 -0
  46. data/config/locales/zh-HK.yml +50 -0
  47. data/config/locales/zh-TW.yml +50 -0
  48. data/lib/devise_token_auth.rb +14 -0
  49. data/lib/devise_token_auth/blacklist.rb +2 -0
  50. data/lib/devise_token_auth/controllers/helpers.rb +157 -0
  51. data/lib/devise_token_auth/controllers/url_helpers.rb +10 -0
  52. data/lib/devise_token_auth/engine.rb +96 -0
  53. data/lib/devise_token_auth/errors.rb +8 -0
  54. data/lib/devise_token_auth/rails/routes.rb +116 -0
  55. data/lib/devise_token_auth/token_factory.rb +126 -0
  56. data/lib/devise_token_auth/url.rb +44 -0
  57. data/lib/devise_token_auth/version.rb +5 -0
  58. data/lib/generators/devise_token_auth/USAGE +31 -0
  59. data/lib/generators/devise_token_auth/install_generator.rb +91 -0
  60. data/lib/generators/devise_token_auth/install_generator_helpers.rb +98 -0
  61. data/lib/generators/devise_token_auth/install_mongoid_generator.rb +46 -0
  62. data/lib/generators/devise_token_auth/install_views_generator.rb +18 -0
  63. data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +60 -0
  64. data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +49 -0
  65. data/lib/generators/devise_token_auth/templates/user.rb.erb +9 -0
  66. data/lib/generators/devise_token_auth/templates/user_mongoid.rb.erb +56 -0
  67. data/lib/tasks/devise_token_auth_tasks.rake +6 -0
  68. data/test/controllers/custom/custom_confirmations_controller_test.rb +25 -0
  69. data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +33 -0
  70. data/test/controllers/custom/custom_passwords_controller_test.rb +79 -0
  71. data/test/controllers/custom/custom_registrations_controller_test.rb +63 -0
  72. data/test/controllers/custom/custom_sessions_controller_test.rb +39 -0
  73. data/test/controllers/custom/custom_token_validations_controller_test.rb +42 -0
  74. data/test/controllers/demo_group_controller_test.rb +151 -0
  75. data/test/controllers/demo_mang_controller_test.rb +284 -0
  76. data/test/controllers/demo_user_controller_test.rb +629 -0
  77. data/test/controllers/devise_token_auth/confirmations_controller_test.rb +191 -0
  78. data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +441 -0
  79. data/test/controllers/devise_token_auth/passwords_controller_test.rb +780 -0
  80. data/test/controllers/devise_token_auth/registrations_controller_test.rb +907 -0
  81. data/test/controllers/devise_token_auth/sessions_controller_test.rb +503 -0
  82. data/test/controllers/devise_token_auth/token_validations_controller_test.rb +102 -0
  83. data/test/controllers/devise_token_auth/unlocks_controller_test.rb +196 -0
  84. data/test/controllers/overrides/confirmations_controller_test.rb +47 -0
  85. data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +53 -0
  86. data/test/controllers/overrides/passwords_controller_test.rb +64 -0
  87. data/test/controllers/overrides/registrations_controller_test.rb +46 -0
  88. data/test/controllers/overrides/sessions_controller_test.rb +35 -0
  89. data/test/controllers/overrides/token_validations_controller_test.rb +43 -0
  90. data/test/dummy/README.rdoc +28 -0
  91. data/test/dummy/app/active_record/confirmable_user.rb +11 -0
  92. data/test/dummy/app/active_record/lockable_user.rb +7 -0
  93. data/test/dummy/app/active_record/mang.rb +5 -0
  94. data/test/dummy/app/active_record/only_email_user.rb +7 -0
  95. data/test/dummy/app/active_record/scoped_user.rb +9 -0
  96. data/test/dummy/app/active_record/unconfirmable_user.rb +9 -0
  97. data/test/dummy/app/active_record/unregisterable_user.rb +9 -0
  98. data/test/dummy/app/active_record/user.rb +6 -0
  99. data/test/dummy/app/controllers/application_controller.rb +18 -0
  100. data/test/dummy/app/controllers/auth_origin_controller.rb +7 -0
  101. data/test/dummy/app/controllers/custom/confirmations_controller.rb +13 -0
  102. data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +13 -0
  103. data/test/dummy/app/controllers/custom/passwords_controller.rb +39 -0
  104. data/test/dummy/app/controllers/custom/registrations_controller.rb +39 -0
  105. data/test/dummy/app/controllers/custom/sessions_controller.rb +29 -0
  106. data/test/dummy/app/controllers/custom/token_validations_controller.rb +19 -0
  107. data/test/dummy/app/controllers/demo_group_controller.rb +15 -0
  108. data/test/dummy/app/controllers/demo_mang_controller.rb +14 -0
  109. data/test/dummy/app/controllers/demo_user_controller.rb +27 -0
  110. data/test/dummy/app/controllers/overrides/confirmations_controller.rb +28 -0
  111. data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +16 -0
  112. data/test/dummy/app/controllers/overrides/passwords_controller.rb +35 -0
  113. data/test/dummy/app/controllers/overrides/registrations_controller.rb +29 -0
  114. data/test/dummy/app/controllers/overrides/sessions_controller.rb +36 -0
  115. data/test/dummy/app/controllers/overrides/token_validations_controller.rb +23 -0
  116. data/test/dummy/app/helpers/application_helper.rb +1058 -0
  117. data/test/dummy/app/models/concerns/favorite_color.rb +19 -0
  118. data/test/dummy/app/mongoid/confirmable_user.rb +52 -0
  119. data/test/dummy/app/mongoid/lockable_user.rb +38 -0
  120. data/test/dummy/app/mongoid/mang.rb +46 -0
  121. data/test/dummy/app/mongoid/only_email_user.rb +33 -0
  122. data/test/dummy/app/mongoid/scoped_user.rb +50 -0
  123. data/test/dummy/app/mongoid/unconfirmable_user.rb +44 -0
  124. data/test/dummy/app/mongoid/unregisterable_user.rb +47 -0
  125. data/test/dummy/app/mongoid/user.rb +49 -0
  126. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  127. data/test/dummy/config.ru +18 -0
  128. data/test/dummy/config/application.rb +48 -0
  129. data/test/dummy/config/application.yml.bk +0 -0
  130. data/test/dummy/config/boot.rb +11 -0
  131. data/test/dummy/config/environment.rb +7 -0
  132. data/test/dummy/config/environments/development.rb +46 -0
  133. data/test/dummy/config/environments/production.rb +84 -0
  134. data/test/dummy/config/environments/test.rb +50 -0
  135. data/test/dummy/config/initializers/assets.rb +10 -0
  136. data/test/dummy/config/initializers/backtrace_silencers.rb +9 -0
  137. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  138. data/test/dummy/config/initializers/devise.rb +290 -0
  139. data/test/dummy/config/initializers/devise_token_auth.rb +55 -0
  140. data/test/dummy/config/initializers/figaro.rb +3 -0
  141. data/test/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  142. data/test/dummy/config/initializers/inflections.rb +18 -0
  143. data/test/dummy/config/initializers/mime_types.rb +6 -0
  144. data/test/dummy/config/initializers/omniauth.rb +11 -0
  145. data/test/dummy/config/initializers/session_store.rb +5 -0
  146. data/test/dummy/config/initializers/wrap_parameters.rb +16 -0
  147. data/test/dummy/config/routes.rb +57 -0
  148. data/test/dummy/config/spring.rb +3 -0
  149. data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +58 -0
  150. data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +57 -0
  151. data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +8 -0
  152. data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +7 -0
  153. data/test/dummy/db/migrate/20141222035835_devise_token_auth_create_only_email_users.rb +55 -0
  154. data/test/dummy/db/migrate/20141222053502_devise_token_auth_create_unregisterable_users.rb +56 -0
  155. data/test/dummy/db/migrate/20150708104536_devise_token_auth_create_unconfirmable_users.rb +56 -0
  156. data/test/dummy/db/migrate/20160103235141_devise_token_auth_create_scoped_users.rb +56 -0
  157. data/test/dummy/db/migrate/20160629184441_devise_token_auth_create_lockable_users.rb +56 -0
  158. data/test/dummy/db/migrate/20190924101113_devise_token_auth_create_confirmable_users.rb +49 -0
  159. data/test/dummy/db/schema.rb +198 -0
  160. data/test/dummy/lib/migration_database_helper.rb +43 -0
  161. data/test/factories/users.rb +41 -0
  162. data/test/lib/devise_token_auth/blacklist_test.rb +11 -0
  163. data/test/lib/devise_token_auth/token_factory_test.rb +191 -0
  164. data/test/lib/devise_token_auth/url_test.rb +26 -0
  165. data/test/lib/generators/devise_token_auth/install_generator_test.rb +217 -0
  166. data/test/lib/generators/devise_token_auth/install_generator_with_namespace_test.rb +222 -0
  167. data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +25 -0
  168. data/test/models/concerns/mongoid_support_test.rb +31 -0
  169. data/test/models/concerns/tokens_serialization_test.rb +70 -0
  170. data/test/models/confirmable_user_test.rb +35 -0
  171. data/test/models/only_email_user_test.rb +29 -0
  172. data/test/models/user_test.rb +108 -0
  173. data/test/support/controllers/routes.rb +43 -0
  174. data/test/test_helper.rb +103 -0
  175. metadata +481 -0
@@ -0,0 +1,283 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeviseTokenAuth
4
+ class RegistrationsController < DeviseTokenAuth::ApplicationController
5
+ before_action :set_user_by_token, only: [:destroy, :update]
6
+ before_action :validate_sign_up_params, only: :create
7
+ before_action :validate_account_update_params, only: :update
8
+ skip_after_action :update_auth_header, only: [:create, :destroy]
9
+
10
+ def create
11
+ build_resource
12
+
13
+ unless @resource.present?
14
+ raise DeviseTokenAuth::Errors::NoResourceDefinedError,
15
+ "#{self.class.name} #build_resource does not define @resource,"\
16
+ ' execution stopped.'
17
+ end
18
+
19
+ # give redirect value from params priority
20
+ @redirect_url = params.fetch(
21
+ :confirm_success_url,
22
+ DeviseTokenAuth.default_confirm_success_url
23
+ )
24
+
25
+ # success redirect url is required
26
+ if confirmable_enabled? && !@redirect_url
27
+ return render_create_error_missing_confirm_success_url
28
+ end
29
+
30
+ # if whitelist is set, validate redirect_url against whitelist
31
+ return render_create_error_redirect_url_not_allowed if blacklisted_redirect_url?(@redirect_url)
32
+
33
+ # override email confirmation, must be sent manually from ctrl
34
+ callback_name = defined?(ActiveRecord) && resource_class < ActiveRecord::Base ? :commit : :create
35
+ resource_class.set_callback(callback_name, :after, :send_on_create_confirmation_instructions)
36
+ resource_class.skip_callback(callback_name, :after, :send_on_create_confirmation_instructions)
37
+
38
+ if @resource.respond_to? :skip_confirmation_notification!
39
+ # Fix duplicate e-mails by disabling Devise confirmation e-mail
40
+ @resource.skip_confirmation_notification!
41
+ end
42
+
43
+ ##################################################
44
+ # Custom Logic Start
45
+ ##################################################
46
+ if member_emails.include? @resource.email
47
+ @resource.tap do |user|
48
+ AssignRole.execute(user)
49
+ end
50
+ @resource.organization = member = Member.find_by(email: @resource.email).organization
51
+ elsif learner_emails.include? @resource.email
52
+ @resource.add_role :learner
53
+ @resource.organization = learner = Learner.find_by(email: @resource.email).organization
54
+ else
55
+ @resource.owned_organization.licensee = @resource if @resource.owned_organization
56
+ subscription = Subscription.where(email: @resource.email).last
57
+ render_create_error_subscription_does_not_exist && return unless subscription
58
+ end
59
+ ##################################################
60
+ # Custom Logic End
61
+ ##################################################
62
+
63
+ if @resource.save
64
+ ##################################################
65
+ # Custom Logic Start
66
+ ##################################################
67
+ subscription&.update(user: @resource, organization: @resource.owned_organization)
68
+ ##################################################
69
+ # Custom Logic End
70
+ ##################################################
71
+
72
+ yield @resource if block_given?
73
+
74
+ unless @resource.confirmed?
75
+ # user will require email authentication
76
+ @resource.send_confirmation_instructions({
77
+ client_config: params[:config_name],
78
+ redirect_url: @redirect_url
79
+ })
80
+ end
81
+
82
+ if active_for_authentication?
83
+ # email auth has been bypassed, authenticate user
84
+ @token = @resource.create_token
85
+ @resource.save!
86
+ update_auth_header
87
+ end
88
+
89
+ render_create_success
90
+ else
91
+ clean_up_passwords @resource
92
+ render_create_error
93
+ end
94
+ end
95
+
96
+ def update
97
+ if @resource
98
+ if @resource.send(resource_update_method, account_update_params)
99
+
100
+ ##################################################
101
+ # Custom Logic Start
102
+ ##################################################
103
+ @resource.configuration.update(remove_logo: true) if !account_update_params.dig(:configuration_attributes, :logo).nil? && account_update_params.dig(:configuration_attributes, :logo).empty?
104
+ ##################################################
105
+ # Custom Logic End
106
+ ##################################################
107
+
108
+ yield @resource if block_given?
109
+ render_update_success
110
+ else
111
+ render_update_error
112
+ end
113
+ else
114
+ render_update_error_user_not_found
115
+ end
116
+ end
117
+
118
+ def destroy
119
+ if @resource
120
+
121
+ ##################################################
122
+ # Custom Logic Start
123
+ ##################################################
124
+ @resource.soft_delete
125
+ ##################################################
126
+ # Custom Logic End
127
+ ##################################################
128
+
129
+ yield @resource if block_given?
130
+ render_destroy_success
131
+ else
132
+ render_destroy_error
133
+ end
134
+ end
135
+
136
+ def sign_up_params
137
+ params.permit(*params_for_resource(:sign_up))
138
+ end
139
+
140
+ def account_update_params
141
+ params.permit(*params_for_resource(:account_update))
142
+ end
143
+
144
+ protected
145
+
146
+ ##################################################
147
+ # Custom Logic Start
148
+ ##################################################
149
+
150
+ def render_update_success
151
+ render json: {
152
+ status: 'success',
153
+ data: resource_data(resource_json: UserSerializer.new(@resource))
154
+ }
155
+ end
156
+
157
+ def render_create_error_subscription_does_not_exist
158
+ response = {
159
+ status: 'error',
160
+ data: resource_data
161
+ }
162
+ message = I18n.t('devise_token_auth.registrations.subscription_does_not_exist')
163
+ render_error(422, message, response)
164
+ end
165
+
166
+ ##################################################
167
+ # Custom Logic End
168
+ ##################################################
169
+
170
+ def build_resource
171
+ @resource = resource_class.new(sign_up_params)
172
+ @resource.provider = provider
173
+
174
+ # honor devise configuration for case_insensitive_keys
175
+ if resource_class.case_insensitive_keys.include?(:email)
176
+ @resource.email = sign_up_params[:email].try(:downcase)
177
+ else
178
+ @resource.email = sign_up_params[:email]
179
+ end
180
+ end
181
+
182
+ def render_create_error_missing_confirm_success_url
183
+ response = {
184
+ status: 'error',
185
+ data: resource_data
186
+ }
187
+ message = I18n.t('devise_token_auth.registrations.missing_confirm_success_url')
188
+ render_error(422, message, response)
189
+ end
190
+
191
+ def render_create_error_redirect_url_not_allowed
192
+ response = {
193
+ status: 'error',
194
+ data: resource_data
195
+ }
196
+ message = I18n.t('devise_token_auth.registrations.redirect_url_not_allowed', redirect_url: @redirect_url)
197
+ render_error(422, message, response)
198
+ end
199
+
200
+ def render_create_success
201
+ render json: {
202
+ status: 'success',
203
+ data: resource_data
204
+ }
205
+ end
206
+
207
+ def render_create_error
208
+ render json: {
209
+ status: 'error',
210
+ data: resource_data,
211
+ errors: resource_errors
212
+ }, status: 422
213
+ end
214
+
215
+ def render_update_error
216
+ render json: {
217
+ status: 'error',
218
+ errors: resource_errors
219
+ }, status: 422
220
+ end
221
+
222
+ def render_update_error_user_not_found
223
+ render_error(404, I18n.t('devise_token_auth.registrations.user_not_found'), status: 'error')
224
+ end
225
+
226
+ def render_destroy_success
227
+ render json: {
228
+ status: 'success',
229
+ message: I18n.t('devise_token_auth.registrations.account_with_uid_destroyed', uid: @resource.uid)
230
+ }
231
+ end
232
+
233
+ def render_destroy_error
234
+ render_error(404, I18n.t('devise_token_auth.registrations.account_to_destroy_not_found'), status: 'error')
235
+ end
236
+
237
+ private
238
+
239
+ ##################################################
240
+ # Custom Logic Start
241
+ ##################################################
242
+
243
+ def learner_emails
244
+ Learner.all.collect(&:email)
245
+ end
246
+
247
+ def member_emails
248
+ Member.all.collect(&:email)
249
+ end
250
+
251
+ ##################################################
252
+ # Custom Logic End
253
+ ##################################################
254
+
255
+ def resource_update_method
256
+ if DeviseTokenAuth.check_current_password_before_update == :attributes
257
+ 'update_with_password'
258
+ elsif DeviseTokenAuth.check_current_password_before_update == :password && account_update_params.key?(:password)
259
+ 'update_with_password'
260
+ elsif account_update_params.key?(:current_password)
261
+ 'update_with_password'
262
+ else
263
+ 'update'
264
+ end
265
+ end
266
+
267
+ def validate_sign_up_params
268
+ validate_post_data sign_up_params, I18n.t('errors.messages.validate_sign_up_params')
269
+ end
270
+
271
+ def validate_account_update_params
272
+ validate_post_data account_update_params, I18n.t('errors.messages.validate_account_update_params')
273
+ end
274
+
275
+ def validate_post_data which, message
276
+ render_error(:unprocessable_entity, message, status: 'error') if which.empty?
277
+ end
278
+
279
+ def active_for_authentication?
280
+ !@resource.respond_to?(:active_for_authentication?) || @resource.active_for_authentication?
281
+ end
282
+ end
283
+ end
@@ -0,0 +1,245 @@
1
+ # frozen_string_literal: true
2
+
3
+ # see http://www.emilsoman.com/blog/2013/05/18/building-a-tested/
4
+ module DeviseTokenAuth
5
+ class SessionsController < DeviseTokenAuth::ApplicationController
6
+ before_action :set_user_by_token, only: [:destroy]
7
+ after_action :reset_session, only: [:destroy]
8
+
9
+ ##################################################
10
+ # Custom Logic Start
11
+ ##################################################
12
+
13
+ before_action :set_organization, only: [:saml]
14
+
15
+ def saml
16
+ field = (resource_params.keys.map(&:to_sym) & resource_class.authentication_keys).first
17
+ @resource = nil
18
+ if field
19
+ q_value = get_case_insensitive_field_from_resource_params(field)
20
+ @resource = find_resource(field, q_value)
21
+ end
22
+
23
+ if @resource.organization
24
+ request = OneLogin::RubySaml::Authrequest.new
25
+ redirect_to(request.create(saml_settings))
26
+ end
27
+ end
28
+
29
+ def users_saml_auth
30
+ response = OneLogin::RubySaml::Response.new(params[:SAMLResponse])
31
+ @organization = User.find_by(email: response.nameid)&.organization
32
+ response.settings = saml_settings if @organization
33
+
34
+ if response.is_valid?
35
+ @resource = User.find_by(email: response.nameid)
36
+ @client_id, @token, @expiry = @resource.create_token
37
+
38
+ if confirmable_enabled?
39
+ @resource.skip_confirmation!
40
+ end
41
+
42
+ sign_in(:user, @resource, store: false, bypass: false)
43
+ @resource.save!
44
+
45
+ redirect_header_options = { success: true }
46
+ redirect_headers = build_redirect_headers(@token,
47
+ @client_id,
48
+ redirect_header_options)
49
+ redirect_to(@resource.build_auth_url('http://sidecarlearning.com/sso',
50
+ redirect_headers))
51
+ else
52
+ render json: {
53
+ success: false,
54
+ errors: response.errors
55
+ }
56
+ end
57
+ end
58
+
59
+ ##################################################
60
+ # Custom Logic End
61
+ ##################################################
62
+
63
+ def new
64
+ render_new_error
65
+ end
66
+
67
+ def create
68
+ # Check
69
+ field = (resource_params.keys.map(&:to_sym) & resource_class.authentication_keys).first
70
+
71
+ @resource = nil
72
+ if field
73
+ q_value = get_case_insensitive_field_from_resource_params(field)
74
+
75
+ @resource = find_resource(field, q_value)
76
+ end
77
+
78
+ if @resource && valid_params?(field, q_value) && (!@resource.respond_to?(:active_for_authentication?) || @resource.active_for_authentication?) && @resource.has_active_subscription?
79
+ valid_password = @resource.valid_password?(resource_params[:password])
80
+ if (@resource.respond_to?(:valid_for_authentication?) && !@resource.valid_for_authentication? { valid_password }) || !valid_password
81
+ return render_create_error_bad_credentials
82
+ end
83
+ @token = @resource.create_token
84
+ @resource.save
85
+
86
+ sign_in(:user, @resource, store: false, bypass: false)
87
+
88
+ yield @resource if block_given?
89
+
90
+ render_create_success
91
+
92
+ ##################################################
93
+ # Custom Logic Start
94
+ ##################################################
95
+
96
+ elsif @resource && !(!@resource.respond_to?(:active_for_authentication?) || @resource.active_for_authentication? && @resource.has_active_subscription?)
97
+ if @resource.respond_to?(:locked_at) && @resource.locked_at
98
+ render_create_error_account_locked
99
+ elsif @resource.deleted_at?
100
+ render_create_error_inactive_account
101
+ elsif !@resource.has_active_subscription?
102
+ render_create_error_invalid_subscription
103
+ else
104
+ render_create_error_not_confirmed
105
+ end
106
+
107
+ ##################################################
108
+ # Custom Logic End
109
+ ##################################################
110
+
111
+ else
112
+ render_create_error_bad_credentials
113
+ end
114
+ end
115
+
116
+ def destroy
117
+ # remove auth instance variables so that after_action does not run
118
+ user = remove_instance_variable(:@resource) if @resource
119
+ client = @token.client if @token.client
120
+ @token.clear!
121
+
122
+ if user && client && user.tokens[client]
123
+ user.tokens.delete(client)
124
+ user.save!
125
+
126
+ yield user if block_given?
127
+
128
+ render_destroy_success
129
+ else
130
+ render_destroy_error
131
+ end
132
+ end
133
+
134
+ protected
135
+
136
+ ##################################################
137
+ # Custom Logic Start
138
+ ##################################################
139
+
140
+ def render_create_error_inactive_account
141
+ render_error(401, I18n.t('devise_token_auth.sessions.inactive_account', email: @resource.email))
142
+ end
143
+
144
+ def render_create_error_invalid_subscription
145
+ render_error(401, I18n.t('devise_token_auth.sessions.invalid_subscription', email: @resource.email))
146
+ end
147
+
148
+ def saml_settings
149
+ settings = OneLogin::RubySaml::Settings.new
150
+
151
+ settings.assertion_consumer_service_url = "http://localhost:9999/users/saml/auth" # http://localhost:9999/users/saml/auth
152
+ settings.idp_entity_id = @organization.entity_id
153
+ settings.idp_sso_target_url = @organization.target_url
154
+ settings.idp_cert_fingerprint = @organization.fingerprint
155
+ settings.idp_cert_fingerprint_algorithm = "http://www.w3.org/2000/09/xmldsig##{@organization.fingerprint_algorithm}" # 256
156
+ settings.name_identifier_format = "urn:oasis:names:tc:SAML:2.0:nameid-format:transient"
157
+ settings.authn_context = "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"
158
+ settings.authn_context = %w[urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport urn:oasis:names:tc:SAML:2.0:ac:classes:Password]
159
+ settings.single_logout_service_binding = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
160
+ settings.assertion_consumer_service_binding = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
161
+
162
+ settings
163
+ end
164
+
165
+
166
+ ##################################################
167
+ # Custom Logic End
168
+ ##################################################
169
+
170
+ def valid_params?(key, val)
171
+ resource_params[:password] && key && val
172
+ end
173
+
174
+ def get_auth_params
175
+ auth_key = nil
176
+ auth_val = nil
177
+
178
+ # iterate thru allowed auth keys, use first found
179
+ resource_class.authentication_keys.each do |k|
180
+ if resource_params[k]
181
+ auth_val = resource_params[k]
182
+ auth_key = k
183
+ break
184
+ end
185
+ end
186
+
187
+ # honor devise configuration for case_insensitive_keys
188
+ if resource_class.case_insensitive_keys.include?(auth_key)
189
+ auth_val.downcase!
190
+ end
191
+
192
+ { key: auth_key, val: auth_val }
193
+ end
194
+
195
+ def render_new_error
196
+ render_error(405, I18n.t('devise_token_auth.sessions.not_supported'))
197
+ end
198
+
199
+ def render_create_success
200
+ render json: {
201
+ data: resource_data(resource_json: @resource.token_validation_response)
202
+ }
203
+ end
204
+
205
+ def render_create_error_not_confirmed
206
+ render_error(401, I18n.t('devise_token_auth.sessions.not_confirmed', email: @resource.email))
207
+ end
208
+
209
+ def render_create_error_account_locked
210
+ render_error(401, I18n.t('devise.mailer.unlock_instructions.account_lock_msg'))
211
+ end
212
+
213
+ def render_create_error_bad_credentials
214
+ render_error(401, I18n.t('devise_token_auth.sessions.bad_credentials'))
215
+ end
216
+
217
+ def render_destroy_success
218
+ render json: {
219
+ success:true
220
+ }, status: 200
221
+ end
222
+
223
+ def render_destroy_error
224
+ render_error(404, I18n.t('devise_token_auth.sessions.user_not_found'))
225
+ end
226
+
227
+ private
228
+
229
+ ##################################################
230
+ # Custom Logic Start
231
+ ##################################################
232
+
233
+ def set_organization
234
+ @organization = Organization.find_by(slug: params[:organization])
235
+ end
236
+
237
+ ##################################################
238
+ # Custom Logic End
239
+ ##################################################
240
+
241
+ def resource_params
242
+ params.permit(*params_for_resource(:sign_in))
243
+ end
244
+ end
245
+ end