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   ú<C:\Users\Broad\Desktop\All-Down\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 )Ú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+   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!   Ú	proxytypeÚaddrr=   Ú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)rQ   r   r(   )r!   rN   rO   r   r   r   Ú_recv_bytes‚   s    
zsockssocket._recv_bytesc             C   s   t dt| ƒƒ|  S )Nz!B)r   rK   )rO   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)r\   z!BBHÚ zutf-8ó    z!BBHIr3   )r]   ÚSOCKS4_DEFAULT_DSTIPr   ÚSOCKS4_VERSIONr
   r   rB   r>   Úencoder@   Úsendallr   rQ   rU   ÚSOCKS4_REPLY_VERSIONr+   r%   rT   )r!   ÚaddressÚis_4arZ   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)rf   )rj   )r!   re   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   rK   r(   rc   rR   rU   r   rT   r0   rb   ÚSOCKS5_USER_AUTH_VERSIONrS   ÚSOCKS5_USER_AUTH_SUCCESSr5   )r!   rh   Zauth_methodsri   Ú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)r\   r   z!BBBzutf-8z!Bz!Hr   r   é   r   )r]   rr   r   rl   r   r   rb   r   r   rS   r   rc   rR   rU   r0   r%   rT   rQ   r   rL   r   r   )r!   re   rZ   r=   rg   Úreservedrh   ri   rq   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   rj   r8   rk   r9   ru   r;   )r!   Zconnect_funcre   ÚresultZsetup_funcsr   r   r   Ú_make_proxyþ   s    
zsockssocket._make_proxyc             C   s   | j tjj|ƒ d S )N)rw   rV   Úconnect)r!   re   r   r   r   rx     s    zsockssocket.connectc             C   s   | j tjj|ƒS )N)rw   rV   Ú
connect_ex)r!   re   r   r   r   ry     s    zsockssocket.connect_ex)TNN)F)r   r   r   r    rI   rQ   rR   ÚstaticmethodrS   rU   r]   rj   rk   rr   ru   rw   rx   ry   r&   r   r   )r$   r   rA   o   s   
		
$&rA   )r;   r<   r=   r>   r?   r@   )Ú
__future__r   ÚcollectionsrV   Úcompatr   r   r   Ú
__author__ra   rd   r`   rl   rn   ro   Úobjectr
   r   r   r   rX   r   r'   r+   r0   r6   Ú
namedtupler:   rA   r   r   r   r   Ú<module>   s,   	
