U
    \á½[7r  ã                   @   s¸  d Z ddlmZmZ ddlZddlZddlZddlmZ ddl	m
Z
 edƒZedƒZer~ddlmZ dd	lmZmZmZmZ nG d
d„ dƒZddlmZ ddlmZ ddlmZ ddlmZmZ ddlmZ G dd„ dejƒZ G dd„ de ƒZ!G dd„ dƒZ"erNe#edƒs,ddl$Z$e$ %def ¡ dZn"G dd„ dej&ƒZ'e (e'e ej)¡ G dd„ de
j*ƒZ+G dd„ de+ƒ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*ƒZ0dS )'z.
Tests for L{twisted.conch.ssh.filetransfer}.
é    )ÚdivisionÚabsolute_importN)ÚrequireModule)ÚunittestÚcryptographyztwisted.conch.unix©Úavatar)ÚcommonÚ
connectionÚfiletransferÚsessionc                   @   s   e Zd ZG dd„ dƒZdS )r   c                   @   s   e Zd ZdS )zavatar.ConchUserN)Ú__name__Ú
__module__Ú__qualname__© r   r   úF/usr/lib/python3/dist-packages/twisted/conch/test/test_filetransfer.pyÚ	ConchUser   s    r   N)r   r   r   r   r   r   r   r   r      s   r   )Údefer)Úloopback)Ú
components)ÚlongÚ	_PY37PLUS)ÚFilePathc                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú
TestAvatarc                 C   s(   t j | ¡ tj| jd< tj| jd< d S )Nó   sessionó   sftp)	r   r   Ú__init__r   Ú
SSHSessionZchannelLookupr   ÚFileTransferServerZsubsystemLookup©Úselfr   r   r   r   $   s    zTestAvatar.__init__c                 O   s~   zt |ƒ}W n  tk
r,   |||fg}Y nX |D ]F}|d }t|ƒdkrR|d pTd}t|ƒdkrj|d pli }|||Ž}q2|S )Nr   é   r   é   )ÚiterÚ	TypeErrorÚlen)r    ÚfÚargsÚkwÚiÚfuncÚrr   r   r   Ú
_runAsUser)   s    zTestAvatar._runAsUserN)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S )ÚFileTransferTestAvatarc                 C   s   t  | ¡ || _d S ©N)r   r   ÚhomeDir)r    r/   r   r   r   r   8   s    
zFileTransferTestAvatar.__init__c                 C   s   t t ¡ ƒ | jj¡S r.   )r   ÚosÚgetcwdÚpreauthChildr/   Úpathr   r   r   r   Ú
getHomeDir<   s    z!FileTransferTestAvatar.getHomeDirN)r   r   r   r   r4   r   r   r   r   r-   6   s   r-   c                   @   s   e Zd Zdd„ ZdS )ÚConchSessionForTestAvatarc                 C   s
   || _ d S r.   r   )r    r   r   r   r   r   B   s    z"ConchSessionForTestAvatar.__init__N)r   r   r   r   r   r   r   r   r5   @   s   r5   ÚSFTPServerForUnixConchUserzNtwisted.conch.unix imported %r, but doesn't define SFTPServerForUnixConchUser'c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚFileTransferForTestAvatarc                 C   s   ddiS )Nó	   conchTestó   ext datar   )r    ÚversionZotherExtr   r   r   Ú
gotVersionQ   s    z$FileTransferForTestAvatar.gotVersionc                 C   s   |dkrdS t ‚d S )Nó   testExtendedRequestó   bar)ÚNotImplementedError)r    ZextNameÚextDatar   r   r   ÚextendedRequestT   s    z)FileTransferForTestAvatar.extendedRequestN)r   r   r   r;   r@   r   r   r   r   r7   O   s   r7   c                   @   s   e Zd Zdd„ ZdS )ÚSFTPTestBasec              
   C   s  t |  ¡ ƒ| _| j d¡| _| j d¡ d¡ | j d¡jdd6}| d¡ tdd	ƒ}| | d
¡¡ W 5 Q R X W 5 Q R X | j d¡ d¡ | j d¡jdd}| d¡ W 5 Q R X | j d¡jdd}| d¡ W 5 Q R X | j d¡jdd}| d¡ W 5 Q R X d S )NZextraZtestDirectoryTÚ	testfile1Úwb)Úmodeó   aaaaaaaaaabbbbbbbbbbz/dev/urandomÚrbi   i¤  ZtestRemoveFileó   aZtestRenameFilez.testHiddenFile)	r   ZmktempÚtestDirÚchildÚmakedirsÚopenÚwriteÚreadÚchmod)r    r&   Úf2r   r   r   ÚsetUp_   s    
$zSFTPTestBase.setUpN)r   r   r   rP   r   r   r   r   rA   ]   s   rA   c                   @   sê   e Zd Zes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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$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zejd.d/„ ƒZerØd0e_ejd1d2„ ƒZd3S )4ÚOurServerOurClientTestsú can't run on non-posix computersc                    s˜   t  ˆ ¡ tˆ jƒˆ _tjˆ jdˆ _t 	ˆ j¡}t 
¡ ˆ _d ˆ _d ˆ _‡ fdd„}|ˆ j_t 	ˆ j¡}ˆ j |¡ ˆ j |¡ |ˆ _|ˆ _ˆ  ¡  d S )Nr   c                    s   | ˆ _ |ˆ _d S r.   )Ú_serverVersionÚ_extData)ZserverVersionr?   r   r   r   Ú_‚   s    z(OurServerOurClientTests.setUp.<locals>._)rA   rP   r-   rH   r   r   r   Úserverr   ZLoopbackRelayÚFileTransferClientÚclientrS   rT   ZgotServerVersionZmakeConnectionÚclientTransportÚserverTransportÚ_emptyBuffers)r    rY   rU   rZ   r   r   r   rP   x   s    

zOurServerOurClientTests.setUpc                 C   s*   | j js| jjr&| j  ¡  | j ¡  q d S r.   )rZ   ÚbufferrY   ÚclearBufferr   r   r   r   r[      s    
z%OurServerOurClientTests._emptyBuffersc                 C   s,   | j  ¡  | j ¡  | j  ¡  | j ¡  d S r.   )rZ   ÚloseConnectionrY   r]   r   r   r   r   ÚtearDown–   s    


z OurServerOurClientTests.tearDownc                 C   s$   |   | jd¡ |   | jddi¡ d S )Né   r8   r9   )ÚassertEqualrS   rT   r   r   r   r   Útest_serverVersion   s    z*OurServerOurClientTests.test_serverVersionc                 C   s&   |   tj | jj¡d| jjf ¡ dS )z:
        It implements the ISFTPServer interface.
        zISFTPServer not provided by %rN)Ú
assertTruer   ÚISFTPServerZ
providedByrV   rX   r   r   r   r   Útest_interface_implementation¢   s    þz5OurServerOurClientTests.test_interface_implementationc                    sb   ˆj  dtjtjB i ¡}ˆ ¡  tj‰g ‰ ‡ ‡fdd„}ˆ td|¡ ‡ ‡fdd„}| 	|¡ |S )zV
        A file opened with C{openFile} is close when the connection is lost.
        ó	   testfile1c                    s   ˆ   | ¡ ˆ| ƒ d S r.   ©Úappend)Úfd)ÚclosedÚoldCloser   r   Úcloseµ   s    
zJOurServerOurClientTests.test_openedFileClosedWithConnection.<locals>.closerl   c                    s`   ˆj j| jdd …  j}ˆj ¡  ˆj ¡  ˆj ¡  ˆj ¡  ˆ ˆj ji ¡ ˆ 	|ˆ ¡ d S )Né   )
rV   Z	openFilesZhandleri   rZ   r^   rY   r]   ra   ZassertIn)ÚopenFileri   )rj   r    r   r   Ú_fileOpened»   s    



zPOurServerOurClientTests.test_openedFileClosedWithConnection.<locals>._fileOpened)
rX   rn   r   ÚFXF_READÚ	FXF_WRITEr[   r0   rl   ZpatchÚaddCallback)r    Údrl   ro   r   )rj   rk   r    r   Ú#test_openedFileClosedWithConnection«   s    ÿÿ	
z;OurServerOurClientTests.test_openedFileClosedWithConnectionc                    s.   ˆ j  d¡}ˆ  ¡  ‡ fdd„}| |¡ |S )zh
        A directory opened with C{openDirectory} is close when the connection
        is lost.
        Ú c                    s<   ˆ j  ¡  ˆ j ¡  ˆ j  ¡  ˆ j ¡  ˆ  ˆ jji ¡ d S r.   )rZ   r^   rY   r]   ra   rV   ZopenDirs©ÚopenDirr   r   r   Ú	_getFilesÐ   s
    



zSOurServerOurClientTests.test_openedDirectoryClosedWithConnection.<locals>._getFiles©rX   ÚopenDirectoryr[   rr   )r    rs   rx   r   r   r   Ú(test_openedDirectoryClosedWithConnectionÈ   s
    
z@OurServerOurClientTests.test_openedDirectoryClosedWithConnectionc                    sd   ˆj  dtjtjB i ¡}ˆ ¡  ‡ ‡‡fdd„}‡fdd„‰ ‡‡fdd„‰‡fdd	„‰| |¡ |S )
Nrf   c                    s*   ˆ  | t | ¡¡ ˆ | ƒ}| ˆ| ¡ |S r.   )ra   r   Z	ISFTPFilerr   ©rn   rs   )Ú
_readChunkÚ_writeChunkr    r   r   ro   à   s    z<OurServerOurClientTests.test_openFileIO.<locals>._fileOpenedc                    s&   |   dd¡}ˆ  ¡  | ˆ jd¡ |S )Nr   é   rE   ©Z	readChunkr[   rr   ra   r|   r   r   r   r}   æ   s    z;OurServerOurClientTests.test_openFileIO.<locals>._readChunkc                    s$   |  dd¡}ˆ ¡  | ˆ |¡ |S )Nr   s
   cccccccccc)Z
writeChunkr[   rr   ©rU   rn   rs   )Ú_readChunk2r    r   r   r~   ì   s    z<OurServerOurClientTests.test_openFileIO.<locals>._writeChunkc                    s&   |  dd¡}ˆ  ¡  | ˆ jd¡ |S )Nr   é   s   aaaaaaaaaabbbbbbbbbbccccccccccr€   r   r   r   r   r‚   ò   s    z<OurServerOurClientTests.test_openFileIO.<locals>._readChunk2©rX   rn   r   rp   rq   r[   rr   )r    rs   ro   r   )r}   r‚   r~   r    r   Útest_openFileIOÛ   s    ÿÿ
z'OurServerOurClientTests.test_openFileIOc                    sV   ˆj  dtjtjB i ¡}ˆ ¡  ‡fdd„‰‡fdd„‰ ‡ ‡‡fdd„}| |¡ |S )Nrf   c                    s   |  ¡ }ˆ  ¡  |S r.   )ÚgetAttrsr[   r   r   r   r   Ú	_getAttrs  s    zBOurServerOurClientTests.test_closedFileGetAttrs.<locals>._getAttrsc                    s   ˆ   ¡  | S r.   )ZflushLoggedErrors©r&   r   r   r   Ú_err  s    z=OurServerOurClientTests.test_closedFileGetAttrs.<locals>._errc                    s4   |   ¡ }ˆ ¡  | ˆ| ¡ | ˆ ¡ ˆ |tj¡S r.   )rl   r[   rr   Ú
addErrbackÚassertFailurer   Ú	SFTPErrorr|   ©r‰   r‡   r    r   r   Ú_close
  s
    
z?OurServerOurClientTests.test_closedFileGetAttrs.<locals>._closer„   )r    rs   rŽ   r   r   r   Útest_closedFileGetAttrsü   s    ÿÿ
z/OurServerOurClientTests.test_closedFileGetAttrsc                    sD   ˆj  dtjtjB i ¡}ˆ ¡  ‡ ‡fdd„}‡fdd„‰ | |¡S )Nrf   c                    s   |   ¡ }ˆ ¡  | ˆ ¡ |S r.   ©r†   r[   rr   r|   ©Ú
_getAttrs2r    r   r   r‡     s    
zBOurServerOurClientTests.test_openFileAttributes.<locals>._getAttrsc                    s&   ˆ j  d¡}ˆ  ¡  | ˆ j| ¡ |S ©Nrf   ©rX   r†   r[   rr   ra   )Zattrs1rs   r   r   r   r’      s    zCOurServerOurClientTests.test_openFileAttributes.<locals>._getAttrs2r„   ©r    rs   r‡   r   r‘   r   Útest_openFileAttributes  s    ÿÿz/OurServerOurClientTests.test_openFileAttributesc                    sV   ˆj  dtjtjB i ¡}ˆ ¡  ‡‡fdd„}‡ ‡fdd„‰‡fdd„‰ | |¡ |S )Nrf   c                    s   |   ¡ }ˆ ¡  | ˆ ¡ |S r.   r   r|   )Ú	_setAttrsr    r   r   r‡   0  s    
z@OurServerOurClientTests.test_openFileSetAttrs.<locals>._getAttrsc                    s:   d| d< ˆj  d| ¡}ˆ ¡  | ˆ ¡ | ˆj| ¡ |S )Nr   Zatimerf   )rX   ZsetAttrsr[   rr   ra   ©Úattrsrs   r‘   r   r   r—   6  s    
z@OurServerOurClientTests.test_openFileSetAttrs.<locals>._setAttrsc                    s   ˆ j  d¡}ˆ  ¡  |S r“   ©rX   r†   r[   ©rU   rs   r   r   r   r’   >  s    zAOurServerOurClientTests.test_openFileSetAttrs.<locals>._getAttrs2r„   r•   r   )r’   r—   r    r   Útest_openFileSetAttrs)  s    ÿÿ
z-OurServerOurClientTests.test_openFileSetAttrsc                    sb   i ‰ˆj jj‰ ‡ ‡fdd„}|ˆj j_ˆj dtjtjB ddi¡}ˆ ¡  ‡‡fdd„}| |¡S )zç
        Check that L{filetransfer.FileTransferClient.openFile} can send
        extended attributes, that should be extracted server side. By default,
        they are ignored, so we just verify they are correctly parsed.
        c                    s   ˆ  |¡ ˆ | ||ƒS r.   )Úupdate)ÚfilenameÚflagsr™   )ÚoldOpenFileÚsavedAttributesr   r   rn   O  s    
zIOurServerOurClientTests.test_openFileExtendedAttributes.<locals>.openFilerf   Úext_foor=   c                    s   ˆ  ˆ ddi¡ d S )Nr¢   r=   ©ra   )Zign)r¡   r    r   r   ÚcheckX  s    zFOurServerOurClientTests.test_openFileExtendedAttributes.<locals>.check)rV   rX   rn   r   rp   rq   r[   rr   )r    rn   rs   r¤   r   )r    r¡   r    r   Útest_openFileExtendedAttributesG  s    

ÿÿz7OurServerOurClientTests.test_openFileExtendedAttributesc                    sB   ˆ j  d¡}ˆ  ¡  ‡ fdd„}| |¡ | |¡ ˆ  |tj¡S )Nó   testRemoveFilec                    s   ˆ j  d¡}ˆ  ¡  |S )Nr¦   )rX   Z
removeFiler[   )Úignoredrs   r   r   r   Ú_removeFileb  s    z<OurServerOurClientTests.test_removeFile.<locals>._removeFile)rX   r†   r[   rr   r‹   r   rŒ   )r    rs   r¨   r   r   r   Útest_removeFile^  s    

z'OurServerOurClientTests.test_removeFilec                    s8   ˆj  d¡}ˆ ¡  ‡ ‡fdd„}‡fdd„‰ | |¡S )Nó   testRenameFilec                    s&   ˆj  dd¡}ˆ ¡  | ˆ | ¡ |S )Nrª   ó   testRenamedFile)rX   Z
renameFiler[   rr   r˜   ©Ú_testRenamedr    r   r   Ú_renamep  s    z8OurServerOurClientTests.test_renameFile.<locals>._renamec                    s&   ˆ j  d¡}ˆ  ¡  | ˆ j|¡ d S )Nr«   r”   )rU   r™   rs   r   r   r   r­   v  s    z=OurServerOurClientTests.test_renameFile.<locals>._testRenamed)rX   r†   r[   rr   )r    rs   r®   r   r¬   r   Útest_renameFilel  s
    z'OurServerOurClientTests.test_renameFilec                 C   s"   | j  d¡}|  ¡  |  |tj¡S ©Nó   testMakeDirectory©rX   r†   r[   r‹   r   rŒ   ©r    rs   r   r   r   Útest_directoryBad~  s    z)OurServerOurClientTests.test_directoryBadc                    sZ   ˆ j  di ¡}ˆ  ¡  ‡ fdd„}‡ fdd„}| |¡ | |¡ | |¡ ˆ  |tj¡S )Nr±   c                    s   ˆ j  d¡}ˆ  ¡  |S r°   rš   r›   r   r   r   r‡   ˆ  s    zAOurServerOurClientTests.test_directoryCreation.<locals>._getAttrsc                    s   ˆ j  d¡}ˆ  ¡  |S r°   )rX   ZremoveDirectoryr[   r›   r   r   r   Ú_removeDirectory‘  s    zHOurServerOurClientTests.test_directoryCreation.<locals>._removeDirectory)rX   ZmakeDirectoryr[   rr   r‹   r   rŒ   )r    rs   r‡   rµ   r   r   r   Útest_directoryCreation„  s    	


z.OurServerOurClientTests.test_directoryCreationc                    s\   ˆj  d¡}ˆ ¡  g ‰‡ ‡‡‡fdd„‰‡‡fdd„}‡fdd„‰ | ˆ¡ | |¡ |S )Nó    c                    sF   ‡‡ fdd„}t  ˆ j¡}ˆ ¡  | |¡ | ˆ¡ | ˆˆ ¡ |S )Nc                    s   ˆ   | ¡ ˆS r.   rg   rˆ   )Úfilesrw   r   r   rh   ¢  s    
zMOurServerOurClientTests.test_openDirectory.<locals>._getFiles.<locals>.append)r   ZmaybeDeferredÚnextr[   rr   rŠ   )rw   rh   rs   ©rŽ   rx   r¸   r    rv   r   rx   ¡  s    

z=OurServerOurClientTests.test_openDirectory.<locals>._getFilesc                    s6   t t tˆ Ž ƒd ƒ}| ¡  ˆ |dddddg¡ d S )Nr   ó   .testHiddenFileó   testDirectoryr¦   rª   rf   )ÚlistÚzipÚsortra   )r§   Zfs)r¸   r    r   r   Ú_checkFiles¬  s     þÿz?OurServerOurClientTests.test_openDirectory.<locals>._checkFilesc                    s   |  ¡ }ˆ  ¡  |S r.   )rl   r[   )rU   rw   rs   r   r   r   rŽ   ´  s    z:OurServerOurClientTests.test_openDirectory.<locals>._closery   )r    rs   rÀ   r   rº   r   Útest_openDirectoryœ  s    

z*OurServerOurClientTests.test_openDirectoryc                 C   s"   | j  d¡}|  ¡  |  |tj¡S )Nó   testLinkr²   r³   r   r   r   Útest_linkDoesntExist¾  s    z,OurServerOurClientTests.test_linkDoesntExistc                    sB   ˆ j  dd¡}ˆ  ¡  ‡ fdd„}‡ fdd„}| |¡ | |¡S )NrÂ   rf   c                    s   ˆ j  dd¡}ˆ  ¡  |S )NrÂ   r!   rš   r›   r   r   r   Ú_getFirstAttrsÈ  s    zDOurServerOurClientTests.test_linkSharesAttrs.<locals>._getFirstAttrsc                    s&   ˆ j  d¡}ˆ  ¡  | ˆ j| ¡ |S r“   r”   )Z
firstAttrsrs   r   r   r   Ú_getSecondAttrsÍ  s    zEOurServerOurClientTests.test_linkSharesAttrs.<locals>._getSecondAttrs©rX   ZmakeLinkr[   rr   )r    rs   rÄ   rÅ   r   r   r   Útest_linkSharesAttrsÄ  s    
z,OurServerOurClientTests.test_linkSharesAttrsc                    sF   ˆ j  dd¡}ˆ  ¡  ‡ fdd„}‡ fdd„}| |¡ | |¡ |S )NrÂ   rf   c                    sH   ˆ j  d¡}ˆ  ¡  tt ¡ ƒ ˆ jj¡}| 	d¡}| 
ˆ j|j¡ |S ©NrÂ   rB   )rX   ZreadLinkr[   r   r0   r1   r2   rH   r3   rI   rr   ra   )rU   rs   ZtestFiler   r   r   Ú	_readLinkÛ  s    
þz8OurServerOurClientTests.test_linkPath.<locals>._readLinkc                    sH   ˆ j  d¡}ˆ  ¡  tt ¡ ƒ ˆ jj¡}| 	d¡}| 
ˆ j|j¡ |S rÈ   )rX   ZrealPathr[   r   r0   r1   r2   rH   r3   rI   rr   ra   )rU   rs   ZtestLinkr   r   r   Ú	_realPathå  s    
þz8OurServerOurClientTests.test_linkPath.<locals>._realPathrÆ   )r    rs   rÉ   rÊ   r   r   r   Útest_linkPath×  s    



z%OurServerOurClientTests.test_linkPathc                 C   s4   | j  dd¡}|  ¡  | | jd¡ | | j¡ |S )Nr<   s   foor=   )rX   r@   r[   rr   ra   Ú_cbTestExtendedRequestr³   r   r   r   Útest_extendedRequestô  s
    z,OurServerOurClientTests.test_extendedRequestc                 C   s"   | j  dd¡}|  ¡  |  |t¡S )Ns   testBadRequestr·   )rX   r@   r[   r‹   r>   )r    r§   rs   r   r   r   rÌ   ü  s    z.OurServerOurClientTests._cbTestExtendedRequestc              	   c   sŒ   | j  d¡}|  ¡  |V }tƒ }z,|D ]"}|  ¡  |V \}}}| |¡ q&W 5 | ¡ }|  ¡  |V  X |  ¡  |  |tdddddgƒ¡ dS )z
        Check that the object returned by
        L{filetransfer.FileTransferClient.openDirectory} can be used
        as an iterator.
        r·   r»   r¼   r¦   rª   rf   N)rX   rz   r[   Úsetrl   Úaddra   )r    rs   rw   Ú	filenamesr&   rž   rU   Z	fileattrsr   r   r   Útest_openDirectoryIterator  s(     þÿz2OurServerOurClientTests.test_openDirectoryIteratorz!Broken by PEP 479 and deprecated.c                 c   sj   | j  d¡}|  ¡  |V }| ¡  |  ¡ }d}|  dt|ƒ¡ |  t|d d ¡ |  ||d d ¡ dS )zJ
        Using client.openDirectory as an iterator is deprecated.
        r·   zeUsing twisted.conch.ssh.filetransfer.ClientDirectory as an iterator was deprecated in Twisted 18.9.0.r!   r   ÚcategoryÚmessageN)rX   rz   r[   r¹   ZflushWarningsra   r%   ÚDeprecationWarning)r    rs   rw   ÚwarningsrÓ   r   r   r   Ú$test_openDirectoryIteratorDeprecated+  s    ÿz<OurServerOurClientTests.test_openDirectoryIteratorDeprecatedN) r   r   r   ÚunixÚskiprP   r[   r_   rb   re   rt   r{   r…   r   r–   rœ   r¥   r©   r¯   r´   r¶   rÁ   rÃ   rÇ   rË   rÍ   rÌ   r   ZinlineCallbacksrÑ   r   rÖ   r   r   r   r   rQ   s   s>   	!"
#ÿrQ   c                   @   s   e Zd Zdd„ ZdS )ÚFakeConnc                 C   s   d S r.   r   )r    Zchannelr   r   r   Ú	sendCloseA  s    zFakeConn.sendCloseN)r   r   r   rÚ   r   r   r   r   rÙ   @  s   rÙ   c                   @   sL   e Zd Zes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 )ÚFileTransferCloseTestsrR   c                 C   s   t ƒ | _d S r.   )r   r   r   r   r   r   rP   J  s    zFileTransferCloseTests.setUpc                 C   s,   t  ¡ }G dd„ dƒ}|ƒ |_| j|j_|S )Nc                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )zDFileTransferCloseTests.buildServerConnection.<locals>.DummyTransportc                 S   s
   | | _ d S r.   )Ú	transportr   r   r   r   r   R  s    zMFileTransferCloseTests.buildServerConnection.<locals>.DummyTransport.__init__c                 S   s   d S r.   r   )r    ZkindÚdatar   r   r   Ú
sendPacketT  s    zOFileTransferCloseTests.buildServerConnection.<locals>.DummyTransport.sendPacketc                 S   s   dS )Nzdummy transportr   r   r   r   r   Ú	logPrefixV  s    zNFileTransferCloseTests.buildServerConnection.<locals>.DummyTransport.logPrefixN)r   r   r   r   rÞ   rß   r   r   r   r   ÚDummyTransportQ  s   rà   )r
   ZSSHConnectionrÜ   r   )r    Úconnrà   r   r   r   ÚbuildServerConnectionM  s
    
z,FileTransferCloseTests.buildServerConnectionc                    s$   dˆ_ |j‰ ‡ ‡fdd„}||_d S )NFc                    s   dˆ_ ˆ | ƒ d S )NT)ÚconnectionLostFired)Úreason©ZorigConnectionLostr    r   r   ÚconnectionLost`  s    zFFileTransferCloseTests.interceptConnectionLost.<locals>.connectionLost)rã   ræ   )r    Ú
sftpServerræ   r   rå   r   ÚinterceptConnectionLost]  s    z.FileTransferCloseTests.interceptConnectionLostc                 C   s   |   | jd¡ d S )Nz*sftpServer's connectionLost was not called)rc   rã   r   r   r   r   ÚassertSFTPConnectionLostf  s    ÿz/FileTransferCloseTests.assertSFTPConnectionLostc                 C   sJ   t jtƒ | jd}| t d¡¡ |jjj	}|  
|¡ | ¡  |  ¡  dS )ze
        Closing a session should notify an SFTP subsystem launched by that
        session.
        )rá   r   r   N)r   r   rÙ   r   Úrequest_subsystemr	   ÚNSrX   rÜ   Úprotorè   ZcloseReceivedré   )r    ZtestSessionrç   r   r   r   Útest_sessionClosek  s    

z(FileTransferCloseTests.test_sessionClosec                 C   s‚   |   ¡ }t d¡t dd¡d  }| |¡ |jd }| t d¡¡ |jj	j
}|  |¡ |  |¡ | t dd¡¡ |  ¡  dS )zy
        A client sending CHANNEL_CLOSE should trigger closeReceived on the
        associated channel instance.
        r   ú>Lr   r`   r   N)râ   r	   rë   ÚstructÚpackÚssh_CHANNEL_OPENÚchannelsrê   rX   rÜ   rì   rè   Zssh_CHANNEL_CLOSEré   ©r    rá   ZpacketZsessionChannelrç   r   r   r   Ú%test_clientClosesChannelOnConnnection€  s    




z<FileTransferCloseTests.test_clientClosesChannelOnConnnectionc                 C   sn   |   ¡ }t d¡t dd¡d  }| |¡ |jd }| t d¡¡ |jj	j
}|  |¡ | ¡  |  ¡  dS )zP
        Closing an SSH connection should close all sessions within it.
        r   rî   r   r`   r   N)râ   r	   rë   rï   rð   rñ   rò   rê   rX   rÜ   rì   rè   ZserviceStoppedré   ró   r   r   r   Ú'test_stopConnectionServiceClosesChannel™  s    



z>FileTransferCloseTests.test_stopConnectionServiceClosesChannelN)r   r   r   r×   rØ   rP   râ   rè   ré   rí   rô   rõ   r   r   r   r   rÛ   E  s   	rÛ   c                   @   s,   e Zd ZdZesdZddddgZdd„ Zd	S )
ÚConstantsTestsag  
    Tests for the constants used by the SFTP protocol implementation.

    @ivar filexferSpecExcerpts: Excerpts from the
        draft-ietf-secsh-filexfer-02.txt (draft) specification of the SFTP
        protocol.  There are more recent drafts of the specification, but this
        one describes version 3, which is what conch (and OpenSSH) implements.
    úCannot run without cryptographyaµ  
           The following values are defined for packet types.

                #define SSH_FXP_INIT                1
                #define SSH_FXP_VERSION             2
                #define SSH_FXP_OPEN                3
                #define SSH_FXP_CLOSE               4
                #define SSH_FXP_READ                5
                #define SSH_FXP_WRITE               6
                #define SSH_FXP_LSTAT               7
                #define SSH_FXP_FSTAT               8
                #define SSH_FXP_SETSTAT             9
                #define SSH_FXP_FSETSTAT           10
                #define SSH_FXP_OPENDIR            11
                #define SSH_FXP_READDIR            12
                #define SSH_FXP_REMOVE             13
                #define SSH_FXP_MKDIR              14
                #define SSH_FXP_RMDIR              15
                #define SSH_FXP_REALPATH           16
                #define SSH_FXP_STAT               17
                #define SSH_FXP_RENAME             18
                #define SSH_FXP_READLINK           19
                #define SSH_FXP_SYMLINK            20
                #define SSH_FXP_STATUS            101
                #define SSH_FXP_HANDLE            102
                #define SSH_FXP_DATA              103
                #define SSH_FXP_NAME              104
                #define SSH_FXP_ATTRS             105
                #define SSH_FXP_EXTENDED          200
                #define SSH_FXP_EXTENDED_REPLY    201

           Additional packet types should only be defined if the protocol
           version number (see Section ``Protocol Initialization'') is
           incremented, and their use MUST be negotiated using the version
           number.  However, the SSH_FXP_EXTENDED and SSH_FXP_EXTENDED_REPLY
           packets can be used to implement vendor-specific extensions.  See
           Section ``Vendor-Specific-Extensions'' for more details.
        aŸ  
            The flags bits are defined to have the following values:

                #define SSH_FILEXFER_ATTR_SIZE          0x00000001
                #define SSH_FILEXFER_ATTR_UIDGID        0x00000002
                #define SSH_FILEXFER_ATTR_PERMISSIONS   0x00000004
                #define SSH_FILEXFER_ATTR_ACMODTIME     0x00000008
                #define SSH_FILEXFER_ATTR_EXTENDED      0x80000000

        aË  
            The `pflags' field is a bitmask.  The following bits have been
           defined.

                #define SSH_FXF_READ            0x00000001
                #define SSH_FXF_WRITE           0x00000002
                #define SSH_FXF_APPEND          0x00000004
                #define SSH_FXF_CREAT           0x00000008
                #define SSH_FXF_TRUNC           0x00000010
                #define SSH_FXF_EXCL            0x00000020
        aÇ  
            Currently, the following values are defined (other values may be
           defined by future versions of this protocol):

                #define SSH_FX_OK                            0
                #define SSH_FX_EOF                           1
                #define SSH_FX_NO_SUCH_FILE                  2
                #define SSH_FX_PERMISSION_DENIED             3
                #define SSH_FX_FAILURE                       4
                #define SSH_FX_BAD_MESSAGE                   5
                #define SSH_FX_NO_CONNECTION                 6
                #define SSH_FX_CONNECTION_LOST               7
                #define SSH_FX_OP_UNSUPPORTED                8
        c                 C   s„   i }| j D ]<}| ¡ D ].}t d|¡}|rt| d¡dƒ|| d¡< qq
|  t|ƒdkd¡ | ¡ D ]\}}|  	|t
t|ƒ¡ qddS )z
        The constants used by the SFTP protocol implementation match those
        found by searching through the spec.
        z)^\s*#define SSH_([A-Z_]+)\s+([0-9x]*)\s*$r"   r   r!   z,No constants found (the test must be buggy).N)ÚfilexferSpecExcerptsÚ
splitlinesÚreÚmatchr   Úgrouprc   r%   Úitemsra   Úgetattrr   )r    Z	constantsZexcerptÚlineÚmÚkÚvr   r   r   Útest_constantsAgainstSpec  s    

 ÿz(ConstantsTests.test_constantsAgainstSpecN)r   r   r   Ú__doc__r   rØ   rø   r  r   r   r   r   rö   ¯  s   &
ÄLrö   c                   @   sP   e Zd ZdZes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 )ÚRawPacketDataTestsz“
    Tests for L{filetransfer.FileTransferClient} which explicitly craft certain
    less common protocol messages to exercise their handling.
    r÷   c                 C   s   t  ¡ | _d S r.   )r   rW   Úftcr   r   r   r   rP   "  s    zRawPacketDataTests.setUpc                 C   sT   t  ¡ }| | j¡ || jjd< t ddtj	¡t
 d¡ t
 d¡ }| j |¡ |S )a/  
        A STATUS packet containing a result code, a message, and a language is
        parsed to produce the result of an outstanding request L{Deferred}.

        @see: U{section 9.1<http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.1>}
            of the SFTP Internet-Draft.
        r!   ú!LLó   msgó   lang)r   ÚDeferredrr   Ú_cbTestPacketSTATUSr  ÚopenRequestsrï   rð   r   ÚFX_OKr	   rë   Úpacket_STATUS©r    rs   rÝ   r   r   r   Útest_packetSTATUS&  s    $z$RawPacketDataTests.test_packetSTATUSc                 C   s$   |   |d d¡ |   |d d¡ dS )z{
        Assert that the result is a two-tuple containing the message and
        language from the STATUS packet.
        r   r  r!   r	  Nr£   ©r    Úresultr   r   r   r  6  s    z&RawPacketDataTests._cbTestPacketSTATUSc                 C   s@   t  ¡ }| | j¡ || jjd< t ddtj	¡}| j 
|¡ |S )az  
        A STATUS packet containing only a result code can also be parsed to
        produce the result of an outstanding request L{Deferred}.  Such packets
        are sent by some SFTP implementations, though not strictly legal.

        @see: U{section 9.1<http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.1>}
            of the SFTP Internet-Draft.
        r!   r  )r   r
  rr   Ú_cbTestPacketSTATUSShortr  r  rï   rð   r   r  r  r  r   r   r   Útest_packetSTATUSShort?  s    	z)RawPacketDataTests.test_packetSTATUSShortc                 C   s$   |   |d d¡ |   |d d¡ dS )z—
        Assert that the result is a two-tuple containing empty strings, since
        the STATUS packet had neither a message nor a language.
        r   r·   r!   Nr£   r  r   r   r   r  P  s    z+RawPacketDataTests._cbTestPacketSTATUSShortc                 C   sJ   t  ¡ }| | j¡ || jjd< t ddtj	¡t
 d¡ }| j |¡ |S )a›  
        A STATUS packet containing a result code and a message but no language
        can also be parsed to produce the result of an outstanding request
        L{Deferred}.  Such packets are sent by some SFTP implementations, though
        not strictly legal.

        @see: U{section 9.1<http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.1>}
            of the SFTP Internet-Draft.
        r!   r  r  )r   r
  rr   Ú_cbTestPacketSTATUSWithoutLangr  r  rï   rð   r   r  r	   rë   r  r  r   r   r   Útest_packetSTATUSWithoutLangY  s    
z/RawPacketDataTests.test_packetSTATUSWithoutLangc                 C   s$   |   |d d¡ |   |d d¡ dS )z¢
        Assert that the result is a two-tuple containing the message from the
        STATUS packet and an empty string, since the language was missing.
        r   r  r!   r·   Nr£   r  r   r   r   r  k  s    z1RawPacketDataTests._cbTestPacketSTATUSWithoutLangN)r   r   r   r  r   rØ   rP   r  r  r  r  r  r  r   r   r   r   r    s   		r  )1r  Z
__future__r   r   r0   rú   rï   Ztwisted.python.reflectr   Ztwisted.trialr   r   r×   Ztwisted.conchr   Ztwisted.conch.sshr	   r
   r   r   Ztwisted.internetr   Ztwisted.protocolsr   Ztwisted.pythonr   Ztwisted.python.compatr   r   Ztwisted.python.filepathr   r   r   r-   r5   ÚhasattrrÕ   Úwarnr6   r7   ZregisterAdapterrd   ZTestCaserA   rQ   rÙ   rÛ   rö   r  r   r   r   r   Ú<module>   sR   
þ
þ   Pjj