
    Ϫf                        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 )NZ   r   )portip)	transportgetPeerr   	makeReplyr   host	otherConn)r   peers     r   connectionMadezSOCKSv4Outgoing.connectionMade   sC    ~~%%'

Rtyy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$   &    

tT"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  rd| 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~~b7I 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    >>NN  &88d?dhhqrl"!XXbq\488AB<ND$("(--Ra"AGT4!XX^^GQ7ND$(AayO+Qq	W0D
 $((*-DH#'88>>'1#= LL((0d114$MIJ))$q)4gtT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!QqT1Q4/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    . !|=3g==|~~dFD$7NN219!!&$FALLTEFQY  $:D&IAMMPQ!3D6:;;xx3S BT$((^ SSr   c                 f    | j                   r%| j                   j                  j                          y y r
   )r   r   r   r   s     r   r!   zSOCKSv4.connectionLost   s$    >>NN$$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!    VT4)	
 r   c                 X    t        j                  t        |g| j                  ||      S r
   )r   ClientCreatorr   
connectTCP)r   r   r   klassargss        r   ra   zSOCKSv4.connectClass   s'    %%gu<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      ud|4}}T\\^AB/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    KK58H8H8LL	
 B;NN))+ 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    fs1vo 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
	
 3BibctAGGFKK$=q A3G#MNGGR#a&[A%+, tAw<!#GGCLGGAJ	
 GGDM  	
		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    7dggDGJJ  Q'"4::..WW]JJ  Q'DG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   