U
    ¦y^�"  ã                   @   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   úCC:\Users\TaGoRe\Desktop\beinconnect-dl\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  |¡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 )Ú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   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   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   )rD   r=   r>   r7   r8   rn   r9   rp   r:   rz   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   rz   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*   	
