3
b`"                 @   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j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   AC:\Users\Broad\Desktop\BeinConnetFix\binaries\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 j|pd}tt| j|| 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j ||}tt| j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   r0   T   s   r0   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   r6   e   s   r6   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   rA   r    )r!   argskwargs)r$   r   r   r    p   s    zsockssocket.__init__TNc             C   s0   |t jt jt jfkstt||||||| _d S )N)r6   r7   r8   r9   AssertionErrorr:   rB   )r!   Z	proxytypeaddrr=   Zrdnsr>   r?   r   r   r   setproxyt   s    zsockssocket.setproxyc             C   sN   d}xDt ||k rH| j|t | }|s>tdj|t | ||7 }qW |S )N    z{0} bytes missing)lenrecvEOFErrorr(   )r!   cntdatacurr   r   r   recvally   s    zsockssocket.recvallc             C   s   | j |}tdj||S )Nz!{0}B)rO   r   r(   )r!   rL   rM   r   r   r   _recv_bytes   s    
zsockssocket._recv_bytesc             C   s   t dt| |  S )Nz!B)r   rI   )rM   r   r   r   _len_and_data   s    zsockssocket._len_and_datac             C   s   ||kr| j   t||d S )N)closer'   )r!   r)   r*   r   r   r   _check_response_version   s    z#sockssocket._check_response_versionc             C   sF   y
t j|S  t jk
r@   |r,| jjr,|S t jt j|S Y nX d S )N)socket	inet_atonerrorrB   r@   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jd}||d 7 }|rh| jj	rh||jdd 7 }| j
| td| jd\}}	}
}| jt| |	tjkr| j  t|	||
fS )N)rZ   z!BBH zutf-8    z!BBHIr3   )r[   SOCKS4_DEFAULT_DSTIPr   SOCKS4_VERSIONr
   r   rB   r>   encoder@   sendallr   rO   rS   SOCKS4_REPLY_VERSIONr+   r%   rR   )r!   addressis_4arX   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)rd   )rh   )r!   rc   r   r   r   _setup_socks4a   s    zsockssocket._setup_socks4ac             C   sH  t dt}tjg}| jjr.| jjr.|jtj |t dt	|7 }|t dj
t	|f| 7 }| j| | jd\}}| jt| |tjks|tjkr| jj s| jj r| j  ttj|tjkrD| jjjd}| jjjd}t dt}|| j|| j| 7 }| j| | jd\}}| jt| |tkrD| j  ttjd S )Nz!Bz!{0}Br   zutf-8)r   SOCKS5_VERSIONr   r   rB   r>   r?   appendr   rI   r(   ra   rP   rS   r   rR   r0   r`   SOCKS5_USER_AUTH_VERSIONrQ   SOCKS5_USER_AUTH_SUCCESSr5   )r!   rf   Zauth_methodsrg   methodr>   r?   statusr   r   r   _socks5_auth   s0    






zsockssocket._socks5_authc             C   s8  |\}}| j |d dd}| j  d}tdttj|}|d krf|jd}|tdtj7 }|| j	|7 }n|tdtj
| 7 }|td|7 }| j| | jd\}}}}	| jt| |tjkr| j  t||	tj
kr| jd}n<|	tjkrt| jd	}
| j|
}n|	tjkr| jd
}td| jdd }||fS )NT)rZ   r   z!BBBzutf-8z!Bz!Hr   r      r   )r[   rp   r   rj   r   r   r`   r   r   rQ   r   ra   rP   rS   r0   r%   rR   rO   r   rJ   r   r   )r!   rc   rX   r=   re   reservedrf   rg   ro   ZatypeZ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   )rB   r<   r=   r6   r7   rh   r8   ri   r9   rs   r;   )r!   Zconnect_funcrc   resultZsetup_funcsr   r   r   _make_proxy   s    
zsockssocket._make_proxyc             C   s   | j tjj| d S )N)ru   rT   connect)r!   rc   r   r   r   rv     s    zsockssocket.connectc             C   s   | j tjj|S )N)ru   rT   
connect_ex)r!   rc   r   r   r   rw     s    zsockssocket.connect_ex)TNN)F)r   r   r   r    rG   rO   rP   staticmethodrQ   rS   r[   rh   ri   rp   rs   ru   rv   rw   r&   r   r   )r$   r   rA   o   s   
		
$&rA   )r;   r<   r=   r>   r?   r@   )
__future__r   collectionsrT   compatr   r   r   
__author__r_   rb   r^   rj   rl   rm   objectr
   r   r   r   rV   r   r'   r+   r0   r6   
namedtupler:   rA   r   r   r   r   <module>   s,   	
