U
    
W[JE  ã                   @   sº   d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ G d	d
„ d
ejƒZG dd„ dƒ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_
Tests for L{twisted.protocol.socks}, an implementation of the SOCKSv4 and
SOCKSv4a protocols.
é    N)ÚdeferÚaddress)ÚDNSLookupError)Ú	iterbytes)Úsocks)Úproto_helpers)Úunittestc                   @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ ZdS )	ÚStringTCPTransportFNc                 C   s   | j S )N)Úpeer©Úself© r   ú9/usr/lib/python3/dist-packages/twisted/test/test_socks.pyÚgetPeer   s    zStringTCPTransport.getPeerc                 C   s   t  ddd¡S )NÚTCPz2.3.4.5é*   )r   ÚIPv4Addressr   r   r   r   ÚgetHost   s    zStringTCPTransport.getHostc                 C   s
   d| _ d S )NT)ÚstringTCPTransport_closingr   r   r   r   ÚloseConnection   s    z!StringTCPTransport.loseConnection)Ú__name__Ú
__module__Ú__qualname__r   r
   r   r   r   r   r   r   r   r	      s
   r	   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚFakeResolverReactorzP
    Bare-bones reactor with deterministic behavior for the resolve method.
    c                 C   s
   || _ dS )zÃ
        @type names: L{dict} containing L{str} keys and L{str} values.
        @param names: A hostname to IP address mapping. The IP addresses are
            stringified dotted quads.
        N)Únames)r   r   r   r   r   Ú__init__(   s    zFakeResolverReactor.__init__c              
   C   sD   zt  | j| ¡W S  tk
r>   t  td| d¡ ƒ¡ Y S X dS )zQ
        Resolve a hostname by looking it up in the C{names} dictionary.
        z"FakeResolverReactor couldn't find zutf-8N)r   Úsucceedr   ÚKeyErrorZfailr   Údecode)r   Zhostnamer   r   r   Úresolve1   s    ÿÿzFakeResolverReactor.resolveN)r   r   r   Ú__doc__r   r   r   r   r   r   r   $   s   	r   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚSOCKSv4DriverNc                 G   s:   ||Ž }t ƒ |_t d||¡|j_| ¡  || _t |¡S )Nr   )	r	   Ú	transportr   r   r
   ÚconnectionMadeÚdriver_outgoingr   r   )r   ZhostÚportÚklassÚargsÚprotor   r   r   ÚconnectClassE   s    zSOCKSv4Driver.connectClassc                 G   s(   ||Ž }|| _ |dkrd}t d|f¡S )Nr   éÒ  ú6.7.8.9)Údriver_listenr   r   )r   r%   r&   r'   Úfactoryr   r   r   ÚlistenClassO   s
    zSOCKSv4Driver.listenClass)r   r   r   r$   r,   r)   r.   r   r   r   r   r!   >   s   
r!   c                   @   sP   e Zd Z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„ ZdS )ÚConnectTestszV
    Tests for SOCKS and SOCKSv4a connect requests using the L{SOCKSv4} protocol.
    c                 C   s0   t ƒ | _tƒ | j_| j ¡  tddiƒ| j_d S ©Ns	   localhostú	127.0.0.1©r!   Úsockr	   r"   r#   r   Zreactorr   r   r   r   ÚsetUp]   s    

zConnectTests.setUpc                 C   s$   | j j}|d k	r |  |jjd¡ d S )Nz-Outgoing SOCKS connections need to be closed.)r3   r$   Ú
assertTruer"   r   )r   Zoutgoingr   r   r   ÚtearDownd   s
    
ÿzConnectTests.tearDownc              	   C   sÖ   | j  t dddd¡t d¡ d d ¡ | j j ¡ }| j j ¡  |  	|t ddd	d¡t d¡ ¡ |  
| j jj¡ |  | j j¡ | j  d
¡ |  	| j jj ¡ d
¡ | j j d¡ |  	| j j ¡ d¡ | j  d¡ d S )Nú!BBHé   é   é"   ú1.2.3.4ó   fooBARó    r   éZ   ó   hello, worldó   hi thereúfake reason)r3   ÚdataReceivedÚstructÚpackÚsocketÚ	inet_atonr"   ÚvalueÚclearÚassertEqualÚassertFalser   ÚassertIsNotNoner$   ÚconnectionLost)r   Úsentr   r   r   Útest_simplek   s2    ÿþýÿÿÿÿzConnectTests.test_simplec              	   C   sè   t  dddd¡t d¡ d d }t|ƒD ]}| j |¡ q*| jj ¡ }| jj 	¡  |  
|t  ddd	d¡t d
¡ ¡ |  | jjj¡ |  | jj¡ | j d¡ |  
| jjj ¡ d¡ | jj d¡ |  
| jj ¡ d¡ | j d¡ dS )áu  
        If the destination IP address has zeros for the first three octets and
        non-zero for the fourth octet, the client is attempting a v4a
        connection.  A hostname is specified after the user ID string and the
        server connects to the address that hostname resolves to.

        @see: U{http://en.wikipedia.org/wiki/SOCKS#SOCKS_4a_protocol}
        r7   r8   r9   r:   ú0.0.0.1ó   fooBAZ ó
   localhost r   r>   r1   r?   r@   rA   N)rC   rD   rE   rF   r   r3   rB   r"   rG   rH   rI   rJ   r   rK   r$   rL   ©r   ÚclientRequestÚbyterM   r   r   r   Ú test_socks4aSuccessfulResolution…   s4    ÿþýÿ	þ ÿz-ConnectTests.test_socks4aSuccessfulResolutionc              	   C   sŒ   t  dddd¡t d¡ d d }t|ƒD ]}| j |¡ q*| jj ¡ }|  	|t  ddd	d¡t d
¡ ¡ |  
| jjj¡ |  | jj¡ dS )ú‹
        Failed hostname resolution on a SOCKSv4a packet results in a 91 error
        response and the connection getting closed.
        r7   r8   r9   r:   rP   rQ   ó   failinghost r   é[   ú0.0.0.0N©rC   rD   rE   rF   r   r3   rB   r"   rG   rI   r5   r   ÚassertIsNoner$   rS   r   r   r   Útest_socks4aFailedResolution´   s"    ÿþýÿ	þz)ConnectTests.test_socks4aFailedResolutionc              	   C   s‚   dd„ | j _| j  t dddd¡t d¡ d d	 ¡ |  | j j 	¡ t dd
dd
¡t d¡ ¡ |  
| j jj¡ |  | j j¡ d S )Nc                 S   s   dS ©Nr   r   ©ÚcodeZserverr%   Úuserr   r   r   Ú<lambda>Ò   ó    z0ConnectTests.test_accessDenied.<locals>.<lambda>r7   r8   r9   é’  ú10.2.3.4r<   r=   r   rY   rZ   )r3   Ú	authorizerB   rC   rD   rE   rF   rI   r"   rG   r5   r   r\   r$   r   r   r   r   Útest_accessDeniedÑ   s"    ÿþýÿÿÿzConnectTests.test_accessDeniedc                 C   sx   | j  t dddd¡t d¡ d d ¡ | j j ¡  | j  d¡ |  | j j	j 
¡ d¡ | j j	j ¡  | j j	 d	¡ d S ©
Nr7   r8   r9   r:   r;   r<   r=   r?   rA   )r3   rB   rC   rD   rE   rF   r"   rH   rI   r$   rG   r   rL   r   r   r   r   Útest_eofRemoteß   s     ÿþýÿÿzConnectTests.test_eofRemotec                 C   sh   | j  t dddd¡t d¡ d d ¡ | j j ¡  | j  d¡ |  | j j	j 
¡ d¡ | j  d	¡ d S rh   )r3   rB   rC   rD   rE   rF   r"   rH   rI   r$   rG   rL   r   r   r   r   Útest_eofLocalñ   s    ÿþýÿÿzConnectTests.test_eofLocalN)r   r   r   r    r4   r6   rN   rV   r]   rg   ri   rj   r   r   r   r   r/   Y   s   /r/   c                   @   sP   e Zd Z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„ ZdS )Ú	BindTestszS
    Tests for SOCKS and SOCKSv4a bind requests using the L{SOCKSv4} protocol.
    c                 C   s0   t ƒ | _tƒ | j_| j ¡  tddiƒ| j_d S r0   r2   r   r   r   r   r4     s    

zBindTests.setUpc              	   C   s@  | j  t dddd¡t d¡ d d ¡ | j j ¡ }| j j ¡  |  	|t ddd	d
¡t d¡ ¡ |  
| j jj¡ |  | j j¡ | j j d¡}|  |¡ tƒ |_| ¡  | j j ¡ }| j j ¡  |  	|t ddd	d¡t d¡ ¡ |  
| j jj¡ | j  d¡ |  	|j ¡ d¡ | d¡ |  	| j j ¡ d¡ | j  d¡ d S )Nr7   r8   é   r:   r;   r<   r=   r   r>   r*   r+   ©r;   éá  rZ   r?   r@   rA   )r3   rB   rC   rD   rE   rF   r"   rG   rH   rI   rJ   r   rK   r,   ÚbuildProtocolr	   r#   rL   ©r   rM   Úincomingr   r   r   rN     sJ    ÿþýÿÿÿ
ÿÿÿ
zBindTests.test_simplec              	   C   sT  t  dddd¡t d¡ d d }t|ƒD ]}| j |¡ q*| jj ¡ }| jj 	¡  |  
|t  ddd	d
¡t d¡ ¡ |  | jjj¡ |  | jj¡ | jj d¡}|  |¡ tƒ |_| ¡  | jj ¡ }| jj 	¡  |  
|t  ddd	d¡t d¡ ¡ |  | jjjd¡ | j d¡ |  
|j ¡ d¡ | d¡ |  
| jj ¡ d¡ | j d¡ dS )rO   r7   r8   rl   r:   rP   rQ   rR   r   r>   r*   r+   )r1   rn   rZ   Nr@   rA   )rC   rD   rE   rF   r   r3   rB   r"   rG   rH   rI   rJ   r   rK   r,   ro   r	   r#   ZassertIsNotrL   )r   rT   rU   rM   rq   r   r   r   Útest_socks4a<  sL    ÿþýÿ	þ
ÿÿ ÿ
zBindTests.test_socks4ac              	   C   sŒ   t  dddd¡t d¡ d d }t|ƒD ]}| j |¡ q*| jj ¡ }|  	|t  ddd	d¡t d
¡ ¡ |  
| jjj¡ |  | jj¡ dS )rW   r7   r8   rl   r:   rP   rQ   rX   r   rY   rZ   Nr[   rS   r   r   r   r]   x  s"    ÿþýÿ	þz&BindTests.test_socks4aFailedResolutionc              	   C   s‚   dd„ | j _| j  t dddd¡t d¡ d d	 ¡ |  | j j 	¡ t dd
dd
¡t d¡ ¡ |  
| j jj¡ |  | j j¡ d S )Nc                 S   s   dS r^   r   r_   r   r   r   rb   –  rc   z-BindTests.test_accessDenied.<locals>.<lambda>r7   r8   rl   rd   re   r<   r=   r   rY   rZ   )r3   rf   rB   rC   rD   rE   rF   rI   r"   rG   r5   r   r\   r,   r   r   r   r   rg   •  s"    ÿþýÿÿÿzBindTests.test_accessDeniedc              	   C   sê   | j  t dddd¡t d¡ d d ¡ | j j ¡ }| j j ¡  | j j	 
d¡}|  |¡ tƒ |_| ¡  | j j ¡ }| j j ¡  |  |t dd	d
d	¡t d¡ ¡ |  | j jj¡ | j  d¡ |  |j ¡ d¡ |j ¡  | d¡ d S ©Nr7   r8   rl   r:   r;   r<   r=   rm   r   r>   rZ   r?   rA   )r3   rB   rC   rD   rE   rF   r"   rG   rH   r,   ro   rK   r	   r#   rI   rJ   r   r   rL   rp   r   r   r   ri   £  s:    ÿþýÿ
ÿÿÿ
zBindTests.test_eofRemotec              	   C   sâ   | j  t dddd¡t d¡ d d ¡ | j j ¡ }| j j ¡  | j j	 
d¡}|  |¡ tƒ |_| ¡  | j j ¡ }| j j ¡  |  |t dd	d
d	¡t d¡ ¡ |  | j jj¡ | j  d¡ |  |j ¡ d¡ | j  d¡ d S rs   )r3   rB   rC   rD   rE   rF   r"   rG   rH   r,   ro   rK   r	   r#   rI   rJ   r   rL   rp   r   r   r   rj   Ä  s8    ÿþýÿ
ÿÿÿzBindTests.test_eofLocalc              	   C   s¨   | j  t dddd¡t d¡ d d ¡ | j j ¡ }| j j ¡  | j j	 
d¡}|  |¡ | j j ¡ }| j j ¡  |  |t dd	d
d	¡t d¡ ¡ |  | j jj¡ d S )Nr7   r8   rl   r:   r;   r<   r=   )z1.6.6.6iš  r   rY   rZ   )r3   rB   rC   rD   rE   rF   r"   rG   rH   r,   ro   r\   rI   r5   r   rp   r   r   r   Útest_badSourceä  s*    ÿþýÿ
ÿÿzBindTests.test_badSourceN)r   r   r   r    r4   rN   rr   r]   rg   ri   rj   rt   r   r   r   r   rk     s   (<! rk   )r    rC   rE   Ztwisted.internetr   r   Ztwisted.internet.errorr   Ztwisted.python.compatr   Ztwisted.protocolsr   Ztwisted.testr   Ztwisted.trialr   ZStringTransportr	   r   ZSOCKSv4r!   ZTestCaser/   rk   r   r   r   r   Ú<module>   s    +