o
    b                     @   s   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 dejZG dd dejZG d	d
 d
ejZG dd dejZG dd dejZdS )z)
Implementation of the SOCKSv4 protocol.
    N)deferprotocolreactor)logc                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )SOCKSv4Outgoingc                 C   
   || _ d S N)socksselfr	    r   9/usr/lib/python3/dist-packages/twisted/protocols/socks.py__init__      
zSOCKSv4Outgoing.__init__c                 C   s.   | j  }| jjdd|j|jd | | j_d S )NZ   r   )portip)	transportgetPeerr	   	makeReplyr   host	otherConn)r   peerr   r   r   connectionMade   s   
zSOCKSv4Outgoing.connectionMadec                 C      | j j  d S r   r	   r   loseConnectionr   reasonr   r   r   connectionLost      zSOCKSv4Outgoing.connectionLostc                 C      | j | d S r   r	   writer   datar   r   r   dataReceived!   r    zSOCKSv4Outgoing.dataReceivedc                 C      | j | | | j| d S r   r	   r   r   r#   r$   r   r   r   r#   $      zSOCKSv4Outgoing.writeN)__name__
__module____qualname__r   r   r   r&   r#   r   r   r   r   r      s    r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
SOCKSv4Incomingc                 C   s   || _ | | j _d S r   )r	   r   r
   r   r   r   r   *   s   zSOCKSv4Incoming.__init__c                 C   r   r   r   r   r   r   r   r   .   r    zSOCKSv4Incoming.connectionLostc                 C   r!   r   r"   r$   r   r   r   r&   1   r    zSOCKSv4Incoming.dataReceivedc                 C   r'   r   r(   r$   r   r   r   r#   4   r)   zSOCKSv4Incoming.writeN)r*   r+   r,   r   r   r&   r#   r   r   r   r   r-   )   s
    r-   c                   @   sp   e Zd ZdZdefddZdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd ZdddZdd Zdd ZdS )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                 C      || _ || _d S r   )loggingr   )r   r0   r   r   r   r   r   M      
zSOCKSv4.__init__c                 C   s   d| _ d | _d S )N    )bufr   )r   r   r   r   r   Q   r1   zSOCKSv4.connectionMadec           
      C   s2  | j r| j | dS | j| | _| j}d| jdd v r| jdd | jdd }| _td|dd \}}}| jdd\}| _|dd dkr|dd dkrd| jvr^|| _dS | jdd\}| _| j|}	|	| j	|||| |	
| fd	d
 dS t|dd }| 	||||| dS dS )z
        Called whenever data is received.

        @type data: L{bytes}
        @param data: Part or all of a SOCKSv4 packet.
        N       !BBH         s      c                 S   
   | dS N[   r   resultr   r   r   r   <lambda>p      
 z&SOCKSv4.dataReceived.<locals>.<lambda>)r   r#   r3   structunpacksplitr   resolveaddCallback_dataReceived2
addErrbacksocket	inet_ntoa)
r   r%   completeBufferheadversioncoder   userserverdr   r   r   r&   U   s*     
zSOCKSv4.dataReceivedc                 C   s   |dks
J d| |  ||||s| d dS |dkr/| ||t| }|| fdd n|dkrE| d	t| |}|| fd
d ntd| | j	dksZJ dt
| j	 dS )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.
        r7   zBad version code: %sr<   Nr8   c                 S   r:   r;   r=   r>   r   r   r   r@      rA   z(SOCKSv4._dataReceived2.<locals>.<lambda>   r   c                 S   s   | dd| d | d S )Nr   r   r8   r=   )xr   r   r   r   r@      s    zBad Connect Code: r2   z hmm, still stuff in buffer... %s)	authorizer   connectClassr   rH   listenClassSOCKSv4IncomingFactoryrF   RuntimeErrorr3   repr)r   rP   rO   rM   rN   r   rQ   r   r   r   rG   w   s   
 zSOCKSv4._dataReceived2c                 C   s   | j r| j j  d S d S r   )r   r   r   r   r   r   r   r      s   zSOCKSv4.connectionLostc                 C   s   t d||||f  dS )Nz0code %s connection to %s:%s (user %s) authorizedr8   )r   msg)r   rN   rP   r   rO   r   r   r   rT      s   
zSOCKSv4.authorizec                 G   s   t jt|g|R  ||S r   )r   ClientCreatorr   
connectTCP)r   r   r   klassargsr   r   r   rU      s   zSOCKSv4.connectClassc                 G   s&   t ||| }t| dd  S )Nr8   )r   	listenTCPr   succeedgetHost)r   r   r]   r^   servr   r   r   rV      s   zSOCKSv4.listenClassr   0.0.0.0c                 C   s<   | j td|||t|  |dkr| j   d S d S )Nr6   r   )r   r#   rB   packrI   	inet_atonr   )r   replyrM   r   r   r   r   r   r      s   zSOCKSv4.makeReplyc                 C   s   |  | | | j| d S r   )r   r   r#   r$   r   r   r   r#      s   zSOCKSv4.writec              	   C   s
  | j sd S | j }| jj }t| j d}|dt |j|j	|| kr&dp'd|j|j	f  |rz|d d |dd  }}|t
tdd |dd  |dt| d	 d  |D ]}tt|d	krm|d
 q]|| q]|d |s1|d |  d S )Naz%s	%s:%d %s %s:%d
<>   c                 S   s   dt |  S )Nz%02X)ord)rS   r   r   r   r@      s    zSOCKSv4.log.<locals>.<lambda>    .
)r0   r   r   r   openr#   timectimer   r   stringjoinmaplenrY   close)r   protor%   r   
their_peerfpcr   r   r   r      s8   
 


zSOCKSv4.log)r   r   rc   )r*   r+   r,   __doc__r   r   r   r&   rG   r   rT   rU   rV   r   r#   r   r   r   r   r   r.   9   s    "%
r.   c                   @       e Zd ZdZdd Zdd ZdS )SOCKSv4Factoryz`
    A factory for a SOCKSv4 proxy.

    Constructor accepts one argument, a log file name.
    c                 C   r   r   )r0   )r   r   r   r   r   r      r   zSOCKSv4Factory.__init__c                 C   s   t | jtS r   )r.   r0   r   r   addrr   r   r   buildProtocol   s   zSOCKSv4Factory.buildProtocolNr*   r+   r,   r}   r   r   r   r   r   r   r      s    r   c                   @   r~   )rW   zJ
    A utility class for building protocols for incoming connections.
    c                 C   r/   r   )r	   r   )r   r	   r   r   r   r   r      r1   zSOCKSv4IncomingFactory.__init__c                 C   sR   |d | j krd| _ | jdd t| jS | j dkrd S | jdd d| _ d S )Nr    r   r<   )r   r	   r   r-   r   r   r   r   r      s   

z$SOCKSv4IncomingFactory.buildProtocolNr   r   r   r   r   rW      s    rW   )r}   rI   rs   rB   rq   twisted.internetr   r   r   twisted.pythonr   Protocolr   r-   r.   Factoryr   rW   r   r   r   r   <module>   s     