o
    i"                     @   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_CONNECTCMD_BIND r   r   @/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/socks.pyr      s    r   c                   @   s   e Zd ZdZdS )Socks5Command   N)r	   r
   r   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_NONEAUTH_GSSAPIAUTH_USER_PASSAUTH_NO_ACCEPTABLEr   r   r   r   r   '   s
    r   c                   @      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   .       r   c                       s"   e Zd ZdZd fdd	Z  ZS )
ProxyErrorr   Nc                    s2   |d ur|d u 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 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 )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.   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   r3   N   s    
r3   c                   @   r   )	ProxyTyper   r   r   N)r	   r
   r   SOCKS4SOCKS4ASOCKS5r   r   r   r   r9   _   r   r9   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|i | 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v sJ t||||||| _d S rE   )r9   r:   r;   r<   r=   rF   )r#   	proxytypeaddrr@   rdnsrA   rB   r   r   r   setproxyn   s   zsockssocket.setproxyc                 C   sT   d}t ||k r(| |t | }|st|t |  d||7 }t ||k s|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)rT   structunpack)r#   rQ   rR   r   r   r   _recv_bytes|   s   
zsockssocket._recv_bytesc                 C   s   t dt| |  S )N!B)rW   packrN   )rR   r   r   r   _len_and_data   s   zsockssocket._len_and_datac                 C   s   ||kr|    t||d S rE   )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 ]}z|t ||fW   S  ty!   Y qw |r,| jjr,d|fS t j|d |p3dd}|d \}}}}}|t ||d fS )Nr   )family)socketAF_INETAF_INET6	inet_ptonOSErrorrF   rC   getaddrinfo)	r#   destaddrdefaultuse_remote_dnsr_   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 }|r;| j	jr;|tkr;|| d 7 }| | td| d\}	}
}}| t|	 |
tjkr`|   t|
||fS )N)rh   r_   z!BBH     z!BBHIr6   )rm   SOCKS4_DEFAULT_DSTIPr`   ra   rW   r[   SOCKS4_VERSIONr   r   rF   rA   encoderC   sendallrX   rT   r^   SOCKS4_REPLY_VERSIONr.   r(   r]   )r#   addressis_4arf   r@   rk   rl   packetrA   version	resp_codedstportdsthostr   r   r   _setup_socks4   s   

zsockssocket._setup_socks4c                 C   s   | j |dd d S )NT)rv   )r|   r#   ru   r   r   r   _setup_socks4a   s   zsockssocket._setup_socks4ac                 C   sL  t dt}tjg}| jjr| jjr|tj	 |t dt
|7 }|t jdt
| dg|R  7 }| | | d\}}| t| |tjksW|tj	kr`| jjrW| jjs`|   ttj|tj	kr| jj }| jj }t dt}|| || | 7 }| | | d\}}| t| |tkr|   ttjd S d S )NrZ   rU   rV   r   )rW   r[   SOCKS5_VERSIONr   r   rF   rA   rB   appendr   rN   rs   rY   r^   r   r]   r3   rr   SOCKS5_USER_AUTH_VERSIONr\   SOCKS5_USER_AUTH_SUCCESSr8   )r#   rw   auth_methodsrx   methodrA   rB   statusr   r   r   _socks5_auth   s4   "





zsockssocket._socks5_authc                 C   sl  |\}}| j |d dd\}}|   d}tdttj|}|d u r6| }|tdtj	7 }|| 
|7 }n!|tjkrG|tdtj| 7 }n|tjkrW|tdtj| 7 }|td|7 }| | | d\}}	}}
| t| |	tjkr|   t|	|
tjkr| d}n|
tj	krt| d}| |}n
|
tjkr| d	}td| d
d }||fS )NT)rh   r   z!BBBrZ   z!Hr   r      r   )rm   r   rW   r[   r   r   r   rr   r   r   r\   r`   ra   r   rb   r   rs   rY   r^   r3   r(   r]   rT   r   rO   rX   )r#   ru   rf   r@   r_   rl   reservedrw   rx   r   atypealendestportr   r   r   _setup_socks5   s:   







zsockssocket._setup_socks5c                 C   sj   | j s|| |S || | j j| j jf}|dkr|d ur|S tj| jtj| jtj| j	i}|| j j
 | |S )Nr   )rF   r?   r@   r9   r:   r|   r;   r~   r<   r   r>   )r#   connect_funcru   resultsetup_funcsr   r   r   _make_proxy   s   
zsockssocket._make_proxyc                 C   s   |  tjj| d S rE   )r   r`   connectr}   r   r   r   r     s   zsockssocket.connectc                 C   s   |  tjj|S rE   )r   r`   
connect_exr}   r   r   r   r     s   zsockssocket.connect_ex)TNNrE   )F)r	   r
   r   r"   rL   rT   rY   staticmethodr\   r^   rm   r|   r~   r   r   r   r   r   r)   r   r   r&   r   rD   i   s     
	


$(rD   )collectionsr`   rW   compatr   
__author__rq   rt   r[   rp   r   r   r   r   r   r   r   rd   r   r*   r.   r3   r9   
namedtupler=   rD   r   r   r   r   <module>   s,   	
