U
    dRfQ                     @   st   d dl mZ d dlZd dlZd dlZd dlZddlmZmZm	Z	 ddlm
Z
mZ G dd de
ZG dd	 d	eZdS )
    )absolute_importN   )create_thriftpy_contextRESTRICTED_SERVER_CIPHERSDEFAULT_CIPHERS)TSocketTServerSocketc                
       s@   e Zd ZdZejddddddddef
 fdd	Zdd Z  Z	S )	
TSSLSocketz.SSL socket implementation for client side
      NTc                    sz   t t| j|||||d |r&|| _nPtd|d| _|s<|	rL| jj||	d |
r`| jj|
|d |svd| j_tj	| j_
dS )u  Initialize a TSSLSocket

        @param validate(bool)       Set to False to disable SSL certificate
            validation and hostname validation. Default enabled.
        @param cafile(str)          Path to a file of concatenated CA
            certificates in PEM format.
        @param capath(str)           path to a directory containing several CA
            certificates in PEM format, following an OpenSSL specific layout.
        @param certfile(str)        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.
        @param keyfile(str)         The keyfile string, if not present,
            the private key will be taken from certfile as well.
        @param ciphers(list<str>)   The cipher suites to allow
        @param ssl_context(SSLContext)  Customize the SSLContext, can be used
            to persist SSLContext object. Caution it's easy to get wrong, only
            use if you know what you're doing.

        The `host` must be the same with server if validate enabled.
        )hostportsocket_familyconnect_timeoutsocket_timeoutFserver_sideciphers)cafilecapath)keyfileN)superr	   __init__ssl_contextr   load_verify_locationsload_cert_chaincheck_hostnamessl	CERT_NONEverify_mode)selfr   r   r   r   r   r   validater   r   certfiler   r   	__class__ A/tmp/pip-unpacked-wheel-jqs7l_7o/thriftpy2/transport/sslsocket.pyr      s*    
   zTSSLSocket.__init__c                 C   sp   t  | jt j}| jj|| jd}tddd}|t j	t j
| |t j	t jd |t jt jd || _d S )N)server_hostnameiir   r   )socketr   SOCK_STREAMr   wrap_socketr   structpack
setsockopt
SOL_SOCKET	SO_LINGERSO_KEEPALIVEIPPROTO_TCPTCP_NODELAYsock)r   _sockZlingerr$   r$   r%   
_init_sockE   s    zTSSLSocket._init_sock)
__name__
__module____qualname____doc__r(   AF_INETr   r   r5   __classcell__r$   r$   r"   r%   r	      s        /r	   c                       s8   e Zd ZdZejddddef fdd	Zdd	 Z  Z	S )
TSSLServerSocketz(SSL implementation of TServerSocket
    r
      Nzcert.pemc	           	         s`   t t| j|||||d |r&|| _n6t|tjs@td| td|d| _| jj	|d dS )as  Initialize a TSSLServerSocket

        @param certfile(str)        The server cert pem filename
        @param ciphers(list<str>)   The cipher suites to allow
        @param ssl_context(SSLContext)  Customize the SSLContext, can be used
            to persist SSLContext object. Caution it's easy to get wrong, only
            use if you know what you're doing.
        )r   r   r   client_timeoutbacklogzNo such certfile found: %sTr   )r!   N)
r   r<   r   r   osaccessR_OKIOErrorr   r   )	r   r   r   r   r>   r?   r   r!   r   r"   r$   r%   r   U   s    
   zTSSLServerSocket.__init__c                 C   sp   | j  \}}z| jj|dd}W n, tjk
rN   |tj |	   Y nX | j
rb|| j
 t|dS d S )NT)r   )r3   )r3   acceptr   r*   r   SSLErrorshutdownr(   	SHUT_RDWRcloser>   
settimeoutr   )r   r3   _Zssl_sockr$   r$   r%   rD   o   s    zTSSLServerSocket.accept)
r6   r7   r8   r9   r(   r:   r   r   rD   r;   r$   r$   r"   r%   r<   Q   s     r<   )
__future__r   r@   r(   r   r+   _sslr   r   r   r   r   r	   r<   r$   r$   r$   r%   <module>   s   ?