U
    Â“«jXD  ã                   @   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)ÚaddressÚdefer)ÚDNSLookupError)Úsocks)Ú	iterbytes)Ú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   ú;/tmp/pip-unpacked-wheel-59kc99xd/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   Úhostnamer   r   r   Úresolve/   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   ÚhostÚportÚklassÚargsÚprotor   r   r   ÚconnectClassD   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   ÚlistenClassM   s
    zSOCKSv4Driver.listenClass)r   r   r   r%   r.   r+   r0   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.)r5   r%   Ú
assertTruer#   r   )r   Úoutgoingr   r   r   ÚtearDowna   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)r5   ÚdataReceivedÚstructÚpackÚsocketÚ	inet_atonr#   ÚvalueÚclearÚassertEqualÚassertFalser   ÚassertIsNotNoner%   ÚconnectionLost)r   Úsentr   r   r   Útest_simplei   s,    ÿþýÿ ÿ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}
        r:   r;   r<   r=   ú0.0.0.1ó   fooBAZ ó
   localhost r   rA   r3   rB   rC   rD   N)rF   rG   rH   rI   r   r5   rE   r#   rJ   rK   rL   rM   r   rN   r%   rO   ©r   ÚclientRequestÚbyterP   r   r   r   Ú test_socks4aSuccessfulResolution‚   s.    ÿþýÿ
 ÿ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.
        r:   r;   r<   r=   rS   rT   ó   failinghost r   é[   ú0.0.0.0N©rF   rG   rH   rI   r   r5   rE   r#   rJ   rL   r7   r   ÚassertIsNoner%   rV   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   ©ÚcodeÚserverr'   Úuserr   r   r   Ú<lambda>Î   ó    z0ConnectTests.test_accessDenied.<locals>.<lambda>r:   r;   r<   é’  ú10.2.3.4r?   r@   r   r\   r]   )r5   Ú	authorizerE   rF   rG   rH   rI   rL   r#   rJ   r7   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 ©
Nr:   r;   r<   r=   r>   r?   r@   rB   rD   )r5   rE   rF   rG   rH   rI   r#   rK   rL   r%   rJ   r   rO   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 rl   )r5   rE   rF   rG   rH   rI   r#   rK   rL   r%   rJ   rO   r   r   r   r   Útest_eofLocalí   s    ÿþýÿzConnectTests.test_eofLocalN)r   r   r   r!   r6   r9   rQ   rY   r`   rk   rm   rn   r   r   r   r   r1   V   s   .r1   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 r2   r4   r   r   r   r   r6     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 )Nr:   r;   é   r=   r>   r?   r@   r   rA   r,   r-   ©r>   éá  r]   rB   rC   rD   )r5   rE   rF   rG   rH   rI   r#   rJ   rK   rL   rM   r   rN   r.   ÚbuildProtocolr	   r$   rO   ©r   rP   Úincomingr   r   r   rQ     sB    ÿþýÿ ÿ
 ÿ
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 )rR   r:   r;   rp   r=   rS   rT   rU   r   rA   r,   r-   )r3   rr   r]   NrC   rD   )rF   rG   rH   rI   r   r5   rE   r#   rJ   rK   rL   rM   r   rN   r.   rs   r	   r$   ZassertIsNotrO   )r   rW   rX   rP   ru   r   r   r   Útest_socks4a7  sD    ÿþýÿ
 ÿ
 ÿ
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 )rZ   r:   r;   rp   r=   rS   rT   r[   r   r\   r]   Nr^   rV   r   r   r   r`   r  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 ra   r   rb   r   r   r   rf   �  rg   z-BindTests.test_accessDenied.<locals>.<lambda>r:   r;   rp   rh   ri   r?   r@   r   r\   r]   )r5   rj   rE   rF   rG   rH   rI   rL   r#   rJ   r7   r   r_   r.   r   r   r   r   rk   �  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 ©Nr:   r;   rp   r=   r>   r?   r@   rq   r   rA   r]   rB   rD   )r5   rE   rF   rG   rH   rI   r#   rJ   rK   r.   rs   rN   r	   r$   rL   rM   r   r   rO   rt   r   r   r   rm   ž  s4    ÿþýÿ
 ÿ
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 rw   )r5   rE   rF   rG   rH   rI   r#   rJ   rK   r.   rs   rN   r	   r$   rL   rM   r   rO   rt   r   r   r   rn   ¾  s2    ÿþýÿ
 ÿ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 )Nr:   r;   rp   r=   r>   r?   r@   )z1.6.6.6iš  r   r\   r]   )r5   rE   rF   rG   rH   rI   r#   rJ   rK   r.   rs   r_   rL   r7   r   rt   r   r   r   Útest_badSourceÝ  s(    ÿþýÿ
 ÿzBindTests.test_badSourceN)r   r   r   r!   r6   rQ   rv   r`   rk   rm   rn   rx   r   r   r   r   ro   þ   s   '; ro   )r!   rH   rF   Ztwisted.internetr   r   Ztwisted.internet.errorr   Ztwisted.protocolsr   Ztwisted.python.compatr   Ztwisted.testr   Ztwisted.trialr   ZStringTransportr	   r   ZSOCKSv4r"   ZTestCaser1   ro   r   r   r   r   Ú<module>   s    )