509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
 Û`-+  ã               @   sš   d Z ddlmZ ddlmZ ddlZddlZddlZddlmZ ddl	Z	dZ
eedƒr^ejZnddlmZ G d	d
„ d
ƒZdd„ ZG dd„ dejejƒZdS )zK
rhn.SSL builds an abstraction on top of the objects provided by pyOpenSSL
é    )ÚSSL)ÚcryptoN)Úbstréx   Ússlerror)Úsocket_errorc               @   s²   e Zd ZdZd(dd„Zdd„ Zdd„ Zd)d	d
„Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zd*dd„Zd+dd„Zdd„ Zd d!„ Zd"d#„ Zd$d%„ ZeZeZd,d&d'„ZdS )-Ú	SSLSocketzM
    Class that wraps a pyOpenSSL Connection object, adding more methods
    Nc             C   sn   d | _ d | _|| _g | _|pg }x|D ]}| j|ƒ q&W tj| _tj| _	d| _
d| _tdƒ| _d| _d | _d S )Ni    r   Ú )Ú_ctxÚ_connectionÚ_sockÚ_trusted_certsÚadd_trusted_certr   ZSSLv23_METHODÚ_ssl_methodZVERIFY_PEERÚ_ssl_verify_flagsÚ_buffer_sizeÚ_posr   Ú_bufferÚ_makefile_calledÚ_closed)ÚselfÚsocketZtrusted_certsÚf© r   ú/usr/lib/python3.6/SSL.pyÚ__init__/   s    

zSSLSocket.__init__c             C   s0   t j|t jƒstd| ƒ‚| jj|jdƒƒ dS )zh
        Adds a trusted certificate to the certificate store of the SSL context
        object.
        z"Unable to read certificate file %szutf-8N)ÚosÚaccessÚR_OKÚ
ValueErrorr   ÚappendÚencode)r   Úfiler   r   r   r   L   s    zSSLSocket.add_trusted_certc             C   s¤   | j ƒ  tj| jƒ| _| jjtjƒ | jjtjƒ | jrVx"| jD ]}| jj	|ƒ q@W nd| _
| jj| j
tƒ ttdƒr„| jjtjƒ tj| j| jƒ| _| jjƒ  dS )z1
        Initializes the SSL connection.
        r   ÚOP_DONT_INSERT_EMPTY_FRAGMENTSN)Ú_check_closedr   ZContextr   r
   Zset_optionsZOP_NO_SSLv2ZOP_NO_SSLv3r   Zload_verify_locationsr   Z
set_verifyÚssl_verify_callbackÚhasattrr#   Z
Connectionr   r   Zset_connect_state)r   r   r   r   r   Úinit_sslU   s    
zSSLSocket.init_sslc             C   s   |r
|| _ | jd | _| S )zG
        Returns self, since we are a file-like object already
        é   )r   r   )r   ÚmodeÚbufsizer   r   r   Úmakefiles   s    zSSLSocket.makefilec             C   s,   | j r
dS | js| jƒ  dS | jd | _dS )z+
        Closes the SSL connection
        Nr(   )r   r   Ú_really_close)r   r   r   r   Úclose€   s    zSSLSocket.closec             C   s   d S )Nr   )r   r   r   r   Úflush‘   s    zSSLSocket.flushc             C   s˜   | j d krd S d }yt| j dƒ}W n  tk
rB   t| j dƒ}Y nX |d k	r„tjd dkrp|ƒ dkr„| j jƒ  n|ƒ dkr„| j jƒ  | j jƒ  d| _d S )NZstate_stringZget_state_stringr   é   s%   SSL negotiation finished successfullyz%SSL negotiation finished successfullyr(   )r   ÚgetattrÚAttributeErrorÚsysÚversion_infoZshutdownr-   r   )r   Z	get_stater   r   r   r,   ”   s    




zSSLSocket._really_closec             C   s   | j rtdƒ‚d S )NzI/O operation on closed file)r   r   )r   r   r   r   r$   «   s    zSSLSocket._check_closedc             C   s$   t | j|ƒrt| j|ƒS t|ƒ‚d S )N)r&   r   r0   r1   )r   Únamer   r   r   Ú__getattr__¯   s    zSSLSocket.__getattr__c             C   s   dS )z'
        Returns false always.
        r   r   )r   r   r   r   Úisattyµ   s    zSSLSocket.isattyc             C   s   | j S )N)r   )r   r   r   r   Útell»   s    zSSLSocket.tellr   c             C   s   t dƒ‚d S )NÚseek)ÚNotImplementedError)r   Úposr)   r   r   r   r8   ¾   s    zSSLSocket.seekc             C   sX  | j ƒ  | j}t| jƒ}xô||k s,|dk�r|dk	rBt|| |ƒ}y:| jj|ƒ}| j| | _t| jƒ}| jjƒ }|dkrzP W q tj	k
r”   P Y q tj
k
rÂ   tjƒ d }td|jƒ P Y q tjk
rä   | jtjdƒ Y q tjk
�r   | jtjdƒ Y qX qW |�r4| jd|… }| j|d… | _n| j}tdƒ| _| jt|ƒ | _|S )z@
        Reads up to amt bytes from the SSL connection.
        Nr   r(   zSSL exceptionÚreadr	   )r$   r   Úlenr   Úminr   ÚrecvÚpendingr   ÚZeroReturnErrorZSysCallErrorr2   Úexc_infoÚprintÚargsÚWantWriteErrorÚ_pollÚselectÚPOLLOUTÚWantReadErrorÚPOLLINr   r   )r   ÚamtÚbuffer_sizeZbuffer_lengthÚdatar?   ÚeÚretr   r   r   r;   Á   s<    



zSSLSocket.readc             C   s   | j t|ƒƒ|d d …< t|ƒS )N)r;   r<   )r   Zbufr   r   r   Úreadintoô   s    zSSLSocket.readintoc             C   sB   t jƒ }|j| j|ƒ |j| jjƒ d ƒ}|g kr>td| ƒ‚d S )Niè  zConnection timed out on %s)rF   ZpollÚregisterr   Z
gettimeoutÚTimeoutException)r   Zfilter_typeZcaller_nameZpollerÚresr   r   r   rE   ø   s
    zSSLSocket._pollc             C   sŒ   | j ƒ  t|ƒ}xvy*| jj|ƒ}|t|ƒkr.P ||d… }W q tjk
r`   | jtjdƒ Y q tj	k
r‚   | jtj
dƒ Y qX qW |S )z/
        Writes to the SSL connection.
        NÚwrite)r$   r<   r   Úsendr   rD   rE   rF   rG   rH   rI   )r   rL   ZoriglenZsentr   r   r   rS   ÿ   s    zSSLSocket.writec             C   s
   | j |ƒS )N)r;   )r   rJ   r   r   r   r>     s    zSSLSocket.recvc             C   sB  | j ƒ  �xd}| jjtdƒƒ}|dkr2|d }n|rHt| jƒ|krH|}|dk	r‚| jd|… }| j|d… | _| jt|ƒ | _|S | j}|r¢t| j|t| jƒ ƒ}y| jj	|ƒ}| j| | _W q t
jk
rÖ   P Y q t
jk
rø   | jtjdƒ Y q t
jk
�r   | jtjdƒ Y qX qW | j}d| _| jt|ƒ | _|S )zg
        Reads a single line (up to `length' characters long) from the SSL
        connection.
        NÚ
r   r(   Úreadliner	   )r$   r   Úfindr   r<   r   r   r=   r   r>   r   r@   rD   rE   rF   rG   rH   rI   )r   ZlengthZ	charcountÚirN   r*   rL   r   r   r   rV     s:    
zSSLSocket.readline)N)N)r   )N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r'   r+   r-   r.   r,   r$   r5   r6   r7   r8   r;   rO   rE   rS   r>   rT   ZsendallrV   r   r   r   r   r   +   s*   
	


3r   c             C   s   |S )zb
    Verify callback, which will be called for each certificate in the
    certificate chain.
    r   )ZconnZcertZerrnumÚdepthÚokr   r   r   r%   K  s    r%   c               @   s   e Zd Zdd„ Zdd„ ZdS )rQ   c             G   s
   || _ d S )N)rC   )r   rC   r   r   r   r   U  s    zTimeoutException.__init__c             C   s   dS )NzTimeout Exceptionr   )r   r   r   r   Ú__str__X  s    zTimeoutException.__str__N)rY   rZ   r[   r   r_   r   r   r   r   rQ   S  s   rQ   )r\   ZOpenSSLr   r   r   r   rF   Zrhn.i18nr   r2   ZDEFAULT_TIMEOUTr&   r   r   Zsslr   r%   ÚErrorZtimeoutrQ   r   r   r   r   Ú<module>   s    
  "