3
]ð]v   ã            #   @   sL  d Z ddlZddlZddlZdZyddlZW n ek
rD   dZY nX dZyddlZdZW n ek
rn   Y nX dZ	yddl
mZ dZ	W n ek
rœ   Y nX ddlmZ ddlmZ ejƒ Zdaejdd… dkZe�r0yddlmZ W n" ek
�r   ddlmZ Y nX dd„ Zdd„ Zdd„ Zdd„ Zndd„ Zdd„ Zdd„ ZdS )zSupport for SSL in PyMongo.é    NTF)ÚCertFile)Ústring_type)ÚConfigurationErroré   é   é   )Ú
SSLContextc             C   sT   |dkr|S t |tƒr*tt|ƒr*tt|ƒ}|tjtjtjfkrB|S td| f ƒ‚dS )z¨Validate the cert reqs are valid. It must be None or one of the
        three values ``ssl.CERT_NONE``, ``ssl.CERT_OPTIONAL`` or
        ``ssl.CERT_REQUIRED``.
        Nz[The value of %s must be one of: `ssl.CERT_NONE`, `ssl.CERT_OPTIONAL` or `ssl.CERT_REQUIRED`)	Ú
isinstancer   ÚhasattrÚsslÚgetattrÚ	CERT_NONEÚCERT_OPTIONALÚCERT_REQUIREDÚ
ValueError)ÚoptionÚvalue© r   ú6/tmp/pip-build-20mum3z4/pymongo/pymongo/ssl_support.pyÚvalidate_cert_reqs8   s    
r   c             C   s&   ddl m} || |ƒ}|r tjS tjS )z;Validate the option to allow invalid certificates is valid.r   )Úvalidate_boolean_or_string)Zpymongo.commonr   r   r   r   )r   r   r   Zboolean_cert_reqsr   r   r   Úvalidate_allow_invalid_certsH   s
    
r   c              C   s.   t ƒ } | jdƒ | jdƒ tj| jƒ | adS )z6Set _WINCERTS to an instance of wincertstore.Certfile.ÚCAÚROOTN)r   ZaddstoreÚatexitÚregisterÚcloseÚ	_WINCERTS)Úcertfiler   r   r   Ú_load_wincertsQ   s
    

r   c              G   sV  | \}}}}}}}|dkr t jn|}ttt dt jƒƒ}	t|	dƒr\trV|t jkrV||	_nd|	_t|	dƒr¾|	 j	tt ddƒO  _	|	 j	tt ddƒO  _	|	 j	tt d	dƒO  _	|	 j	tt d
dƒO  _	|dk	�rdyf|dk	�r t
j}
|
d dkrð|
dk �s|
d dk�r|
dk �rtdƒ‚|	j|||ƒ n|	j||ƒ W n4 t jk
�rb } ztd|f ƒ‚W Y dd}~X nX |dk	�r”t|	dƒ�s‚tdƒ‚t j|	_|	j|ƒ |dk	�rª|	j|ƒ n¢|t jk�rLt|	dƒ�rÌ|	jƒ  n€t
jdk�rît|	dƒ�rî|	jƒ  n^t
jdk�r.t�r.t� tdk�rtƒ  W dQ R X |	jtjƒ nt�rD|	jtjƒ ƒ ntdƒ‚||	_|	S )z'Create and return an SSLContext object.NÚPROTOCOL_TLS_CLIENTÚcheck_hostnameFÚoptionsÚOP_NO_SSLv2r   ÚOP_NO_SSLv3ÚOP_NO_COMPRESSIONZOP_NO_RENEGOTIATIONr   r   é	   r   zKSupport for ssl_pem_passphrase requires python 2.7.9+ (pypy 2.5.1+) or 3.3+z)Private key doesn't match certificate: %sÚverify_flagszESupport for ssl_crlfile requires python 2.7.9+ (pypy 2.5.1+) or  3.4+Úload_default_certsÚwin32Úset_default_verify_pathszo`ssl_cert_reqs` is not ssl.CERT_NONE and no system CA certificates could be loaded. `ssl_ca_certs` is required.)r   r   r&   )r   r   )r   r   r   r   ÚPROTOCOL_SSLv23r
   Ú	_PY37PLUSr   r!   r"   ÚsysÚversion_infor   Úload_cert_chainÚSSLErrorÚVERIFY_CRL_CHECK_LEAFr'   Úload_verify_locationsr(   Úplatformr*   ÚHAVE_WINCERTSTOREÚ_WINCERTSLOCKr   r   ÚnameÚHAVE_CERTIFIÚcertifiÚwhereÚverify_mode)Úargsr   ÚkeyfileZ
passphraseÚca_certsÚ	cert_reqsZcrlfileÚmatch_hostnamer:   ÚctxÚviÚexcr   r   r   Úget_ssl_contextc   sf    









rC   c             C   s   t d| f ƒ‚dS )z(No ssl module, raise ConfigurationError.zNThe value of %s is set but can't be validated. The ssl module is not availableN)r   )r   Údummyr   r   r   r   À   s    c             C   s
   t | |ƒS )z(No ssl module, raise ConfigurationError.)r   )r   rD   r   r   r   r   Æ   s    c              G   s   t dƒ‚dS )z(No ssl module, raise ConfigurationError.z The ssl module is not available.N)r   )rD   r   r   r   rC   Ê   s    )r   r   )Ú__doc__r   r-   Ú	threadingZHAVE_SSLr   ÚImportErrorr7   r8   r4   Zwincertstorer   Zbson.py3compatr   Zpymongo.errorsr   ÚLockr5   r   r.   r,   r   Zpymongo.ssl_contextr   r   r   rC   r   r   r   r   Ú<module>   sJ   
	
]