U
    ŖljXD  ć                   @   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-aghyhbke/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    )