o
    Xzj{  ã                   @   s¦   d dl Z d dlZd dlZd dlZddlmZ ddlmZ ddlm	Z	m
Z
 ddlm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dS )é    Né   )ÚObfuscatedConnection)ÚAbridgedPacketCodec)ÚIntermediatePacketCodecÚ!RandomizedIntermediatePacketCodecé   )Ú
AESModeCTRc                   @   s8   e Zd ZdZdZdd„ Zedd„ ƒZdd„ Zd	d
„ Z	dS )Ú	MTProxyIOzŒ
    It's very similar to tcpobfuscated.ObfuscatedIO, but the way
    encryption keys, protocol tag and dc_id are encoded is different.
    Nc                 C   s4   |j | _ |j| _|  |j|j|j¡\| _| _| _d S ©N)	Ú_readerÚ_writerÚinit_headerÚ_secretÚ_dc_idÚpacket_codecÚheaderÚ_encryptÚ_decrypt)ÚselfÚ
connection© r   úa/var/www/kodo/tsheker/venv/lib/python3.10/site-packages/telethon/network/connection/tcpmtproxy.pyÚ__init__   s   ÿþzMTProxyIO.__init__c                 C   s‚  t | ƒdko| d dk}t|tƒ}|r|stdƒ‚|r!| dd … n| } t | ƒdkr-tdƒ‚d}	 t d
¡}|d dkrL|d d… |vrL|dd… dkrLnq0t|ƒ}|ddd… }t t	|dd… ƒ|  ¡ 
¡ }t	|dd… ƒ}	t t	|d d… ƒ|  ¡ 
¡ }
t	|dd… ƒ}t||	ƒ}t|
|ƒ}|j|dd…< |jddd	d�}|d d… | |dd …  }| t	|ƒ¡dd
… |dd
…< |||fS )Né   r   éÝ   z7Only RandomizedIntermediate can be used with dd-secretsr   é   z9MTProxy secret must be a hex-string representing 16 bytes)s   PVrGs   GET s   POSTs   îîîîTé@   éï   é   s       é7   é   éÿÿÿÿé   é(   é8   é    é0   é<   é   Úlittle)Úsignedé>   )ÚlenÚ
issubclassr   Ú
ValueErrorÚosÚurandomÚ	bytearrayÚhashlibÚsha256ÚbytesÚdigestr   Úobfuscate_tagÚto_bytesÚencrypt)ÚsecretÚdc_idr   Úis_ddÚis_rand_codecÚkeywordsÚrandomÚrandom_reversedÚencrypt_keyÚ
encrypt_ivÚdecrypt_keyÚ
decrypt_ivÚ	encryptorÚ	decryptorÚdc_id_bytesr   r   r   r       sT   ÿÿÿ
ûÿÿÿÿ


zMTProxyIO.init_headerc                 Ã   s   �| j  | j |¡I d H ¡S r
   )r   r8   r   Úreadexactly)r   Únr   r   r   rG   L   s   €zMTProxyIO.readexactlyc                 C   s   | j  | j |¡¡ d S r
   )r   Úwriter   r8   )r   Údatar   r   r   rI   O   s   zMTProxyIO.write)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ústaticmethodr   rG   rI   r   r   r   r   r	      s    	
+r	   c                       sV   e Zd ZdZdZeZdddœ‡ fdd„
Zd‡ fdd„	Ze	dd	„ ƒZ
e	d
d„ ƒZ‡  ZS )Ú
TcpMTProxyaŽ  
    Connector which allows user to connect to the Telegram via proxy servers
    commonly known as MTProxy.
    Implemented very ugly due to the leaky abstractions in Telethon networking
    classes that should be refactored later (TODO).

    .. warning::

        The support for TcpMTProxy classes is **EXPERIMENTAL** and prone to
        be changed. You shouldn't be using this class yet.
    N)ÚproxyÚ
local_addrc          	         s6   |   |¡\}}|  |d ¡| _tƒ j||||d� d S )Nr(   )Úloggers)Úaddress_infoÚnormalize_secretr   Úsuperr   )	r   ÚipÚportr:   rS   rQ   rR   Ú
proxy_hostÚ
proxy_port©Ú	__class__r   r   r   c   s
   
ÿzTcpMTProxy.__init__c                 ƒ   s�   �t ƒ j||d�I d H  zt | j d¡d¡I d H  W n tjy%   Y n ty5   t d¡I d H  Y nw | j 	¡ rF|  
¡ I d H  tdƒ‚d S )N)ÚtimeoutÚsslrQ   r(   z9Proxy closed the connection after sending initial payload)rV   Ú_connectÚasyncioÚwait_forr   Ú_wait_for_dataÚTimeoutErrorÚ	ExceptionÚsleepÚat_eofÚ
disconnectÚConnectionError)r   r]   r^   r[   r   r   r_   j   s   €	ÿ
ÿþzTcpMTProxy._connectc                 C   s   | d u rt dƒ‚| d d… S )Nz.No proxy info specified for MTProxy connectionr(   )r.   )Ú
proxy_infor   r   r   rT   €   s   zTcpMTProxy.address_infoc                 C   sn   | d d… dv r| dd … } zt  | ¡}W n ty0   | dt| ƒ d   } t |  ¡ ¡}Y nw |d d… S )Nr(   )ÚeeÚddú=r   r   )r4   Úfromhexr.   r,   Úbase64Ú	b64decodeÚencode)r9   Úsecret_bytesr   r   r   rU   †   s   þzTcpMTProxy.normalize_secret)NN)rK   rL   rM   rN   r   r	   Úobfuscated_ior   r_   rO   rT   rU   Ú__classcell__r   r   r[   r   rP   S   s    
rP   c                   @   ó   e Zd ZdZeZdS )ÚConnectionTcpMTProxyAbridgedz2
    Connect to proxy using abridged protocol
    N)rK   rL   rM   rN   r   r   r   r   r   r   ru   “   ó    ru   c                   @   rt   )Ú ConnectionTcpMTProxyIntermediatez6
    Connect to proxy using intermediate protocol
    N)rK   rL   rM   rN   r   r   r   r   r   r   rw   š   rv   rw   c                   @   rt   )Ú*ConnectionTcpMTProxyRandomizedIntermediatezN
    Connect to proxy using randomized intermediate protocol (dd-secrets)
    N)rK   rL   rM   rN   r   r   r   r   r   r   rx   ¡   rv   rx   )r`   r2   rn   r/   r   r   Útcpabridgedr   Útcpintermediater   r   Úcryptor   r	   rP   ru   rw   rx   r   r   r   r   Ú<module>   s    C@