Ë
    ojù  ã                   ó  — d Z ddlZddlZddlZddlZddlmZmZmZ ddl	m
Z
  G d„ dej                  «      Z G d„ dej                  «      Z G d	„ d
ej                  «      Z G d„ dej                  «      Z G d„ dej                  «      Zy)z)
Implementation of the SOCKSv4 protocol.
é    N)ÚdeferÚprotocolÚreactor)Úlogc                   ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚSOCKSv4Outgoingc                 ó   — || _         y ©N)Úsocks©Úselfr   s     ú9/usr/lib/python3/dist-packages/twisted/protocols/socks.pyÚ__init__zSOCKSv4Outgoing.__init__   s	   € Øˆ�
ó    c                 óÀ   — | j                   j                  «       }| j                  j                  dd|j                  |j
                  ¬«       | | j                  _        y )NéZ   r   )ÚportÚip)Ú	transportÚgetPeerr   Ú	makeReplyr   ÚhostÚ	otherConn)r   Úpeers     r   ÚconnectionMadezSOCKSv4Outgoing.connectionMade   sC   € Ø�~‰~×%Ñ%Ó'ˆØ�
‰
×Ñ˜R ¨¯©°t·y±yÐÔAØ#ˆ�
‰
Õr   c                 óL   — | j                   j                  j                  «        y r
   ©r   r   ÚloseConnection©r   Úreasons     r   ÚconnectionLostzSOCKSv4Outgoing.connectionLost   ó   € Ø�
‰
×Ñ×+Ñ+Õ-r   c                 ó:   — | j                   j                  |«       y r
   ©r   Úwrite©r   Údatas     r   ÚdataReceivedzSOCKSv4Outgoing.dataReceived!   ó   € Ø�
‰
×Ñ˜Õr   c                 ór   — | j                   j                  | |«       | j                  j                  |«       y r
   ©r   r   r   r%   r&   s     r   r%   zSOCKSv4Outgoing.write$   ó&   € Ø�
‰
�‰�t˜TÔ"Ø�‰×Ñ˜TÕ"r   N)Ú__name__Ú
__module__Ú__qualname__r   r   r!   r(   r%   © r   r   r   r      s   „ òò$ò
.òó#r   r   c                   ó$   — e Zd Zd„ Zd„ Zd„ Zd„ Zy)ÚSOCKSv4Incomingc                 ó4   — || _         | | j                   _        y r
   )r   r   r   s     r   r   zSOCKSv4Incoming.__init__*   s   € ØˆŒ
Ø#ˆ�
‰
Õr   c                 óL   — | j                   j                  j                  «        y r
   r   r   s     r   r!   zSOCKSv4Incoming.connectionLost.   r"   r   c                 ó:   — | j                   j                  |«       y r
   r$   r&   s     r   r(   zSOCKSv4Incoming.dataReceived1   r)   r   c                 ór   — | j                   j                  | |«       | j                  j                  |«       y r
   r+   r&   s     r   r%   zSOCKSv4Incoming.write4   r,   r   N)r-   r.   r/   r   r!   r(   r%   r0   r   r   r2   r2   )   s   „ ò$ò.òó#r   r2   c                   óZ   — e Zd ZdZdefd„Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zdd„Zd„ Zd„ Zy)ÚSOCKSv4aË  
    An implementation of the SOCKSv4 protocol.

    @type logging: L{str} or L{None}
    @ivar logging: If not L{None}, the name of the logfile to which connection
        information will be written.

    @type reactor: object providing L{twisted.internet.interfaces.IReactorTCP}
    @ivar reactor: The reactor used to create connections.

    @type buf: L{str}
    @ivar buf: Part of a SOCKSv4 connection request.

    @type otherConn: C{SOCKSv4Incoming}, C{SOCKSv4Outgoing} or L{None}
    @ivar otherConn: Until the connection has been established, C{otherConn} is
        L{None}. After that, it is the proxy-to-destination protocol instance
        along which the client's connection is being forwarded.
    Nc                 ó    — || _         || _        y r
   )Úloggingr   )r   r:   r   s      r   r   zSOCKSv4.__init__M   s   € ØˆŒØˆ�r   c                 ó    — d| _         d | _        y )Nr   )Úbufr   )r   s    r   r   zSOCKSv4.connectionMadeQ   s   € ØˆŒØˆ�r   c                 ó  — | j                   r| j                   j                  |«       y| j                  |z   | _        | j                  }d| j                  dd v �r,| j                  dd | j                  dd c}| _        t        j                  d|dd «      \  }}}| j                  j                  dd«      \  }| _        |dd dk(  r‘|dd dk7  r‰d| j                  vr|| _        y| j                  j                  dd«      \  }| _        | j                  j                  |«      }	|	j                  | j                  ||||«       |	j                  | fd	„«       yt        j                  |dd «      }| j                  |||||«       yy)
z‡
        Called whenever data is received.

        @type data: L{bytes}
        @param data: Part or all of a SOCKSv4 packet.
        Nó    é   ú!BBHé   é   é   s      c                 ó$   — |j                  d«      S ©Né[   ©r   ©Úresultr   s     r   ú<lambda>z&SOCKSv4.dataReceived.<locals>.<lambda>p   s   € °t·~±~ÀbÓ7I€ r   )r   r%   r<   ÚstructÚunpackÚsplitr   ÚresolveÚaddCallbackÚ_dataReceived2Ú
addErrbackÚsocketÚ	inet_ntoa)
r   r'   ÚcompleteBufferÚheadÚversionÚcoder   ÚuserÚserverÚds
             r   r(   zSOCKSv4.dataReceivedU   sa  € ð �>Š>Ø�N‰N× Ñ  Ô&ØØ—8‘8˜d‘?ˆŒØŸ™ˆØ�d—h‘h˜q˜r�lÒ"Ø!ŸX™X b q˜\¨4¯8©8°A°B¨<ˆNˆD�$”(Ü"(§-¡-°¸¸R¸a¸Ó"AÑˆG�T˜4Ø!ŸX™XŸ^™^¨G°QÓ7‰NˆD�$”(Ø�A�aˆy˜OÒ+°°Q°q°	¸WÒ0Dð
  $§(¡(Ñ*Ø-�D”HØØ#'§8¡8§>¡>°'¸1Ó#=Ñ �˜œØ—L‘L×(Ñ(¨Ó0�Ø—‘˜d×1Ñ1°4¸À$ÈÔMØ—‘°ÒIÔJØä×)Ñ)¨$¨q°¨)Ó4�à×Ñ ¨¨g°t¸TÕBð) #r   c                 óª  — |dk(  s
J d|z  «       ‚| j                  ||||«      s| j                  d«       y|dk(  r-| j                  ||t        | «      }|j	                  | fd„«       n@|dk(  r-| j                  dt        | |«      }|j                  | fd	„«       nt        d
|› �«      ‚| j                  dk(  sJ dt        | j                  «      z  «       ‚y)a4  
        The second half of the SOCKS connection setup. For a SOCKSv4 packet this
        is after the server address has been extracted from the header. For a
        SOCKSv4a packet this is after the host name has been resolved.

        @type server: L{str}
        @param server: The IP address of the destination, represented as a
            dotted quad.

        @type user: L{str}
        @param user: The username associated with the connection.

        @type version: L{int}
        @param version: The SOCKS protocol version number.

        @type code: L{int}
        @param code: The command code. 1 means establish a TCP/IP stream
            connection, and 2 means establish a TCP/IP port binding.

        @type port: L{int}
        @param port: The port number associated with the connection.
        rA   zBad version code: %srF   NrB   c                 ó$   — |j                  d«      S rE   rG   rH   s     r   rJ   z(SOCKSv4._dataReceived2.<locals>.<lambda>”   s   € °4·>±>À"Ó3E€ r   é   r   c                 ó6   — |j                  dd| d   | d   «      S )Nr   r   rB   rG   )Úxr   s     r   rJ   z(SOCKSv4._dataReceived2.<locals>.<lambda>—   s   € ¨t¯~©~¸bÀ!ÀQÀqÁTÈ1ÈQÉ4Ó/P€ r   zBad Connect Code: r   z hmm, still stuff in buffer... %s)Ú	authorizer   ÚconnectClassr   rQ   ÚlistenClassÚSOCKSv4IncomingFactoryrO   ÚRuntimeErrorr<   Úrepr)r   rY   rX   rV   rW   r   rZ   s          r   rP   zSOCKSv4._dataReceived2w   sË   € ð. ˜!Š|Ð=Ð3°gÑ=Ó=ˆ|Ø�~‰~˜d F¨D°$Ô7Ø�N‰N˜2ÔØØ�1Š9Ø×!Ñ! &¨$´ÀÓFˆAØ�L‰L¨TÒEÕFØ�QŠYØ× Ñ  Ô$:¸DÀ&ÓIˆAØ�M‰M¨ÒPÕQäÐ!3°D°6Ð:Ó;Ð;Ø�x‰x˜3ŠÐSÐ BÄTÈ$Ï(É(Ã^Ñ SÓS‰r   c                 óf   — | j                   r%| j                   j                  j                  «        y y r
   )r   r   r   r   s     r   r!   zSOCKSv4.connectionLostœ   s$   € Ø�>Š>Ø�N‰N×$Ñ$×3Ñ3Õ5ð r   c                 óH   — t        j                  d|›d|›d|›d|›d�	«       y)Nzcode z connection to ú:z (user z) authorizedrB   )r   Úmsg)r   rW   rY   r   rX   s        r   r`   zSOCKSv4.authorize    s!   € Ü�Šâ’VšT¢4ð)ô	
ð r   c                 óX   — t        j                  t        |g|¢­Ž j                  ||«      S r
   )r   ÚClientCreatorr   Ú
connectTCP)r   r   r   ÚklassÚargss        r   ra   zSOCKSv4.connectClass§   s'   € Ü×%Ñ%¤g¨uÐ<°tÒ<×GÑGÈÈdÓSÐSr   c                 ó€   — t        j                  | ||Ž «      }t        j                  |j	                  «       dd  «      S )NrB   )r   Ú	listenTCPr   ÚsucceedÚgetHost)r   r   rm   rn   Úservs        r   rb   zSOCKSv4.listenClassª   s4   € Ü× Ñ  ¡u¨d |Ó4ˆÜ�}‰}˜TŸ\™\›^¨A¨BÐ/Ó0Ð0r   c                 óÒ   — | j                   j                  t        j                  d|||«      t	        j
                  |«      z   «       |dk7  r| j                   j                  «        y y )Nr@   r   )r   r%   rK   ÚpackrR   Ú	inet_atonr   )r   ÚreplyrV   r   r   s        r   r   zSOCKSv4.makeReply®   sT   € Ø�‰×ÑÜ�K‰K˜ ¨°Ó5¼×8HÑ8HÈÓ8LÑLô	
ð �BŠ;Ø�N‰N×)Ñ)Õ+ð r   c                 ó^   — | j                  | |«       | j                  j                  |«       y r
   )r   r   r%   r&   s     r   r%   zSOCKSv4.writeµ   s"   € Ø�‰��tÔØ�‰×Ñ˜TÕ"r   c           	      ó4  — | j                   sy | j                  j                  «       }| j                  j                  j                  «       }t	        | j                   d«      }|j                  dt        j                  «       |j                  |j                  || k(  xr dxs d|j                  |j                  fz  «       |rµ|d d |dd  }}|j                  t        j                  t        d„ |«      d«      dz   «       |j                  dt        |«      z
  dz  dz  «       |D ]<  }t        t        |«      «      dkD  r|j                  d	«       Œ,|j                  |«       Œ> |j                  d
«       |rŒµ|j                  d
«       |j                  «        y )NÚaz%s	%s:%d %s %s:%d
ú<ú>é   c                 ó   — dt        | «      z  S )Nz%02X)Úord)r_   s    r   rJ   zSOCKSv4.log.<locals>.<lambda>Ì   s   € ¨f´s¸1³v©o€ r   ú é   ú.ú
)r:   r   r   r   Úopenr%   ÚtimeÚctimer   r   ÚstringÚjoinÚmapÚlenre   Úclose)r   Úprotor'   r   Ú
their_peerÚfÚpÚcs           r   r   zSOCKSv4.log¹   sN  € Ø�|Š|ØØ�~‰~×%Ñ%Ó'ˆØ—^‘^×-Ñ-×5Ñ5Ó7ˆ
Ü�—‘˜sÓ#ˆØ	�‰Ø"ä—
‘
“Ø—	‘	Ø—	‘	Ø˜4‘-Ò' CÒ/¨CØ—‘Ø—‘ðñô
	
ñ Ø˜3˜B�i  b c ˆtˆAØ�G‰G”F—K‘K¤Ñ$=¸qÓ AÀ3ÓGÈ#ÑMÔNØ�G‰G�Rœ#˜a›&‘[ AÑ%¨Ñ+Ô,Øò �Ü”t˜A“w“< !Ò#Ø—G‘G˜C•Là—G‘G˜A•Jð	ð
 �G‰G�DŒMò ð 	
�‰�ŒØ	�‰�	r   )r   r   z0.0.0.0)r-   r.   r/   Ú__doc__r   r   r   r(   rP   r!   r`   ra   rb   r   r%   r   r0   r   r   r8   r8   9   sJ   „ ñð&  $¨Wó òò CòD#TòJ6òòTò1ó,ò#ór   r8   c                   ó   — e Zd ZdZd„ Zd„ Zy)ÚSOCKSv4Factoryz`
    A factory for a SOCKSv4 proxy.

    Constructor accepts one argument, a log file name.
    c                 ó   — || _         y r
   )r:   )r   r   s     r   r   zSOCKSv4Factory.__init__ß   s	   € Øˆ�r   c                 ó6   — t        | j                  t        «      S r
   )r8   r:   r   ©r   Úaddrs     r   ÚbuildProtocolzSOCKSv4Factory.buildProtocolâ   s   € Ü�t—|‘|¤WÓ-Ð-r   N©r-   r.   r/   r‘   r   r˜   r0   r   r   r“   r“   Ø   s   „ ñòó.r   r“   c                   ó   — e Zd ZdZd„ Zd„ Zy)rc   zJ
    A utility class for building protocols for incoming connections.
    c                 ó    — || _         || _        y r
   )r   r   )r   r   r   s      r   r   zSOCKSv4IncomingFactory.__init__ë   s   € ØˆŒ
Øˆ�r   c                 óþ   — |d   | j                   k(  r8d| _         | j                  j                  dd«       t        | j                  «      S | j                   dk(  ry | j                  j                  dd«       d| _         y )Nr   Ú r   rF   )r   r   r   r2   r–   s     r   r˜   z$SOCKSv4IncomingFactory.buildProtocolï   sh   € Ø�‰7�d—g‘gÒØˆDŒGØ�J‰J× Ñ   QÔ'Ü" 4§:¡:Ó.Ð.Ø�W‰W˜Š]Øà�J‰J× Ñ   QÔ'ØˆDŒGØr   Nr™   r0   r   r   rc   rc   æ   s   „ ñòó
r   rc   )r‘   rR   r‡   rK   r…   Útwisted.internetr   r   r   Útwisted.pythonr   ÚProtocolr   r2   r8   ÚFactoryr“   rc   r0   r   r   ú<module>r¢      s‚   ðñ
ó Û ó Û ÷ 6Ñ 5Ý ô#�h×'Ñ'ô #ô(#�h×'Ñ'ô #ô \ˆh×Ñô \ô~.�X×%Ñ%ô .ô˜X×-Ñ-õ r   