U
    ‹¾úgè"  ã                   @   sø   d dl Z d dlZd dlZddl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
ƒZG dd„ deƒZG dd„ dƒZG dd„ 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ƒZe  dd¡ZG dd„ dejƒZdS )é    Né   )Ú
compat_ordz"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   ú0/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/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   .   s   r   c                       s"   e Zd ZdZd‡ fdd„	Z‡  ZS )Ú
ProxyErrorr   Nc                    s2   |d k	r |d kr | j  |¡pd}tƒ  ||¡ d S )Nzunknown error)ÚCODESÚgetÚsuperÚ__init__)ÚselfÚcodeÚmsg©Ú	__class__r   r   r   7   s    zProxyError.__init__)NN)r	   r
   r   ÚERR_SUCCESSr   Ú__classcell__r   r   r!   r   r   4   s   r   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚInvalidVersionErrorc                    s&   d|d›d|d›}t ƒ  d|¡ d S )Nz/Invalid response version from server. Expected Z02xz got r   )r   r   )r   Úexpected_versionÚgot_versionr    r!   r   r   r   >   s    zInvalidVersionError.__init__)r	   r
   r   r   r$   r   r   r!   r   r%   =   s   r%   c                   @   s   e Zd ZdZddddœZdS )ÚSocks4ErroréZ   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(   D   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   r-   N   s   ör-   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   r3   _   s   r3   Ú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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ƒ j||Ž d S ©N)Ú_proxyr   r   )r   ÚargsÚkwargsr!   r   r   r   j   s    zsockssocket.__init__TNc                 C   s0   |t jt jt jfkst‚t||||||ƒ| _d S r?   )r3   r4   r5   r6   ÚAssertionErrorr7   r@   )r   Z	proxytypeÚaddrr:   Zrdnsr;   r<   r   r   r   Úsetproxyn   s    zsockssocket.setproxyc                 C   sJ   d}t |ƒ|k rF|  |t |ƒ ¡}|s<t|t |ƒ › dƒ‚||7 }q|S )Nó    z bytes missing)ÚlenÚrecvÚEOFError)r   ÚcntÚdataÚcurr   r   r   Úrecvalls   s    
zsockssocket.recvallc                 C   s   |   |¡}t d|› d|¡S )Nú!ÚB)rM   ÚstructÚunpack)r   rJ   rK   r   r   r   Ú_recv_bytes|   s    
zsockssocket._recv_bytesc                 C   s   t  dt| ƒ¡|  S )Nú!B)rP   ÚpackrG   )rK   r   r   r   Ú_len_and_data€   s    zsockssocket._len_and_datac                 C   s   ||kr|   ¡  t||ƒ‚d S r?   )Úcloser%   )r   r&   r'   r   r   r   Ú_check_response_version„   s    z#sockssocket._check_response_versionc           	   	   C   sž   |r
|fn
t jt jfD ]4}z|t  ||¡fW   S  tk
rH   Y qY qX q|r`| jjr`d|fS t j|d |pndd}|d \}}}}}|t  ||d ¡fS d S )Nr   )Úfamily)ÚsocketÚAF_INETÚAF_INET6Ú	inet_ptonÚOSErrorr@   r=   Úgetaddrinfo)	r   ÚdestaddrÚdefaultÚuse_remote_dnsrX   ÚfÚresÚ_Úipaddrr   r   r   Ú_resolve_address‰   s    zsockssocket._resolve_addressFc                 C   sÈ   |\}}| j |t|tjd\}}t dttj|¡| }| j	j
p@d ¡ }||d 7 }|rv| j	jrv|tkrv|| ¡ d 7 }|  |¡ t d|  d¡¡\}	}
}}|  t|	¡ |
tjkrÀ|  ¡  t|
ƒ‚||fS )N)ra   rX   z!BBHÚ ó    z!BBHIr0   )rf   ÚSOCKS4_DEFAULT_DSTIPrY   rZ   rP   rT   ÚSOCKS4_VERSIONr   r   r@   r;   Úencoder=   ÚsendallrQ   rM   rW   ÚSOCKS4_REPLY_VERSIONr(   r#   rV   )r   ÚaddressÚis_4ar_   r:   rd   re   Úpacketr;   ÚversionZ	resp_codeZdstportZdsthostr   r   r   Ú_setup_socks4—   s    

zsockssocket._setup_socks4c                 C   s   | j |dd d S )NT)ro   )rr   ©r   rn   r   r   r   Ú_setup_socks4a°   s    zsockssocket._setup_socks4ac                 C   sJ  t  dt¡}tjg}| jjr0| jjr0| tj	¡ |t  dt
|ƒ¡7 }|t jdt
|ƒ› df|žŽ 7 }|  |¡ |  d¡\}}|  t|¡ |tjks¬|tj	kr¾| jjr¬| jjs¾|  ¡  ttjƒ‚|tj	krF| jj ¡ }| jj ¡ }t  dt¡}||  |¡|  |¡ 7 }|  |¡ |  d¡\}}|  t|¡ |tkrF|  ¡  ttjƒ‚d S )NrS   rN   rO   r   )rP   rT   ÚSOCKS5_VERSIONr   r   r@   r;   r<   Úappendr   rG   rl   rR   rW   r   rV   r-   rk   ÚSOCKS5_USER_AUTH_VERSIONrU   ÚSOCKS5_USER_AUTH_SUCCESSr2   )r   rp   Zauth_methodsrq   Úmethodr;   r<   Ústatusr   r   r   Ú_socks5_auth³   s:     

ÿÿÿ


zsockssocket._socks5_authc                 C   st  |\}}| j |d dd\}}|  ¡  d}t dttj|¡}|d krl| ¡ }|t dtj	¡7 }||  
|¡7 }nB|tjkrŽ|t dtj¡| 7 }n |tjkr®|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rV|  d	¡}t d|  d
¡¡d }||fS )NT)ra   r   z!BBBrS   z!Hr   r   é   r   )rf   r{   rP   rT   ru   r   r   rk   r   r   rU   rY   rZ   r   r[   r   rl   rR   rW   r-   r#   rV   rM   r   rH   rQ   )r   rn   r_   r:   rX   re   Úreservedrp   rq   rz   ÚatypeÚalenZdestportr   r   r   Ú_setup_socks5×   s:    



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   )r@   r9   r:   r3   r4   rr   r5   rt   r6   r€   r8   )r   Zconnect_funcrn   ÚresultZsetup_funcsr   r   r   Ú_make_proxyÿ   s    
   ýzsockssocket._make_proxyc                 C   s   |   tjj|¡ d S r?   )r‚   rY   Úconnectrs   r   r   r   rƒ     s    zsockssocket.connectc                 C   s   |   tjj|¡S r?   )r‚   rY   Ú
connect_exrs   r   r   r   r„     s    zsockssocket.connect_ex)TNN)N)F)r	   r
   r   r   rE   rM   rR   ÚstaticmethodrU   rW   rf   rr   rt   r{   r€   r‚   rƒ   r„   r$   r   r   r!   r   r>   i   s   
	


$(r>   )ÚcollectionsrY   rP   Úcompatr   Ú
__author__rj   rm   rT   ri   ru   rw   rx   r   r   r   r   r]   r   r%   r(   r-   r3   Ú
namedtupler7   r>   r   r   r   r   Ú<module>	   s*   	
