U
    h{                     @   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_secretZ_dc_idpacket_codecheader_encrypt_decrypt)self
connection r   J/tmp/pip-unpacked-wheel-c81u5j2r/telethon/network/connection/tcpmtproxy.py__init__   s      zMTProxyIO.__init__c                 C   s  t | dko| d dk}t|t}|r2|s2td|rB| dd  n| } t | dkrZtdd}td	}|d d
kr^|d d |kr^|dd dkr^qq^t|}|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   @         s       7         (   8       0   <      littleT)signed>   )len
issubclassr   
ValueErrorosurandom	bytearrayhashlibsha256bytesdigestr   Zobfuscate_tagto_bytesencrypt)secretdc_idr   Zis_ddZis_rand_codeckeywordsrandomZrandom_reversedZencrypt_keyZ
encrypt_ivZdecrypt_keyZ
decrypt_ivZ	encryptorZ	decryptorZdc_id_bytesr   r   r   r       sN     


zMTProxyIO.init_headerc                    s   | j | j|I d H S r
   )r   r6   r   readexactly)r   nr   r   r   r;   L   s    zMTProxyIO.readexactlyc                 C   s   | j | j| d S r
   )r   writer   r6   )r   datar   r   r   r=   O   s    zMTProxyIO.write)
__name__
__module____qualname____doc__r   r   staticmethodr   r;   r=   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portr8   rG   rE   rF   Z
proxy_hostZ
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 n8 tjk
rJ   Y n$ tk
rl   tdI d H  Y nX | j	 r| 
 I d H  tdd S )N)timeoutsslrE   r'   z9Proxy closed the connection after sending initial payload)rJ   _connectasynciowait_forr   Z_wait_for_dataTimeoutError	ExceptionsleepZat_eofZ
disconnectConnectionError)r   rO   rP   rM   r   r   rQ   j   s    	
zTcpMTProxy._connectc                 C   s   | d krt d| d d S )Nz.No proxy info specified for MTProxy connectionr'   )r-   )Z
proxy_infor   r   r   rH      s    zTcpMTProxy.address_infoc                 C   sp   | d d dkr| dd  } zt | }W n8 tk
rb   | dt|  d   } t|  }Y nX |d d S )Nr'   )eedd=r   r   )r3   fromhexr-   r+   base64	b64decodeencode)r7   Zsecret_bytesr   r   r   rI      s    zTcpMTProxy.normalize_secret)NN)r?   r@   rA   rB   r   r	   Zobfuscated_ior   rQ   rC   rH   rI   __classcell__r   r   rM   r   rD   S   s   
rD   c                   @   s   e Zd ZdZeZdS )ConnectionTcpMTProxyAbridgedz2
    Connect to proxy using abridged protocol
    N)r?   r@   rA   rB   r   r   r   r   r   r   r`      s   r`   c                   @   s   e Zd ZdZeZdS ) ConnectionTcpMTProxyIntermediatez6
    Connect to proxy using intermediate protocol
    N)r?   r@   rA   rB   r   r   r   r   r   r   ra      s   ra   c                   @   s   e Zd ZdZeZdS )*ConnectionTcpMTProxyRandomizedIntermediatezN
    Connect to proxy using randomized intermediate protocol (dd-secrets)
    N)r?   r@   rA   rB   r   r   r   r   r   r   rb      s   rb   )rR   r1   r\   r.   r   r   Ztcpabridgedr   Ztcpintermediater   r   Zcryptor   r	   rD   r`   ra   rb   r   r   r   r   <module>   s   C@