o
    ¼>hv}  ã                   @   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   Ú
SSHSessionÚchannelLookupr   ÚFileTransferServerÚsubsystemLookup©Úself© r   ú„/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/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   r1   r   r   r   r   Q   s   

zFileTransferTestAvatar.__init__c                 C   s   t t ¡ ƒ | jj¡S r0   )r
   ÚosÚgetcwdÚpreauthChildr1   Úpathr   r   r   r   Ú
getHomeDirU   s   z!FileTransferTestAvatar.getHomeDirN)r,   r-   r.   r   r6   r   r   r   r   r/   P   s    r/   c                   @   ó   e Zd Zdd„ ZdS )ÚConchSessionForTestAvatarc                 C   s
   || _ d S r0   ©Úavatar)r   r:   r   r   r   r   Z   ó   
z"ConchSessionForTestAvatar.__init__N)r,   r-   r.   r   r   r   r   r   r8   Y   ó    r8   zNtwisted.conch.unix imported %r, but doesn't define SFTPServerForUnixConchUser'c                   @   r   )ÚFileTransferForTestAvatarc                 C   s   ddiS )Nó	   conchTestó   ext datar   )r   ÚversionÚotherExtr   r   r   Ú
gotVersionm   s   z$FileTransferForTestAvatar.gotVersionc                 C   s   |dkrdS t ‚)Nó   testExtendedRequestó   bar)ÚNotImplementedError)r   ÚextNameÚextDatar   r   r   ÚextendedRequestp   s   z)FileTransferForTestAvatar.extendedRequestN)r,   r-   r.   rB   rH   r   r   r   r   r=   l   s    r=   c                   @   r7   )Ú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ÚextraÚtestDirectoryTÚ	testfile1Úwb)Úmodeó   aaaaaaaaaabbbbbbbbbbz/dev/urandomÚrbi   i¤  ÚtestRemoveFileó   aÚtestRenameFilez.testHiddenFile)	r
   ÚmktempÚtestDirÚchildÚmakedirsÚopenÚwriteÚreadÚchmod)r   r%   Úf2r   r   r   ÚsetUp{   s(   
ÿ€þÿÿ"ÿzSFTPTestBase.setUpN)r,   r-   r.   r]   r   r   r   r   rI   z   r<   rI   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 )Nr9   c                    s   | ˆ _ |ˆ _d S r0   )Ú_serverVersionÚ_extData)ÚserverVersionrG   r   r   r   Ú_œ   s   
z(OurServerOurClientTests.setUp.<locals>._)rI   r]   r/   rU   r:   r   r   Úserverr   ÚLoopbackRelayÚFileTransferClientÚclientr_   r`   ÚgotServerVersionÚmakeConnectionÚclientTransportÚserverTransportÚ_emptyBuffers)r   ri   rb   rj   r   r   r   r]   ‘   s   

zOurServerOurClientTests.setUpc                 C   s<   | j js| jjr| j  ¡  | j ¡  | j js| jjsd S d S r0   )rj   Úbufferri   ÚclearBufferr   r   r   r   rk   ª   s   

þz%OurServerOurClientTests._emptyBuffersc                 C   s,   | j  ¡  | j ¡  | j  ¡  | j ¡  d S r0   )rj   ÚloseConnectionri   rm   r   r   r   r   ÚtearDown¯   s   


z OurServerOurClientTests.tearDownc                 C   s$   |   | jd¡ |   | jddi¡ d S )Né   r>   r?   )ÚassertEqualr_   r`   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   ÚISFTPServerÚ
providedByrc   rf   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 r0   ©Úappend)Úfd)ÚclosedÚoldCloser   r   ÚcloseÎ   ó   
zJOurServerOurClientTests.test_openedFileClosedWithConnection.<locals>.closer}   c                    s`   ˆj j| jdd …  j}ˆj ¡  ˆj ¡  ˆj ¡  ˆj ¡  ˆ ˆj ji ¡ ˆ 	|ˆ ¡ d S )Né   )
rc   Ú	openFilesÚhandlerz   rj   rn   ri   rm   rq   ÚassertIn)ÚopenFilerz   )r{   r   r   r   Ú_fileOpenedÔ   s   



zPOurServerOurClientTests.test_openedFileClosedWithConnection.<locals>._fileOpened)
rf   rƒ   r   ÚFXF_READÚ	FXF_WRITErk   r2   r}   ÚpatchÚaddCallback)r   Údr}   r„   r   )r{   r|   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 r0   )rj   rn   ri   rm   rq   rc   ÚopenDirs©ÚopenDirr   r   r   Ú	_getFilesè   s
   



zSOurServerOurClientTests.test_openedDirectoryClosedWithConnection.<locals>._getFiles©rf   ÚopenDirectoryrk   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 )
Nrw   c                    s*   ˆ  | t | ¡¡ ˆ | ƒ}| ˆ| ¡ |S r0   )rq   r   Ú	ISFTPFilerˆ   ©rƒ   r‰   )Ú
_readChunkÚ_writeChunkr   r   r   r„   ø   s   z<OurServerOurClientTests.test_openFileIO.<locals>._fileOpenedc                    s&   |   dd¡}ˆ  ¡  | ˆ jd¡ |S )Nr   é   rO   ©Ú	readChunkrk   rˆ   rq   r”   r   r   r   r•   þ   ó   z;OurServerOurClientTests.test_openFileIO.<locals>._readChunkc                    s$   |  dd¡}ˆ ¡  | ˆ |¡ |S )Nr—   s
   cccccccccc)Ú
writeChunkrk   rˆ   ©rb   rƒ   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©rf   rƒ   r   r…   r†   rk   rˆ   )r   r‰   r„   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 )Nrw   c                    ó   |  ¡ }ˆ  ¡  |S r0   )ÚgetAttrsrk   rœ   r   r   r   Ú	_getAttrs  ó   zBOurServerOurClientTests.test_closedFileGetAttrs.<locals>._getAttrsc                    s   ˆ   ¡  | S r0   )ÚflushLoggedErrors©r%   r   r   r   Ú_err  s   z=OurServerOurClientTests.test_closedFileGetAttrs.<locals>._errc                    s4   |   ¡ }ˆ ¡  | ˆ| ¡ | ˆ ¡ ˆ |tj¡S r0   )r}   rk   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 )Nrw   c                    ó   |   ¡ }ˆ ¡  | ˆ ¡ |S r0   ©r¢   rk   rˆ   r”   ©Ú
_getAttrs2r   r   r   r£   2  ó   
zBOurServerOurClientTests.test_openFileAttributes.<locals>._getAttrsc                    ó&   ˆ j  d¡}ˆ  ¡  | ˆ j| ¡ |S ©Nrw   ©rf   r¢   rk   rˆ   rq   )Ú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 )Nrw   c                    r®   r0   r¯   r”   )Ú	_setAttrsr   r   r   r£   H  r²   z@OurServerOurClientTests.test_openFileSetAttrs.<locals>._getAttrsc                    s:   d| d< ˆj  d| ¡}ˆ ¡  | ˆ ¡ | ˆj| ¡ |S )Nr   Úatimerw   )rf   ÚsetAttrsrk   rˆ   rq   ©Úattrsr‰   r°   r   r   r¹   N  s   
z@OurServerOurClientTests.test_openFileSetAttrs.<locals>._setAttrsc                    ó   ˆ j  d¡}ˆ  ¡  |S r´   ©rf   r¢   rk   ©rb   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 r0   )Úupdate)ÚfilenameÚflagsr½   )ÚoldOpenFileÚsavedAttributesr   r   rƒ   g  r~   zIOurServerOurClientTests.test_openFileExtendedAttributes.<locals>.openFilerw   Úext_foorD   c                    s   ˆ  ˆ ddi¡ d S )NrÈ   rD   ©rq   )Úign)rÇ   r   r   r   Úcheckt  ó   zFOurServerOurClientTests.test_openFileExtendedAttributes.<locals>.check)rc   rf   rƒ   r   r…   r†   rk   rˆ   )r   rƒ   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Î   )rf   Ú
removeFilerk   )Úignoredr‰   r   r   r   Ú_removeFile}  rÁ   z<OurServerOurClientTests.test_removeFile.<locals>._removeFile)rf   r¢   rk   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)rf   Ú
renameFilerk   rˆ   r¼   ©Ú_testRenamedr   r   r   Ú_renameŠ  s   z8OurServerOurClientTests.test_renameFile.<locals>._renamec                    s&   ˆ j  d¡}ˆ  ¡  | ˆ j|¡ d S )NrÔ   rµ   )rb   r½   r‰   r   r   r   r×     s   z=OurServerOurClientTests.test_renameFile.<locals>._testRenamed)rf   r¢   rk   rˆ   )r   r‰   rØ   r   rÖ   r   Útest_renameFile†  s
   
z'OurServerOurClientTests.test_renameFilec                 C   ó"   | j  d¡}|  ¡  |  |tj¡S ©Nó   testMakeDirectory©rf   r¢   rk   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Û   )rf   ÚremoveDirectoryrk   rÀ   r   r   r   Ú_removeDirectory©  rÁ   zHOurServerOurClientTests.test_directoryCreation.<locals>._removeDirectory)rf   ÚmakeDirectoryrk   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 r0   rx   r¦   )ÚfilesrŽ   r   r   ry   ¹  s   
zMOurServerOurClientTests.test_openDirectory.<locals>._getFiles.<locals>.append)r   ÚmaybeDeferredÚnextrk   rˆ   r¨   )rŽ   ry   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Ó   rw   )ÚlistÚzipÚsortrq   )rÐ   Úfs)ræ   r   r   r   Ú_checkFilesÄ  s   þz?OurServerOurClientTests.test_openDirectory.<locals>._checkFilesc                    r¡   r0   )r}   rk   )rb   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ð   rw   c                    s   ˆ j  dd¡}ˆ  ¡  |S )Nrð   r    r¿   rÀ   r   r   r   Ú_getFirstAttrsä  s   zDOurServerOurClientTests.test_linkSharesAttrs.<locals>._getFirstAttrsc                    r³   r´   rµ   )Ú
firstAttrsr‰   r   r   r   Ú_getSecondAttrsé  rš   zEOurServerOurClientTests.test_linkSharesAttrs.<locals>._getSecondAttrs©rf   ÚmakeLinkrk   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ð   rw   c                    óH   ˆ j  d¡}ˆ  ¡  tt ¡ ƒ ˆ jj¡}| 	d¡}| 
ˆ j|j¡ |S ©Nrð   rL   )rf   ÚreadLinkrk   r
   r2   r3   r4   rU   r5   rV   rˆ   rq   )rb   r‰   ÚtestFiler   r   r   Ú	_readLinkö  ó   
z8OurServerOurClientTests.test_linkPath.<locals>._readLinkc                    rø   rù   )rf   ÚrealPathrk   r
   r2   r3   r4   rU   r5   rV   rˆ   rq   )rb   r‰   Ú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 )NrC   s   foorD   )rf   rH   rk   rˆ   rq   Ú_cbTestExtendedRequestrÞ   r   r   r   Útest_extendedRequest
  s
   z,OurServerOurClientTests.test_extendedRequestc                 C   s"   | j  dd¡}|  ¡  |  |t¡S )Ns   testBadRequestrå   )rf   rH   rk   r©   rE   )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)rf   r‘   rk   rè   ÚflushWarningsrq   r$   ÚDeprecationWarning)r   r‰   rŽ   Ú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.
        rw   c                    s"   ˆ  ˆ g ¡ t ¡ }ˆ  | ¡ |S r0   )rq   r   ÚDeferredry   )ÚoffsetÚlengthr‰   ©ÚgotReadRequestr   r   r   Ú	_slowRead9  s   
zOOurServerOurClientTests.test_closedConnectionCancelsRequests.<locals>._slowReadéd   éÈ   r    N)rf   rƒ   r   r…   rk   rc   r€   Úvaluesr™   rq   r$   ÚassertNoResultrj   rn   rm   ri   ÚassertFalseÚ	connectedÚfailureResultOfr   r¢   )r   r‰   Úfhr  ÚserverSideFhr   r  r   Ú$test_closedConnectionCancelsRequests+  s*   €



z<OurServerOurClientTests.test_closedConnectionCancelsRequestsN)r,   r-   r.   r]   rk   ro   rr   rv   rŠ   r’   r    r­   r¸   rÂ   rÍ   rÒ   rÙ   rß   rä   rï   rñ   r÷   r  r  r  r   ÚinlineCallbacksr
  r  r   r   r   r   r^      s6    	!(
r^   c                   @   r7   )ÚFakeConnc                 C   ó   d S r0   r   )r   Ú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 r0   )r   r:   r   r   r   r   r]   `  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 r0   )Ú	transportr   r   r   r   r   i  r;   zMFileTransferCloseTests.buildServerConnection.<locals>.DummyTransport.__init__c                 S   r  r0   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   ÚSSHConnectionr"  r:   )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©Ú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)rs   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)  r:   r   N)r   r   r  r:   Úrequest_subsystemr   ÚNSrf   r"  Úprotor1  ÚcloseReceivedr2  )r   ÚtestSessionr0  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   rp   r   N)r*  r   r4  ÚstructÚpackÚssh_CHANNEL_OPENÚchannelsr3  rf   r"  r5  r1  Ússh_CHANNEL_CLOSEr2  ©r   r)  ÚpacketÚsessionChannelr0  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   r9  r   rp   r   N)r*  r   r4  r:  r;  r<  r=  r3  rf   r"  r5  r1  ÚserviceStoppedr2  r?  r   r   r   Ú'test_stopConnectionServiceClosesChannel±  s   



z>FileTransferCloseTests.test_stopConnectionServiceClosesChannelN)
r,   r-   r.   r]   r*  r1  r2  r8  rB  rD  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Úgrouprs   r$   Úitemsrq   Úgetattrr   )r   Ú	constantsÚexcerptÚlineÚmÚkÚvr   r   r   Útest_constantsAgainstSpec  s   
€ýÿÿz(ConstantsTests.test_constantsAgainstSpecN)r,   r-   r.   Ú__doc__rF  rT  r   r   r   r   rE  Æ  s    	LrE  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 )Nr9   )r   r   r   Úftsr   r   r   r   r]   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 handler   ée   )r   r   r   r!   s   No such file or directoryrå   N)
r   rW  rh   r   r4  ÚbytesÚdataReceivedr   Úvaluer   )r   r"  Ú	requestIdr   r}   Úexpectedr   r   r   Útest_closeInvalidHandle<  s6   ÿþýý
ú	÷óýþz0RawPacketDataServerTests.test_closeInvalidHandleN)r,   r-   r.   rU  r]   r^  r   r   r   r   rV  1  s    rV  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 r0   )r   re   Úftcr   r   r   r   r]   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ó   lang)r   r  rˆ   Ú_cbTestPacketSTATUSr`  ÚopenRequestsr:  r;  r   ÚFX_OKr   r4  Ú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   rb  r    rc  NrÉ   ©r   Úresultr   r   r   rd    ó   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    ra  )r   r  rˆ   Ú_cbTestPacketSTATUSShortr`  re  r:  r;  r   rf  rg  rh  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É   rk  r   r   r   rn  ¥  rm  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    ra  rb  )r   r  rˆ   Ú_cbTestPacketSTATUSWithoutLangr`  re  r:  r;  r   rf  r   r4  rg  rh  r   r   r   Útest_packetSTATUSWithoutLang­  s   
z/RawPacketDataTests.test_packetSTATUSWithoutLangc                 C   rj  )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   rb  r    rå   NrÉ   rk  r   r   r   rp  ¾  rm  z1RawPacketDataTests._cbTestPacketSTATUSWithoutLangN)r,   r-   r.   rU  r]   ri  rd  ro  rn  rq  rp  r   r   r   r   r_  p  s    r_  )8rU  r2   rH  r:  Úunittestr   Úhamcrestr   r   Útwisted.internetr   Útwisted.internet.errorr   Útwisted.internet.testingr   Útwisted.protocolsr   Útwisted.pythonr	   Útwisted.python.filepathr
   Útwisted.trial.unittestr   Útwisted.conchr   Ú_unixÚImportErrorÚtwisted.conch.unixr   Ú_SFTPServerForUnixConchUserÚcryptographyÚ_cryptographyÚtwisted.conch.avatarr   Ú
_ConchUserÚobjectÚtwisted.conch.sshr   r   r   r   r   r/   r8   r	  Úwarnr=   ÚregisterAdapterrt   rI   r^   r  r!  rE  rV  r_  r   r   r   r   Ú<module>   s   ÿÿÿÿÿ	üÿ		ÿ
   L

g
j

=