B
    è?F[ãW  ã               @   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-headerz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   ú,lib/python3.7/site-packages/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-rangeZdatezdelete-markerzmetadata-directiveNzsecurity-tokenzserver-side-encryptionz
version-idzstorage-classZmfaZ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|¡rØt d|¡| _ d| j| j  }t d|¡rt d|¡| _d	| j| j  }	t d|	¡r0t d|	¡| _d S )
Nú~Ú.ZcredentialsF)Zdo_loadz%s_hostÚCredentialsz%s_portz%s_host_header)ZhostZ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)r,   r   r   r   Úget_access_keyØ   s    zProvider.get_access_keyc             C   s
   || _ d S )N)r0   )r,   Úvaluer   r   r   Úset_access_keyÝ   s    zProvider.set_access_keyc             C   s   |   ¡ r|  ¡  | jS )N)r.   r/   Ú_secret_key)r,   r   r   r   Úget_secret_keyâ   s    zProvider.get_secret_keyc             C   s
   || _ d S )N)r4   )r,   r2   r   r   r   Úset_secret_keyç   s    zProvider.set_secret_keyc             C   s   |   ¡ r|  ¡  | jS )N)r.   r/   Ú_security_token)r,   r   r   r   Úget_security_tokenì   s    zProvider.get_security_tokenc             C   s
   || _ d S )N)r7   )r,   r2   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   ZutcnowZmicrosecondsZsecondsZdaysÚbotoÚlogÚdebug)r,   ZdeltaZseconds_leftr   r   r   r.   ö   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rŽtj| ¡  | _tj 	d¡ nÊ|d k	r|	 
||¡rÄ|	 ||¡| _tj 	d| ¡ n@t 
d| |¡røt 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r¨t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¡ n’t 
d	|¡rxt d	|¡| _tj 	d¡ nht 
d	d¡ràt d	d¡}
y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	rÌt 
d| |¡rôtj 	d¡ t d| |¡| _tj 	d| ¡ n(t 
d	|¡rôt 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   r;   r<   r=   r)   r*   r   r   r   r?   ÚImportErrorÚerrorZget_passwordr   r0   r4   ÚMetadataServiceSupportr/   Ú_convert_key_to_str)r,   r   r   r   r   Zaccess_key_nameZsecret_key_nameZsecurity_token_nameZprofile_name_nameZsharedZkeyring_namer?   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)r;   r<   r=   Z
boto.utilsrG   r   Zgetfloatr+   Ú_get_credentials_from_metadatar0   r4   r7   r   Zstrptimer   Znow)r,   rG   rI   ZattemptsÚmetadataÚcredsÚ
expires_atr   r   r   r/   |  s$    




z,Provider._populate_keys_from_metadata_serverc       	   
   C   s¢   t | ¡ ƒd }t|tƒs<|dkr(d}nd| }td| ƒ‚y*|d }|  |d ¡}|d }|d	 }W n. tk
r” } ztd
| ƒ‚W d 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   rF   ÚKeyError)	r,   rN   rO   Úmsgr   r   r   rP   Úer   r   r   rM   –  s"    
z'Provider._get_credentials_from_metadatac             C   s   t |tjƒrt|ƒS |S )N)rU   r   Z	text_typeÚstr)r,   Úkeyr   r   r   rF   ´  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 )N)$ÚHeaderInfoMapr   ÚMETADATA_PREFIX_KEYr   ÚHEADER_PREFIX_KEYr   ÚACL_HEADER_KEYZ
acl_headerÚAUTH_HEADER_KEYZ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_KEYZ
version_idÚMFA_HEADER_KEYZ
mfa_headerÚRESTORE_HEADER_KEYZrestore_header)r,   Zheader_info_mapr   r   r   r&   »  s(    













zProvider.configure_headersc             C   sB   | j | j }|t | _|t | _|t | _|t | _	|t
 | _d S )N)Ú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)r,   Z	error_mapr   r   r   r'   Ó  s    



zProvider.configure_errorsc             C   s   | j | j S )N)r(   r   )r,   r   r   r   Úget_provider_nameÛ  s    zProvider.get_provider_namec             C   s   | j | j S )N)ÚChunkedTransferSupportr   )r,   r   r   r   Úsupports_chunked_transferÞ  s    z"Provider.supports_chunked_transfer)NNNN)NNNN)Gr   r   r   r@   r
   r   r   ÚCannedS3ACLStringsÚCannedGSACLStringsr   r(   ru   rE   r^   ÚAWS_HEADER_PREFIXr]   r_   r`   ra   rb   rc   rd   re   rf   rh   rg   ri   rk   rj   rl   rm   ÚGOOG_HEADER_PREFIXr\   ro   r;   Z	exceptionZS3CopyErrorrp   ZS3CreateErrorrq   ZS3DataErrorrr   ZS3PermissionsErrorrs   ZS3ResponseErrorZGSCopyErrorZGSCreateErrorZGSDataErrorZGSPermissionsErrorZGSResponseErrorrn   r-   r1   r3   Úpropertyr   r5   r6   r   r8   r9   r   r.   r%   r/   rM   rF   r&   r'   rt   rv   r   r   r   r   r   N   s¦   

 
"


 
rr   c               C   s   t dƒS )Nr   )r   r   r   r   r   Úget_defaultã  s    r|   )1Ú__doc__r    Zboto.compatr   r   r;   r   r   Zboto.pyami.configr   Zboto.exceptionr   Zboto.gs.aclr   r	   rx   Zboto.s3.aclrw   r
   r^   r]   ry   rz   r_   r`   ra   rb   rc   re   rd   rf   rh   rg   rj   rl   ri   rk   rm   ro   rp   rq   rr   rs   ÚobjectZNO_CREDENTIALS_PROVIDEDÚ
ValueErrorr   r   r|   r   r   r   r   Ú<module>   sV      