@@ -177,18 +177,32 @@ def request_individual_signature(self, project_id, user_id, return_url=None, ret
177177 format (project ))
178178
179179 cla .log .debug ('Individual Signature - creating default individual values for user: {}' .format (user ))
180- default_cla_values = create_default_individual_values (user )
180+ provider_type = (return_url_type or '' ).lower ()
181+ if provider_type not in ('github' , 'gitlab' ):
182+ provider_label = provider_type or 'missing'
183+ cla .log .warning ('Individual Signature - unsupported provider_type "{}" for {}' .format (
184+ provider_label , request_info ))
185+ return {'errors' : {'return_url_type' : 'unsupported provider_type: {}' .format (provider_label )}}
186+ default_cla_values = create_default_individual_values (user , preferred_email = preferred_email ,
187+ provider_type = provider_type )
181188 cla .log .debug ('Individual Signature - created default individual values: {}' .format (default_cla_values ))
182189
190+ resolved_email = default_cla_values .get ('email' )
191+ if provider_type in ('github' , 'gitlab' ):
192+ resolved_email = resolved_email .strip () if isinstance (resolved_email , str ) else None
193+ if not resolved_email :
194+ return {'errors' : {'user_id' : f'no { provider_type } user_emails found' }}
195+ default_cla_values ['email' ] = resolved_email
196+
183197 # Generate signature callback url
184198 cla .log .debug ('Individual Signature - get active signature metadata' )
185199 signature_metadata = cla .utils .get_active_signature_metadata (user_id )
186200 cla .log .debug ('Individual Signature - get active signature metadata: {}' .format (signature_metadata ))
187201
188202 cla .log .debug ('Individual Signature - get individual signature callback url' )
189- if return_url_type . lower () == "github" :
203+ if provider_type == "github" :
190204 callback_url = cla .utils .get_individual_signature_callback_url (user_id , signature_metadata )
191- elif return_url_type . lower () == "gitlab" :
205+ elif provider_type == "gitlab" :
192206 callback_url = cla .utils .get_individual_signature_callback_url_gitlab (user_id , signature_metadata )
193207
194208 cla .log .debug ('Individual Signature - get individual signature callback url: {}' .format (callback_url ))
@@ -261,12 +275,12 @@ def request_individual_signature(self, project_id, user_id, return_url=None, ret
261275 signature_return_url = return_url ,
262276 signature_callback_url = callback_url )
263277 # Set signature ACL
264- if return_url_type . lower () == "github" :
278+ if provider_type == "github" :
265279 acl = user .get_user_github_id ()
266- elif return_url_type . lower () == "gitlab" :
280+ elif provider_type == "gitlab" :
267281 acl = user .get_user_gitlab_id ()
268- cla .log .debug ('Individual Signature - setting ACL using user {} id: {}' .format (return_url_type , acl ))
269- signature .set_signature_acl ('{}:{}' .format (return_url_type . lower () ,acl ))
282+ cla .log .debug ('Individual Signature - setting ACL using provider {} id: {}' .format (provider_type , acl ))
283+ signature .set_signature_acl ('{}:{}' .format (provider_type ,acl ))
270284
271285 # Populate sign url
272286 self .populate_sign_url (signature , callback_url , default_values = default_cla_values ,
@@ -1346,14 +1360,16 @@ def populate_sign_url(self, signature, callback_url=None,
13461360 cla .log .debug (f'{ fn } - { sig_type } - '
13471361 f'loading user by reference id: { signature .get_signature_reference_id ()} ' )
13481362 user .load (signature .get_signature_reference_id ())
1363+ provider_type = (signature .get_signature_return_url_type () or '' ).lower ()
1364+ resolved_user_email = resolve_individual_user_email (user , provider_type , preferred_email )
13491365 cla .log .debug (f'{ fn } - { sig_type } - loaded user by '
13501366 f'id: { user .get_user_id ()} , '
13511367 f'name: { user .get_user_name ()} , '
1352- f'email: { user . get_user_email () } ' )
1368+ f'email: { resolved_user_email } ' )
13531369 if not user .get_user_name () is None :
13541370 user_signature_name = user .get_user_name ()
1355- if not user . get_user_email () is None :
1356- user_signature_email = user . get_user_email ()
1371+ if resolved_user_email is not None :
1372+ user_signature_email = resolved_user_email
13571373 except DoesNotExist :
13581374 cla .log .warning (f'{ fn } - { sig_type } - no user associated with this signature '
13591375 f'id: { signature .get_signature_reference_id ()} - can not sign ICLA' )
@@ -2406,7 +2422,32 @@ def create_default_company_values(company: Company,
24062422 return values
24072423
24082424
2409- def create_default_individual_values (user : User , preferred_email : str = None ) -> Dict [str , Any ]:
2425+ def resolve_individual_user_email (user : User , provider_type : str = None ,
2426+ preferred_email : str = None ) -> Optional [str ]:
2427+ if user is None :
2428+ return None
2429+
2430+ provider_type = (provider_type or '' ).lower ()
2431+ user_emails = user .get_user_emails () or set ()
2432+
2433+ if preferred_email and preferred_email in user_emails :
2434+ return preferred_email
2435+
2436+ if provider_type not in ('github' , 'gitlab' ):
2437+ lf_email = user .get_lf_email ()
2438+ if preferred_email and lf_email is not None and preferred_email == lf_email :
2439+ return preferred_email
2440+ if lf_email is not None :
2441+ return lf_email
2442+
2443+ if len (user_emails ) > 0 :
2444+ return next (iter (user_emails ), None )
2445+
2446+ return None
2447+
2448+
2449+ def create_default_individual_values (user : User , preferred_email : str = None ,
2450+ provider_type : str = None ) -> Dict [str , Any ]:
24102451 values = {}
24112452
24122453 if user is None :
@@ -2416,8 +2457,9 @@ def create_default_individual_values(user: User, preferred_email: str = None) ->
24162457 values ['full_name' ] = user .get_user_name ()
24172458 values ['public_name' ] = user .get_user_name ()
24182459
2419- if user .get_user_email (preferred_email = preferred_email ) is not None :
2420- values ['email' ] = user .get_user_email ()
2460+ resolved_email = resolve_individual_user_email (user , provider_type , preferred_email )
2461+ if resolved_email is not None :
2462+ values ['email' ] = resolved_email
24212463
24222464 return values
24232465
0 commit comments