o
    Òó·iv}  ã                   @   s’  d Z ddlZddlZddlZddlm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 dd
lmZ ddlmZ zddlmZ W n eyY   dZY nw eZzddlmZ W n eyo   dZY nw eZzddlZW n eyƒ   dZY nw eZzddl m!Z" W n ey™   e#Z!Y nw e"Z!zddl$m%Z%m&Z&m'Z'm(Z( W n	 ey³   Y nw G dd„ de!ƒZ)G dd„ de)ƒZ*G dd„ dƒZ+edu rÜddl,Z,e, -def ¡ nG dd„ deƒZ.e /e.e)e'j0¡ G dd„ deƒZ1ee dƒG dd„ de1ƒƒZ2G dd„ dƒZ3ee dƒG d d!„ d!eƒƒZ4ee d"ƒG d#d$„ d$eƒƒZ5ee dƒee d"ƒG d%d&„ d&eƒƒƒZ6ee d"ƒG d'd(„ d(eƒƒZ7dS ))z.
Tests for L{twisted.conch.ssh.filetransfer}.
é    N)ÚskipIf)Úassert_thatÚequal_to)Údefer)ÚConnectionLost)ÚStringTransport)Úloopback)Ú
components)ÚFilePath)ÚTestCase)Úunix)ÚSFTPServerForUnixConchUser)Ú	ConchUser)ÚcommonÚ
connectionÚfiletransferÚsessionc                   @   ó   e Zd Zdd„ Zdd„ ZdS )Ú
TestAvatarc                 C   s&   t  | ¡ tj| jd< tj| jd< d S )Nó   sessionó   sftp)r   Ú__init__r   Ú
SSHSessionZchannelLookupr   ÚFileTransferServerZsubsystemLookup©Úself© r   újC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/conch/test/test_filetransfer.pyr   >   s   
zTestAvatar.__init__c                 O   s€   zt |ƒ}W n ty   |||fg}Y nw |D ]%}|d }t|ƒdkr(|d p)d}t|ƒdkr4|d p5i }||i |¤Ž}q|S )Nr   é   r   é   )ÚiterÚ	TypeErrorÚlen)r   ÚfÚargsÚkwÚiÚfuncÚrr   r   r   Ú
_runAsUserC   s   ÿzTestAvatar._runAsUserN)Ú__name__Ú
__module__Ú__qualname__r   r)   r   r   r   r   r   =   s    r   c                   @   r   )ÚFileTransferTestAvatarc                 C   s   t  | ¡ || _d S ©N)r   r   ÚhomeDir)r   r/   r   r   r   r   Q   s   

zFileTransferTestAvatar.__init__c                 C   s   t t ¡ ƒ | jj¡S r.   )r
   ÚosÚgetcwdÚpreauthChildr/   Úpathr   r   r   r   Ú
getHomeDirU   s   z!FileTransferTestAvatar.getHomeDirN)r*   r+   r,   r   r4   r   r   r   r   r-   P   s    r-   c                   @   ó   e Zd Zdd„ ZdS )ÚConchSessionForTestAvatarc                 C   s
   || _ d S r.   ©Úavatar)r   r8   r   r   r   r   Z   ó   
z"ConchSessionForTestAvatar.__init__N)r*   r+   r,   r   r   r   r   r   r6   Y   ó    r6   zNtwisted.conch.unix imported %r, but doesn't define SFTPServerForUnixConchUser'c                   @   r   )ÚFileTransferForTestAvatarc                 C   s   ddiS )Nó	   conchTestó   ext datar   )r   ÚversionZotherExtr   r   r   Ú
gotVersionm   s   z$FileTransferForTestAvatar.gotVersionc                 C   s   |dkrdS t ‚)Nó   testExtendedRequestó   bar)ÚNotImplementedError)r   ZextNameÚextDatar   r   r   ÚextendedRequestp   s   z)FileTransferForTestAvatar.extendedRequestN)r*   r+   r,   r?   rD   r   r   r   r   r;   l   s    r;   c                   @   r5   )ÚSFTPTestBasec              	   C   sx  t |  ¡ ƒ| _| j d¡| _| j d¡ d¡ | j d¡jdd��*}| d¡ tdd	ƒ�}| | d
¡¡ W d   ƒ n1 s?w   Y  W d   ƒ n1 sNw   Y  | j d¡ d¡ | j d¡jdd��}| d¡ W d   ƒ n1 svw   Y  | j d¡jdd��}| d¡ W d   ƒ n1 s•w   Y  | j d¡jdd��}| d¡ W d   ƒ d S 1 sµw   Y  d S )NÚextraZtestDirectoryTÚ	testfile1Úwb)Úmodeó   aaaaaaaaaabbbbbbbbbbz/dev/urandomÚrbi   i¤  ZtestRemoveFileó   aZtestRenameFilez.testHiddenFile)	r
   ÚmktempÚtestDirÚchildÚmakedirsÚopenÚwriteÚreadÚchmod)r   r#   Úf2r   r   r   ÚsetUp{   s(   
ÿ€þÿÿ"ÿzSFTPTestBase.setUpN)r*   r+   r,   rV   r   r   r   r   rE   z   r:   rE   z can't run on non-posix computersc                   @   sØ   e 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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jd/d0„ ƒZd1S )2ÚOurServerOurClientTestsc                    s˜   t  ˆ ¡ tˆ jƒˆ _tjˆ jd�ˆ _t 	ˆ j¡}t 
¡ ˆ _d ˆ _d ˆ _‡ fdd„}|ˆ j_t 	ˆ j¡}ˆ j |¡ ˆ j |¡ |ˆ _|ˆ _ˆ  ¡  d S )Nr7   c                    s   | ˆ _ |ˆ _d S r.   )Ú_serverVersionÚ_extData)ZserverVersionrC   r   r   r   Ú_œ   s   
z(OurServerOurClientTests.setUp.<locals>._)rE   rV   r-   rN   r8   r   r   Úserverr   ZLoopbackRelayÚFileTransferClientÚclientrX   rY   ZgotServerVersionÚmakeConnectionÚclientTransportÚserverTransportÚ_emptyBuffers)r   r_   rZ   r`   r   r   r   rV   ‘   s   

zOurServerOurClientTests.setUpc                 C   s<   | j js| jjr| j  ¡  | j ¡  | j js| jjsd S d S r.   )r`   Úbufferr_   ÚclearBufferr   r   r   r   ra   ª   s   

þz%OurServerOurClientTests._emptyBuffersc                 C   s,   | j  ¡  | j ¡  | j  ¡  | j ¡  d S r.   )r`   ÚloseConnectionr_   rc   r   r   r   r   ÚtearDown¯   s   


z OurServerOurClientTests.tearDownc                 C   s$   |   | jd¡ |   | jddi¡ d S )Né   r<   r=   )ÚassertEqualrX   rY   r   r   r   r   Útest_serverVersionµ   s   z*OurServerOurClientTests.test_serverVersionc                 C   s&   |   tj | jj¡d| jj›�¡ dS )z:
        It implements the ISFTPServer interface.
        zISFTPServer not provided by N)Ú
assertTruer   ÚISFTPServerZ
providedByr[   r]   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 )zW
        A file opened with C{openFile} is closed when the connection is lost.
        ó	   testfile1c                    s   ˆ   | ¡ ˆ| ƒ d S r.   ©Úappend)Úfd)ÚclosedÚoldCloser   r   ÚcloseÎ   ó   
zJOurServerOurClientTests.test_openedFileClosedWithConnection.<locals>.closerr   c                    s`   ˆj j| jdd …  j}ˆj ¡  ˆj ¡  ˆj ¡  ˆj ¡  ˆ ˆj ji ¡ ˆ 	|ˆ ¡ d S )Né   )
r[   Ú	openFilesÚhandlero   r`   rd   r_   rc   rg   ZassertIn)ÚopenFilero   )rp   r   r   r   Ú_fileOpenedÔ   s   



zPOurServerOurClientTests.test_openedFileClosedWithConnection.<locals>._fileOpenedN)
r]   rw   r   ÚFXF_READÚ	FXF_WRITEra   r0   rr   ÚpatchÚaddCallback)r   Údrr   rx   r   )rp   rq   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.   )r`   rd   r_   rc   rg   r[   ZopenDirs©ÚopenDirr   r   r   Ú	_getFilesè   s
   



zSOurServerOurClientTests.test_openedDirectoryClosedWithConnection.<locals>._getFilesN©r]   ÚopenDirectoryra   r|   )r   r}   r‚   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 )
Nrl   c                    s*   ˆ  | t | ¡¡ ˆ | ƒ}| ˆ| ¡ |S r.   )rg   r   Z	ISFTPFiler|   ©rw   r}   )Ú
_readChunkÚ_writeChunkr   r   r   rx   ø   s   z<OurServerOurClientTests.test_openFileIO.<locals>._fileOpenedc                    s&   |   dd¡}ˆ  ¡  | ˆ jd¡ |S )Nr   é   rJ   ©Ú	readChunkra   r|   rg   r†   r   r   r   r‡   þ   ó   z;OurServerOurClientTests.test_openFileIO.<locals>._readChunkc                    s$   |  dd¡}ˆ ¡  | ˆ |¡ |S )Nr‰   s
   cccccccccc)Z
writeChunkra   r|   ©rZ   rw   r}   )Ú_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Ž   
  rŒ   z<OurServerOurClientTests.test_openFileIO.<locals>._readChunk2©r]   rw   r   ry   rz   ra   r|   )r   r}   rx   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 )Nrl   c                    ó   |  ¡ }ˆ  ¡  |S r.   )ÚgetAttrsra   r�   r   r   r   Ú	_getAttrs  ó   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.   )rr   ra   r|   Ú
addErrbackÚassertFailurer   Ú	SFTPErrorr†   ©r—   r”   r   r   r   Ú_close"  s
   
z?OurServerOurClientTests.test_closedFileGetAttrs.<locals>._closer�   )r   r}   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 )Nrl   c                    ó   |   ¡ }ˆ ¡  | ˆ ¡ |S r.   ©r“   ra   r|   r†   ©Ú
_getAttrs2r   r   r   r”   2  ó   
zBOurServerOurClientTests.test_openFileAttributes.<locals>._getAttrsc                    ó&   ˆ j  d¡}ˆ  ¡  | ˆ j| ¡ |S ©Nrl   ©r]   r“   ra   r|   rg   )Zattrs1r}   r   r   r   r¡   8  rŒ   zCOurServerOurClientTests.test_openFileAttributes.<locals>._getAttrs2r�   ©r   r}   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 )Nrl   c                    rž   r.   rŸ   r†   )Ú	_setAttrsr   r   r   r”   H  r¢   z@OurServerOurClientTests.test_openFileSetAttrs.<locals>._getAttrsc                    s:   d| d< ˆj  d| ¡}ˆ ¡  | ˆ ¡ | ˆj| ¡ |S )Nr   Úatimerl   )r]   ZsetAttrsra   r|   rg   ©Úattrsr}   r    r   r   r¨   N  s   
z@OurServerOurClientTests.test_openFileSetAttrs.<locals>._setAttrsc                    ó   ˆ j  d¡}ˆ  ¡  |S r¤   ©r]   r“   ra   ©rZ   r}   r   r   r   r¡   V  ó   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   rw   g  rs   zIOurServerOurClientTests.test_openFileExtendedAttributes.<locals>.openFilerl   Úext_foorA   c                    s   ˆ  ˆ ddi¡ d S )Nr¶   rA   ©rg   )Zign)rµ   r   r   r   Úcheckt  ó   zFOurServerOurClientTests.test_openFileExtendedAttributes.<locals>.checkN)r[   r]   rw   r   ry   rz   ra   r|   )r   rw   r}   r¸   r   )r´   rµ   r   r   Útest_openFileExtendedAttributes^  s   


ý
z7OurServerOurClientTests.test_openFileExtendedAttributesc                    sB   ˆ j  d¡}ˆ  ¡  ‡ fdd„}| |¡ | |¡ ˆ  |tj¡S )Nó   testRemoveFilec                    r¬   )Nr»   )r]   Z
removeFilera   )Úignoredr}   r   r   r   Ú_removeFile}  r¯   z<OurServerOurClientTests.test_removeFile.<locals>._removeFile)r]   r“   ra   r|   r™   r   rš   )r   r}   r½   r   r   r   Útest_removeFiley  s   

z'OurServerOurClientTests.test_removeFilec                    s8   ˆj  d¡}ˆ ¡  ‡ ‡fdd„}‡fdd„‰ | |¡S )Nó   testRenameFilec                    s&   ˆj  dd¡}ˆ ¡  | ˆ | ¡ |S )Nr¿   ó   testRenamedFile)r]   Z
renameFilera   r|   rª   ©Ú_testRenamedr   r   r   Ú_renameŠ  s   z8OurServerOurClientTests.test_renameFile.<locals>._renamec                    s&   ˆ j  d¡}ˆ  ¡  | ˆ j|¡ d S )NrÀ   r¥   )rZ   r«   r}   r   r   r   rÂ   �  s   z=OurServerOurClientTests.test_renameFile.<locals>._testRenamed)r]   r“   ra   r|   )r   r}   rÃ   r   rÁ   r   Útest_renameFile†  s
   
z'OurServerOurClientTests.test_renameFilec                 C   ó"   | j  d¡}|  ¡  |  |tj¡S ©Nó   testMakeDirectory©r]   r“   ra   r™   r   rš   ©r   r}   r   r   r   Útest_directoryBad—  ó   z)OurServerOurClientTests.test_directoryBadc                    sZ   ˆ j  di ¡}ˆ  ¡  ‡ fdd„}‡ fdd„}| |¡ | |¡ | |¡ ˆ  |tj¡S )NrÇ   c                    r¬   rÆ   r­   r®   r   r   r   r”      r¯   zAOurServerOurClientTests.test_directoryCreation.<locals>._getAttrsc                    r¬   rÆ   )r]   ZremoveDirectoryra   r®   r   r   r   Ú_removeDirectory©  r¯   zHOurServerOurClientTests.test_directoryCreation.<locals>._removeDirectory)r]   ZmakeDirectoryra   r|   r™   r   rš   )r   r}   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.   rm   r–   )Úfilesr�   r   r   rn   ¹  s   
zMOurServerOurClientTests.test_openDirectory.<locals>._getFiles.<locals>.append)r   ZmaybeDeferredÚnextra   r|   r˜   )r�   rn   r}   ©rœ   r‚   rÏ   r   r€   r   r‚   ¸  s   

z=OurServerOurClientTests.test_openDirectory.<locals>._getFilesc                    s0   t t tˆ Ž ƒd ƒ}| ¡  ˆ |g d¢¡ d S )Nr   )s   .testHiddenFiles   testDirectoryr»   r¿   rl   )ÚlistÚzipÚsortrg   )r¼   Úfs)rÏ   r   r   r   Ú_checkFilesÄ  s   þz?OurServerOurClientTests.test_openDirectory.<locals>._checkFilesc                    r’   r.   )rr   ra   )rZ   r�   r}   r   r   r   rœ   Ò  r•   z:OurServerOurClientTests.test_openDirectory.<locals>._closerƒ   )r   r}   rÖ   r   rÑ   r   Útest_openDirectory³  s   

z*OurServerOurClientTests.test_openDirectoryc                 C   rÅ   )Nó   testLinkrÈ   rÉ   r   r   r   Útest_linkDoesntExistÛ  rË   z,OurServerOurClientTests.test_linkDoesntExistc                    sB   ˆ j  dd¡}ˆ  ¡  ‡ fdd„}‡ fdd„}| |¡ | |¡S )NrØ   rl   c                    s   ˆ j  dd¡}ˆ  ¡  |S )NrØ   r   r­   r®   r   r   r   Ú_getFirstAttrsä  s   zDOurServerOurClientTests.test_linkSharesAttrs.<locals>._getFirstAttrsc                    r£   r¤   r¥   )Z
firstAttrsr}   r   r   r   Ú_getSecondAttrsé  rŒ   zEOurServerOurClientTests.test_linkSharesAttrs.<locals>._getSecondAttrs©r]   ZmakeLinkra   r|   )r   r}   rÚ   rÛ   r   r   r   Útest_linkSharesAttrsà  s   

z,OurServerOurClientTests.test_linkSharesAttrsc                    sF   ˆ j  dd¡}ˆ  ¡  ‡ fdd„}‡ fdd„}| |¡ | |¡ |S )NrØ   rl   c                    óH   ˆ j  d¡}ˆ  ¡  tt ¡ ƒ ˆ jj¡}| 	d¡}| 
ˆ j|j¡ |S ©NrØ   rG   )r]   ZreadLinkra   r
   r0   r1   r2   rN   r3   rO   r|   rg   )rZ   r}   ZtestFiler   r   r   Ú	_readLinkö  ó   
z8OurServerOurClientTests.test_linkPath.<locals>._readLinkc                    rÞ   rß   )r]   ZrealPathra   r
   r0   r1   r2   rN   r3   rO   r|   rg   )rZ   r}   ZtestLinkr   r   r   Ú	_realPathþ  rá   z8OurServerOurClientTests.test_linkPath.<locals>._realPathrÜ   )r   r}   rà   râ   r   r   r   Útest_linkPathò  s   

z%OurServerOurClientTests.test_linkPathc                 C   s4   | j  dd¡}|  ¡  | | jd¡ | | j¡ |S )Nr@   s   foorA   )r]   rD   ra   r|   rg   Ú_cbTestExtendedRequestrÉ   r   r   r   Útest_extendedRequest
  s
   z,OurServerOurClientTests.test_extendedRequestc                 C   s"   | j  dd¡}|  ¡  |  |t¡S )Ns   testBadRequestrÎ   )r]   rD   ra   r™   rB   )r   r¼   r}   r   r   r   rä     s   z.OurServerOurClientTests._cbTestExtendedRequestc                 c   sz   � | j  d¡}|  ¡  |V }| ¡ }|  ¡  |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)r]   r„   ra   rÐ   ZflushWarningsrg   r"   ÚDeprecationWarning)r   r}   r�   ZoneFileÚwarningsrç   r   r   r   Ú$test_openDirectoryIteratorDeprecated  s   €ÿz<OurServerOurClientTests.test_openDirectoryIteratorDeprecatedc                 #   sÐ   � ˆj  dtji ¡}ˆ ¡  |V }g ‰ ‡ ‡fdd„}ˆjj ¡ \}||_~| dd¡}ˆ ¡  ˆ 	t
ˆ ƒd¡ ˆ |¡ ˆj ¡  ˆj ¡  ˆj ¡  ˆ ¡  ˆ ˆj j¡ ˆ |t¡ | ¡ }ˆ |t¡ dS )z{
        If there are requests outstanding when the connection
        is closed for any reason, they should fail.
        rl   c                    s"   ˆ  ˆ g ¡ t ¡ }ˆ  | ¡ |S r.   )rg   r   ÚDeferredrn   )ÚoffsetÚlengthr}   ©ZgotReadRequestr   r   r   Ú	_slowRead9  s   
zOOurServerOurClientTests.test_closedConnectionCancelsRequests.<locals>._slowReadéd   éÈ   r   N)r]   rw   r   ry   ra   r[   ru   Úvaluesr‹   rg   r"   ZassertNoResultr`   rd   rc   r_   ZassertFalseÚ	connectedZfailureResultOfr   r“   )r   r}   Úfhrï   ZserverSideFhr   rî   r   Ú$test_closedConnectionCancelsRequests+  s*   €



z<OurServerOurClientTests.test_closedConnectionCancelsRequestsN)r*   r+   r,   rV   ra   re   rh   rk   r~   r…   r‘   r�   r§   r°   rº   r¾   rÄ   rÊ   rÍ   r×   rÙ   rÝ   rã   rå   rä   r   ZinlineCallbacksrê   rõ   r   r   r   r   rW   �   s6    	!(
rW   c                   @   r5   )ÚFakeConnc                 C   ó   d S r.   r   )r   Zchannelr   r   r   Ú	sendCloseZ  ó   zFakeConn.sendCloseN)r*   r+   r,   rø   r   r   r   r   rö   Y  r:   rö   c                   @   sD   e 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S )ÚFileTransferCloseTestsc                 C   s   t ƒ | _d S r.   )r   r8   r   r   r   r   rV   `  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   i  r9   zMFileTransferCloseTests.buildServerConnection.<locals>.DummyTransport.__init__c                 S   r÷   r.   r   )r   ÚkindÚdatar   r   r   Ú
sendPacketl  rù   zOFileTransferCloseTests.buildServerConnection.<locals>.DummyTransport.sendPacketc                 S   s   dS )Nzdummy transportr   r   r   r   r   Ú	logPrefixo  rù   zNFileTransferCloseTests.buildServerConnection.<locals>.DummyTransport.logPrefixN)r*   r+   r,   r   rþ   rÿ   r   r   r   r   ÚDummyTransporth  s    r   )r   ZSSHConnectionrû   r8   )r   Úconnr   r   r   r   ÚbuildServerConnectionc  s
   

z,FileTransferCloseTests.buildServerConnectionc                    s$   dˆ_ |j‰ ‡ ‡fdd„}||_d S )NFc                    s   dˆ_ ˆ | ƒ d S )NT)ÚconnectionLostFired)Úreason©ZorigConnectionLostr   r   r   ÚconnectionLostz  s   zFFileTransferCloseTests.interceptConnectionLost.<locals>.connectionLost)r  r  )r   Ú
sftpServerr  r   r  r   ÚinterceptConnectionLostv  s   
z.FileTransferCloseTests.interceptConnectionLostc                 C   s   |   | jd¡ d S )Nz*sftpServer's connectionLost was not called)ri   r  r   r   r   r   ÚassertSFTPConnectionLost€  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  r8   r   N)r   r   rö   r8   Úrequest_subsystemr   ÚNSr]   rû   Úprotor  ZcloseReceivedr	  )r   ZtestSessionr  r   r   r   Útest_sessionClose…  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   rf   r   N)r  r   r  ÚstructÚpackÚssh_CHANNEL_OPENÚchannelsr
  r]   rû   r  r  Zssh_CHANNEL_CLOSEr	  ©r   r  Ú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   rf   r   N)r  r   r  r  r  r  r  r
  r]   rû   r  r  ZserviceStoppedr	  r  r   r   r   Ú'test_stopConnectionServiceClosesChannel±  s   



z>FileTransferCloseTests.test_stopConnectionServiceClosesChannelN)
r*   r+   r,   rV   r  r  r	  r  r  r  r   r   r   r   rú   ^  s    
rú   zCannot run without cryptographyc                   @   s    e Zd ZdZg d¢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.
    )aµ  
           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|ƒ¡ q2d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ÚmatchÚintÚgroupri   r"   Úitemsrg   Úgetattrr   )r   Ú	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  Æ  s    	Lr  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚRawPacketDataServerTestszŒ
    Tests for L{filetransfer.FileTransferServer} which explicitly craft
    certain less common situations to exercise their handling.
    c                 C   s   t jtƒ d�| _d S )Nr7   )r   r   r   Úftsr   r   r   r   rV   9  r¹   zRawPacketDataServerTests.setUpc                 C   sŽ   t ƒ }| j |¡ d}d}t tdgƒ| t |¡ ¡}| j |¡ t tdgƒ| tg d¢ƒ t d¡ t d¡ ¡}t| ¡ t	|ƒƒ dS )	zl
        A close request with an unknown handle receives an FX_NO_SUCH_FILE error
        response.
        s   1234s   invalid handlert   ée   )r   r   r   r   s   No such file or directoryrÎ   N)
r   r(  r^   r   r  ÚbytesZdataReceivedr   Úvaluer   )r   rû   Z	requestIdrv   rr   Úexpectedr   r   r   Útest_closeInvalidHandle<  s6   ÿþýý
ú	÷óýþz0RawPacketDataServerTests.test_closeInvalidHandleN)r*   r+   r,   r&  rV   r-  r   r   r   r   r'  1  s    r'  c                   @   sH   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S )ÚRawPacketDataTestsz“
    Tests for L{filetransfer.FileTransferClient} which explicitly craft certain
    less common protocol messages to exercise their handling.
    c                 C   s   t  ¡ | _d S r.   )r   r\   Úftcr   r   r   r   rV   w  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ó   langN)r   rë   r|   Ú_cbTestPacketSTATUSr/  ÚopenRequestsr  r  r   ÚFX_OKr   r  Úpacket_STATUS©r   r}   rý   r   r   r   Útest_packetSTATUSz  s   ÿþÿz$RawPacketDataTests.test_packetSTATUSc                 C   ó$   |   |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   r1  r   r2  Nr·   ©r   Úresultr   r   r   r3  �  ó   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   r0  N)r   rë   r|   Ú_cbTestPacketSTATUSShortr/  r4  r  r  r   r5  r6  r7  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=  ¥  r<  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   r0  r1  N)r   rë   r|   Ú_cbTestPacketSTATUSWithoutLangr/  r4  r  r  r   r5  r   r  r6  r7  r   r   r   Útest_packetSTATUSWithoutLang­  s   
z/RawPacketDataTests.test_packetSTATUSWithoutLangc                 C   r9  )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   r1  r   rÎ   Nr·   r:  r   r   r   r?  ¾  r<  z1RawPacketDataTests._cbTestPacketSTATUSWithoutLangN)r*   r+   r,   r&  rV   r8  r3  r>  r=  r@  r?  r   r   r   r   r.  p  s    r.  )8r&  r0   r  r  Zunittestr   Zhamcrestr   r   Ztwisted.internetr   Ztwisted.internet.errorr   Ztwisted.internet.testingr   Ztwisted.protocolsr   Ztwisted.pythonr	   Ztwisted.python.filepathr
   Ztwisted.trial.unittestr   Ztwisted.conchr   Z_unixÚImportErrorZtwisted.conch.unixr   Z_SFTPServerForUnixConchUserZcryptographyZ_cryptographyZtwisted.conch.avatarr   Z
_ConchUserÚobjectZtwisted.conch.sshr   r   r   r   r   r-   r6   ré   Úwarnr;   ZregisterAdapterrj   rE   rW   rö   rú   r  r'  r.  r   r   r   r   Ú<module>   s�   ÿÿÿÿÿ	üÿ		ÿ
   L

g
j

=