@@ -7,6 +7,73 @@ module OmniauthRegistrationsControllerOverride
77 included do
88 include Decidim ::AfterSignInActionHelper
99
10+ def create
11+ form_params = user_params_from_oauth_hash || params [ :user ]
12+
13+ @form = form ( Decidim ::OmniauthRegistrationForm ) . from_params ( form_params )
14+ @form . email ||= verified_email
15+
16+ Decidim ::CreateOmniauthRegistration . call ( @form , verified_email ) do
17+ on ( :ok ) do |user |
18+ if user . active_for_authentication?
19+ sign_in_and_redirect user , event : :authentication
20+ provider_name = current_organization . enabled_omniauth_providers . dig ( @form . provider . to_sym , :display_name ) || @form . provider . titleize
21+ set_flash_message :notice , :success , kind : provider_name
22+ else
23+ expire_data_after_sign_in!
24+ user . resend_confirmation_instructions unless user . confirmed?
25+ redirect_to decidim . root_path
26+ flash [ :notice ] = t ( "devise.registrations.signed_up_but_unconfirmed" )
27+ end
28+ end
29+
30+ on ( :invalid ) do
31+ set_flash_message :notice , :success , kind : @form . provider . capitalize
32+ session [ "devise.omniauth.verified_email" ] = verified_email
33+ render :new
34+ end
35+
36+ on ( :error ) do |user |
37+ if user . errors [ :email ]
38+ set_flash_message :alert , :failure , kind : @form . provider . capitalize ,
39+ reason : t ( "decidim.devise.omniauth_registrations.create.email_already_exists" )
40+ end
41+ session [ "devise.omniauth.verified_email" ] = verified_email
42+ render :new
43+ end
44+ end
45+ end
46+
47+ def sign_in_and_redirect ( resource_or_scope , *args )
48+ strategy = request . env [ "omniauth.strategy" ]
49+ provider = strategy . present? ? strategy . name : request . params [ "provider" ]
50+ session [ "omniauth.provider" ] = provider
51+ super
52+ end
53+
54+ # Skip authorization handler by default
55+ def skip_first_login_authorization?
56+ ActiveRecord ::Type ::Boolean . new . cast ( ENV . fetch ( "SKIP_FIRST_LOGIN_AUTHORIZATION" , "false" ) )
57+ end
58+
59+ # def failure
60+ # https://github.com/heartcombo/devise/blob/main/app/controllers/devise/omniauth_callbacks_controller.rb#L10
61+ # end
62+
63+ protected
64+
65+ def after_omniauth_failure_path_for ( scope )
66+ request . params [ stored_location_key_for ( scope ) ] || session [ stored_location_key_for ( scope ) ] || request . referer || super
67+ end
68+
69+ private
70+
71+ def verified_email
72+ @verified_email ||= oauth_data . dig ( :info , :email ) || session . delete ( "devise.omniauth.verified_email" )
73+ end
74+
75+ # rubocop: disable Metrics/CyclomaticComplexity
76+ # rubocop: disable Metrics/PerceivedComplexity
1077 def after_sign_in_path_for ( user )
1178 after_sign_in_action_for ( user , request . params [ :after_action ] ) if request . params [ :after_action ] . present?
1279
@@ -15,14 +82,14 @@ def after_sign_in_path_for(user)
1582 elsif user . present? && !user . tos_accepted? && request . params [ :after_action ] . present?
1683 session [ "tos_after_action" ] = request . params [ :after_action ]
1784 super
18- elsif !pending_redirect? ( user ) && first_login_and_not_authorized? ( user )
19- decidim_verifications . authorizations_path
85+ elsif !skip_first_login_authorization? && ( first_login_and_not_authorized? ( user ) && ! user . admin? && ! pending_redirect? ( user ) )
86+ decidim_verifications . first_login_authorizations_path
2087 else
2188 super
2289 end
2390 end
24-
25- private
91+ # rubocop: enable Metrics/CyclomaticComplexity
92+ # rubocop: enable Metrics/PerceivedComplexity
2693
2794 def verified_email
2895 @verified_email ||= find_verified_email
0 commit comments