
    %                        d Z ddlmZ ddlmZ ddlmZ ddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZ ddlZddlmZ ddlZ G d d	 ej&                  ej(                  e            Z G d
 de      Z G d de      Z G d de      ZdZ G d de      ZdZ G d de      Z G d d ej&                  ej(                  e            Zg dZd Z d Z! G d de      Z" e"       Z#y)zBThis package exposes credentials for talking to a Docker registry.    )absolute_import)division)print_functionN)docker_name)clientc                   4    e Zd ZdZej
                  d        Zy)ProviderzHInterface for providing User Credentials for use with a Docker Registry.c                      y)z>Produces a value suitable for use in the Authorization header.N selfs    9lib/third_party/containerregistry/client/docker_creds_.pyGetzProvider.Get(           N)__name__
__module____qualname____doc__abcabstractmethodr   r   r   r   r	   r	   $   s!    P I Ir   r	   c                       e Zd ZdZd Zy)	Anonymousz$Implementation for anonymous access.c                      y)z#Implement anonymous authentication. r   r   s    r   r   zAnonymous.Get1   s    r   N)r   r   r   r   r   r   r   r   r   r   .   s
    ,r   r   c                   J    e Zd ZdZd Zeej                  d               Zd Z	y)SchemeProviderz=Implementation for providing a challenge response credential.c                     || _         y N)_scheme)r   schemes     r   __init__zSchemeProvider.__init__9   s	    DLr   c                      y)z=Returns the authentication payload to follow the auth scheme.Nr   r   s    r   suffixzSchemeProvider.suffix=   r   r   c                 8    | j                   d| j                  S )zCGets the credential in a form suitable for an Authorization header. )r    r$   r   s    r   r   zSchemeProvider.GetC   s    ||T[[11r   N)
r   r   r   r   r"   propertyr   r   r$   r   r   r   r   r   r   6   s3    E H  H2r   r   c                   R     e Zd ZdZ fdZed        Zed        Zed        Z xZ	S )Basicz=Implementation for providing a username/password-based creds.c                 H    t         t        |   d       || _        || _        y )Nr)   )superr)   r"   	_username	_password)r   usernamepassword	__class__s      r   r"   zBasic.__init__K   s     	%(DNDNr   c                     | j                   S r   )r,   r   s    r   r.   zBasic.usernameP       >>r   c                     | j                   S r   )r-   r   s    r   r/   zBasic.passwordT   r2   r   c                     | j                   j                  d      }| j                  j                  d      }t        j                  |dz   |z         j                  d      S )Nutf8   :)r.   encoder/   base64	b64encodedecode)r   ups      r   r$   zBasic.suffixX   sN    V$AV$AAHqL)0088r   )
r   r   r   r   r"   r'   r.   r/   r$   __classcell__r0   s   @r   r)   r)   H   sG    E
     9 9r   r)   _tokenc                   2     e Zd ZdZ fdZed        Z xZS )OAuth2zGBase class for turning OAuth2Credentials into suitable GCR credentials.c                 R    t         t        |   t        d       || _        || _        y)zConstructor.

    Args:
      creds: the credentials from which to retrieve access tokens.
      transport: the http transport to use for token exchanges.
    does not matterN)r+   rA   r"   	_USERNAME_creds
_transport)r   creds	transportr0   s      r   r"   zOAuth2.__init__e   s%     
&$ ,=>DKDOr   c                     | j                   j                  | j                        }| j                   j                  | j                        j                  S )N)http)rE   get_access_tokenrF   access_token)r   	unused_ats     r   r/   zOAuth2.passwordq   sC     ,,$//,BI ;;''T__'=JJJr   )r   r   r   r   r"   r'   r/   r=   r>   s   @r   rA   rA   b   s!    O
  K Kr   rA   z(credentials not found in native keychainc                   (     e Zd ZdZ fdZd Z xZS )Helperz;This provider wraps a particularly named credential helper.c                 ^    t         t        |   dd       || _        |j                  | _        y)zConstructor.

    Args:
      name: the name of the helper, as it appears in the Docker config.
      registry: the registry for which we're invoking the helper.
    rC   N)r+   rO   r"   _nameregistry	_registry)r   namerR   r0   s      r   r"   zHelper.__init__   s,     
&$ !24EFDJ&&DNr   c                 p   dj                  | j                        }t        j                  d|       	 t	        j
                  |dgt        j                  t        j                  t        j                        }|j                  d| j                  z   j                  d      	      d
   }|j                         t         k(  r-t        j                  d       t#               j%                         S |j&                  d
k7  r%t        d| j                  |j&                  |fz        t)        j*                  |j-                  d            }t        j                  d       t/        |d   |d         j%                         S # t        $ r1}|j                  t        j                  k(  rt        d|z          d }~ww xY w)Nzdocker-credential-{name})rT   z)Invoking %r to obtain Docker credentials.get)stdoutstdinstderrzexecutable not found: zhttps://zutf-8)inputr   z6Credentials not found, falling back to anonymous auth.z4Error fetching credential for %s, exit status: %d
%sz)Successfully obtained Docker credentials.UsernameSecret)formatrQ   logginginfo
subprocessPopenPIPESTDOUTOSErrorerrnoENOENT	ExceptioncommunicaterS   r7   strip_MAGIC_NOT_FOUND_MESSAGEr   r   
returncodejsonloadsr:   r)   )r   bin_namer<   erW   blobs         r   r   z
Helper.Get   sl   
 *00djj0AHLL<hG	


U
""	$a ]]DNN*227;  ==>@F||~11llKL[__||qMzz1<<89 : : ::fmmG,-DLL<=j!4>26688)  	
ELL	 08;<<s   AE; ;	F5,F00F5)r   r   r   r   r"   r   r=   r>   s   @r   rO   rO      s    C	'!9r   rO   c                   4    e Zd ZdZej
                  d        Zy)Keychainz;Interface for resolving an image reference to a credential.c                      y)zResolves the appropriate credential for the given registry.

    Args:
      name: the registry for which we need a credential.

    Returns:
      a Provider suitable for use with registry operations.
    Nr   )r   rT   s     r   ResolvezKeychain.Resolve   r   r   N)r   r   r   r   r   r   rt   r   r   r   rr   rr      s    C  r   rr   )z%sz
https://%sz	http://%szhttps://%s/v1/zhttp://%s/v1/zhttps://%s/v2/zhttp://%s/v2/c                      t         j                  dk(  rt         j                  j                  d      S t         j                  j	                  d      S )Nntz%USERPROFILE%~)osrT   path
expandvars
expanduserr   r   r   _GetUserHomeDirr|      s9    WW_ 77o..77c""r   c                      t         j                  j                  d      t         j                  j                  d      S t         j                  j	                  t               d      S )NDOCKER_CONFIGz.docker)rx   environrV   ry   joinr|   r   r   r   _GetConfigDirectoryr      sB     ZZ^^O$0::>>/**77<<)955r   c                   "    e Zd ZdZd Zd Zd Zy)_DefaultKeychainz9This implements the default docker credential resolution.c                      d | _         d| _        y )Nzconfig.json)_config_dir_config_filer   s    r   r"   z_DefaultKeychain.__init__   s    D &Dr   c                     t         j                  j                  |      st        dj	                  |            || _        y )NzNAttempting to override docker configuration directory to invalid directory: {})rx   ry   isdirrg   r]   r   )r   
config_dirs     r   setCustomConfigDirz#_DefaultKeychain.setCustomConfigDir   s:     77==$ 228&2DF F!Dr   c                 h   t        j                  dt        |             d }| j                  5t        j
                  j                  | j                  | j                        }n2t        j
                  j                  t               | j                        }	 t        j                  |dd      5 }t        j                  |j                               }d d d        j!                  di       }t"        D ]1  }||j$                  z  |v st'        |||j$                  z     |      c S  d|v rt'        |d   |      S |j!                  di       }t"        D ]  }||j$                  z  |v s|||j$                  z     }d|v rJt)        j*                  |d         j-                  d      }	|	j/                  d	d
      \  }
}t1        |
|      c S d|v rd|v rt1        |d   |d         c S t3        dt        j4                  |      z          t               S # 1 sw Y   >xY w# t        $ r t               cY S w xY w)Nz,Loading Docker credentials for repository %rrr5   )encodingcredHelpers
credsStoreauthsauth:   r.   r/   z6Unsupported entry in "auth" section of Docker config: )r^   r_   strr   rx   ry   r   r   r   ioopenrl   rm   readIOErrorr   rV   _FORMATSrR   rO   r8   	b64decoder:   splitr)   rg   dumps)r   rT   config_filereadercfg
cred_storeformr   entrydecodedr.   r/   s               r   rt   z_DefaultKeychain.Resolve   s    LL?TKK#GGLL!1!143D3DEkGGLL!4!68I8IJk77;v6&jj' 7 +J			+j!56== 
 sC%t,, GGGR E			&dT]]*+U?$$U6]3::6B'&}}S!4
(Hx*
*5 Z5%8uZ(%
*;<
< Fjj ! !   ;E 76 [s*   H .$HH HH H10H1N)r   r   r   r   r"   r   rt   r   r   r   r   r      s    A&",r   r   )$r   
__future__r   r   r   r   r8   re   r   rl   r^   rx   r`   containerregistry.clientr   httplib2oauth2clientr   sixwith_metaclassABCMetaobjectr	   r   r   r)   rD   rA   rj   rO   rr   r   r|   r   r   DefaultKeychainr   r   r   <module>r      s    I &  % 
   	   	  0  / 
I!s!!#++v6 I 2X 2$9N 9. 	KU K> F /9U /9d!s!!#++v6 "#6>x >D #$r   