U
    W+dW                     @   s  d Z ddlZddlmZ ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ dd	lmZ dd
lmZ dd
lmZ ddlmZ dZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&d Z'd!Z(d"Z)d#Z*e+ Z,G d$d% d%e-Z.G d&d' d'e+Z/d(d) Z0dS )*zC
This class encapsulates the provider-specific header differences.
    N)six)datetime)config)
expanduser)Config)InvalidInstanceMetadataError)ACL)CannedACLStrings)Policyheader_prefixmetadata_prefixzx-amz-zx-goog-z
acl-headerzauth-headerzcopy-source-headerzcopy-source-version-id-headerzcopy-source-range-headerzdelete-marker-headerzdate-headerzmetadata-directive-headerzresumable-upload-headerzsecurity-token-headerstorage-classz
mfa-headerzserver-side-encryption-headerzversion-id-headerzrestore-headerZStorageCopyErrorZStorageCreateErrorZStorageDataErrorZStoragePermissionsErrorZStorageResponseErrorc                   @   s   e Zd ZdS )ProfileNotFoundErrorN)__name__
__module____qualname__ r   r   1/tmp/pip-unpacked-wheel-dlxw5sjy/boto/provider.pyr   J   s   r   c                #   @   s:  e Zd ZdddZeedZeedZ	dddZ
dddZdddZeeeed eed	 ed
eed eed eed eed eed eed edeed eed eed eed eed eed ieeeed eed	 edeed eed edeed eed eed eed eed edeed eed ededidZ e!e"j#j$e%e"j#j&e'e"j#j(e)e"j#j*e+e"j#j,ie!e"j#j-e%e"j#j.e'e"j#j/e)e"j#j0e+e"j#j1idZ2d:ddZ3dd Z4dd Z5e6e4e5Z7d d! Z8d"d# Z9e6e8e9Z:d$d% Z;d&d' Z<e6e;e<Z=d(d) Z>d;d*d+Z?d,d- Z@d.d/ ZAd0d1 ZBd2d3 ZCd4d5 ZDd6d7 ZEd8d9 ZFdS )<Provider)Zaws_access_key_idZaws_secret_access_keyZaws_security_tokenZaws_profile)Zgs_access_key_idZgs_secret_access_keyNN)awsZgoogleZs3ZgsFTzmeta-ZaclZAWSzcopy-sourcezcopy-source-version-idzcopy-source-rangedatezdelete-markerzmetadata-directiveNzsecurity-tokenzserver-side-encryptionz
version-idr   ZmfarestoreZGOOG1Z	resumablec           
      C   s4  d | _ d | _d | _|| _|| _|| _|| _|| _| j| j | _	| j
| j | _d | _tjtdd| d}tdd| _tj|r| j| | |||| |   |   d| j| j  }td|rtd|| _ d| j| j  }td|rtd|| _d	| j| j  }	td|	r0td|	| _d S )
N~.credentialsF)Zdo_loadz%s_hostCredentialsz%s_portz%s_host_header)hostportZhost_header
access_key
secret_keysecurity_tokenprofile_namenameAclClassMapZ	acl_classCannedAclsMapZcanned_acls_credential_expiry_timeospathjoinr   r   shared_credentialsisfileZload_from_pathget_credentialsconfigure_headersconfigure_errors
HostKeyMapr   
has_optiongetgetint)
selfr"   r   r   r    r!   Zshared_pathZhost_opt_nameZport_opt_nameZhost_header_opt_namer   r   r   __init__   s6    zProvider.__init__c                 C   s   |   r|   | jS N)_credentials_need_refresh#_populate_keys_from_metadata_server_access_keyr2   r   r   r   get_access_key   s    zProvider.get_access_keyc                 C   s
   || _ d S r4   )r7   r2   valuer   r   r   set_access_key   s    zProvider.set_access_keyc                 C   s   |   r|   | jS r4   )r5   r6   _secret_keyr8   r   r   r   get_secret_key   s    zProvider.get_secret_keyc                 C   s
   || _ d S r4   )r=   r:   r   r   r   set_secret_key   s    zProvider.set_secret_keyc                 C   s   |   r|   | jS r4   )r5   r6   _security_tokenr8   r   r   r   get_security_token   s    zProvider.get_security_tokenc                 C   s
   || _ d S r4   )r@   r:   r   r   r   set_security_token   s    zProvider.set_security_tokenc                 C   s^   | j d krdS | j t  }|j|j|jd d  d  d }|dk rVtjd dS dS d S )NF   i  i@B i,  z!Credentials need to be refreshed.T)	r%   r   utcnowmicrosecondssecondsdaysbotologdebug)r2   deltaZseconds_leftr   r   r   r5      s    
z"Provider._credentials_need_refreshc                 C   s4  | j | j \}}}}|d kr@|d k	r@| tjkr@tj|  }| j}	|d k	rb|| _tj	d n| tjkrtj|  | _tj	d n|d k	r|	
||r|	||| _tj	d|  n@t
d| |rtd| || _tj	d|  ntd| nR|	
d|r0|	d|| _tj	d n(t
d	|rXtd	|| _tj	d
 |d k	rx|| _tj	d nh| tjkrtj|  | _tj	d n8|d k	r$|	
||r|	||| _tj	d|  nBt
d| |rtd| || _tj	d|  ntd| n|	
d|rN|	d|| _tj	d nt
d	|rxtd	|| _tj	d nht
d	drtd	d}
zdd l}W n$ tk
r   tjd  Y nX ||
| j| _tj	d |d k	r|| _tj	d n|d k	r|d kr|d kr| tjkrJtj|  | _tj	d n|	
|pVd|r|	|pjd|| _tj	d nt|d k	rt
d| |rtj	d td| || _tj	d|  n(t
d	|rtd	|| _tj	d | jd ks| jd kr"| j| j r"|   | | j| _d S )Nz$Using access key provided by client.z/Using access key found in environment variable.z@Using access key found in shared credential file for profile %s.z
profile %sz2Using access key found in config file: profile %s.zProfile "%s" not found!defaultz1Using access key found in shared credential file.r   z&Using access key found in config file.z$Using secret key provided by client.z/Using secret key found in environment variable.z@Using secret key found in shared credential file for profile %s.z2Using secret key found in config file: profile %s.z1Using secret key found in shared credential file.z&Using secret key found in config file.keyringr   zZThe keyring module could not be imported. For keyring support, install the keyring module.z"Using secret key found in keyring.z(Using security token provided by client.z3Using security token found in environment variable.z5Using security token found in shared credential file.zconfig has optionz6Using security token found in config file: profile %s.z*Using security token found in config file.)CredentialMapr"   upperr&   environr)   r   rH   rI   rJ   r/   r0   r   r   r   rM   ImportErrorerrorget_passwordr    r7   r=   MetadataServiceSupportr6   _convert_key_to_str)r2   r   r   r    r!   Zaccess_key_nameZsecret_key_nameZsecurity_token_nameZprofile_name_nameZsharedZkeyring_namerM   r   r   r   r+   	  s    






 





zProvider.get_credentialsc                 C   s   t jd ddlm} tddd}tddd}|||d	d
}|r| |}|d | _	|d | _
|d | _|d }t|d| _t jd| jt  | d S )Nz,Retrieving credentials from metadata server.r   )get_instance_metadataZBotoZmetadata_service_timeoutg      ?Zmetadata_service_num_attempts   z#meta-data/iam/security-credentials/)timeoutZnum_retriesdata      z%Y-%m-%dT%H:%M:%SZz.Retrieved credentials will expire in %s at: %s)rH   rI   rJ   Z
boto.utilsrV   r   getfloatr1   _get_credentials_from_metadatar7   r=   r@   r   strptimer%   now)r2   rV   rX   attemptsmetadatacreds
expires_atr   r   r   r6   |  s.     



 z,Provider._populate_keys_from_metadata_serverc           	   
   C   s   t | d }t|ts<|dkr(d}nd| }td| z*|d }| |d }|d }|d	 }W n. tk
r } ztd
| W 5 d }~X Y nX ||||fS )Nr    zan empty stringztype: %sz7Expected a dict type of credentials instead received %sZAccessKeyIdZSecretAccessKeyTokenZ
Expirationz;Credentials from instance metadata missing required key: %s)listvalues
isinstancedictr   rU   KeyError)	r2   ra   rb   msgr   r   r    rc   er   r   r   r]     s(    
z'Provider._get_credentials_from_metadatac                 C   s   t |tjrt|S |S r4   )rh   r   	text_typestr)r2   keyr   r   r   rU     s    zProvider._convert_key_to_strc                 C   s   | j | j }|t | _|t | _|t | _|t | _	|t
 | _|t | _|t | _|t | _|t | _|t | _|t | _|t | _|t | _|t | _|t | _|t  | _!|t" | _#d S r4   )$HeaderInfoMapr"   METADATA_PREFIX_KEYr   HEADER_PREFIX_KEYr   ACL_HEADER_KEYZ
acl_headerAUTH_HEADER_KEYauth_headerCOPY_SOURCE_HEADER_KEYZcopy_source_header!COPY_SOURCE_VERSION_ID_HEADER_KEYZcopy_source_version_idCOPY_SOURCE_RANGE_HEADER_KEYZcopy_source_range_headerDATE_HEADER_KEYZdate_headerDELETE_MARKER_HEADER_KEYZdelete_markerMETADATA_DIRECTIVE_HEADER_KEYZmetadata_directive_headerSECURITY_TOKEN_HEADER_KEYZsecurity_token_headerRESUMABLE_UPLOAD_HEADER_KEYZresumable_upload_headerSERVER_SIDE_ENCRYPTION_KEYZserver_side_encryption_headerSTORAGE_CLASS_HEADER_KEYZstorage_class_headerVERSION_ID_HEADER_KEY
version_idMFA_HEADER_KEYZ
mfa_headerRESTORE_HEADER_KEYZrestore_header)r2   Zheader_info_mapr   r   r   r,     s0    











zProvider.configure_headersc                 C   sB   | j | j }|t | _|t | _|t | _|t | _	|t
 | _d S r4   )ErrorMapr"   STORAGE_COPY_ERRORZstorage_copy_errorSTORAGE_CREATE_ERRORZstorage_create_errorSTORAGE_DATA_ERRORZstorage_data_errorSTORAGE_PERMISSIONS_ERRORZstorage_permissions_errorSTORAGE_RESPONSE_ERRORZstorage_response_error)r2   Z	error_mapr   r   r   r-     s    



zProvider.configure_errorsc                 C   s   | j | j S r4   )r.   r"   r8   r   r   r   get_provider_name  s    zProvider.get_provider_namec                 C   s   | j | j S r4   )ChunkedTransferSupportr"   r8   r   r   r   supports_chunked_transfer  s    z"Provider.supports_chunked_transfer)NNNN)NNNN)Gr   r   r   rN   r
   r   r#   CannedS3ACLStringsCannedGSACLStringsr$   r.   r   rT   rr   AWS_HEADER_PREFIXrq   rs   rt   rv   rw   rx   ry   rz   r{   r}   r|   r~   r   r   r   r   GOOG_HEADER_PREFIXrp   r   rH   	exceptionZS3CopyErrorr   ZS3CreateErrorr   ZS3DataErrorr   ZS3PermissionsErrorr   ZS3ResponseErrorZGSCopyErrorZGSCreateErrorZGSDataErrorZGSPermissionsErrorZGSResponseErrorr   r3   r9   r<   propertyr   r>   r?   r   rA   rB   r    r5   r+   r6   r]   rU   r,   r-   r   r   r   r   r   r   r   N   s*  
                                  3              
#


    
sr   c                   C   s   t dS )Nr   )r   r   r   r   r   get_default  s    r   )1__doc__r&   Zboto.compatr   r   rH   r   r   Zboto.pyami.configr   Zboto.exceptionr   Zboto.gs.aclr   r	   r   Zboto.s3.aclr   r
   rr   rq   r   r   rs   rt   rv   rw   rx   rz   ry   r{   r}   r|   r   r   r~   r   r   r   r   r   r   r   objectZNO_CREDENTIALS_PROVIDED
ValueErrorr   r   r   r   r   r   r   <module>   sV      