@ -3541,6 +3541,89 @@ class _GitCookiesChecker(object):
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      print ( ' \t ' . join ( ( ( ' %% + %d s '  %  l )  %  s ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                       for  l ,  s  in  zip ( lengths ,  row ) ) ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  @staticmethod 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  def  _parse_identity ( identity ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ Parses identity  " git-<ldap>.example.com "  into <ldap> and domain. """ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    username ,  domain  =  identity . split ( ' . ' ,  1 ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  username . startswith ( ' git- ' ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      username  =  username [ len ( ' git- ' ) : ] 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  username ,  domain 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  def  _get_usernames_of_domain ( self ,  domain ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ Returns list of usernames referenced by .gitcookies in a given domain. """ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    identities_by_domain  =  { } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    for  _ ,  identity ,  _  in  self . get_hosts_with_creds ( ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      username ,  domain  =  self . _parse_identity ( identity ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      identities_by_domain . setdefault ( domain ,  [ ] ) . append ( username ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  identities_by_domain . get ( domain ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  def  _canonical_git_googlesource_host ( self ,  host ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ Normalizes Gerrit hosts (with  ' -review ' ) to Git host. """ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    assert  host . endswith ( self . _GOOGLESOURCE ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    # Prefix doesn't include '.' at the end. 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    prefix  =  host [ : - ( 1  +  len ( self . _GOOGLESOURCE ) ) ] 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  prefix . endswith ( ' -review ' ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      prefix  =  prefix [ : - len ( ' -review ' ) ] 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  prefix  +  ' . '  +  self . _GOOGLESOURCE 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  def  has_generic_host ( self ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ Returns whether generic .googlesource.com has been configured. 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    Chrome  Infra  recommends  to  use  explicit  $ { host } . googlesource . com  instead . 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    for  host ,  _ ,  _  in  self . get_hosts_with_creds ( include_netrc = False ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      if  host  ==  ' . '  +  self . _GOOGLESOURCE : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        return  True 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  False 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  def  _get_git_gerrit_identity_pairs ( self ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ Returns map from canonic host to pair of identities (Git, Gerrit). 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    One  of  identities  might  be  None ,  meaning  not  configured . 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    host_to_identity_pairs  =  { } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    for  host ,  identity ,  _  in  self . get_hosts_with_creds ( ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      canonical  =  self . _canonical_git_googlesource_host ( host ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      pair  =  host_to_identity_pairs . setdefault ( canonical ,  [ None ,  None ] ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      idx  =  0  if  canonical  ==  host  else  1 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      pair [ idx ]  =  identity 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  host_to_identity_pairs 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  def  get_partially_configured_hosts ( self ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  set ( 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        host  for  host ,  identities_pair  in 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        self . _get_git_gerrit_identity_pairs ( ) . iteritems ( ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        if  None  in  identities_pair  and  host  !=  ' . '  +  self . _GOOGLESOURCE ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  def  get_conflicting_hosts ( self ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  set ( 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        host  for  host ,  ( i1 ,  i2 )  in 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        self . _get_git_gerrit_identity_pairs ( ) . iteritems ( ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        if  None  not  in  ( i1 ,  i2 )  and  i1  !=  i2 ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  def  get_duplicated_hosts ( self ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    counters  =  collections . Counter ( h  for  h ,  _ ,  _  in  self . get_hosts_with_creds ( ) ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  set ( host  for  host ,  count  in  counters . iteritems ( )  if  count  >  1 ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  _EXPECTED_HOST_IDENTITY_DOMAINS  =  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    ' chromium.googlesource.com ' :  ' chromium.org ' , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    ' chrome-internal.googlesource.com ' :  ' google.com ' , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  def  get_hosts_with_wrong_identities ( self ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ Finds hosts which **likely** reference wrong identities. 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    Note :  skips  hosts  which  have  conflicting  identities  for  Git  and  Gerrit . 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    hosts  =  set ( ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    for  host ,  expected  in  self . _EXPECTED_HOST_IDENTITY_DOMAINS . iteritems ( ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      pair  =  self . _get_git_gerrit_identity_pairs ( ) . get ( host ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				      if  pair  and  pair [ 0 ]  ==  pair [ 1 ] : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        _ ,  domain  =  self . _parse_identity ( pair [ 0 ] ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        if  domain  !=  expected : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				          hosts . add ( host ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  hosts 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				def  CMDcreds_check ( parser ,  args ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  """ Checks credentials and suggests changes. """ 
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -3555,7 +3638,7 @@ def CMDcreds_check(parser, args):
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  print ( ' Your .netrc and .gitcookies have credentails for these hosts: ' ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  checker . print_current_creds ( include_netrc = True ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  # TODO(tandrii):  finish thi s.
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  # TODO(tandrii):  add report && autofixe s.
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				  return  0