3
O6b1                 @   sx  d Z ddl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mZ ddlmZ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#m$Z$ ddl%m&Z& ddl'm(Z(m)Z* ej+Z,ej-Z-ej.Z.ej/Z/e0eddZ1dZ2dZ3dZ4ej5Z6ej7ej8ej9ej:ej;ej:ej<B iZ=e>dd e=j? D Z@dd ZAejBejCejDfZEdd ZFG dd dejGZHG dd deIZJG dd deIZKdS )zMA CPython compatible SSLContext implementation wrapping PyOpenSSL's
context.
    N)EINTR)
ip_address)SSL)verify_hostnameverify_ip_address)CertificateErrorVerificationError)default_backend)_unicode)r   )time)_load_trusted_ca_certs_ocsp_callback)
_OCSPCache)_errno_from_exceptionSocketCheckerOP_NO_RENEGOTIATIONTc             c   s   | ]\}}||fV  qd S )N ).0keyvaluer   r   X/var/www/html/sandeepIITI/myenv/lib/python3.6/site-packages/pymongo/pyopenssl_context.py	<genexpr>G   s    r   c             C   s.   yt t|  dS  ttfk
r(   dS X d S )NTF)_ip_addressr
   
ValueErrorUnicodeError)addressr   r   r   _is_ip_addressI   s
    r   c             C   s
   | j dkS )z<Return True if the OpenSSL.SSL.SysCallError is a ragged EOF.   Unexpected EOF)r   r   )args)excr   r   r   _ragged_eofV   s    r"   c                   sV   e Zd Z fddZdd Z fddZ fddZ fd	d
Zd fdd	Z  Z	S )_sslConnc                s$   t  | _|| _tt| j|| d S )N)_SocketCheckersocket_checkersuppress_ragged_eofssuperr#   __init__)selfctxsockr&   )	__class__r   r   r(   `   s    z_sslConn.__init__c             O   sl   | j  }|rt }xTy
|||S  tk
rb   | jj| dd| |r\t | |kr\tjdwY qX qW d S )NTz	timed out)
gettimeout_time_RETRY_ERRORSr%   select_sockettimeout)r)   callr    kwargsr2   startr   r   r   _calle   s    

z_sslConn._callc                s   | j tt| jf||S )N)r6   r'   r#   do_handshake)r)   r    r4   )r,   r   r   r7   s   s    z_sslConn.do_handshakec                sX   y| j tt| jf||S  tjk
rR } z| jr@t|r@dS  W Y d d }~X nX d S )N    )r6   r'   r#   recv_SSLSysCallErrorr&   r"   )r)   r    r4   r!   )r,   r   r   r9   v   s    z_sslConn.recvc                sX   y| j tt| jf||S  tjk
rR } z| jr@t|r@dS  W Y d d }~X nX d S )Nr   )r6   r'   r#   	recv_intor:   r;   r&   r"   )r)   r    r4   r!   )r,   r   r   r<      s    z_sslConn.recv_intor   c                s   t |}t|}d}d}x~||k ry"| jtt| j||d  |}W n6 ttfk
rz } zt|t	krhw W Y d d }~X nX |dkrt
d||7 }qW d S )Nr   zConnection closed)
memoryviewlenr6   r'   r#   sendIOErrorOSErrorr   _EINTR	Exception)r)   bufflagsviewtotal_length
total_sentsentr!   )r,   r   r   sendall   s    
z_sslConn.sendall)r   )
__name__
__module____qualname__r(   r6   r7   r9   r<   rJ   __classcell__r   r   )r,   r   r#   ^   s   		r#   c               @   s   e Zd ZdZdd ZdS )_CallbackDataz0Data class which is passed to the OCSP callback.c             C   s   d | _ d | _t | _d S )N)trusted_ca_certscheck_ocsp_endpointr   Zocsp_response_cache)r)   r   r   r   r(      s    z_CallbackData.__init__N)rK   rL   rM   __doc__r(   r   r   r   r   rO      s   rO   c               @   s   e Zd ZdZd%Zdd Zedd	 Zd
d Zdd Z	eee	Z
dd Zdd ZeeeZdd Zdd ZeeeZdd Zdd ZeeeZd&ddZd'ddZdd  Zd(d#d$ZdS ))
SSLContextzUA CPython compatible SSLContext implementation wrapping PyOpenSSL's
    context.
    	_protocol_ctx_callback_data_check_hostnamec             C   s@   || _ tj| j | _t | _d| _d| j_| jjt	| jd d S )NT)callbackdata)
rT   r:   ContextrU   rO   rV   rW   rQ   Zset_ocsp_client_callbackr   )r)   protocolr   r   r   r(      s    zSSLContext.__init__c             C   s   | j S )zhThe protocol version chosen when constructing the context.
        This attribute is read-only.
        )rT   )r)   r   r   r   r[      s    zSSLContext.protocolc             C   s   t | jj  S )zWhether to try to verify other peers' certificates and how to
        behave if verification fails. This attribute must be one of
        ssl.CERT_NONE, ssl.CERT_OPTIONAL or ssl.CERT_REQUIRED.
        )_REVERSE_VERIFY_MAPrU   Zget_verify_mode)r)   r   r   r   Z__get_verify_mode   s    zSSLContext.__get_verify_modec             C   s   dd }| j jt| | dS )zSetter for verify_mode.c             S   s   |S )Nr   )ZconnobjZx509objZerrnumZerrdepthretcoder   r   r   _cb   s    z)SSLContext.__set_verify_mode.<locals>._cbN)rU   Z
set_verify_VERIFY_MAP)r)   r   r^   r   r   r   Z__set_verify_mode   s    zSSLContext.__set_verify_modec             C   s   | j S )N)rW   )r)   r   r   r   Z__get_check_hostname   s    zSSLContext.__get_check_hostnamec             C   s   t |tstd|| _d S )Nz$check_hostname must be True or False)
isinstancebool	TypeErrorrW   )r)   r   r   r   r   Z__set_check_hostname   s    
zSSLContext.__set_check_hostnamec             C   s   | j jS )N)rV   rQ   )r)   r   r   r   Z__get_check_ocsp_endpoint   s    z$SSLContext.__get_check_ocsp_endpointc             C   s   t |tstd|| j_d S )Nz check_ocsp must be True or False)r`   ra   rb   rV   rQ   )r)   r   r   r   r   Z__set_check_ocsp_endpoint   s    
z$SSLContext.__set_check_ocsp_endpointc             C   s   | j jdS )Nr   )rU   set_options)r)   r   r   r   Z__get_options   s    zSSLContext.__get_optionsc             C   s   | j jt| d S )N)rU   rc   int)r)   r   r   r   r   Z__set_options   s    zSSLContext.__set_optionsNc                sF    r fdd}| j j| | j j| | j j|p4| | j j  dS )a  Load a private key and the corresponding certificate. The certfile
        string must be the path to a single file in PEM format containing the
        certificate as well as any number of CA certificates needed to
        establish the certificate's authenticity. The keyfile string, if
        present, must point to a file containing the private key. Otherwise
        the private key will be taken from certfile as well.
        c                s
    j dS )Nzutf-8)encode)
max_lengthZprompt_twice	user_data)passwordr   r   _pwcb  s    z)SSLContext.load_cert_chain.<locals>._pwcbN)rU   Zset_passwd_cbZuse_certificate_chain_fileZuse_privatekey_fileZcheck_privatekey)r)   certfilekeyfilerh   ri   r   )rh   r   load_cert_chain   s    zSSLContext.load_cert_chainc             C   s   | j j|| t|| j_dS )zLoad a set of "certification authority"(CA) certificates used to
        validate other peers' certificates when `~verify_mode` is other than
        ssl.CERT_NONE.
        N)rU   load_verify_locationsr   rV   rP   )r)   cafilecapathr   r   r   rm     s    z SSLContext.load_verify_locationsc             C   s   | j j  dS )zdSpecify that the platform provided CA certificates are to be used
        for verification purposes.N)rU   set_default_verify_paths)r)   r   r   r   rp     s    z#SSLContext.set_default_verify_pathsFTc       	      C   s   t | j||}|r|j| |dkr.|j  n:|rLt| rL|j|jd | jtj	kr`|j
  |j  |r|j  | jr|dk	ry*t|rt|t| nt|t| W n2 ttfk
r } ztt|W Y dd}~X nX |S )zTWrap an existing Python socket sock and return a TLS socket
        object.
        TidnaN)r#   rU   Zset_sessionZset_accept_stater   Zset_tlsext_host_namere   verify_mode
_stdlibssl	CERT_NONEZrequest_ocspZset_connect_stater7   check_hostname_verify_ip_addressr
   _verify_hostname_SICertificateError_SIVerificationError_CertificateErrorstr)	r)   r+   server_sidedo_handshake_on_connectr&   server_hostnamesessionZssl_connr!   r   r   r   wrap_socket  s(    

zSSLContext.wrap_socket)rT   rU   rV   rW   )NN)NN)FTTNN)rK   rL   rM   rR   	__slots__r(   propertyr[   Z_SSLContext__get_verify_modeZ_SSLContext__set_verify_moderr   Z_SSLContext__get_check_hostnameZ_SSLContext__set_check_hostnameru   Z$_SSLContext__get_check_ocsp_endpointZ$_SSLContext__set_check_ocsp_endpointrQ   Z_SSLContext__get_optionsZ_SSLContext__set_optionsoptionsrl   rm   rp   r   r   r   r   r   rS      s0   





   rS   )LrR   socketr1   sslrs   errnor   rB   	ipaddressr   r   ZOpenSSLr   r:   Zservice_identity.pyopensslr   rw   r   rv   Zservice_identityr   rx   r   ry   Zcryptography.hazmat.backendsr	   Z_default_backendZbson.py3compatr
   Zpymongo.errorsrz   Zpymongo.monotonicr   r.   Zpymongo.ocsp_supportr   r   Zpymongo.ocsp_cacher   Zpymongo.socket_checkerr   r   r$   ZSSLv23_METHODPROTOCOL_SSLv23OP_NO_SSLv2OP_NO_SSLv3OP_NO_COMPRESSIONgetattrr   HAS_SNIZCHECK_HOSTNAME_SAFEIS_PYOPENSSLErrorSSLErrorrt   ZVERIFY_NONECERT_OPTIONALZVERIFY_PEERCERT_REQUIREDZVERIFY_FAIL_IF_NO_PEER_CERTr_   dictitemsr\   r   ZWantReadErrorZWantWriteErrorZWantX509LookupErrorr/   r"   
Connectionr#   objectrO   rS   r   r   r   r   <module>   sD   
A