B
    ˽eny              	   @   sz  d dl mZ yd dlmZ W n  ek
r<   d dlmZ Y nX d dlmZmZm	Z	 d dl
Z
d dlmZ d dlZd dlZd dlmZ d dlZd dlZd dlZdZejdkrejd	k ryd dlZW n ek
r   ed
Y nX eeZd ZZd ZZd ZZeeedZ e!e"e # e $ Z%ej Z&Z'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-G dd de*Z.G dd de*Z/G dd de*Z0dd d!d"Z1d#d$d%d&d'd(d)d*d+Z2ed,ed,ed-iZ3d@d/d0Z4d1d2 Z5d3d4 Z6e6Z7d5d6 Z8e8Z9dAd7d8Z:G d9d: d:ejZ;d;d< Z<xBd=D ]:Ze=e;edZ>e?e>es(e;j@Ae eBe;ee<e q(W G d>d? d?e;ZCdS )B    )	b64encode)Callable)
EOPNOTSUPPEINVALEAGAINN)BytesIO)SEEK_CURz1.7.1nt)   r   z8To run PySocks on Windows you must install win_inet_pton      r
   )SOCKS4SOCKS5HTTPc                s   t   fdd}|S )Nc           
      sp   | d }zNy$|  }|dkr&|d  | |S  tk
rR } z W d d }~X Y nX W d |dkrj|d X d S )Nr   TF)
gettimeoutsetblocking	Exception)argskwargsselfZ_is_blockinge)function H/home/ankuromar296_gmail_com/.local/lib/python3.7/site-packages/socks.pywrapper(   s    

z"set_self_blocking.<locals>.wrapper)	functoolswraps)r   r   r   )r   r   set_self_blocking&   s    r   c               @   s"   e Zd ZdZdddZdd ZdS )
ProxyErrorz4Socket_err contains original socket.error exception.Nc             C   s(   || _ || _|r$|  j d|7  _ d S )Nz: {})msg
socket_errformat)r   r   r    r   r   r   __init__;   s    zProxyError.__init__c             C   s   | j S )N)r   )r   r   r   r   __str__B   s    zProxyError.__str__)N)__name__
__module____qualname____doc__r"   r#   r   r   r   r   r   9   s   
r   c               @   s   e Zd ZdS )GeneralProxyErrorN)r$   r%   r&   r   r   r   r   r(   F   s   r(   c               @   s   e Zd ZdS )ProxyConnectionErrorN)r$   r%   r&   r   r   r   r   r)   J   s   r)   c               @   s   e Zd ZdS )SOCKS5AuthErrorN)r$   r%   r&   r   r   r   r   r*   N   s   r*   c               @   s   e Zd ZdS )SOCKS5ErrorN)r$   r%   r&   r   r   r   r   r+   R   s   r+   c               @   s   e Zd ZdS )SOCKS4ErrorN)r$   r%   r&   r   r   r   r   r,   V   s   r,   c               @   s   e Zd ZdS )	HTTPErrorN)r$   r%   r&   r   r   r   r   r-   Z   s   r-   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)[   \   ]   zGeneral SOCKS server failurez!Connection not allowed by rulesetzNetwork unreachablezHost unreachablezConnection refusedzTTL expiredz(Command not supported, or protocol errorzAddress type not supported)r   r   r
                  i8  i  Tc             C   s.   | ||||r|  nd|r"|  ndft_dS )zSets a default proxy.

    All further socksocket objects will use the default unless explicitly
    changed. All parameters are as for socket.set_proxy().N)encode
socksocketdefault_proxy)
proxy_typeaddrportrdnsusernamepasswordr   r   r   set_default_proxys   s    r?   c              O   s    d|kr| d|d< t| |S )N	proxytyper9   )popr?   )r   r   r   r   r   setdefaultproxy~   s    rB   c               C   s   t jS )z4Returns the default proxy, set by set_default_proxy.)r7   r8   r   r   r   r   get_default_proxy   s    rC   c             C   s   t jrt | j_ntddS )a  Attempts to replace a module's socket library with a SOCKS socket.

    Must set a default proxy using set_default_proxy(...) first. This will
    only work on modules that import socket directly into the namespace;
    most of the Python Standard Library falls into this category.zNo default proxy specifiedN)r7   r8   socketr(   )moduler   r   r   wrap_module   s    
rF   c
             C   s8  | \}
}|
 dr|
d}
|r4| dr4|d}d}xt||dtjD ]}|\}}}}}d}yxt|||}|	rx|	D ]}|j|  qzW t|tt	fr|
| |r||||||| |r|| ||
|f |S  tjtfk
r } z|}|r
|  d}W dd}~X Y qLX qLW |r*|tddS )a  create_connection(dest_pair, *[, timeout], **proxy_args) -> socket object

    Like socket.create_connection(), but connects to proxy
    before returning the socket object.

    dest_pair - 2-tuple of (IP/hostname, port).
    **proxy_args - Same args passed to socksocket.set_proxy() if present.
    timeout - Optional socket timeout value, in seconds.
    source_address - tuple (host, port) for the socket to bind to as its source
    address before connecting (only for compatibility)
    [z[]Nr   zgai returned empty list.)
startswithstriprD   getaddrinfoSOCK_STREAMr7   
setsockopt
isinstanceintfloat
settimeout	set_proxybindconnecterrorr   close)	dest_pairtimeoutsource_addressr9   
proxy_addr
proxy_portZ
proxy_rdnsZproxy_usernameZproxy_passwordsocket_optionsZremote_hostZremote_porterrrfamilysocket_typeproto	canonnamesasockoptr   r   r   r   create_connection   s>    





re   c               @   s   e Zd ZdZdd Ze ZdS )_BaseSocketzBAllows Python 2 delegated methods such as send() to be overridden.c             O   sH   t j| f|| t | _x(| jD ]}t| || j|< t| | q"W d S )N)_orig_socketr"   dict_savedmethods
_savenamesgetattrdelattr)r   poskwnamer   r   r   r"      s
    z_BaseSocket.__init__N)r$   r%   r&   r'   r"   listrj   r   r   r   r   rf      s   rf   c                s    fddS )Nc                s   | j   ||S )N)ri   )r   rm   rn   )ro   r   r   <lambda>       z_makemethod.<locals>.<lambda>r   )ro   r   )ro   r   _makemethod   s    rs   )sendtosendrecvfromrecvc                   s<  e Zd ZdZdZejejdf fdd	Zdd Z	 fdd	Z
d
d Zdd Zd7ddZdd Z fddZ fddZd8 fdd	Zd9 fdd	Zdd Z fddZdd  ZeZd!d" ZeZd#d$ ZeZd%d& Z fd'd(Zd)d* Zd+d, Zd-d. Zd/d0 Z e!ee"ee#e iZ$e%d: fd1d2	Z&e%d3d4 Z'd5d6 Z(  Z)S );r7   a2  socksocket([family[, type[, proto]]]) -> socket object

    Open a SOCKS enabled socket. The parameters are the same as
    those of the standard socket init. In order for SOCKS to work,
    you must specify family=AF_INET and proto=0.
    The "type" argument must be either SOCK_STREAM or SOCK_DGRAM.
    Nr   c                sp   |t jt jfkr"d}t||tt| j|||f|| d | _| j	rT| j	| _
nd| _
d | _d | _d | _d S )Nz0Socket type must be stream or datagram, not {!r})NNNNNN)rD   rK   
SOCK_DGRAM
ValueErrorr!   superr7   r"   
_proxyconnr8   proxyproxy_socknameproxy_peername_timeout)r   r^   typer`   r   r   r   )	__class__r   r   r"      s    
zsocksocket.__init__c             C   s@   d}x6t ||k r:||t | }|s0td||7 }qW |S )zReceive EXACTLY the number of bytes requested from the file object.

        Blocks until the required number of bytes have been received.rr   zConnection closed unexpectedly)lenreadr(   )r   filecountdatadr   r   r   _readall  s    zsocksocket._readallc                s@   || _ y|  }tt| | j  W n tjk
r:   Y nX d S )N)r   get_proxy_peernamerz   r7   rP   rD   rT   )r   rW   Zpeer)r   r   r   rP     s    zsocksocket.settimeoutc             C   s   | j S )N)r   )r   r   r   r   r   #  s    zsocksocket.gettimeoutc             C   s   |r|  d  n
|  d d S )Ng        )rP   )r   vr   r   r   r   &  s    zsocksocket.setblockingTc             C   s.   |||||r|  nd|r"|  ndf| _dS )a   Sets the proxy to be used.

        proxy_type -  The type of the proxy to be used. Three types
                        are supported: PROXY_TYPE_SOCKS4 (including socks4a),
                        PROXY_TYPE_SOCKS5 and PROXY_TYPE_HTTP
        addr -        The address of the server (IP or DNS).
        port -        The port of the server. Defaults to 1080 for SOCKS
                        servers and 8080 for HTTP proxy servers.
        rdns -        Should DNS queries be performed on the remote side
                       (rather than the local side). The default is True.
                       Note: This has no effect with SOCKS4 servers.
        username -    Username to authenticate with to the server.
                       The default is no authentication.
        password -    Password to authenticate with to the server.
                       Only relevant when username is also provided.N)r6   r|   )r   r9   r:   r;   r<   r=   r>   r   r   r   rQ   ,  s    zsocksocket.set_proxyc             O   s"   d|kr| d|d< | j||S )Nr@   r9   )rA   rQ   )r   r   r   r   r   r   setproxyA  s    zsocksocket.setproxyc                s   | j \}}}}}}|r"| jtjkr4tj| f||S | jrFttd|t	kr^d}	tt
|	tt| j|| |  \}
}d|f}t | _|  }| j| d}| | j||\}
}|\}}
|\}
}tt| ||f tt| | j d| _dS )zVImplements proxy connection for UDP sockets.

        Happens during the bind() phase.z"Socket already bound to an addressz'UDP only supported by SOCKS5 proxy type0   )z0.0.0.0r   N)r|   r   rD   rx   rg   rR   r{   rT   r   r   r   rz   r7   getsockname_proxy_addrrS   _SOCKS5_requestrP   r   r}   )r   rm   rn   r9   rY   rZ   r<   r=   r>   r   _r;   dstr|   ZUDP_ASSOCIATEZrelayhost)r   r   r   rR   F  s*    zsocksocket.bindc       
         s   | j tjkr$tt| j|f||S | js4| d |d }|d d }t }d}|	| d}|	| | 
|| tt| j| | f||}	|	|  S )N) r   s         )r   rD   rx   rz   r7   rt   r{   rR   r   write_write_SOCKS5_addressru   getvaluetell)
r   bytesr   r   addressflagsheaderZRSVZ
STANDALONEsent)r   r   r   rt   k  s    


zsocksocket.sendtoc                s:   | j tjkr | j||| jf|S tt| j||f|S d S )N)r   rD   rx   rt   r~   rz   r7   ru   )r   r   r   r   )r   r   r   ru     s    zsocksocket.sendc       	         s   | j tjkrtt| ||S | js.| d ttt| 	|d |}|
dt |d}t|rntd| |\}}| jr| j\}}||ks|d|fkrttd||||ffS )N)r   r   i   r   r   zReceived UDP packet fragmentr   zPacket filtered)r   rD   rx   rz   r7   rv   r{   rR   r   rw   seekr   r   ordNotImplementedError_read_SOCKS5_addressr~   rT   r   )	r   bufsizer   buffragZfromhostZfromportZpeerhostZpeerport)r   r   r   rv     s    


zsocksocket.recvfromc             O   s   | j ||\}}|S )N)rv   )r   rm   rn   r   r   r   r   r   rw     s    zsocksocket.recvc                s   | j r| j   tt|  S )N)r{   rU   rz   r7   )r   )r   r   r   rU     s    
zsocksocket.closec             C   s   | j S )z:Returns the bound IP address and port number at the proxy.)r}   )r   r   r   r   get_proxy_sockname  s    zsocksocket.get_proxy_socknamec             C   s   |   S )z>
        Returns the IP and port number of the proxy.
        )getpeername)r   r   r   r   r     s    zsocksocket.get_proxy_peernamec             C   s   | j S )zwReturns the IP address and port number of the destination machine.

        Note: get_proxy_peername returns the proxy.)r~   )r   r   r   r   get_peername  s    zsocksocket.get_peernamec             G   s   d}|  | ||\| _| _dS )z7Negotiates a stream connection through a SOCKS5 server.   N)r   r~   r}   )r   	dest_addrZCONNECTr   r   r   _negotiate_SOCKS5  s    zsocksocket._negotiate_SOCKS5c                s  | j \}}}}}}	|d}
|dd}z|r@|	r@|
d n
|
d |
  | |d}|dd dkrvtd	|dd d
kr|r|	std|
dtt|	  | tt|		  |	  |
  | |d}|dd dkrtd	|dd dkrHtdn6|dd dkrH|dd dkr@tdntd	|
d| d  | 
||
}|
  | |d}|dd dkrtd	t|dd }|dkrt|d}td||| |}tt| | j ||fS |  |
  X dS )z
        Send SOCKS5 request with given command (CMD field) and
        address (DST field). Returns resolved DST address that was used.
        wbrbr   s    s    r   r      z%SOCKS5 proxy server sent invalid data   zPNo username/password supplied. Server requested username/password authenticationr   r   zSOCKS5 authentication failed   z7All offered SOCKS5 authentication methods were rejectedr
   zUnknown errorz{:#04x}: {}N)r|   makefiler   flushr   r(   r*   chrr   r6   r   r   SOCKS5_ERRORSgetr+   r!   r   rz   r7   rP   r   rU   )r   conncmdr   r9   r:   r;   r<   r=   r>   writerreaderZchosen_authZauth_statusresolvedrespstatusrT   Zbnd)r   r   r   r     s\    

.


zsocksocket._SOCKS5_requestc          	   C   sH  |\}}| j \}}}}}}	tjdtjdi}
xrtjtjfD ]b}yDt||}||
| |  t||}|td| ||fS  tj	k
r   w8Y q8X q8W |r|
d}|dtt|
  |  nbt||tjtjtjtj}|d }|d }|d d }t||}||
| |  t||}|td| ||fS )z~
        Return the host and port packed for the SOCKS5 protocol,
        and the resolved address as a tuple object.
        r      z>Hidnar   r   r1   )r|   rD   AF_INETAF_INET6	inet_ptonr   	inet_ntopstructpackrT   r6   r   r   rJ   	AF_UNSPECrK   IPPROTO_TCPAI_ADDRCONFIG)r   r:   r   r   r;   r9   r   r<   r=   r>   Zfamily_to_byter^   
addr_bytesZ
host_bytes	addressesZtarget_addrr   r   r   r      s6    
 z socksocket._write_SOCKS5_addressc             C   s   |  |d}|dkr(t|  |d}nN|dkrN|  |d}|  |t|}n(|dkrnttj|  |d}ntdtd|  |d	d
 }||fS )Nr   r   r1   r   r      z%SOCKS5 proxy server sent invalid dataz>Hr   r   )	r   rD   	inet_ntoar   r   r   r(   r   unpack)r   r   Zatypr:   lengthr;   r   r   r   r   M  s    zsocksocket._read_SOCKS5_addressc             C   s  | j \}}}}}}| d}	| dd}
zLd}yt|}W n4 tjk
rr   |r^d}d}ntt|}Y nX |	tddd	| |	| |r|	| |	d
 |r|	|	dd
  |	
  | |
d}|dd	 d
krtdt|d	d }|dkr&t|d}td||t|dd td|dd d f| _|rjt||f| _n
||f| _W d|
  |	  X dS )z0Negotiates a connection through a SOCKS4 server.r   r   r   Fs      Tz>BBHr1   r   r   r   r5   z%SOCKS4 proxy server sent invalid datar   Z   zUnknown errorz{:#04x}: {}Nz>H)r|   r   rD   	inet_atonrT   gethostbynamer   r   r   r6   r   r   r(   r   SOCKS4_ERRORSr   r,   r!   r   r   r}   r~   rU   )r   r   	dest_portr9   r:   r;   r<   r=   r>   r   r   Zremote_resolver   r   r   rT   r   r   r   _negotiate_SOCKS4\  sH    




zsocksocket._negotiate_SOCKS4c             C   sj  | j \}}}}}}|r|nt|}d|d d t|  d d|d g}	|rv|rv|	dt|d |   |	d | d|	 | 	 }
|

 }|
  |stdy|d	d
\}}}W n tk
r   tdY nX |dstdyt|}W n tk
r$   tdY nX |dkrVd||}|dkrN|d7 }t|d| _||f| _dS )zwNegotiates a connection through an HTTP server.

        NOTE: This currently only supports HTTP CONNECT-style proxies.s   CONNECT r      :s	    HTTP/1.1s   Host: s   Proxy-Authorization: basic s   
zConnection closed unexpectedly r   z'HTTP proxy server sent invalid responsezHTTP/z0Proxy server does not appear to be an HTTP proxyz4HTTP proxy server did not return a valid HTTP status   z{}: {})i  i  i  za
[*] Note: The HTTP proxy server may not be supported by PySocks (must be a CONNECT tunnel proxy))s   0.0.0.0r   N)r|   rD   r   r6   strappendr   sendalljoinr   readlinerU   r(   splitry   rH   rN   r-   r!   r}   r~   )r   r   r   r9   r:   r;   r<   r=   r>   Zhttp_headersZfobjZstatus_liner`   status_codeZ
status_msgrT   r   r   r   _negotiate_HTTP  sB     



zsocksocket._negotiate_HTTPc          
      s$  t |dks|d dr,tdt| |\}}| jtjkr|| jsP| d t	|}|dkrn|snd| _
n
||f| _
dS | j\}}}}}	}
t|ttfrt |dks|rt|tstdtt| | j |dkr
|| _
tt| | j tt| ||f dS |  }ytt| | W nz tjk
r } zX|   |s|\}}d	||}t| }d
||}td|| t||n|W dd}~X Y nX y| j| }|| || W nb tjk
r  } z"|s|   td|n|W dd}~X Y n  tk
r   |    Y nX dS )z
        Connects to the specified destination through a proxy.
        Uses the same API as socket's connect().
        To select the proxy server, use set_proxy().

        dest_pair - 2-tuple of (IP/hostname, port).
        r   r   rG   z PySocks doesn't support IPv6: %s)r   r   z0.0.0.0Nz0Invalid destination-connection (host, port) pairz{}:{}zError connecting to {} proxy {}z%s due to: %szSocket error)r   rH   rD   rT   r   r   rx   r{   rR   r   r~   r|   rM   rp   tuplerN   r(   rz   r7   rP   r   rS   r   rU   r!   PRINTABLE_PROXY_TYPESlogdebugr)   _proxy_negotiatorsr   )r   rV   catch_errorsr   r   r9   rY   rZ   r<   r=   r>   rT   Zproxy_serverZprintable_typer   Z	negotiate)r   r   r   rS     sd    	





zsocksocket.connectc          
   C   sH   y| j |dd dS  tk
rB } z|jr0|jS  W dd}~X Y nX dS )a&   https://docs.python.org/3/library/socket.html#socket.socket.connect_ex
        Like connect(address), but return an error indicator instead of raising an exception for errors returned by the C-level connect() call (other problems, such as "host not found" can still raise exceptions).
        T)r   r   N)rS   OSErrorerrno)r   rV   r   r   r   r   
connect_ex6  s    zsocksocket.connect_exc             C   s4   | j \}}}}}}|pt|}|s,td||fS )zD
        Return proxy address to connect to as tuple object
        zInvalid proxy type)r|   DEFAULT_PORTSr   r(   )r   r9   rY   rZ   r<   r=   r>   r   r   r   r   F  s
    zsocksocket._proxy_addr)NNNTNN)r   )r   )N)*r$   r%   r&   r'   r8   rD   r   rK   r"   r   rP   r   r   rQ   r   rR   rt   ru   rv   rw   rU   r   Zgetproxysocknamer   Zgetproxypeernamer   r   r   r   r   r   r   r   r   r   r   r   r   rS   r   r   __classcell__r   r   )r   r   r7      sH   	 
%b-<<\r7   )NNNTNN)	NNNNNTNNN)Dbase64r   collections.abcr   ImportErrorcollectionsr   r   r   r   r   ior   loggingosr   rD   r   sys__version__ro   version_infoZwin_inet_pton	getLoggerr$   r   ZPROXY_TYPE_SOCKS4r   ZPROXY_TYPE_SOCKS5r   ZPROXY_TYPE_HTTPr   ZPROXY_TYPESrh   zipvalueskeysr   Z
_orgsocketrg   r   IOErrorr   r(   r)   r*   r+   r,   r-   r   r   r   r?   rB   rC   ZgetdefaultproxyrF   Z
wrapmodulere   rf   rs   rk   methodrM   rj   r   setattrr7   r   r   r   r   <module>   s   

 

    
8
