o
    Óó·iXD  ć                   @   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   ś]C:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-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   s>   z	t  | j| ”W S  ty   t  td| d” ” Y S w )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                   @   óP   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   ó0   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[   ó   

zConnectTests.setUpc                 C   s(   | j j}|d ur|  |jjd” d S d S )Nz-Outgoing SOCKS connections need to be closed.)r7   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)r7   Ś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   rD   r5   rE   rF   rG   N)rI   rJ   rK   rL   r   r7   rH   r#   rM   rN   rO   rP   r   rQ   r%   rR   ©r   ŚclientRequestŚbyterS   r   r   r   Ś test_socks4aSuccessfulResolution   s,   ’žż’
’z-ConnectTests.test_socks4aSuccessfulResolutionc              	   C   ó   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@   rV   rW   ó   failinghost r   é[   ś0.0.0.0N©rI   rJ   rK   rL   r   r7   rH   r#   rM   rO   r:   r   ŚassertIsNoner%   rY   r   r   r   Śtest_socks4aFailedResolution°   ó    ’žż’
’z)ConnectTests.test_socks4aFailedResolutionc              	   C   ó   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   ó   dS ©Nr   r   ©ŚcodeŚserverr'   Śuserr   r   r   Ś<lambda>Ī   ó    z0ConnectTests.test_accessDenied.<locals>.<lambda>r=   r>   r?   é  ś10.2.3.4rB   rC   r   r`   ra   )r7   Ś	authorizerH   rI   rJ   rK   rL   rO   r#   rM   r:   r   rc   r%   r   r   r   r   Śtest_accessDeniedĶ   ó    ’žż’
ž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@   rA   rB   rC   rE   rG   )r7   rH   rI   rJ   rK   rL   r#   rN   rO   r%   rM   r   rR   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 rt   )r7   rH   rI   rJ   rK   rL   r#   rN   rO   r%   rM   rR   r   r   r   r   Śtest_eofLocalķ   s   ’žż’zConnectTests.test_eofLocalN)r   r   r   r!   r8   r<   rT   r\   rd   rr   ru   rv   r   r   r   r   r2   V   s    .r2   c                   @   r1   )Ś	BindTestszS
    Tests for SOCKS and SOCKSv4a bind requests using the L{SOCKSv4} protocol.
    c                 C   r3   r4   r6   r   r   r   r   r8     r9   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@   rA   rB   rC   r   rD   r,   r-   ©rA   éį  ra   rE   rF   rG   )r7   rH   rI   rJ   rK   rL   r#   rM   rN   rO   rP   r   rQ   r.   ŚbuildProtocolr	   r$   rR   ©r   rS   Śincomingr   r   r   rT     s>   ’žż’’
’
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 )rU   r=   r>   rx   r@   rV   rW   rX   r   rD   r,   r-   )r5   rz   ra   NrF   rG   )rI   rJ   rK   rL   r   r7   rH   r#   rM   rN   rO   rP   r   rQ   r.   r{   r	   r$   ZassertIsNotrR   )r   rZ   r[   rS   r}   r   r   r   Śtest_socks4a7  s@   ’žż’
’
’
zBindTests.test_socks4ac              	   C   r]   )r^   r=   r>   rx   r@   rV   rW   r_   r   r`   ra   Nrb   rY   r   r   r   rd   r  re   z&BindTests.test_socks4aFailedResolutionc              	   C   rf   )Nc                 S   rg   rh   r   ri   r   r   r   rm     rn   z-BindTests.test_accessDenied.<locals>.<lambda>r=   r>   rx   ro   rp   rB   rC   r   r`   ra   )r7   rq   rH   rI   rJ   rK   rL   rO   r#   rM   r:   r   rc   r.   r   r   r   r   rr     rs   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>   rx   r@   rA   rB   rC   ry   r   rD   ra   rE   rG   )r7   rH   rI   rJ   rK   rL   r#   rM   rN   r.   r{   rQ   r	   r$   rO   rP   r   r   rR   r|   r   r   r   ru     s2   ’žż’
’
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 r   )r7   rH   rI   rJ   rK   rL   r#   rM   rN   r.   r{   rQ   r	   r$   rO   rP   r   rR   r|   r   r   r   rv   ¾  s0   ’žż’
’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>   rx   r@   rA   rB   rC   )z1.6.6.6i  r   r`   ra   )r7   rH   rI   rJ   rK   rL   r#   rM   rN   r.   r{   rc   rO   r:   r   r|   r   r   r   Śtest_badSourceŻ  s&   ’žż’
’zBindTests.test_badSourceN)r   r   r   r!   r8   rT   r~   rd   rr   ru   rv   r   r   r   r   r   rw   ž   s    '; rw   )r!   rK   rI   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TestCaser2   rw   r   r   r   r   Ś<module>   s    )