a G2]ny @srddlmZzddlmZWney:ddlmZYn0ddlmZmZm Z ddl Z ddl m Z ddl Z ddlZddlmZddlZddlZddlZdZejdkrejd krz ddlZWneyed Yn0e eZd ZZd ZZd ZZeeedZ e!e"e #e $Z%ejZ&Z'ddZ(Gddde)Z*Gddde*Z+Gddde*Z,Gddde*Z-Gddde*Z.Gddde*Z/Gddde*Z0dd d!d"Z1d#d$d%d&d'd(d)d*d+Z2ed,ed,ed-iZ3d@d/d0Z4d1d2Z5d3d4Z6e6Z7d5d6Z8e8Z9dAd7d8Z:Gd9d:d:ejZ;d;d<Ze?e>es"e;j@AeeBe;eed?d?e;ZCdS)B) b64encode)Callable) EOPNOTSUPPEINVALEAGAINN)BytesIO)SEEK_CURz1.7.1nt)rz8To run PySocks on Windows you must install win_inet_ptonr )SOCKS4SOCKS5HTTPcstfdd}|S)Nc s|d}z|z>|}|dkr&|d|i|WW|dkrH|dStyn}zWYd}~n d}~00W|dkr|dn|dkr|d0dS)NrTF) gettimeout setblocking Exception)argskwargsselfZ _is_blockingefunction)/usr/lib/python3.9/site-packages/socks.pywrapper(s   z"set_self_blocking..wrapper) functoolswraps)rrrrrset_self_blocking&s rc@s"eZdZdZdddZddZdS) ProxyErrorz4Socket_err contains original socket.error exception.NcCs(||_||_|r$|jd|7_dS)Nz: {})msg socket_errformat)rr r!rrr__init__;szProxyError.__init__cCs|jSN)r rrrr__str__BszProxyError.__str__)N)__name__ __module__ __qualname____doc__r#r&rrrrr9s rc@s eZdZdS)GeneralProxyErrorNr'r(r)rrrrr+Fsr+c@s eZdZdS)ProxyConnectionErrorNr,rrrrr-Jsr-c@s eZdZdS)SOCKS5AuthErrorNr,rrrrr.Nsr.c@s eZdZdS) SOCKS5ErrorNr,rrrrr/Rsr/c@s eZdZdS) SOCKS4ErrorNr,rrrrr0Vsr0c@s eZdZdS) HTTPErrorNr,rrrrr1Zsr1zRequest 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)[\]zGeneral SOCKS server failurez!Connection not allowed by rulesetzNetwork unreachablezHost unreachablezConnection refusedz TTL expiredz(Command not supported, or protocol errorzAddress type not supported)r r r i8iTcCs.|||||r|nd|r"|ndft_dS)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_typeaddrportrdnsusernamepasswordrrrset_default_proxyssrCcOs$d|vr|d|d<t|i|SNZ proxytyper=)poprC)rrrrrsetdefaultproxy~srFcCstjS)z4Returns the default proxy, set by set_default_proxy.)r;r<rrrrget_default_proxysrGcCstjrt|j_ntddS)aAttempts 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.zNo default proxy specifiedN)r;r<socketr+)modulerrr wrap_modules rJc  Cs8|\} } | dr| d} |r4|dr4|d}d} t||dtjD]} | \}}}}}d}zzt|||}| r| D]}|j|qvt|tt fr| ||r| |||||||r| || | | f|WStjtfy}z"|} |r|d}WYd}~qJd}~00qJ| r*| tddS)acreate_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[]Nrzgai returned empty list.) startswithstriprH getaddrinfo SOCK_STREAMr;Z setsockopt isinstanceintfloat settimeout set_proxybindconnecterrorrclose) dest_pairtimeoutZsource_addressr= proxy_addr proxy_portZ proxy_rdnsZproxy_usernameZproxy_passwordZsocket_optionsZ remote_hostZ remote_porterrrfamilyZ socket_typeprotoZ canonnameZsaZsockoptrrrrcreate_connections@         rbc@seZdZdZddZeZdS) _BaseSocketzBAllows Python 2 delegated methods such as send() to be overridden.cOsJtj|g|Ri|t|_|jD]}t|||j|<t||q&dSr$) _orig_socketr#dict _savedmethods _savenamesgetattrdelattr)rposkwnamerrrr#s  z_BaseSocket.__init__N)r'r(r)r*r#listrgrrrrrcsrccs fddS)Ncs|j|i|Sr$)rf)rrjrkrlrrz_makemethod..rrnrrnr _makemethodsrq)sendtosendrecvfromrecvcs<eZdZdZdZejejdffdd ZddZ fdd Z d d Z d d Z d7ddZ ddZfddZfddZd8fdd Zd9fdd ZddZfddZdd ZeZd!d"ZeZd#d$ZeZd%d&Zfd'd(Zd)d*Zd+d,Zd-d.Zd/d0Z e!ee"ee#e iZ$e%d:fd1d2 Z&e%d3d4Z'd5d6Z(Z)S);r;a2socksocket([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. Nrcsv|tjtjfvr"d}t||tt|j|||g|Ri|d|_|j rZ|j |_ nd|_ d|_ d|_ d|_ dS)Nz0Socket type must be stream or datagram, not {!r})NNNNNN)rHrO SOCK_DGRAM ValueErrorr"superr;r# _proxyconnr<proxyproxy_socknameproxy_peername_timeout)rr_typer`rrr  __class__rrr#s" zsocksocket.__init__cCs<d}t||kr8||t|}|s.td||7}q|S)zReceive EXACTLY the number of bytes requested from the file object. Blocks until the required number of bytes have been received.rpConnection closed unexpectedly)lenreadr+)rfilecountdatadrrr_readalls  zsocksocket._readallcs>||_z|}tt||jWntjy8Yn0dSr$)r}get_proxy_peernamerxr;rSrHrW)rrZZpeerrrrrSs zsocksocket.settimeoutcCs|jSr$)r}r%rrrr#szsocksocket.gettimeoutcCs|r|dn |ddS)Ng)rS)rvrrrr&s zsocksocket.setblockingTcCs.|||||r|nd|r"|ndf|_dS)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)r:rz)rr=r>r?r@rArBrrrrT,szsocksocket.set_proxycOs&d|vr|d|d<|j|i|SrD)rErT)rrrrrrsetproxyAszsocksocket.setproxycs|j\}}}}}}|r"|jtjkr:tj|g|Ri|S|jrLttd|t krdd} tt | t t |j|i|| \} } d| f} t|_|} |j| d}||j|| \} }| \}} |\} } t t ||| ft t ||jd|_dS)zVImplements proxy connection for UDP sockets. Happens during the bind() phase.z"Socket already bound to an addressz'UDP only supported by SOCKS5 proxy type0)0.0.0.0rN)rzr~rHrvrdrUryrWrrrrxr;Z getsockname _proxy_addrrV_SOCKS5_requestrSr}r{)rrjrkr=r[r\r@rArBr _r?dstrzZ UDP_ASSOCIATEZrelayhostrrrrUFs.     zsocksocket.bindc s|jtjkr*tt|j|g|Ri|S|js:|d|d}|dd}t}d}| |d}| || ||tt|j | |g|Ri|} | | S)Nrs)r~rHrvrxr;rrryrUrwrite_write_SOCKS5_addressrsgetvaluetell) rbytesrrZaddressflagsheaderZRSVZ STANDALONEsentrrrrrks       zsocksocket.sendtoc sB|jtjkr$|j|||jfi|Stt|j||fi|SdSr$)r~rHrvrrr|rxr;rs)rrrrrrrrss zsocksocket.sendc s|jtjkrtt|||S|js.|dttt| |d|}| dt | d}t |rntd||\}}|jr|j\}}||ks|d|fvrttd| |||ffS)Nrir r zReceived UDP packet fragmentrzPacket filtered)r~rHrvrxr;rtryrUrruseekrrordNotImplementedError_read_SOCKS5_addressr|rWr) rbufsizerbuffragZfromhostZfromportZpeerhostZpeerportrrrrts      zsocksocket.recvfromcOs|j|i|\}}|Sr$)rt)rrjrkrrrrrruszsocksocket.recvcs|jr|jtt|Sr$)ryrXrxr;r%rrrrXs zsocksocket.closecCs|jS)z:Returns the bound IP address and port number at the proxy.)r{r%rrrget_proxy_socknameszsocksocket.get_proxy_socknamecCs|S)z> Returns the IP and port number of the proxy. ) getpeernamer%rrrrszsocksocket.get_proxy_peernamecCs|jS)zwReturns the IP address and port number of the destination machine. Note: get_proxy_peername returns the proxy.)r|r%rrr get_peernameszsocksocket.get_peernamecGsd}||||\|_|_dS)z7Negotiates a stream connection through a SOCKS5 server.N)rr|r{)r dest_addrZCONNECTrrr_negotiate_SOCKS5szsocksocket._negotiate_SOCKS5cs|j\}}}}}} |d} |dd} z|r@| r@| dn | d| || d} | dddkrvtd | ddd kr|r| std | d tt| |tt|  | | || d} | ddd krtd | ddd krHtdn6| ddd krH| dddkr@tdntd | d|d | || }| || d}|dddkrtd t |dd}|dkrt |d}td|||| }tt||j||fW| | S| | 0dS)z Send SOCKS5 request with given command (CMD field) and address (DST field). Returns resolved DST address that was used. wbrbrssr r %SOCKS5 proxy server sent invalid datazPNo username/password supplied. Server requested username/password authenticationrrzSOCKS5 authentication failedz7All offered SOCKS5 authentication methods were rejectedr Unknown error {:#04x}: {}N)rzmakefilerflushrr+r.chrrr:rr SOCKS5_ERRORSgetr/r"rrxr;rSr}rX)rZconncmdrr=r>r?r@rArBwriterreaderZ chosen_authZ auth_statusZresolvedrespstatusrWZbndrrrrsz            zsocksocket._SOCKS5_requestc CsJ|\}}|j\}}}}}} tjdtjdi} tjtjfD]h} zJt| |} || | | t| | }|td|||fWStj yYq6Yq60q6|r| d} |dt t |  | nbt ||tjtjtjtj}|d}|d} |dd}t| |} || | | t| | }|td|||fS)z~ Return the host and port packed for the SOCKS5 protocol, and the resolved address as a tuple object. r>Hidnarrr5)rzrHAF_INETAF_INET6Z inet_ptonr inet_ntopstructpackrWr:rrrNZ AF_UNSPECrOZ IPPROTO_TCPZ AI_ADDRCONFIG)rr>rrr?r=rr@rArBZfamily_to_byter_ addr_bytesZ host_bytesZ addressesZ target_addrrrrr s8         z socksocket._write_SOCKS5_addresscCs||d}|dkr(t||d}nN|dkrN||d}||t|}n(|dkrnttj||d}ntdtd||d d }||fS) Nr rr5rrrrr r) rrH inet_ntoarrrr+runpack)rrZatypr>lengthr?rrrrMs  zsocksocket._read_SOCKS5_addresscCs|j\}}}}}}|d} |dd} zZd} zt|} Wn2tjyp|r\d} d} ntt|} Yn0| tddd || | |r| || d | r| | d d | | | d } | dd d krt d t | d d}|dkr$t|d}td||t| ddtd| dddf|_| rht| |f|_n ||f|_W| | n| | 0dS)z0Negotiates a connection through a SOCKS4 server.rrrFsTz>BBHr5r rrr9z%SOCKS4 proxy server sent invalid datar ZrrNr)rzrrHZ inet_atonrW gethostbynamerrrr:rrr+r SOCKS4_ERRORSrr0r"rrr{r|rX)rr dest_portr=r>r?r@rArBrrZremote_resolverrrrWrrr_negotiate_SOCKS4\sR           zsocksocket._negotiate_SOCKS4cCsf|j\}}}}}}|r|nt|}d|ddt|dd|dg} |rv|rv| dt|d|| d|d| | } | } | | st dz| d d \} } }Wntyt d Yn0| d st d z t| } Wnty tdYn0| dkrRd| |}| dvrJ|d7}t|d|_||f|_dS)zwNegotiates a connection through an HTTP server. NOTE: This currently only supports HTTP CONNECT-style proxies.sCONNECT r:s HTTP/1.1sHost: sProxy-Authorization: basic s r r z'HTTP proxy server sent invalid responsezHTTP/z0Proxy server does not appear to be an HTTP proxyz4HTTP proxy server did not return a valid HTTP statusz{}: {})iiiza [*] Note: The HTTP proxy server may not be supported by PySocks (must be a CONNECT tunnel proxy))s0.0.0.0rN)rzrHrr:strappendrZsendalljoinrreadlinerXr+splitrwrLrQr1r"r{r|)rrrr=r>r?r@rArBZ http_headersZfobjZ status_liner`Z status_codeZ status_msgrWrrr_negotiate_HTTPsR          zsocksocket._negotiate_HTTPc s&t|dks|ddr,tdt||\}}|jtjkr||jsP|dt |}|dkrn|snd|_ n ||f|_ dS|j \}}}}} } t |t tfrt|dks|rt |tstdtt||j|dur ||_ tt||jtt|||fdS|}ztt||Wn|tjy} z`||s|\}}d ||} t|} d | | }td || t|| n| WYd} ~ nd} ~ 00z|j|}||||Wnbtjy} z*|s|td | n| WYd} ~ n&d} ~ 0ty |Yn0dS) 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 rrKz PySocks doesn't support IPv6: %srrNz0Invalid destination-connection (host, port) pairz{}:{}zError connecting to {} proxy {}z %s due to: %sz Socket error)rrLrHrWrr~rvryrUrr|rzrPrmtuplerQr+rxr;rSr}rVrrXr"PRINTABLE_PROXY_TYPESlogdebugr-_proxy_negotiatorsr)rrY catch_errorsrrr=r[r\r@rArBrWZ proxy_serverZprintable_typer Z negotiaterrrrVst             zsocksocket.connectc CsXz|j|ddWdStyR}z&|jr<|jWYd}~SWYd}~n d}~00dS)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)rrN)rVOSErrorerrno)rrYrrrr connect_ex6szsocksocket.connect_excCs4|j\}}}}}}|pt|}|s,td||fS)zD Return proxy address to connect to as tuple object zInvalid proxy type)rz DEFAULT_PORTSrr+)rr=r[r\r@rArBrrrrFs zsocksocket._proxy_addr)NNNTNN)r)r)N)*r'r(r)r*r<rHrrOr#rrSrrrTrrUrrrsrtrurXrZgetproxysocknamerZgetproxypeernamerrrrrrrrr rrrrrVrr __classcell__rrrrr;sP   %   b-<<\ r;)NNNTNN) NNNNNTNNN)Dbase64rcollections.abcr ImportError collectionsrrrrriorZloggingosrrHrsys __version__rl version_infoZ win_inet_ptonZ getLoggerr'rZPROXY_TYPE_SOCKS4r ZPROXY_TYPE_SOCKS5rZPROXY_TYPE_HTTPrZ PROXY_TYPESrezipvalueskeysrZ _orgsocketrdrIOErrorrr+r-r.r/r0r1rrrrCrFrGZgetdefaultproxyrJZ wrapmodulerbrcrqrhmethodrPrgrsetattrr;rrrrs                =