§
    Ètºfv}  ã                   óð  — 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 	 ddlmZ eZn# e$ r dZY nw xY w	 ddlmZ eZn# e$ r dZY nw xY w	 ddlZeZn# e$ r dZY nw xY w	 ddl m!Z" e"Z!n# e$ r e#Z!Y nw xY w	 ddl$m%Z%m&Z&m'Z'm(Z( n# e$ r Y nw xY w G d„ de!¦  «        Z) G d„ de)¦  «        Z* G d„ d¦  «        Z+e€ddl,Z, e,j-        de›d�¦  «         n% G d„ de¦  «        Z. ej/        e.e)e'j0        ¦  «          G d„ de¦  «        Z1 ee d¦  «         G d„ de1¦  «        ¦   «         Z2 G d„ d ¦  «        Z3 ee d¦  «         G d!„ d"e¦  «        ¦   «         Z4 ee d#¦  «         G d$„ d%e¦  «        ¦   «         Z5 ee d¦  «         ee d#¦  «         G d&„ d'e¦  «        ¦   «         ¦   «         Z6 ee d#¦  «         G 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„ Zd„ ZdS )Ú
TestAvatarc                 óŠ   — t                                | ¦  «         t          j        | j        d<   t
          j        | j        d<   d S )Nó   sessionó   sftp)r   Ú__init__r   Ú
SSHSessionÚchannelLookupr   ÚFileTransferServerÚsubsystemLookup©Úselfs    úc/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/conch/test/test_filetransfer.pyr   zTestAvatar.__init__>   s<   € Ý×Ò˜4Ñ Ô Ð Ý)0Ô);ˆÔ˜:Ñ&Ý(4Ô(GˆÔ˜WÑ%Ð%Ð%ó    c                 óò   — 	 t          |¦  «        }n# t          $ r	 |||fg}Y nw xY w|D ]L}|d         }t          |¦  «        dk    r|d         pd}t          |¦  «        dk    r|d         pi } ||i |¤Ž}ŒM|S )Nr   é   © é   )ÚiterÚ	TypeErrorÚlen)r   ÚfÚargsÚkwÚiÚfuncÚrs          r    Ú
_runAsUserzTestAvatar._runAsUserC   s­   € ð	 Ý�Q‘”ˆAˆAøÝð 	 ð 	 ð 	 Ø�T˜2��ˆAˆAˆAð	 øøøàð 	"ð 	"ˆAØ�Q”4ˆDÝ�q‘6”6˜A’:Ð& ! A¤$Ð,¨"ˆDÝ�Q‘”˜!’Ð$  !¤Ð*¨ˆBØ��dÐ!˜bÐ!Ð!ˆAˆAØˆs   ‚ ’%¤%N)Ú__name__Ú
__module__Ú__qualname__r   r/   r$   r!   r    r   r   =   s5   € € € € € ðHð Hð Hð

ð 
ð 
ð 
ð 
r!   r   c                   ó   — e Zd Zd„ Zd„ ZdS )ÚFileTransferTestAvatarc                 óH   — t                                | ¦  «         || _        d S ©N)r   r   ÚhomeDir)r   r7   s     r    r   zFileTransferTestAvatar.__init__Q   s!   € Ý×Ò˜DÑ!Ô!Ð!ØˆŒˆˆr!   c                 ó|   — t          t          j        ¦   «         ¦  «                             | j        j        ¦  «        S r6   )r   ÚosÚgetcwdÚpreauthChildr7   Úpathr   s    r    Ú
getHomeDirz!FileTransferTestAvatar.getHomeDirU   s)   € Ý�œ	™œÑ$Ô$×1Ò1°$´,Ô2CÑDÔDÐDr!   N)r0   r1   r2   r   r=   r$   r!   r    r4   r4   P   s7   € € € € € ðð ð ðEð Eð Eð Eð Er!   r4   c                   ó   — e Zd Zd„ ZdS )ÚConchSessionForTestAvatarc                 ó   — || _         d S r6   ©Úavatar)r   rB   s     r    r   z"ConchSessionForTestAvatar.__init__Z   s   € ØˆŒˆˆr!   N)r0   r1   r2   r   r$   r!   r    r?   r?   Y   s#   € € € € € ðð ð ð ð r!   r?   ztwisted.conch.unix imported z0, but doesn't define SFTPServerForUnixConchUser'c                   ó   — e Zd Zd„ Zd„ ZdS )ÚFileTransferForTestAvatarc                 ó
   — ddiS )Nó	   conchTestó   ext datar$   )r   ÚversionÚotherExts      r    Ú
gotVersionz$FileTransferForTestAvatar.gotVersionm   s   € Ø  +Ð.Ð.r!   c                 ó    — |dk    rdS t           ‚)Nó   testExtendedRequestó   bar)ÚNotImplementedError)r   ÚextNameÚextDatas      r    ÚextendedRequestz)FileTransferForTestAvatar.extendedRequestp   s   € ØÐ0Ò0Ð0Ø�vÝ%Ð%r!   N)r0   r1   r2   rJ   rQ   r$   r!   r    rD   rD   l   s2   € € € € € ð	/ð 	/ð 	/ð	&ð 	&ð 	&ð 	&ð 	&r!   rD   c                   ó   — e Zd Zd„ ZdS )ÚSFTPTestBasec                 ó¾  — t          |                      ¦   «         ¦  «        | _        | j                             d¦  «        | _        | j                             d¦  «                             d¦  «         | j                             d¦  «                             d¬¦  «        5 }|                     d¦  «         t          dd	¦  «        5 }|                     |                     d
¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   | j                             d¦  «                             d¦  «         | j                             d¦  «                             d¬¦  «        5 }|                     d¦  «         d d d ¦  «         n# 1 swxY w Y   | j                             d¦  «                             d¬¦  «        5 }|                     d¦  «         d d d ¦  «         n# 1 swxY w Y   | j                             d¦  «                             d¬¦  «        5 }|                     d¦  «         d d d ¦  «         d S # 1 swxY 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)   Úf2s      r    ÚsetUpzSFTPTestBase.setUp{   s2  € Ý §¢¡¤Ñ.Ô.ˆŒð ”|×)Ò)¨'Ñ2Ô2ˆŒØŒ×Ò˜?Ñ+Ô+×4Ò4°TÑ:Ô:Ð:àŒ\×Ò Ñ,Ô,×1Ò1°tÐ1Ñ<Ô<ð 	,ÀØ�GŠGÐ)Ñ*Ô*Ð*Ý�n dÑ+Ô+ð ,¨rØ—’˜Ÿš 	Ñ*Ô*Ñ+Ô+Ð+ð,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,ð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,ð 	Œ×Ò˜;Ñ'Ô'×-Ò-¨eÑ4Ô4Ð4ØŒ\×ÒÐ 0Ñ1Ô1×6Ò6¸DÐ6ÑAÔAð 	ÀQØ�GŠG�D‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	àŒ\×ÒÐ 0Ñ1Ô1×6Ò6¸DÐ6ÑAÔAð 	ÀQØ�GŠG�D‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	àŒ\×ÒÐ 1Ñ2Ô2×7Ò7¸TÐ7ÑBÔBð 	ÀaØ�GŠG�D‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	sl   Â!&DÃ)C<Ã0DÃ<D 	Ä DÄD 	ÄDÄDÄDÅ9FÆFÆ"FÇG6Ç6G:Ç=G:È/IÉIÉIN)r0   r1   r2   rh   r$   r!   r    rS   rS   z   s#   € € € € € ðð ð ð ð r!   rS   z can't run on non-posix computersc                   óÒ   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zej        d„ ¦   «         Zej        d„ ¦   «         ZdS )ÚOurServerOurClientTestsc                 ó*  ‡ — t                                ‰ ¦  «         t          ‰ j        ¦  «        ‰ _        t          j        ‰ j        ¬¦  «        ‰ _        t          j	        ‰ j        ¦  «        }t          j
        ¦   «         ‰ _        d ‰ _        d ‰ _        ˆ fd„}|‰ j        _        t          j	        ‰ j        ¦  «        }‰ j                             |¦  «         ‰ j                             |¦  «         |‰ _        |‰ _        ‰                      ¦   «          d S )NrA   c                 ó$   •— | ‰_         |‰_        d S r6   )Ú_serverVersionÚ_extData)ÚserverVersionrP   r   s     €r    Ú_z(OurServerOurClientTests.setUp.<locals>._œ   s   ø€ Ø"/ˆDÔØ#ˆDŒMˆMˆMr!   )rS   rh   r4   r`   rB   r   r   Úserverr	   ÚLoopbackRelayÚFileTransferClientÚclientrm   rn   ÚgotServerVersionÚmakeConnectionÚclientTransportÚserverTransportÚ_emptyBuffers)r   rw   rp   rx   s   `   r    rh   zOurServerOurClientTests.setUp‘   sû   ø€ Ý×Ò˜4Ñ Ô Ð å,¨T¬\Ñ:Ô:ˆŒÝ"Ô5¸T¼[ÐIÑIÔIˆŒÝ"Ô0°´Ñ=Ô=ˆå"Ô5Ñ7Ô7ˆŒØ"ˆÔØˆŒð	$ð 	$ð 	$ð 	$ð 	$ð ()ˆŒÔ$Ý"Ô0°´Ñ=Ô=ˆØŒ×"Ò" ?Ñ3Ô3Ð3ØŒ×"Ò" ?Ñ3Ô3Ð3à.ˆÔØ.ˆÔà×ÒÑÔÐÐÐr!   c                 óÎ   — | j         j        s| j        j        rL| j                              ¦   «          | j                             ¦   «          | j         j        °>| j        j        °Jd S d S r6   )rx   Úbufferrw   ÚclearBufferr   s    r    ry   z%OurServerOurClientTests._emptyBuffersª   sx   € ØÔ"Ô)ð 	/¨TÔ-AÔ-Hð 	/ØÔ ×,Ò,Ñ.Ô.Ð.ØÔ ×,Ò,Ñ.Ô.Ð.ð Ô"Ô)ð 	/¨TÔ-AÔ-Hð 	/ð 	/ð 	/ð 	/ð 	/r!   c                 óÎ   — | j                              ¦   «          | j                             ¦   «          | j                              ¦   «          | j                             ¦   «          d S r6   )rx   ÚloseConnectionrw   r|   r   s    r    ÚtearDownz OurServerOurClientTests.tearDown¯   s\   € ØÔ×+Ò+Ñ-Ô-Ð-ØÔ×+Ò+Ñ-Ô-Ð-ØÔ×(Ò(Ñ*Ô*Ð*ØÔ×(Ò(Ñ*Ô*Ð*Ð*Ð*r!   c                 óv   — |                       | j        d¦  «         |                       | j        ddi¦  «         d S )Né   rF   rG   )ÚassertEqualrm   rn   r   s    r    Útest_serverVersionz*OurServerOurClientTests.test_serverVersionµ   s>   € Ø×Ò˜Ô,¨aÑ0Ô0Ð0Ø×Ò˜œ¨°{Ð(CÑDÔDÐDÐDÐDr!   c                 óš   — |                       t          j                             | j        j        ¦  «        d| j        j        ›�¦  «         dS )z:
        It implements the ISFTPServer interface.
        zISFTPServer not provided by N)Ú
assertTruer   ÚISFTPServerÚ
providedByrq   rt   r   s    r    Útest_interface_implementationz5OurServerOurClientTests.test_interface_implementation¹   sM   € ð 	�ŠÝÔ$×/Ò/°´Ô0BÑCÔCØA¨4¬;Ô+=ÐAÐAñ	
ô 	
ð 	
ð 	
ð 	
r!   c                 ó0  ‡ ‡‡— ‰ j                              dt          j        t          j        z  i ¦  «        }‰                      ¦   «          t          j        Šg Šˆˆfd„}‰                      t          d|¦  «         ˆˆ fd„}| 	                    |¦  «         |S )zW
        A file opened with C{openFile} is closed when the connection is lost.
        ó	   testfile1c                 óH   •— ‰                      | ¦  «          ‰| ¦  «         d S r6   ©Úappend)ÚfdÚclosedÚoldCloses    €€r    ÚclosezJOurServerOurClientTests.test_openedFileClosedWithConnection.<locals>.closeÎ   s&   ø€ Ø�MŠM˜"ÑÔÐØˆH�R‰LŒLˆLˆLˆLr!   r‘   c                 ó„  •— ‰j         j        | j        dd …                  j        }‰j                             ¦   «          ‰j                             ¦   «          ‰j                             ¦   «          ‰j                             ¦   «          ‰                     ‰j         j        i ¦  «         ‰ 	                    |‰¦  «         d S )Né   )
rq   Ú	openFilesÚhandlerŽ   rx   r~   rw   r|   r‚   ÚassertIn)ÚopenFilerŽ   r�   r   s     €€r    Ú_fileOpenedzPOurServerOurClientTests.test_openedFileClosedWithConnection.<locals>._fileOpenedÔ   s©   ø€ Ø”Ô& x¤°q°r°rÔ':Ô;Ô>ˆBØÔ ×/Ò/Ñ1Ô1Ð1ØÔ ×/Ò/Ñ1Ô1Ð1ØÔ ×,Ò,Ñ.Ô.Ð.ØÔ ×,Ò,Ñ.Ô.Ð.Ø×Ò˜Tœ[Ô2°BÑ7Ô7Ð7Ø�MŠM˜"˜fÑ%Ô%Ð%Ð%Ð%r!   )
rt   r—   r   ÚFXF_READÚ	FXF_WRITEry   r9   r‘   ÚpatchÚaddCallback)r   Údr‘   r˜   r�   r�   s   `   @@r    Ú#test_openedFileClosedWithConnectionz;OurServerOurClientTests.test_openedFileClosedWithConnectionÂ   s½   øøø€ ð ŒK× Ò Ø�,Ô/µ,Ô2HÑHÈ"ñ
ô 
ˆð 	×ÒÑÔÐå”8ˆØˆð	ð 	ð 	ð 	ð 	ð 	ð 	�
Š
•2�w Ñ&Ô&Ð&ð	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	
�Š�kÑ"Ô"Ð"Øˆr!   c                 ó˜   ‡ — ‰ j                              d¦  «        }‰                      ¦   «          ˆ fd„}|                     |¦  «         |S )zh
        A directory opened with C{openDirectory} is close when the connection
        is lost.
        Ú c                 ó  •— ‰j                              ¦   «          ‰j                             ¦   «          ‰j                              ¦   «          ‰j                             ¦   «          ‰                     ‰j        j        i ¦  «         d S r6   )rx   r~   rw   r|   r‚   rq   ÚopenDirs)ÚopenDirr   s    €r    Ú	_getFileszSOurServerOurClientTests.test_openedDirectoryClosedWithConnection.<locals>._getFilesè   sx   ø€ ØÔ ×/Ò/Ñ1Ô1Ð1ØÔ ×/Ò/Ñ1Ô1Ð1ØÔ ×,Ò,Ñ.Ô.Ð.ØÔ ×,Ò,Ñ.Ô.Ð.Ø×Ò˜Tœ[Ô1°2Ñ6Ô6Ð6Ð6Ð6r!   ©rt   ÚopenDirectoryry   rœ   )r   r�   r¤   s   `  r    Ú(test_openedDirectoryClosedWithConnectionz@OurServerOurClientTests.test_openedDirectoryClosedWithConnectionà   s^   ø€ ð
 ŒK×%Ò% bÑ)Ô)ˆØ×ÒÑÔÐð	7ð 	7ð 	7ð 	7ð 	7ð 	
�Š�iÑ Ô Ð Øˆr!   c                 óô   ‡ ‡‡‡— ‰ j                              dt          j        t          j        z  i ¦  «        }‰                      ¦   «          ˆˆˆ fd„}ˆ fd„Šˆˆ fd„Šˆ fd„Š|                     |¦  «         |S )NrŠ   c                 óš   •— ‰                      | t          j        | ¦  «        ¦  «          ‰| ¦  «        }|                     ‰| ¦  «         |S r6   )r‚   r   Ú	ISFTPFilerœ   )r—   r�   Ú
_readChunkÚ_writeChunkr   s     €€€r    r˜   z<OurServerOurClientTests.test_openFileIO.<locals>._fileOpenedø   sL   ø€ Ø×Ò˜X¥|Ô'=¸hÑ'GÔ'GÑHÔHÐHØ�
˜8Ñ$Ô$ˆAØ�MŠM˜+ xÑ0Ô0Ð0ØˆHr!   c                 ó’   •— |                       dd¦  «        }‰                     ¦   «          |                     ‰j        d¦  «         |S )Nr   é   rZ   ©Ú	readChunkry   rœ   r‚   )r—   r�   r   s     €r    r«   z;OurServerOurClientTests.test_openFileIO.<locals>._readChunkþ   sG   ø€ Ø×"Ò" 1 bÑ)Ô)ˆAØ×ÒÑ Ô Ð Ø�MŠM˜$Ô*Ð,AÑBÔBÐBØˆHr!   c                 óˆ   •— |                      dd¦  «        }‰                     ¦   «          |                     ‰|¦  «         |S )Nr®   s
   cccccccccc)Ú
writeChunkry   rœ   )rp   r—   r�   Ú_readChunk2r   s      €€r    r¬   z<OurServerOurClientTests.test_openFileIO.<locals>._writeChunk  sC   ø€ Ø×#Ò# B¨	Ñ2Ô2ˆAØ×ÒÑ Ô Ð Ø�MŠM˜+ xÑ0Ô0Ð0ØˆHr!   c                 ó’   •— |                      dd¦  «        }‰                     ¦   «          |                     ‰j        d¦  «         |S )Nr   é   s   aaaaaaaaaabbbbbbbbbbccccccccccr¯   ©rp   r—   r�   r   s      €r    r³   z<OurServerOurClientTests.test_openFileIO.<locals>._readChunk2
  sG   ø€ Ø×"Ò" 1 bÑ)Ô)ˆAØ×ÒÑ Ô Ð Ø�MŠM˜$Ô*Ð,MÑNÔNÐNØˆHr!   ©rt   r—   r   r™   rš   ry   rœ   )r   r�   r˜   r«   r³   r¬   s   `  @@@r    Útest_openFileIOz'OurServerOurClientTests.test_openFileIOò   sÏ   øøøø€ ØŒK× Ò Ø�,Ô/µ,Ô2HÑHÈ"ñ
ô 
ˆð 	×ÒÑÔÐð	ð 	ð 	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð 	
�Š�kÑ"Ô"Ð"Øˆr!   c                 óæ   ‡ ‡‡— ‰ j                              dt          j        t          j        z  i ¦  «        }‰                      ¦   «          ˆ fd„Šˆ fd„Šˆˆˆ fd„}|                     |¦  «         |S )NrŠ   c                 óX   •— |                      ¦   «         }‰                     ¦   «          |S r6   )ÚgetAttrsry   r¶   s      €r    Ú	_getAttrszBOurServerOurClientTests.test_closedFileGetAttrs.<locals>._getAttrs  s+   ø€ Ø×!Ò!Ñ#Ô#ˆAØ×ÒÑ Ô Ð ØˆHr!   c                 ó0   •— ‰                      ¦   «          | S r6   )ÚflushLoggedErrors)r)   r   s    €r    Ú_errz=OurServerOurClientTests.test_closedFileGetAttrs.<locals>._err  s   ø€ Ø×"Ò"Ñ$Ô$Ð$ØˆHr!   c                 óê   •— |                       ¦   «         }‰                     ¦   «          |                     ‰| ¦  «         |                     ‰¦  «         ‰                     |t
          j        ¦  «        S r6   )r‘   ry   rœ   Ú
addErrbackÚassertFailurer   Ú	SFTPError)r—   r�   r¿   r¼   r   s     €€€r    Ú_closez?OurServerOurClientTests.test_closedFileGetAttrs.<locals>._close"  sc   ø€ Ø—’Ñ Ô ˆAØ×ÒÑ Ô Ð Ø�MŠM˜) XÑ.Ô.Ð.Ø�LŠL˜ÑÔÐØ×%Ò% a­Ô)?Ñ@Ô@Ð@r!   r·   )r   r�   rÄ   r¿   r¼   s   `  @@r    Útest_closedFileGetAttrsz/OurServerOurClientTests.test_closedFileGetAttrs  s·   øøø€ ØŒK× Ò Ø�,Ô/µ,Ô2HÑHÈ"ñ
ô 
ˆð 	×ÒÑÔÐð	ð 	ð 	ð 	ð 	ð
	ð 	ð 	ð 	ð 	ð	Að 	Að 	Að 	Að 	Að 	Að 	Að 	
�Š�fÑÔÐØˆr!   c                 óÔ   ‡ ‡— ‰ j                              dt          j        t          j        z  i ¦  «        }‰                      ¦   «          ˆˆ fd„}ˆ fd„Š|                     |¦  «        S )NrŠ   c                 ó‚   •— |                       ¦   «         }‰                     ¦   «          |                     ‰¦  «         |S r6   ©r»   ry   rœ   )r—   r�   Ú
_getAttrs2r   s     €€r    r¼   zBOurServerOurClientTests.test_openFileAttributes.<locals>._getAttrs2  s=   ø€ Ø×!Ò!Ñ#Ô#ˆAØ×ÒÑ Ô Ð Ø�MŠM˜*Ñ%Ô%Ð%ØˆHr!   c                 óš   •— ‰j                              d¦  «        }‰                     ¦   «          |                     ‰j        | ¦  «         |S ©NrŠ   ©rt   r»   ry   rœ   r‚   )Úattrs1r�   r   s     €r    rÉ   zCOurServerOurClientTests.test_openFileAttributes.<locals>._getAttrs28  sF   ø€ Ø”×$Ò$ \Ñ2Ô2ˆAØ×ÒÑ Ô Ð Ø�MŠM˜$Ô*¨FÑ3Ô3Ð3ØˆHr!   r·   )r   r�   r¼   rÉ   s   `  @r    Útest_openFileAttributesz/OurServerOurClientTests.test_openFileAttributes,  sŒ   øø€ ØŒK× Ò Ø�,Ô/µ,Ô2HÑHÈ"ñ
ô 
ˆð 	×ÒÑÔÐð	ð 	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð �}Š}˜YÑ'Ô'Ð'r!   c                 óæ   ‡ ‡‡— ‰ j                              dt          j        t          j        z  i ¦  «        }‰                      ¦   «          ˆˆ fd„}ˆˆ fd„Šˆ fd„Š|                     |¦  «         |S )NrŠ   c                 ó‚   •— |                       ¦   «         }‰                     ¦   «          |                     ‰¦  «         |S r6   rÈ   )r—   r�   Ú	_setAttrsr   s     €€r    r¼   z@OurServerOurClientTests.test_openFileSetAttrs.<locals>._getAttrsH  s=   ø€ Ø×!Ò!Ñ#Ô#ˆAØ×ÒÑ Ô Ð Ø�MŠM˜)Ñ$Ô$Ð$ØˆHr!   c                 óÐ   •— d| d<   ‰j                              d| ¦  «        }‰                     ¦   «          |                     ‰¦  «         |                     ‰j        | ¦  «         |S )Nr   ÚatimerŠ   )rt   ÚsetAttrsry   rœ   r‚   )Úattrsr�   rÉ   r   s     €€r    rÑ   z@OurServerOurClientTests.test_openFileSetAttrs.<locals>._setAttrsN  sc   ø€ ØˆE�'‰NØ”×$Ò$ \°5Ñ9Ô9ˆAØ×ÒÑ Ô Ð Ø�MŠM˜*Ñ%Ô%Ð%Ø�MŠM˜$Ô*¨EÑ2Ô2Ð2ØˆHr!   c                 ód   •— ‰j                              d¦  «        }‰                     ¦   «          |S rË   ©rt   r»   ry   ©rp   r�   r   s     €r    rÉ   zAOurServerOurClientTests.test_openFileSetAttrs.<locals>._getAttrs2V  s/   ø€ Ø”×$Ò$ \Ñ2Ô2ˆAØ×ÒÑ Ô Ð ØˆHr!   r·   )r   r�   r¼   rÉ   rÑ   s   `  @@r    Útest_openFileSetAttrsz-OurServerOurClientTests.test_openFileSetAttrs@  s²   øøø€ ð ŒK× Ò Ø�,Ô/µ,Ô2HÑHÈ"ñ
ô 
ˆð 	×ÒÑÔÐð	ð 	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð
 	
�Š�iÑ Ô Ð Øˆr!   c                 ó$  ‡ ‡‡— i Š‰ j         j        j        Šˆˆfd„}|‰ j         j        _        ‰ j                             dt          j        t          j        z  ddi¦  «        }‰                      ¦   «          ˆˆ f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                 óH   •— ‰                      |¦  «          ‰| ||¦  «        S r6   )Úupdate)ÚfilenameÚflagsrÕ   ÚoldOpenFileÚsavedAttributess      €€r    r—   zIOurServerOurClientTests.test_openFileExtendedAttributes.<locals>.openFileg  s+   ø€ Ø×"Ò" 5Ñ)Ô)Ð)Ø�;˜x¨°Ñ6Ô6Ð6r!   rŠ   Úext_foorM   c                 ó8   •— ‰                      ‰ddi¦  «         d S )Nrá   rM   ©r‚   )Úignrà   r   s    €€r    ÚcheckzFOurServerOurClientTests.test_openFileExtendedAttributes.<locals>.checkt  s$   ø€ Ø×Ò˜_¨y¸&Ð.AÑBÔBÐBÐBÐBr!   )rq   rt   r—   r   r™   rš   ry   rœ   )r   r—   r�   rå   rß   rà   s   `   @@r    Útest_openFileExtendedAttributesz7OurServerOurClientTests.test_openFileExtendedAttributes^  sÂ   øøø€ ð ˆØ”kÔ(Ô1ˆð	7ð 	7ð 	7ð 	7ð 	7ð 	7ð '/ˆŒÔÔ#àŒK× Ò ØÝÔ!¥LÔ$:Ñ:Ø˜Ðñ
ô 
ˆð
 	×ÒÑÔÐð	Cð 	Cð 	Cð 	Cð 	Cð 	Cð �}Š}˜UÑ#Ô#Ð#r!   c                 óþ   ‡ — ‰ j                              d¦  «        }‰                      ¦   «          ˆ fd„}|                     |¦  «         |                     |¦  «         ‰                      |t
          j        ¦  «        S )Nó   testRemoveFilec                 ód   •— ‰j                              d¦  «        }‰                     ¦   «          |S )Nrè   )rt   Ú
removeFilery   )Úignoredr�   r   s     €r    Ú_removeFilez<OurServerOurClientTests.test_removeFile.<locals>._removeFile}  s0   ø€ Ø”×&Ò&Ð'8Ñ9Ô9ˆAØ×ÒÑ Ô Ð ØˆHr!   )rt   r»   ry   rœ   rÂ   r   rÃ   )r   r�   rì   s   `  r    Útest_removeFilez'OurServerOurClientTests.test_removeFiley  sƒ   ø€ ØŒK× Ò Ð!2Ñ3Ô3ˆØ×ÒÑÔÐð	ð 	ð 	ð 	ð 	ð
 	
�Š�kÑ"Ô"Ð"Ø	�Š�kÑ"Ô"Ð"Ø×!Ò! !¥\Ô%;Ñ<Ô<Ð<r!   c                 ó¢   ‡ ‡— ‰ j                              d¦  «        }‰                      ¦   «          ˆˆ fd„}ˆ fd„Š|                     |¦  «        S )Nó   testRenameFilec                 ó’   •— ‰j                              dd¦  «        }‰                     ¦   «          |                     ‰| ¦  «         |S )Nrï   ó   testRenamedFile)rt   Ú
renameFilery   rœ   )rÕ   r�   Ú_testRenamedr   s     €€r    Ú_renamez8OurServerOurClientTests.test_renameFile.<locals>._renameŠ  sG   ø€ Ø”×&Ò&Ð'8Ð:LÑMÔMˆAØ×ÒÑ Ô Ð Ø�MŠM˜,¨Ñ.Ô.Ð.ØˆHr!   c                 óš   •— ‰j                              d¦  «        }‰                     ¦   «          |                     ‰j        |¦  «         d S )Nrñ   rÌ   )rp   rÕ   r�   r   s      €r    ró   z=OurServerOurClientTests.test_renameFile.<locals>._testRenamed�  sH   ø€ Ø”×$Ò$Ð%7Ñ8Ô8ˆAØ×ÒÑ Ô Ð Ø�MŠM˜$Ô*¨EÑ2Ô2Ð2Ð2Ð2r!   )rt   r»   ry   rœ   )r   r�   rô   ró   s   `  @r    Útest_renameFilez'OurServerOurClientTests.test_renameFile†  sw   øø€ ØŒK× Ò Ð!2Ñ3Ô3ˆØ×ÒÑÔÐð	ð 	ð 	ð 	ð 	ð 	ð	3ð 	3ð 	3ð 	3ð 	3ð
 �}Š}˜WÑ%Ô%Ð%r!   c                 óž   — | j                              d¦  «        }|                      ¦   «          |                      |t          j        ¦  «        S ©Nó   testMakeDirectory©rt   r»   ry   rÂ   r   rÃ   ©r   r�   s     r    Útest_directoryBadz)OurServerOurClientTests.test_directoryBad—  sC   € ØŒK× Ò Ð!5Ñ6Ô6ˆØ×ÒÑÔÐØ×!Ò! !¥\Ô%;Ñ<Ô<Ð<r!   c                 ó4  ‡ — ‰ j                              di ¦  «        }‰                      ¦   «          ˆ fd„}ˆ fd„}|                     |¦  «         |                     |¦  «         |                     |¦  «         ‰                      |t
          j        ¦  «        S )Nrù   c                 ód   •— ‰j                              d¦  «        }‰                     ¦   «          |S rø   r×   rØ   s     €r    r¼   zAOurServerOurClientTests.test_directoryCreation.<locals>._getAttrs   s0   ø€ Ø”×$Ò$Ð%9Ñ:Ô:ˆAØ×ÒÑ Ô Ð ØˆHr!   c                 ód   •— ‰j                              d¦  «        }‰                     ¦   «          |S rø   )rt   ÚremoveDirectoryry   rØ   s     €r    Ú_removeDirectoryzHOurServerOurClientTests.test_directoryCreation.<locals>._removeDirectory©  s0   ø€ Ø”×+Ò+Ð,@ÑAÔAˆAØ×ÒÑ Ô Ð ØˆHr!   )rt   ÚmakeDirectoryry   rœ   rÂ   r   rÃ   )r   r�   r¼   r  s   `   r    Útest_directoryCreationz.OurServerOurClientTests.test_directoryCreationœ  s±   ø€ ØŒK×%Ò%Ð&:¸BÑ?Ô?ˆØ×ÒÑÔÐð	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð
 	
�Š�iÑ Ô Ð Ø	�ŠÐ&Ñ'Ô'Ð'Ø	�Š�iÑ Ô Ð Ø×!Ò! !¥\Ô%;Ñ<Ô<Ð<r!   c                 óè   ‡ ‡‡‡— ‰ j                              d¦  «        }‰                      ¦   «          g Šˆˆˆˆ fd„Šˆˆ fd„}ˆ fd„Š|                     ‰¦  «         |                     |¦  «         |S )Nr!   c                 óð   •‡ — ˆˆ fd„}t          j        ‰ j        ¦  «        }‰                     ¦   «          |                     |¦  «         |                     ‰¦  «         |                     ‰‰ ¦  «         |S )Nc                 ó2   •— ‰                      | ¦  «         ‰S r6   rŒ   )r)   Úfilesr£   s    €€r    r�   zMOurServerOurClientTests.test_openDirectory.<locals>._getFiles.<locals>.append¹  s   ø€ Ø—’˜Q‘”�Ø�r!   )r   ÚmaybeDeferredÚnextry   rœ   rÁ   )r£   r�   r�   rÄ   r¤   r  r   s   `  €€€€r    r¤   z=OurServerOurClientTests.test_openDirectory.<locals>._getFiles¸  s…   øø€ ðð ð ð ð ð õ Ô# G¤LÑ1Ô1ˆAØ×ÒÑ Ô Ð Ø�MŠM˜&Ñ!Ô!Ð!Ø�MŠM˜)Ñ$Ô$Ð$Ø�LŠL˜ Ñ)Ô)Ð)ØˆHr!   c                 ó²   •— t          t          t          ‰Ž ¦  «        d         ¦  «        }|                     ¦   «          ‰                     |g d¢¦  «         d S )Nr   )s   .testHiddenFiles   testDirectoryrè   rï   rŠ   )ÚlistÚzipÚsortr‚   )rë   Úfsr  r   s     €€r    Ú_checkFilesz?OurServerOurClientTests.test_openDirectory.<locals>._checkFilesÄ  sb   ø€ Ý•d�3 ˜;Ñ'Ô'¨Ô*Ñ+Ô+ˆBØ�GŠG‰IŒIˆIØ×ÒØðð ð ñ	ô 	ð 	ð 	ð 	r!   c                 óX   •— |                      ¦   «         }‰                     ¦   «          |S r6   )r‘   ry   )rp   r£   r�   r   s      €r    rÄ   z:OurServerOurClientTests.test_openDirectory.<locals>._closeÒ  s'   ø€ Ø—’‘”ˆAØ×ÒÑ Ô Ð ØˆHr!   r¥   )r   r�   r  rÄ   r¤   r  s   `  @@@r    Útest_openDirectoryz*OurServerOurClientTests.test_openDirectory³  s¼   øøøø€ ØŒK×%Ò% cÑ*Ô*ˆØ×ÒÑÔÐØˆð
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð	ð 	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð
 	
�Š�iÑ Ô Ð Ø	�Š�kÑ"Ô"Ð"Øˆr!   c                 óž   — | j                              d¦  «        }|                      ¦   «          |                      |t          j        ¦  «        S )Nó   testLinkrú   rû   s     r    Útest_linkDoesntExistz,OurServerOurClientTests.test_linkDoesntExistÛ  sB   € ØŒK× Ò  Ñ-Ô-ˆØ×ÒÑÔÐØ×!Ò! !¥\Ô%;Ñ<Ô<Ð<r!   c                 óÊ   ‡ — ‰ j                              dd¦  «        }‰                      ¦   «          ˆ fd„}ˆ fd„}|                     |¦  «         |                     |¦  «        S )Nr  rŠ   c                 óf   •— ‰j                              dd¦  «        }‰                     ¦   «          |S )Nr  r#   r×   rØ   s     €r    Ú_getFirstAttrszDOurServerOurClientTests.test_linkSharesAttrs.<locals>._getFirstAttrsä  s1   ø€ Ø”×$Ò$ [°!Ñ4Ô4ˆAØ×ÒÑ Ô Ð ØˆHr!   c                 óš   •— ‰j                              d¦  «        }‰                     ¦   «          |                     ‰j        | ¦  «         |S rË   rÌ   )Ú
firstAttrsr�   r   s     €r    Ú_getSecondAttrszEOurServerOurClientTests.test_linkSharesAttrs.<locals>._getSecondAttrsé  sF   ø€ Ø”×$Ò$ \Ñ2Ô2ˆAØ×ÒÑ Ô Ð Ø�MŠM˜$Ô*¨JÑ7Ô7Ð7ØˆHr!   ©rt   ÚmakeLinkry   rœ   )r   r�   r  r  s   `   r    Útest_linkSharesAttrsz,OurServerOurClientTests.test_linkSharesAttrsà  s„   ø€ ØŒK× Ò  ¨lÑ;Ô;ˆØ×ÒÑÔÐð	ð 	ð 	ð 	ð 	ð
	ð 	ð 	ð 	ð 	ð 	
�Š�nÑ%Ô%Ð%Ø�}Š}˜_Ñ-Ô-Ð-r!   c                 óÎ   ‡ — ‰ j                              dd¦  «        }‰                      ¦   «          ˆ fd„}ˆ fd„}|                     |¦  «         |                     |¦  «         |S )Nr  rŠ   c                 óH  •— ‰j                              d¦  «        }‰                     ¦   «          t          t	          j        ¦   «         ¦  «                             ‰j        j        ¦  «        }| 	                    d¦  «        }| 
                    ‰j        |j        ¦  «         |S ©Nr  rW   )rt   ÚreadLinkry   r   r9   r:   r;   r`   r<   ra   rœ   r‚   )rp   r�   ÚtestFiler   s      €r    Ú	_readLinkz8OurServerOurClientTests.test_linkPath.<locals>._readLinkö  ó   ø€ Ø”×$Ò$ [Ñ1Ô1ˆAØ×ÒÑ Ô Ð Ý¥¤	¡¤Ñ,Ô,×9Ò9¸$¼,Ô:KÑLÔLˆHØ—~’~ kÑ2Ô2ˆHØ�MŠM˜$Ô*¨H¬MÑ:Ô:Ð:ØˆHr!   c                 óH  •— ‰j                              d¦  «        }‰                     ¦   «          t          t	          j        ¦   «         ¦  «                             ‰j        j        ¦  «        }| 	                    d¦  «        }| 
                    ‰j        |j        ¦  «         |S r   )rt   ÚrealPathry   r   r9   r:   r;   r`   r<   ra   rœ   r‚   )rp   r�   ÚtestLinkr   s      €r    Ú	_realPathz8OurServerOurClientTests.test_linkPath.<locals>._realPathþ  r$  r!   r  )r   r�   r#  r(  s   `   r    Útest_linkPathz%OurServerOurClientTests.test_linkPathò  s‰   ø€ ØŒK× Ò  ¨lÑ;Ô;ˆØ×ÒÑÔÐð	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð 	
�Š�iÑ Ô Ð Ø	�Š�iÑ Ô Ð Øˆr!   c                 óÎ   — | j                              dd¦  «        }|                      ¦   «          |                     | j        d¦  «         |                     | j        ¦  «         |S )NrL   s   foorM   )rt   rQ   ry   rœ   r‚   Ú_cbTestExtendedRequestrû   s     r    Útest_extendedRequestz,OurServerOurClientTests.test_extendedRequest
  s]   € ØŒK×'Ò'Ð(>ÀÑGÔGˆØ×ÒÑÔÐØ	�Š�dÔ&¨Ñ/Ô/Ð/Ø	�Š�dÔ1Ñ2Ô2Ð2Øˆr!   c                 ó–   — | j                              dd¦  «        }|                      ¦   «          |                      |t          ¦  «        S )Ns   testBadRequestr!   )rt   rQ   ry   rÂ   rN   )r   rë   r�   s      r    r+  z.OurServerOurClientTests._cbTestExtendedRequest  sC   € ØŒK×'Ò'Ð(9¸3Ñ?Ô?ˆØ×ÒÑÔÐØ×!Ò! !Õ%8Ñ9Ô9Ð9r!   c              #   óÊ  K  — | 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)rt   r¦   ry   r	  ÚflushWarningsr‚   r(   ÚDeprecationWarning)r   r�   r£   ÚoneFileÚwarningsr0  s         r    Ú$test_openDirectoryIteratorDeprecatedz<OurServerOurClientTests.test_openDirectoryIteratorDeprecated  sß   è è € ð
 ŒK×%Ò% cÑ*Ô*ˆØ×ÒÑÔÐØ�'�'ˆØ—,’,‘.”.ˆØ×ÒÑÔÐØˆˆˆà×%Ò%Ñ'Ô'ˆð@ð 	ð 	×Ò˜�C ™MœMÑ*Ô*Ð*Ø×ÒÕ+¨X°a¬[¸Ô-DÑEÔEÐEØ×Ò˜ (¨1¤+¨iÔ"8Ñ9Ô9Ð9Ð9Ð9r!   c              #   ó>  ‡ ‡K  — ‰ j                              dt          j        i ¦  «        }‰                      ¦   «          |V —}g Šˆˆ f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.
        rŠ   c                 ó„   •— ‰                      ‰g ¦  «         t          j        ¦   «         }‰                     | ¦  «         |S r6   )r‚   r   ÚDeferredr�   )ÚoffsetÚlengthr�   ÚgotReadRequestr   s      €€r    Ú	_slowReadzOOurServerOurClientTests.test_closedConnectionCancelsRequests.<locals>._slowRead9  s?   ø€ Ø×Ò˜^¨RÑ0Ô0Ð0Ý”Ñ Ô ˆAØ×!Ò! &Ñ)Ô)Ð)ØˆHr!   éd   éÈ   r#   N)rt   r—   r   r™   ry   rq   r”   Úvaluesr°   r‚   r(   ÚassertNoResultrx   r~   r|   rw   ÚassertFalseÚ	connectedÚfailureResultOfr   r»   )r   r�   Úfhr<  ÚserverSideFhr;  s   `    @r    Ú$test_closedConnectionCancelsRequestsz<OurServerOurClientTests.test_closedConnectionCancelsRequests+  s‘  øøè è € ð ŒK× Ò  ­|Ô/DÀbÑIÔIˆØ×ÒÑÔÐØˆWˆWˆð ˆð	ð 	ð 	ð 	ð 	ð 	ð œÔ.×5Ò5Ñ7Ô7‰ˆØ!*ˆÔØð �LŠL˜˜cÑ"Ô"ˆØ×ÒÑÔÐØ×Ò�˜^Ñ,Ô,¨aÑ0Ô0Ð0Ø×Ò˜AÑÔÐð 	Ô×+Ò+Ñ-Ô-Ð-ØÔ×(Ò(Ñ*Ô*Ð*ØÔ×(Ò(Ñ*Ô*Ð*Ø×ÒÑÔÐà×Ò˜œÔ.Ñ/Ô/Ð/Ø×Ò˜Q¥Ñ/Ô/Ð/ð �KŠK‰MŒMˆØ×Ò˜Q¥Ñ/Ô/Ð/Ð/Ð/r!   N)r0   r1   r2   rh   ry   r   rƒ   rˆ   rž   r§   r¸   rÅ   rÎ   rÙ   ræ   rí   rö   rü   r  r  r  r  r)  r,  r+  r   ÚinlineCallbacksr5  rF  r$   r!   r    rj   rj   �   s¡  € € € € € ðð ð ð2/ð /ð /ð
+ð +ð +ðEð Eð Eð
ð 
ð 
ðð ð ð<ð ð ð$ð ð ðBð ð ð2(ð (ð (ð(ð ð ð<$ð $ð $ð6=ð =ð =ð&ð &ð &ð"=ð =ð =ð
=ð =ð =ð.&ð &ð &ðP=ð =ð =ð
.ð .ð .ð$ð ð ð0ð ð ð:ð :ð :ð
 Ôð:ð :ñ Ôð:ð( Ôð*0ð *0ñ Ôð*0ð *0ð *0r!   rj   c                   ó   — e Zd Zd„ ZdS )ÚFakeConnc                 ó   — d S r6   r$   )r   Úchannels     r    Ú	sendClosezFakeConn.sendCloseZ  s   € Øˆr!   N)r0   r1   r2   rL  r$   r!   r    rI  rI  Y  s#   € € € € € ðð ð ð ð r!   rI  c                   ó8   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	ÚFileTransferCloseTestsc                 ó,   — t          ¦   «         | _        d S r6   )r   rB   r   s    r    rh   zFileTransferCloseTests.setUp`  s   € Ý ‘l”lˆŒˆˆr!   c                 ó†   — t          j        ¦   «         } G d„ d¦  «        } |¦   «         |_        | j        |j        _        |S )Nc                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )úDFileTransferCloseTests.buildServerConnection.<locals>.DummyTransportc                 ó   — | | _         d S r6   )Ú	transportr   s    r    r   zMFileTransferCloseTests.buildServerConnection.<locals>.DummyTransport.__init__i  s   € Ø!%�”��r!   c                 ó   — d S r6   r$   )r   ÚkindÚdatas      r    Ú
sendPacketzOFileTransferCloseTests.buildServerConnection.<locals>.DummyTransport.sendPacketl  s   € Ø�r!   c                 ó   — dS )Nzdummy transportr$   r   s    r    Ú	logPrefixzNFileTransferCloseTests.buildServerConnection.<locals>.DummyTransport.logPrefixo  s   € Ø(Ð(r!   N)r0   r1   r2   r   rX  rZ  r$   r!   r    ÚDummyTransportrR  h  sA   € € € € € ð&ð &ð &ðð ð ð)ð )ð )ð )ð )r!   r[  )r   ÚSSHConnectionrT  rB   )r   Úconnr[  s      r    ÚbuildServerConnectionz,FileTransferCloseTests.buildServerConnectionc  sZ   € åÔ'Ñ)Ô)ˆð	)ð 	)ð 	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð (˜Ñ)Ô)ˆŒØ $¤ˆŒÔØˆr!   c                 ó@   ‡ ‡— d‰ _         |j        Šˆˆ fd„}||_        d S )NFc                 ó,   •— d‰_          ‰| ¦  «         d S )NT)ÚconnectionLostFired)ÚreasonÚorigConnectionLostr   s    €€r    ÚconnectionLostzFFileTransferCloseTests.interceptConnectionLost.<locals>.connectionLostz  s"   ø€ Ø'+ˆDÔ$ØÐ˜vÑ&Ô&Ð&Ð&Ð&r!   )ra  rd  )r   Ú
sftpServerrd  rc  s   `  @r    ÚinterceptConnectionLostz.FileTransferCloseTests.interceptConnectionLostv  sC   øø€ Ø#(ˆÔ Ø'Ô6Ðð	'ð 	'ð 	'ð 	'ð 	'ð 	'ð %3ˆ
Ô!Ð!Ð!r!   c                 ó<   — |                       | j        d¦  «         d S )Nz*sftpServer's connectionLost was not called)r…   ra  r   s    r    ÚassertSFTPConnectionLostz/FileTransferCloseTests.assertSFTPConnectionLost€  s+   € Ø�ŠØÔ$Ð&Rñ	
ô 	
ð 	
ð 	
ð 	
r!   c                 ó>  — t          j        t          ¦   «         | j        ¬¦  «        }|                     t          j        d¦  «        ¦  «         |j        j        j	        }|  
                    |¦  «         |                     ¦   «          |                      ¦   «          dS )ze
        Closing a session should notify an SFTP subsystem launched by that
        session.
        )r]  rB   r   N)r   r   rI  rB   Úrequest_subsystemr   ÚNSrt   rT  Úprotorf  ÚcloseReceivedrh  )r   ÚtestSessionre  s      r    Útest_sessionClosez(FileTransferCloseTests.test_sessionClose…  s�   € õ Ô(­h©j¬jÀÄÐMÑMÔMˆð 	×%Ò%¥f¤i°Ñ&8Ô&8Ñ9Ô9Ð9Ø Ô'Ô1Ô7ˆ
ð 	×$Ò$ ZÑ0Ô0Ð0ð 	×!Ò!Ñ#Ô#Ð#à×%Ò%Ñ'Ô'Ð'Ð'Ð'r!   c                 ó  — |                       ¦   «         }t          j        d¦  «        t          j        dd¦  «        dz  z   }|                     |¦  «         |j        d         }|                     t          j        d¦  «        ¦  «         |j        j	        j
        }|                      |¦  «         |                      |¦  «         |                     t          j        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   rk  ÚstructÚpackÚssh_CHANNEL_OPENÚchannelsrj  rt   rT  rl  rf  Ússh_CHANNEL_CLOSErh  ©r   r]  ÚpacketÚsessionChannelre  s        r    Ú%test_clientClosesChannelOnConnnectionz<FileTransferCloseTests.test_clientClosesChannelOnConnnection™  sì   € ð
 ×)Ò)Ñ+Ô+ˆõ ”˜:Ñ&Ô&­¬°T¸1Ñ)=Ô)=ÀÑ)AÑAˆØ×Ò˜fÑ%Ô%Ð%Øœ qÔ)ˆà×(Ò(­¬°7Ñ);Ô);Ñ<Ô<Ð<Ø#Ô*Ô4Ô:ˆ
Ø×$Ò$ ZÑ0Ô0Ð0ð 	×$Ò$ ZÑ0Ô0Ð0ð 	×Ò�vœ{¨4°Ñ3Ô3Ñ4Ô4Ð4à×%Ò%Ñ'Ô'Ð'Ð'Ð'r!   c                 ó¶  — |                       ¦   «         }t          j        d¦  «        t          j        dd¦  «        dz  z   }|                     |¦  «         |j        d         }|                     t          j        d¦  «        ¦  «         |j        j	        j
        }|                      |¦  «         |                     ¦   «          |                      ¦   «          dS )zP
        Closing an SSH connection should close all sessions within it.
        r   rq  r   r�   r   N)r^  r   rk  rr  rs  rt  ru  rj  rt   rT  rl  rf  ÚserviceStoppedrh  rw  s        r    Ú'test_stopConnectionServiceClosesChannelz>FileTransferCloseTests.test_stopConnectionServiceClosesChannel±  sÈ   € ð ×)Ò)Ñ+Ô+ˆõ ”˜:Ñ&Ô&­¬°T¸1Ñ)=Ô)=ÀÑ)AÑAˆØ×Ò˜fÑ%Ô%Ð%Øœ qÔ)ˆà×(Ò(­¬°7Ñ);Ô);Ñ<Ô<Ð<Ø#Ô*Ô4Ô:ˆ
Ø×$Ò$ ZÑ0Ô0Ð0ð 	×ÒÑÔÐà×%Ò%Ñ'Ô'Ð'Ð'Ð'r!   N)
r0   r1   r2   rh   r^  rf  rh  ro  rz  r}  r$   r!   r    rN  rN  ^  s}   € € € € € ð#ð #ð #ðð ð ð&3ð 3ð 3ð
ð 
ð 
ð
(ð (ð (ð((ð (ð (ð0(ð (ð (ð (ð (r!   rN  zCannot run without cryptographyc                   ó    — e Zd ZdZg d¢Z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                 óÀ  — i }| j         D ]i}|                     ¦   «         D ]R}t          j        d|¦  «        }|r9t	          |                     d¦  «        d¦  «        ||                     d¦  «        <   ŒSŒj|                      t          |¦  «        dk    d¦  «         |                     ¦   «         D ].\  }}|  	                    |t          t          |¦  «        ¦  «         Œ/d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Úgroupr…   r(   Úitemsr‚   Úgetattrr   )r   Ú	constantsÚexcerptÚlineÚmÚkÚvs          r    Útest_constantsAgainstSpecz(ConstantsTests.test_constantsAgainstSpec  só   € ð
 ˆ	ØÔ0ð 	?ð 	?ˆGØ×*Ò*Ñ,Ô,ð ?ð ?�Ý”HÐIÈ4ÑPÔP�Øð ?Ý,/°·²¸±
´
¸AÑ,>Ô,>�I˜aŸgšg a™jœjÑ)øð?ð 	�ŠÝ�	‰NŒN˜QÒÐ Nñ	
ô 	
ð 	
ð —O’OÑ%Ô%ð 	:ð 	:‰DˆAˆqØ×Ò˜Q¥­°aÑ 8Ô 8Ñ9Ô9Ð9Ð9ð	:ð 	:r!   N)r0   r1   r2   Ú__doc__r�  r�  r$   r!   r    r  r  Æ  sC   € € € € € ðð ðJð Jð JÐðX:ð :ð :ð :ð :r!   r  c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚRawPacketDataServerTestszŒ
    Tests for L{filetransfer.FileTransferServer} which explicitly craft
    certain less common situations to exercise their handling.
    c                 óR   — t          j        t          ¦   «         ¬¦  «        | _        d S )NrA   )r   r   r   Úftsr   s    r    rh   zRawPacketDataServerTests.setUp9  s   € ÝÔ2½*¹,¼,ÐGÑGÔGˆŒˆˆr!   c                 ó&  — t          ¦   «         }| j                             |¦  «         d}d}t          j        t          dg¦  «        |z   t          j        |¦  «        z   ¦  «        }| j                             |¦  «         t          j        t          dg¦  «        |z   t          g d¢¦  «        z   t          j        d¦  «        z   t          j        d¦  «        z   ¦  «        }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   r”  rv   r   rk  ÚbytesÚdataReceivedr   Úvaluer   )r   rT  Ú	requestIdr•   r‘   Úexpecteds         r    Útest_closeInvalidHandlez0RawPacketDataServerTests.test_closeInvalidHandle<  s   € õ
 $Ñ%Ô%ˆ	ØŒ×Ò 	Ñ*Ô*Ð*ð ˆ	à"ˆõ ”	õ �1�#‰JŒJØñåŒi˜ÑÔñ ñ
ô 
ˆð 	Œ×Ò˜eÑ$Ô$Ð$õ ”9õ �3�%‰LŒLð ñõ �,�,�,ÑÔñ õ ŒIÐ2Ñ3Ô3ñ	4õ ŒI�c‰NŒNññ
ô 
ˆõ& 	Ø�OŠOÑÔÝ�XÑÔñ	
ô 	
ð 	
ð 	
ð 	
r!   N)r0   r1   r2   r�  rh   rœ  r$   r!   r    r’  r’  1  s?   € € € € € ðð ð
Hð Hð Hð1
ð 1
ð 1
ð 1
ð 1
r!   r’  c                   ó<   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	S )
ÚRawPacketDataTestsz“
    Tests for L{filetransfer.FileTransferClient} which explicitly craft certain
    less common protocol messages to exercise their handling.
    c                 ó6   — t          j        ¦   «         | _        d S r6   )r   rs   Úftcr   s    r    rh   zRawPacketDataTests.setUpw  s   € ÝÔ2Ñ4Ô4ˆŒˆˆr!   c                 óF  — t          j        ¦   «         }|                     | j        ¦  «         || j        j        d<   t          j        ddt          j	        ¦  «        t          j        d¦  «        z   t          j        d¦  «        z   }| 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   r8  rœ   Ú_cbTestPacketSTATUSr   ÚopenRequestsrr  rs  r   ÚFX_OKr   rk  Úpacket_STATUS©r   r�   rW  s      r    Útest_packetSTATUSz$RawPacketDataTests.test_packetSTATUSz  s�   € õ ŒNÑÔˆØ	�Š�dÔ.Ñ/Ô/Ð/Ø#$ˆŒÔ˜aÑ åŒK˜˜q¥,Ô"4Ñ5Ô5ÝŒi˜ÑÔñ åŒi˜Ñ Ô ñ!ð 	ð
 	Œ×Ò˜tÑ$Ô$Ð$Øˆr!   c                 óv   — |                       |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   Úresults     r    r¥  z&RawPacketDataTests._cbTestPacketSTATUS�  s>   € ð
 	×Ò˜ œ FÑ+Ô+Ð+Ø×Ò˜ œ GÑ,Ô,Ð,Ð,Ð,r!   c                 óò   — t          j        ¦   «         }|                     | j        ¦  «         || j        j        d<   t          j        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   r8  rœ   Ú_cbTestPacketSTATUSShortr   r¦  rr  rs  r   r§  r¨  r©  s      r    Útest_packetSTATUSShortz)RawPacketDataTests.test_packetSTATUSShort•  sf   € õ ŒNÑÔˆØ	�Š�dÔ3Ñ4Ô4Ð4Ø#$ˆŒÔ˜aÑ ÝŒ{˜5 !¥\Ô%7Ñ8Ô8ˆØŒ×Ò˜tÑ$Ô$Ð$Øˆr!   c                 óv   — |                       |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¬  s     r    r¯  z+RawPacketDataTests._cbTestPacketSTATUSShort¥  s>   € ð
 	×Ò˜ œ CÑ(Ô(Ð(Ø×Ò˜ œ CÑ(Ô(Ð(Ð(Ð(r!   c                 ó  — t          j        ¦   «         }|                     | j        ¦  «         || j        j        d<   t          j        ddt          j	        ¦  «        t          j        d¦  «        z   }| 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   r8  rœ   Ú_cbTestPacketSTATUSWithoutLangr   r¦  rr  rs  r   r§  r   rk  r¨  r©  s      r    Útest_packetSTATUSWithoutLangz/RawPacketDataTests.test_packetSTATUSWithoutLang­  su   € õ ŒNÑÔˆØ	�Š�dÔ9Ñ:Ô:Ð:Ø#$ˆŒÔ˜aÑ ÝŒ{˜5 !¥\Ô%7Ñ8Ô8½6¼9ÀVÑ;LÔ;LÑLˆØŒ×Ò˜tÑ$Ô$Ð$Øˆr!   c                 óv   — |                       |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¬  s     r    r³  z1RawPacketDataTests._cbTestPacketSTATUSWithoutLang¾  s>   € ð
 	×Ò˜ œ FÑ+Ô+Ð+Ø×Ò˜ œ CÑ(Ô(Ð(Ð(Ð(r!   N)r0   r1   r2   r�  rh   rª  r¥  r°  r¯  r´  r³  r$   r!   r    rž  rž  p  s‡   € € € € € ðð ð
5ð 5ð 5ðð ð ð&-ð -ð -ðð ð ð )ð )ð )ðð ð ð")ð )ð )ð )ð )r!   rž  )8r�  r9   rƒ  rr  Ú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   r4   r?   r4  ÚwarnrD   ÚregisterAdapterr†   rS   rj   rI  rN  r  r’  rž  r$   r!   r    ú<module>rÌ     sP  ðð
ð ð
 
€	€	€	Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð à *Ð *Ð *Ð *Ð *Ð *Ð *Ð *à "Ð "Ð "Ð "Ð "Ð "Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø &Ð &Ð &Ð &Ð &Ð &Ø %Ð %Ð %Ð %Ð %Ð %Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø +Ð +Ð +Ð +Ð +Ð +ðØ+Ð+Ð+Ð+Ð+Ð+ð €D€Døð ð ð ð Ø€D€D€Dðøøøð
=ðð ð ð ð ð ð "=ÐÐøð ð &ð &ð &Ø!%ÐÐÐð&øøøð
!Ø(Ð(Ð(Ð(ð !€L€Løð ð ð ð Ø€L€L€Lðøøøð
Ø<Ð<Ð<Ð<Ð<Ð<ð €I€Iøð ð ð ð Ø€I€I€Iðøøøð
	ØKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKøØð 	ð 	ð 	Ø€Dð	øøøðð ð ð ð �ñ ô ð ð&Eð Eð Eð Eð E˜Zñ Eô Eð Eðð ð ð ð ñ ô ð ð
 Ð%ð €O€O€Oà€H„M€Mð
 ˆ4ˆ4ð		ñô ð ð ð&ð &ð &ð &ð &Ð$>ñ &ô &ð &ð €JÔØ! :¨|Ô/Gñô ð ð
ð ð ð ð �8ñ ô ð ð* €ˆDˆÐ4Ñ5Ô5ðF0ð F0ð F0ð F0ð F0˜lñ F0ô F0ñ 6Ô5ðF0ðRð ð ð ð ñ ô ð ð
 €ˆDˆÐ4Ñ5Ô5ðd(ð d(ð d(ð d(ð d(˜Xñ d(ô d(ñ 6Ô5ðd(ðN €ˆLÐÐ;Ñ<Ô<ðe:ð e:ð e:ð e:ð e:�Xñ e:ô e:ñ =Ô<ðe:ðT €ˆDˆÐ4Ñ5Ô5Ø€ˆLÐÐ;Ñ<Ô<ð:
ð :
ð :
ð :
ð :
˜xñ :
ô :
ñ =Ô<ñ 6Ô5ð:
ðz €ˆLÐÐ;Ñ<Ô<ðS)ð S)ð S)ð S)ð S)˜ñ S)ô S)ñ =Ô<ðS)ð S)ð S)sZ   ÁA ÁAÁAÁA( Á(A2Á1A2Á6A= Á=BÂBÂB ÂBÂBÂ"B/ Â/B7Â6B7