U
    $Pf"                     @   s  d dl mZ d dlZd dlZddlmZmZmZ dZdZ	d Z
edd d d dZd	ZdZd ZG d
d deZG dd deZG dd deZG dd deZG dd dejZG dd deZG dd deZG dd deZG dd deZeddZG dd dejZdS )     )unicode_literalsN   )
compat_ordcompat_struct_packcompat_struct_unpackz"Timo Schmid <coding@timoschmid.de>   z!BBBB      c                   @   s   e Zd ZdZdZdS )Socks4Commandr      N)__name__
__module____qualname__CMD_CONNECTZCMD_BIND r   r   4/tmp/pip-unpacked-wheel-7zdooeg3/youtube_dl/socks.pyr
   $   s   r
   c                   @   s   e Zd ZdZdS )Socks5Command   N)r   r   r   ZCMD_UDP_ASSOCIATEr   r   r   r   r   )   s   r   c                   @   s   e Zd ZdZdZdZdZdS )
Socks5Authr   r   r   r   N)r   r   r   	AUTH_NONEZAUTH_GSSAPIAUTH_USER_PASSAUTH_NO_ACCEPTABLEr   r   r   r   r   -   s   r   c                   @   s   e Zd ZdZdZdZdS )Socks5AddressTyper   r   r   N)r   r   r   	ATYP_IPV4ATYP_DOMAINNAME	ATYP_IPV6r   r   r   r   r   4   s   r   c                       s"   e Zd ZdZd fdd	Z  ZS )
ProxyErrorr   Nc                    s6   |d k	r |d kr | j |pd}tt| || d S )Nzunknown error)CODESgetsuperr   __init__)selfcodemsg	__class__r   r   r    =   s    zProxyError.__init__)NN)r   r   r   ERR_SUCCESSr    __classcell__r   r   r$   r   r   :   s   r   c                       s   e Zd Z fddZ  ZS )InvalidVersionErrorc                    s"   d ||}tt| d| d S )NzBInvalid response version from server. Expected {0:02x} got {1:02x}r   )formatr   r(   r    )r!   expected_versiongot_versionr#   r$   r   r   r    D   s
     zInvalidVersionError.__init__)r   r   r   r    r'   r   r   r$   r   r(   C   s   r(   c                   @   s   e Zd ZdZddddZdS )Socks4ErrorZ   zrequest rejected or failedzLrequest rejected because SOCKS server cannot connect to identd on the clientzPrequest rejected because the client program and identd report different user-ids)[   \   ]   N)r   r   r   r&   r   r   r   r   r   r,   J   s
   r,   c                   @   s*   e Zd ZdZdddddddd	d
dd
ZdS )Socks5Errorr   zgeneral SOCKS server failurez!connection not allowed by rulesetzNetwork unreachablezHost unreachablezConnection refusedzTTL expiredzCommand not supportedzAddress type not supportedz$unknown username or invalid passwordz0all offered authentication methods were rejected)
r   r   r   r   r	               r   N)r   r   r   ERR_GENERAL_FAILUREr   r   r   r   r   r1   T   s   r1   c                   @   s   e Zd ZdZdZdZdS )	ProxyTyper   r   r   N)r   r   r   SOCKS4SOCKS4ASOCKS5r   r   r   r   r7   e   s   r7   Proxy)typehostportusernamepassword
remote_dnsc                       s   e Zd Z fddZd ddZdd Zd	d
 Ze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  ZS )"sockssocketc                    s   d | _ tt| j|| d S N)_proxyr   rB   r    )r!   argskwargsr$   r   r   r    p   s    zsockssocket.__init__TNc                 C   s0   |t jt jt jfkstt||||||| _d S rC   )r7   r8   r9   r:   AssertionErrorr;   rD   )r!   Z	proxytypeaddrr>   Zrdnsr?   r@   r   r   r   setproxyt   s    zsockssocket.setproxyc                 C   sJ   d}t ||k rF| |t | }|s<td|t | ||7 }q|S )N    z{0} bytes missing)lenrecvEOFErrorr)   )r!   cntdatacurr   r   r   recvally   s    
zsockssocket.recvallc                 C   s   |  |}td||S )N!{0}B)rQ   r   r)   )r!   rN   rO   r   r   r   _recv_bytes   s    
zsockssocket._recv_bytesc                 C   s   t dt| |  S )N!B)r   rK   )rO   r   r   r   _len_and_data   s    zsockssocket._len_and_datac                 C   s   ||kr|    t||d S rC   )closer(   )r!   r*   r+   r   r   r   _check_response_version   s    z#sockssocket._check_response_versionc                 C   sP   zt |W S  t jk
rJ   |r2| jjr2| Y S t t | Y S Y nX d S rC   )socket	inet_atonerrorrD   rA   gethostbyname)r!   destaddrdefaultuse_remote_dnsr   r   r   _resolve_address   s    zsockssocket._resolve_addressFc                 C   s   |\}}| j |t|d}tdttj|| }| jjp6dd}||d 7 }|rh| jj	rh||dd 7 }| 
| td| d\}}	}
}| t| |	tjkr|   t|	||
fS )Nr^   z!BBH utf-8    z!BBHIr4   )r_   SOCKS4_DEFAULT_DSTIPr   SOCKS4_VERSIONr
   r   rD   r?   encoderA   sendallr   rQ   rW   SOCKS4_REPLY_VERSIONr,   r&   rV   )r!   addressis_4ar\   r>   ipaddrpacketr?   versionZ	resp_codeZdstportZdsthostr   r   r   _setup_socks4   s    

zsockssocket._setup_socks4c                 C   s   | j |dd d S )NT)rj   )rn   r!   ri   r   r   r   _setup_socks4a   s    zsockssocket._setup_socks4ac                 C   sD  t dt}tjg}| jjr.| jjr.|tj |t dt	|7 }|t d
t	|f| 7 }| | | d\}}| t| |tjks|tjkr| jjr| jjs|   ttj|tjkr@| jjd}| jjd}t dt}|| || | 7 }| | | d\}}| t| |tkr@|   ttjd S )NrT   rR   r   rb   )r   SOCKS5_VERSIONr   r   rD   r?   r@   appendr   rK   r)   rg   rS   rW   r   rV   r1   rf   SOCKS5_USER_AUTH_VERSIONrU   SOCKS5_USER_AUTH_SUCCESSr6   )r!   rl   Zauth_methodsrm   methodr?   r@   statusr   r   r   _socks5_auth   s:    






zsockssocket._socks5_authc                 C   s8  |\}}| j |d dd}|   d}tdttj|}|d krf|d}|tdtj7 }|| 	|7 }n|tdtj
| 7 }|td|7 }| | | d\}}}}	| t| |tjkr|   t||	tj
kr| d}n<|	tjkrt| d	}
| |
}n|	tjkr| d
}td| dd }||fS )NTr`   r   z!BBBrb   rT   z!Hr   r      r   )r_   rw   r   rq   r   r   rf   r   r   rU   r   rg   rS   rW   r1   r&   rV   rQ   r   rL   r   r   )r!   ri   r\   r>   rk   reservedrl   rm   rv   atypealenZdestportr   r   r   _setup_socks5   s4    




zsockssocket._setup_socks5c                 C   sj   | j s|| |S || | j j| j jf}|dkr:|d k	r:|S tj| jtj| jtj| j	i}|| j j
 | |S )Nr   )rD   r=   r>   r7   r8   rn   r9   rp   r:   r|   r<   )r!   Zconnect_funcri   resultZsetup_funcsr   r   r   _make_proxy   s    
   zsockssocket._make_proxyc                 C   s   |  tjj| d S rC   )r~   rX   connectro   r   r   r   r     s    zsockssocket.connectc                 C   s   |  tjj|S rC   )r~   rX   
connect_exro   r   r   r   r     s    zsockssocket.connect_ex)TNN)F)r   r   r   r    rI   rQ   rS   staticmethodrU   rW   r_   rn   rp   rw   r|   r~   r   r   r'   r   r   r$   r   rB   o   s   
	
	
$&rB   )
__future__r   collectionsrX   compatr   r   r   
__author__re   rh   rd   rq   rs   rt   objectr
   r   r   r   rZ   r   r(   r,   r1   r7   
namedtupler;   rB   r   r   r   r   <module>   s*   	
