
    <e                     t   d Z ddlZddlZddlZddlZddlZddlZddlZddlZ	 ddl	Z	n# e
$ r dZ	Y nw xY w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mZ  ej        d	          Z ej        d
          Z ej        d           ej        ZdZddz  dz   ZdZdZdZ d Z! G d dej"                  Z# G d dej"                  Z$ G d dej%        ej&                  Z'e	ej(        )                    ej(        *                    e+          d          Z,ej(        )                    ej(        *                    e+          d          Z- G d dej%                  Z. G d de.e#          Z/ G d  d!e.e$          Z0 G d" d#e'          Z1 G d$ d%e          Z2 eej3        d&           G d' d(e                      Z4 ee	d)           G d* d+e2                      Z5 ee	d)           G d, d-e                      Z6 G d. d/e          Z7 G d0 d1e          Z8d2 Z9e:d3k    r ej;                     dS dS )4zTest script for ftplib module.    N)TestCase
skipUnless)support)threading_helper)socket_helper)warnings_helper)HOSTHOSTv6asynchatasyncoreT)moduleutf-8zabcde12345
i  u   non-ascii char ®
u   foo
bar
 non-ascii char ®
u>  type=cdir;perm=el;unique==keVO1+ZF4; test
type=pdir;perm=e;unique==keVO1+d?3; ..
type=OS.unix=slink:/foobar;perm=;unique==keVO1+4G4; foobar
type=OS.unix=chr-13/29;perm=;unique==keVO1+5G4; device
type=OS.unix=blk-11/108;perm=;unique==keVO1+6G4; block
type=file;perm=awr;unique==keVO1+8G4; writable
type=dir;perm=cpmel;unique==keVO1+7G4; promiscuous
type=dir;perm=;unique==keVO1+1t2; no-exec
type=file;perm=r;unique==keVO1+EG4; two words
type=file;perm=r;unique==keVO1+IH4;  leading space
type=file;perm=r;unique==keVO1+1G4; file1
type=dir;perm=cpmel;unique==keVO1+7G4; incoming
type=file;perm=r;unique==keVO1+1G4; file2
type=file;perm=r;unique==keVO1+1G4; file3
type=file;perm=r;unique==keVO1+1G4; file4
type=dir;perm=cpmel;unique==SGP1; dir ® non-ascii char
type=file;perm=r;unique==SGP2; file ® non-ascii char
c                      d S N r       '/usr/lib/python3.11/test/test_ftplib.pydefault_error_handlerr   ;   s	     	Dr   c                   :     e Zd ZdZd Zd Zd Z fdZd Z xZ	S )DummyDTPHandlerFc                     t           j                            | |           || _        d| j        _        |j        | _        d S )N )r   
async_chat__init__	baseclasslast_received_dataencodingselfconnr   s      r   r   zDummyDTPHandler.__init__E   s:    $$T4000",.)!*r   c                     |                      d                              | j        d          }| j        xj        |z  c_        d S )N   replace)recvdecoder   r   r   )r   new_datas     r   handle_readzDummyDTPHandler.handle_readK   s?    99T??))$-CC))X5))))r   c                     | j         s7| j                            d           |                                  d| _         d S d S )N226 transfer completeT)dtp_conn_closedr   pushcloser   s    r   handle_closezDummyDTPHandler.handle_closeO   sK     # 	(N 7888JJLLL#'D   	( 	(r   c                     | j         j        | j         j        }d | j         _        |s|                                 S t          t          |                               |                    | j                             d S r   )r   	next_dataclose_when_donesuperr   r+   encoder   )r   what	__class__s     r   r+   zDummyDTPHandler.pushX   sn    >#/>+D'+DN$ 	*'')))ot$$))$++dm*D*DEEEEEr   c                 "    t                       d S r   r   r-   s    r   handle_errorzDummyDTPHandler.handle_error`       r   )
__name__
__module____qualname__r*   r   r'   r.   r+   r8   __classcell__r5   s   @r   r   r   B   s~        O+ + +6 6 6( ( (F F F F F             r   r   c                       e Zd ZeZef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d Zd Zd Zd Z d Z!d Z"d Z#d Z$d  Z%d! Z&d"S )#DummyFTPHandlerc                    t           j                            | |           | j                            t          j        t          j        d           |                     d           g | _        d | _	        d | _
        d| _        d| _        d | _        d | _        t          | _        |                     d           || _        d| _        d S )N      
r   220 welcomez252.253.254.255)r   r   r   socket
setsockopt
SOL_SOCKETSO_OOBINLINEset_terminator	in_bufferdtplast_received_cmdr   next_responser0   rest	RETR_DATAnext_retr_datar+   r   fake_pasv_server_ipr   r    r   s      r   r   zDummyFTPHandler.__init__h   s    $$T4000v0&2EqIIIG$$$!%"$	'		-     $5   r   c                 :    | j                             |           d S r   )rJ   appendr   datas     r   collect_incoming_dataz%DummyFTPHandler.collect_incoming_data|   s    d#####r   c                    d                     | j                                      | j                  }g | _        | j        r!|                     | j                   d| _        |                    d          d                                         }|| _        |	                    d          }|dk    r||dz   d          }nd}t          | d|z             r t          | d|z             } ||           d S |                     d|z             d S )	Nr   r    r   rB   cmd_z 550 command "%s" not understood.)joinrJ   r%   r   rM   r+   splitlowerrL   findhasattrgetattr)r   linecmdspaceargmethods         r   found_terminatorz DummyFTPHandler.found_terminator   s   xx''..t}== 	$IId()))!#Djjooa &&((!$		#B;;uqyzz"CCC4#&& 	?T6C<00FF3KKKKKII8#=>>>>>r   c                 "    t                       d S r   r7   r-   s    r   r8   zDummyFTPHandler.handle_error   r9   r   c                 |    t           j                            | |                    | j                  dz              d S )NrC   )r   r   r+   r3   r   rU   s     r   r+   zDummyFTPHandler.push   s4      t{{4='A'AG'KLLLLLr   c                 h   t          t          t          |                    d                              }dt	          |d d                   z  }|d         dz  |d         z   }t          j        ||ft                    }|                     ||           | _	        | 
                    d           d S )	N,z%d.%d.%d.%d         timeoutr   &200 active data connection established)listmapintr]   tuplerE   create_connectionTIMEOUTdtp_handlerrK   r+   )r   re   addripportss         r   cmd_portzDummyFTPHandler.cmd_port   s    CSYYs^^,,--E$rr(OO+Q#a($b$ZAAA##A#66		:;;;;;r   c                    t          j        | j                                         d         df          5 }|                    t                     |                                d         }| j        }|                    dd          }|dz  }|dz  }|                     d|||fz             |                                \  }}| 	                    ||           | _
        d d d            d S # 1 swxY w Y   d S )Nr   rB   .rk   rm   z$227 entering passive mode (%s,%d,%d)rq   )rE   create_servergetsockname
settimeoutrx   rQ   r#   r+   acceptry   rK   )	r   re   sockr|   r{   p1p2r    rz   s	            r   cmd_pasvzDummyFTPHandler.cmd_pasv   s(   !4;#:#:#<#<Q#?"CDD 	>OOG$$$##%%a(D)BC%%BD3JrTCZII<r2rlJKKKJD$'''==DH	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>s   B*C++C/2C/c                    |                     |d                   dd         \  }}}t          |          }t          j        ||ft                    }|                     ||           | _        |                     d           d S )Nr   rB   rZ   ro   rq   rr   )r]   ru   rE   rw   rx   ry   rK   r+   )r   re   afr{   r|   r}   s         r   cmd_eprtzDummyFTPHandler.cmd_eprt   s}    yyQ((2.B4yy$b$ZAAA##A#66		:;;;;;r   c                    t          j        | j                                         d         dft           j                  5 }|                    t
                     |                                d         }|                     d|z             |                                \  }}|                     ||           | _	        d d d            d S # 1 swxY w Y   d S )Nr   )familyrB   z+229 entering extended passive mode (|||%d|)rq   )
rE   r   r   AF_INET6r   rx   r+   r   ry   rK   )r   re   r   r|   r    rz   s         r   cmd_epsvzDummyFTPHandler.cmd_epsv   s   !4;#:#:#<#<Q#?"C)/: : : 	>=AOOG$$$##%%a(DIICTIJJJJD$'''==DH	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>s    B CCCc                 0    |                      |           d S r   r+   r   re   s     r   cmd_echozDummyFTPHandler.cmd_echo   s    		#r   c                 0    |                      d           d S )Nz200 noop okr   r   s     r   cmd_noopzDummyFTPHandler.cmd_noop       		-     r   c                 0    |                      d           d S )Nz331 username okr   r   s     r   cmd_userzDummyFTPHandler.cmd_user       		#$$$$$r   c                 0    |                      d           d S )Nz230 password okr   r   s     r   cmd_passzDummyFTPHandler.cmd_pass   r   r   c                 0    |                      d           d S )Nz230 acct okr   r   s     r   cmd_acctzDummyFTPHandler.cmd_acct   r   r   c                 0    |                      d           d S )Nz350 rnfr okr   r   s     r   cmd_rnfrzDummyFTPHandler.cmd_rnfr   r   r   c                 0    |                      d           d S )Nz250 rnto okr   r   s     r   cmd_rntozDummyFTPHandler.cmd_rnto   r   r   c                 0    |                      d           d S )Nz250 dele okr   r   s     r   cmd_delezDummyFTPHandler.cmd_dele   r   r   c                 0    |                      d           d S )N
250 cwd okr   r   s     r   cmd_cwdzDummyFTPHandler.cmd_cwd       		,r   c                 0    |                      d           d S )Nz250 1000r   r   s     r   cmd_sizezDummyFTPHandler.cmd_size   s    		*r   c                 6    |                      d|z             d S )Nz257 "%s"r   r   s     r   cmd_mkdzDummyFTPHandler.cmd_mkd   s    		*c/"""""r   c                 0    |                      d           d S )Nz
250 rmd okr   r   s     r   cmd_rmdzDummyFTPHandler.cmd_rmd   r   r   c                 0    |                      d           d S )Nz257 "pwd ok"r   r   s     r   cmd_pwdzDummyFTPHandler.cmd_pwd   s    		.!!!!!r   c                 0    |                      d           d S )Nz200 type okr   r   s     r   cmd_typezDummyFTPHandler.cmd_type   r   r   c                 X    |                      d           |                                  d S Nz221 quit ok)r+   r,   r   s     r   cmd_quitzDummyFTPHandler.cmd_quit   s%    		-   

r   c                 0    |                      d           d S )Nz226 abor okr   r   s     r   cmd_aborzDummyFTPHandler.cmd_abor   r   r   c                 0    |                      d           d S )Nz125 stor okr   r   s     r   cmd_storzDummyFTPHandler.cmd_stor   r   r   c                 >    || _         |                     d           d S )Nz350 rest ok)rN   r+   r   s     r   cmd_restzDummyFTPHandler.cmd_rest   s!    			-     r   c                     |                      d           | j        t          | j                  }nd}| j                             | j        |d                     | j                                         d | _        d S )Nz125 retr okr   )r+   rN   ru   rK   rP   r1   )r   re   offsets      r   cmd_retrzDummyFTPHandler.cmd_retr   so    		-   9 ^^FFFd)&''2333  """			r   c                     |                      d           | j                             t                     | j                                         d S )Nz125 list ok)r+   rK   	LIST_DATAr1   r   s     r   cmd_listzDummyFTPHandler.cmd_list   B    		-   i     """""r   c                     |                      d           | j                             t                     | j                                         d S )Nz125 nlst ok)r+   rK   	NLST_DATAr1   r   s     r   cmd_nlstzDummyFTPHandler.cmd_nlst  r   r   c                 0    |                      d           d S )Nz200 opts okr   r   s     r   cmd_optszDummyFTPHandler.cmd_opts  r   r   c                     |                      d           | j                             t                     | j                                         d S )Nz125 mlsd ok)r+   rK   	MLSD_DATAr1   r   s     r   cmd_mlsdzDummyFTPHandler.cmd_mlsd
  r   r   c                 ^    dt          |          z  | _        |                     d           d S )Nxz125 setlongretr ok)ru   rP   r+   r   s     r   cmd_setlongretrzDummyFTPHandler.cmd_setlongretr  s-    !CHHn		&'''''r   N)'r:   r;   r<   r   ry   DEFAULT_ENCODINGr   rW   rg   r8   r+   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r@   r@   d   s       !K&6 5 5 5 5($ $ $? ? ?&     M M M< < <> > >< < <> > >  ! ! !% % %% % %! ! !! ! !! ! !! ! !       # # #     " " "! ! !  ! ! !! ! !! ! !  # # #
# # #
! ! !# # #
( ( ( ( (r   r@   c                   V    e Zd ZeZej        efdZd Z	d Z
d Zd Zd ZeZd Zd Zd	S )
DummyFTPServerc                    t           j                            |            t          j                            |            d| _        |                     |t          j                   | 	                    |           | 
                    d           d| _        t          j                    | _        | j                                        d d         \  | _        | _        d | _        || _        d S )NTrn   F   )	threadingThreadr   r   
dispatcherdaemoncreate_socketrE   SOCK_STREAMbindlistenactiveLockactive_lockr   hostr|   handler_instancer   )r   addressr   r   s       r   r   zDummyFTPServer.__init__  s    !!$'''$$T***2v1222		'A$>++#{6688!<	49 $ r   c                     t          j                    | _        t           j                            |            | j                                         d S r   )r   Event_DummyFTPServer__flagr   startwaitr-   s    r   r   zDummyFTPServer.start&  sB    o''t$$$r   c                 d   d| _         | j                                         | j         rmt          j        ra| j                                         t                              dd           | j                                         | j         rt          j        at          	                    d           d S )NT皙?rB   )rp   count
ignore_all)
r   r   setr   
socket_mapr   acquirelooprelease	close_allr-   s    r   runzDummyFTPServer.run,  s    k 	'h1 	'$$&&&MM#QM///$$&&& k 	'h1 	' 	d+++++r   c                 <    d| _         |                                  d S )NF)r   r\   r-   s    r   stopzDummyFTPServer.stop5  s    		r   c                 H    |                      || j                  | _        d S )Nr   )handlerr   r   r   r    rz   s      r   handle_acceptedzDummyFTPServer.handle_accepted:  s"     $TDM J Jr   c                 .    |                                   d S r   )r,   r-   s    r   handle_connectzDummyFTPServer.handle_connect=  s    

r   c                     dS Nr   r   r-   s    r   writablezDummyFTPServer.writableA  s    qr   c                 "    t                       d S r   r7   r-   s    r   r8   zDummyFTPServer.handle_errorD  r9   r   N)r:   r;   r<   r@   r   rE   AF_INETr   r   r   r   r   r   r   r'   r   r8   r   r   r   r   r     s        G#)><L ! ! ! !  , , ,  
K K K   K           r   r   zkeycert3.pemzpycacert.pemc                   n     e Zd ZdZdZdZd Zd Z fdZ fdZ	 fdZ
 fdZ fd	Zd
 Z fdZ xZS )SSLConnectionz3An asyncore.dispatcher subclass supporting TLS/SSL.Fc                    t          j        t           j                  }|                    t                     |                    | j        ddd          }|                                  |                     |           d| _	        d S )NFT)suppress_ragged_eofsserver_sidedo_handshake_on_connect)
ssl
SSLContextPROTOCOL_TLS_SERVERload_cert_chainCERTFILEwrap_socketrE   del_channel
set_socket_ssl_accepting)r   contextrE   s      r   secure_connectionzSSLConnection.secure_connectionS  s    nS%<==G##H---((>C59AF ) H HF OOF###"&Dr   c                    	 | j                                          d| _        d S # t          j        $ r}|j        d         t          j        t          j        fv rY d }~d S |j        d         t          j        k    r| 	                                cY d }~S d|j        d         v r| 	                                cY d }~S  d }~wt          $ r?}|j        d         t          j        k    r| 	                                cY d }~S Y d }~d S d }~ww xY w)NFr   SSLV3_ALERT_BAD_CERTIFICATErB   )rE   do_handshaker  r  SSLErrorargsSSL_ERROR_WANT_READSSL_ERROR_WANT_WRITESSL_ERROR_EOFr.   OSErrorerrnoECONNABORTED)r   errs     r   _do_ssl_handshakezSSLConnection._do_ssl_handshake^  sG   ,((*** ',### < 	 	 	8A;3#:#&#;#= = =FFFFFXa[C$555,,........2chqkAA,,........ / / /8A;%"444,,........ 544444/sD   $ D%B;.B;D"B;4D:B;;D.D6DDc                    d| _         	 | j                                        | _        nR# t          j        $ r5}|j        d         t          j        t          j        fv rY d }~d S Y d }~nd }~wt          $ r Y nw xY wd| _         t          | dd          du r)t          t          |                                            d S d S )NTr   F_ccc)_ssl_closingrE   unwrapr  r  r  r  r  r  ra   r2   r   r,   )r   r  r5   s     r   _do_ssl_shutdownzSSLConnection._do_ssl_shutdownq  s     $D"k0022<   8A;3#:#&#;#= = =FFFFF= = = = =    
  !&DtVU++u44mT**0022222s   ) A8%A((A87A8c                     | j         r|                                  d S | j        r|                                  d S t	          t
          |                                            d S r   )r  r  r  r!  r2   r   handle_read_eventr   r5   s    r   r#  zSSLConnection.handle_read_event  sk    " ?&&(((((" ?%%'''''mT**<<>>>>>r   c                     | j         r|                                  d S | j        r|                                  d S t	          t
          |                                            d S r   )r  r  r  r!  r2   r   handle_write_eventr$  s    r   r&  z SSLConnection.handle_write_event  sm    " @&&(((((" @%%'''''mT**==?????r   c                    	 t          t          |                               |          S # t          j        $ rG}|j        d         t          j        t          j        t          j        t          j	        fv rY d }~dS  d }~ww xY wr   )
r2   r   sendr  r  r  r  SSL_ERROR_ZERO_RETURNr  r  )r   rV   r  r5   s      r   r(  zSSLConnection.send  s    ]D1166t<<<<   8A;3#4c6O#&#:#&#;#= = = 11111s   '+ B;A<;A<<Bc                 Z   	 t          t          |                               |          S # t          j        $ rp}|j        d         t          j        t          j        fv rY d }~dS |j        d         t          j        t          j	        fv r| 
                                 Y d }~dS  d }~ww xY w)Nr   r   )r2   r   r$   r  r  r  r  r  r  r)  r.   )r   buffer_sizer  r5   s      r   r$   zSSLConnection.recv  s    	]D1166{CCC<   8A;3#:#&#;#= = =333338A;3#4c6O"PPP%%'''33333s    '+ B*%B%%9B%$B%%B*c                 "    t                       d S r   r7   r-   s    r   r8   zSSLConnection.handle_error  s    !#####r   c                     t          | j        t          j                  r"| j        j        |                                  d S t          t          |                                            d S r   )	
isinstancerE   r  	SSLSocket_sslobjr!  r2   r   r,   r$  s    r   r,   zSSLConnection.close  s^    4;66 3K'3%%'''''mT**0022222r   )r:   r;   r<   __doc__r  r  r  r  r!  r#  r&  r(  r$   r8   r,   r=   r>   s   @r   r   r   M  s        AA		' 		' 		'	, 	, 	,&	 	 	 	 	(	? 	? 	? 	? 	?	@ 	@ 	@ 	@ 	@	 	 	 	 	
	 
	 
	 
	 
		$ 	$ 	$	3 	3 	3 	3 	3 	3 	3 	3 	3r   r   c                       e Zd ZdZd ZdS )DummyTLS_DTPHandlerz.A DummyDTPHandler subclass supporting TLS/SSL.c                     t                               | ||           | j        j        r|                                  d S d S r   )r   r   r   secure_data_channelr  r   s      r   r   zDummyTLS_DTPHandler.__init__  sI    $$T4;;;~1 )&&((((() )r   N)r:   r;   r<   r1  r   r   r   r   r3  r3    s)        <<	) 	) 	) 	) 	)r   r3  c                   8    e Zd ZdZeZefdZd Zd Z	d Z
d ZdS )DummyTLS_FTPHandlerz.A DummyFTPHandler subclass supporting TLS/SSL.c                 \    t                               | ||           d| _        d| _        d S )Nr   F)r@   r   r5  r  rR   s      r   r   zDummyTLS_FTPHandler.__init__  s0    $$T4($CCC',D$DIIIr   c                 X    |                      d           |                                  dS )zSet up secure control channel.z234 AUTH TLS successfulN)r+   r  r   rb   s     r   cmd_authzDummyTLS_FTPHandler.cmd_auth  s-    II/000""$$$$$r   c                 f    |                      d           d| _        |                                  d S )Nz 220 Reverting back to clear-textT)r+   r  r!  r:  s     r   cmd_ccczDummyTLS_FTPHandler.cmd_ccc  s4    II8999DI!!#####r   c                 0    |                      d           dS )zNegotiate size of buffer for secure data transfer.
            For TLS/SSL the only valid value for the parameter is '0'.
            Any other value is accepted but ignored.
            z200 PBSZ=0 successful.Nr   r:  s     r   cmd_pbszzDummyTLS_FTPHandler.cmd_pbsz  s    
 II./////r   c                     |                                 }|dk    r|                     d           d| _        dS |dk    r|                     d           d| _        dS |                     d           dS )	zSetup un/secure data channel.Cz200 Protection set to ClearFPz200 Protection set to PrivateTz(502 Unrecognized PROT type (use C or P).N)upperr+   r5  )r   rb   re   s      r   cmd_protzDummyTLS_FTPHandler.cmd_prot  s|    **,,Cczz		7888+0(((		9:::+/(((		DEEEEEr   N)r:   r;   r<   r1  r3  ry   r   r   r;  r=  r?  rD  r   r   r   r7  r7    sw        <<)*: 	 	 	 	
	% 	% 	%
	$ 	$ 	$
	0 	0 	0
	F 
	F 
	F 
	F 
	Fr   r7  c                       e Zd ZeZdS )DummyTLS_FTPServerN)r:   r;   r<   r7  r   r   r   r   rF  rF    s        %r   rF  c                      e Zd Zef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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*S )+TestFTPClassc                    t          t          df|          | _        | j                                         t	          j        t          |          | _        | j                            | j        j	        | j        j
                   d S Nr   r   rp   r   )r   r	   serverr   ftplibFTPrx   clientconnectr   r|   r   r   s     r   setUpzTestFTPClass.setUp  sl    $dAYBBBj8DDDDK,dk.>?????r   c                     | j                                          | j                                         d | _        t                              d           d S NTr   rO  r,   rL  r   r   r   r-   s    r   tearDownzTestFTPClass.tearDown  N    d+++++r   c                     |                      t          |          t          |                     |                      ||           d S r   )assertEquallen)r   receivedexpecteds      r   
check_datazTestFTPClass.check_data  s@    XH6668,,,,,r   c                 `    |                      | j                                        d           d S )NrD   )rY  rO  
getwelcomer-   s    r   test_getwelcomezTestFTPClass.test_getwelcome  s,    //11=AAAAAr   c                 h   |                      | j                            d          t          d                     |                      | j                            d          t          d                     |                      | j                            d          t          d                     d S )Nfooz
pass 12345z
pass *****z
PASS 12345z
PASS *****)rY  rO  sanitizereprr-   s    r   test_sanitizezTestFTPClass.test_sanitize  s    --e44d5kkBBB--l;;T,=O=OPPP--l;;T,=O=OPPPPPr   c                    |                      t          | j        j        d           |                      t          | j        j        d           |                      t          | j        j        d           |                      t          j        | j        j        d           |                      t          j        | j        j        d           |                      t          j        | j        j        d           |                      t          j        | j        j        d           |                      t          j        | j        j        d           d S )	Nz
echo 40
0z	echo 40
0z	echo 400zecho 400zecho 499zecho 500zecho 599zecho 999)assertRaises
ValueErrorrO  sendcmdrM  
error_temp
error_permerror_protor-   s    r   test_exceptionszTestFTPClass.test_exceptions  s    *dk&9>JJJ*dk&9<HHH*dk&9<HHH&+T[-@*MMM&+T[-@*MMM&+T[-@*MMM&+T[-@*MMM&,dk.A:NNNNNr   c                     t           j        t           j        t           j        t           j        t           j        t          t          f}|D ]"}	  |d          # t           j        $ r Y w xY wd S )Nz(exception not included in all_errors set)	rM  error_replyrj  rk  rl  Errorr  EOFError
all_errors)r   
exceptionsr   s      r   test_all_errorszTestFTPClass.test_all_errors  s|    (&*;V=N(&, 
  	 	AaBCCC$   	 	s   AA('A(c                 (   |                      | j        j                   | j                            d           |                      | j        j                   | j                            d           |                     | j        j                   d S )NTF)
assertTruerO  passiveserverset_pasvassertFalser-   s    r   test_set_pasvzTestFTPClass.test_set_pasv  s{    1222T"""1222U###233333r   c                    | j                             d           | j                             d           |                     t          j        | j         j        d           |                     t          j        | j         j        d           d S )Nzecho 200zecho 299zecho 199zecho 300)rO  voidcmdrg  rM  ro  r-   s    r   test_voidcmdzTestFTPClass.test_voidcmd"  st    J'''J'''&,dk.A:NNN&,dk.A:NNNNNr   c                 8    | j                                          d S r   )rO  loginr-   s    r   
test_loginzTestFTPClass.test_login(      r   c                 :    | j                             d           d S )Npasswd)rO  acctr-   s    r   	test_acctzTestFTPClass.test_acct+  s    """""r   c                     | j                             dd           d| j        j        _        |                     t          j        | j         j        dd           d S )Nab200)rO  renamerL  r   rM   rg  rM  ro  r-   s    r   test_renamezTestFTPClass.test_rename.  sO    3$$$5:$2&,dk.@#sKKKKKr   c                     | j                             d           d| j        j        _        |                     t          j        | j         j        d           d S )Nrb  199)rO  deleterL  r   rM   rg  rM  ro  r-   s    r   test_deletezTestFTPClass.test_delete3  sK    5!!!5:$2&,dk.@%HHHHHr   c                 :    | j                             d           d S Nrb  )rO  sizer-   s    r   	test_sizezTestFTPClass.test_size8  s    r   c                 f    | j                             d          }|                     |d           d S )N/foo)rO  mkdrY  r   dirs     r   test_mkdzTestFTPClass.test_mkd;  s1    koof%%f%%%%%r   c                 :    | j                             d           d S r  )rO  rmdr-   s    r   test_rmdzTestFTPClass.test_rmd?  s    r   c                 f    | j                             d          }|                     |d           d S )Nr  r   )rO  cwdrY  r  s     r   test_cwdzTestFTPClass.test_cwdB  s1    koof%%l+++++r   c                 d    | j                                         }|                     |d           d S )Nzpwd ok)rO  pwdrY  r  s     r   test_pwdzTestFTPClass.test_pwdF  s/    kooh'''''r   c                     |                      | j                                        d           |                      | j        j        d            d S r   )rY  rO  quitr   r-   s    r   	test_quitzTestFTPClass.test_quitJ  sG    ))++];;;)400000r   c                 8    | j                                          d S r   )rO  abortr-   s    r   
test_abortzTestFTPClass.test_abortO  r  r   c                       fd}g  j                             d|                                d                              t                     d S )Nc                 l                         |                     j        j                             d S r   rT   r%   rO  r   rV   r[  r   s    r   callbackz.TestFTPClass.test_retrbinary.<locals>.callbackS  ,    OODKK(<==>>>>>r   retrr   rO  
retrbinaryr]  r\   rO   )r   r  r[  s   ` @r   test_retrbinaryzTestFTPClass.test_retrbinaryR  se    	? 	? 	? 	? 	? 	?vx000))955555r   c                       fd}dD ]W}g  j                             d||                                d                              t          |d                     Xd S )Nc                 l                         |                     j        j                             d S r   r  r  s    r   r  z3TestFTPClass.test_retrbinary_rest.<locals>.callbackZ  r  r   )r   
      r  rN   r   r  )r   r  rN   r[  s   `  @r   test_retrbinary_restz!TestFTPClass.test_retrbinary_restY  s    	? 	? 	? 	? 	? 	? 	A 	ADHK""68$"???OOBGGH--y/?@@@@	A 	Ar   c                     g }| j                             d|j                   |                     d                    |          t
                              dd                     d S )Nr  r   
)rO  	retrlinesrT   r]  r\   rO   r#   r   r[  s     r   test_retrlineszTestFTPClass.test_retrlinesa  sW    fho666))9+<+<VR+H+HIIIIIr   c                    t          j        t                              | j        j                            }| j                            d|           |                     | j        j	        j
        t                     g |                    d           | j                            d|fd           |                                d S )Nstorr   c                 .                         d           S r   rT   r   flags    r   <lambda>z.TestFTPClass.test_storbinary.<locals>.<lambda>m  s    T[[=N=N r   r  )ioBytesIOrO   r3   rO  r   
storbinaryr]  rL  r   r   seekrv  )r   fr  s     @r   test_storbinaryzTestFTPClass.test_storbinaryf  s    Jy''(<==>>vq)))4GSSS	q			vq3N3N3N3NOOOr   c                 p   t                               dd                              | j        j                  }t          j        |          }dD ]f}|                    d           | j                            d||           | 	                    | j
        j        j        t          |                     gd S )Nr  
)   30r   r  r  )rO   r#   r3   rO  r   r  r  r  r  rY  rL  r   rN   str)r   rV   r  rs       r   test_storbinary_restz!TestFTPClass.test_storbinary_restp  s      ..55dk6JKKJt 	H 	HAFF1IIIK""611"555T[9>AGGGG	H 	Hr   c                    t                               dd                              | j        j                  }t          j        |          }| j                            d|           |                     | j	        j
        j        t                      g |                    d           | j                            d|fd           |                                t          j        t                               dd                    }t          j        dt"          fd	
          5  |                     t&          | j        j        d|           d d d            d S # 1 swxY w Y   d S )Nr  r  r  r   zstor fooc                 .                         d           S r   r  r  s    r   r  z-TestFTPClass.test_storlines.<locals>.<lambda>  s    D@Q@Q r   r  r   T)quiet)rO   r#   r3   rO  r   r  r  	storlinesr]  rL  r   r   r  rv  StringIOr   check_warningsBytesWarningrg  	TypeError)r   rV   r  r  s      @r   test_storlineszTestFTPClass.test_storlinesx  s     ..55dk6JKKJtfa(((4GSSS	q			j!6Q6Q6Q6QRRRK	))&$7788+R,>dKKK 	O 	Oi)>
ANNN	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	Os   )(EE"%E"c                     | j                                          |                     | j                                         t                              d          d d                    d S )Nr  rZ   )rO  nlstrY  r   r]   r-   s    r   	test_nlstzTestFTPClass.test_nlst  sU    ))++Y__V-D-DSbS-IJJJJJr   c                     g | j                             fd           |                     d                              t                              dd                     d S )Nc                 .                         |           S r   r  )r   ls    r   r  z'TestFTPClass.test_dir.<locals>.<lambda>  s    !((1++ r   r   r  )rO  r  rY  r\   r   r#   )r   r  s    @r   test_dirzTestFTPClass.test_dir  s\    ----...Y%6%6vr%B%BCCCCCr   c                     t           j                                                   t           j                            d                     t           j                            dddg                     t           j                                                  }|D ]\  }}                     |t                                          |t
                                          |                                d|                                d|                                d|            fdd( fd		} |d
            |dd            |dd            |dd            |dd            |dd            |dd            |dd            |dd            |dd            |dd             |d!d"            |d#d$            d%           t           j                                                  \  }}|D ])}                     |	                                           * d&            
                    t          t           j                                                    d&            j                                        D ]}                     d'|z             d S ))N/)pathr  type)r  factspermuniquec                 *    | j         j        _        d S r   )rL  r   r0   )rV   r   s    r   set_dataz(TestFTPClass.test_mlsd.<locals>.set_data  s    59DK(222r   c                 t   |dn|}|dn|}|dn|}|dn|} |            t          j                                                  \  }}                    ||                               |d         |                               |d         |                               |d         |           d S )Nr  r  r  name)nextrO  mlsdrY  )	rb   r  r  r  r  _namer  r   r  s	          r   
test_entryz*TestFTPClass.test_mlsd.<locals>.test_entry  s    !\66tD!\66tD!'XXVF!\66tDHTNNN 0 0 2 233LE5UD)))U6]D111U6]D111U8_f55555r   z)type=type;perm=perm;unique=unique; name
z*type=ty=pe;perm=perm;unique=unique; name
zty=pe)r  z*type==type;perm=perm;unique=unique; name
z=typez+type=t=y=pe;perm=perm;unique=unique; name
zt=y=pez)type=====;perm=perm;unique=unique; name
z====z*type=type;perm=perm;unique=unique; na me
zna me)r  z*type=type;perm=perm;unique=unique; name 
zname z*type=type;perm=perm;unique=unique;  name
z namez,type=type;perm=perm;unique=unique; n am  e
zn am  ez*type=type;perm=perm;unique=unique; na;me
zna;mez*type=type;perm=perm;unique=unique; ;name
z;namez+type=type;perm=perm;unique=unique; ;name;
z;name;z)type=type;perm=perm;unique=unique; ;;;;
z;;;;z)Type=type;TyPe=perm;UNIQUE=unique; name
r   zunexpected data %s)NNNN)rs   rO  r  assertIsInstancer  dictrv  assertInr  islowerrg  StopIterationfail)r   lsr  r  r  r  r   r  s   `      @r   	test_mlsdzTestFTPClass.test_mlsd  sI   T[   T[3''(((T[3vv.>??@@@$+""$$%% 	+ 	+KD%!!$,,,!!%...OOD!!!MM&%(((MM&%(((MM(E****	: 	: 	: 	: 	:
	6 
	6 
	6 
	6 
	6 
	6 
	6 	
@AAA
APPPP
APPPP
BRRRR
@vNNNN
APPPP
APPPP
APPPP
C)TTTT
APPPP
APPPP
BRRRR
@vNNNN>???DK,,..//u 	) 	)AOOAIIKK((((-t{/?/?/A/ABBB!!## 	0 	0AII*Q.////	0 	0r   c                     | j                                         5  |                     | j        j        j        d           d d d            d S # 1 swxY w Y   d S )Nr|   rO  makeportrY  rL  r   rL   r-   s    r   test_makeportzTestFTPClass.test_makeport  s    [!!## 	( 	(T[9K &( ( (	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(   &AAAc                     | j                                         \  }}t          j        ||ft                    }|                                 |                     | j        j        j	        d           d S )Nro   pasv
rO  makepasvrE   rw   rx   r,   rY  rL  r   rL   r   r   r|   r    s       r   test_makepasvzTestFTPClass.test_makepasv  sc    [))++
d'tgFFF

5GPPPPPr   c                 B   d| j         _        | j                                         \  }}|                     || j        j        j                   t          j        | j         j	        
                                d         |ft                                                     dS )z/Test the opt-in to the old vulnerable behavior.Tr   ro   N)rO  trust_server_pasv_ipv4_addressr  rY  rL  r   rQ   rE   rw   r   getpeernamerx   r,   )r   bad_hostr|   s      r   *test_makepasv_issue43285_security_disabledz7TestFTPClass.test_makepasv_issue43285_security_disabled  s    592--//$$+6J	L 	L 	L 	 $+"2">">"@"@"CT!J)0	2 	2 	227%'''''r   c                 $   |                      | j        j                   | j                                        \  }}|                     || j        j        j                   t          j	        ||ft                                                     d S )Nro   )ry  rO  r  r  assertNotEqualrL  r   rQ   rE   rw   rx   r,   )r   trusted_hostr|   s      r   1test_makepasv_issue43285_security_enabled_defaultz>TestFTPClass.test_makepasv_issue43285_security_enabled_default  s    CDDD![1133ddk:N	P 	P 	P 	 ,!5wGGGMMOOOOOr   c                 2     j                                           fd}t          j        t                    5  _          j                              j        j         j        j                    j         	                    d            
                     |                       d d d            n# 1 swxY w Y                         j        j        j        d                                 |                       t          j        t                    5  _          j                              j        j         j        j                    j         	                    d            j                                          d d d            n# 1 swxY w Y                         j        j        j        d                                 |                       	 t          j        t                    5  _          j                              j        j         j        j                    j         	                    d           d j        j        _        d d d            n# 1 swxY w Y                        d           n?# t          j        $ r-}                     t%          |          d           Y d }~nd }~ww xY wt'          j        d                                 j        j        j        d                                 |                       d S )Nc                       j         j        dS 	  j                             d           n# t          t          f$ r Y dS w xY wdS )NFnoopT)rO  r   ri  r  rq  r-   s   r   is_client_connectedz=TestFTPClass.test_with_statement.<locals>.is_client_connected  s]    {'u##F++++X&   uu4s   , A Aro   r  r  z550 error on quitzException not raisedr   )rO  r  rM  rN  rx   rP  rL  r   r|   ri  rv  rY  r   rL   ry  rM   r  rk  r  timesleep)r   r  r  s   `  r   test_with_statementz TestFTPClass.test_with_statement  s   	 	 	 	 	 Z((( 	3DKK 0$+2BCCCK'''OO//11222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	5GPPP,,../// Z((( 	DKK 0$+2BCCCK'''K	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	5GPPP,,..///	.G,,, Q##DK$4dk6FGGG##F+++=P,:Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q II,----   	< 	< 	<SXX':;;;;;;;;	< 	
35GPPP,,../////sb   A,B22B69B6A(FFFJ 5A I!J !I%%J (I%)J J>#J99J>c                    | j                                          t          j                    }	 | j                             | j        j        | j        j        t          |f           | 	                    | j         j
                                        d         |           | j                                          d S # t          $ r3}|j        t          j        k    r|                     d|z              d }~ww xY w)N)source_addressrB   couldn't bind to port %d)rO  r  r   find_unused_portrP  rL  r   r|   r	   rY  r   r   r  r  
EADDRINUSEskipTest)r   r|   es      r   test_source_addressz TestFTPClass.test_source_address  s    -//	K 0$+2B04d|   = = =T[-99;;A>EEEK 	 	 	w%***84?@@@	s   B	B9 9
C6.C11C6c                    t          j                    }t          |f| j        _        	 | j                            d          5 }|                     |                                d         |           d d d            d S # 1 swxY w Y   d S # t          $ r3}|j	        t          j
        k    r|                     d|z              d }~ww xY w)Nrs   rB   r  )r   r  r	   rO  r  transfercmdrY  r   r  r  r  r  )r   r|   r   r  s       r   &test_source_address_passive_connectionz3TestFTPClass.test_source_address_passive_connection&  s   -//&*D\"	((00 >D  !1!1!3!3A!6===> > > > > > > > > > > > > > > > > > 	 	 	w%***84?@@@	s;   B /A>1B >BB BB 
C.CCc                 <   |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                     t          j        t          j        d           |                      t          j        d          d	           |                      t          j        d
          d	           d S )Nz257 "/foo/bar"z/foo/barz257 "/foo/bar" createdz257 ""r   z257 "" createdz250 "/foo/bar"z257 "/foo/b""ar"z	/foo/b"arz257 "/foo/b""ar" created)rY  rM  parse257rg  ro  r-   s    r   test_parse257zTestFTPClass.test_parse2571  s    )9::JGGG)ABBJOOO22B777)9::B???&,fo?OPPP 	);<<kJJJ)CDDkRRRRRr   c                 |    |                      t          j        | j        j        d| j        j        z  dz             d S )Nr   r   )rg  rM  rp  rO  ri  maxliner-   s    r   test_line_too_longzTestFTPClass.test_line_too_long=  sA    &,(; 33a7	9 	9 	9 	9 	9r   c                     | j                             d| j         j        dz  z             g }|                     t          j        | j         j        d|j                   d S )NzSETLONGRETR %dr   r  )rO  ri  r$  rg  rM  rp  r  rT   r  s     r   test_retrlines_too_longz$TestFTPClass.test_retrlines_too_longA  sf    ,0Ca0GHIII&,+/	J 	J 	J 	J 	Jr   c                     t          j        d| j        j        z  dz            }|                     t
          j        | j        j        d|           d S )N   xr   r  )r  r  rO  r$  rg  rM  rp  r  )r   r  s     r   test_storlines_too_longz$TestFTPClass.test_storlines_too_longG  sG    Jtdk11A566&,(=vqIIIIIr   c                 T   ddg}|D ]}|                      |          5  |                                  |                     |           |                     || j        j                   |                                  |                                  |                                  | j        	                    d          }| 
                    |d           d d d            n# 1 swxY w Y   t          j        t                    }|                     t          |j                   d S )Nzlatin-1r   r   u   /non-ascii dir ®ro   )subTestrV  rR  rY  rO  r   r  r  r  r  r]  rM  rN  rx   r   )r   	encodingsr   new_dirrO  s        r   test_encoding_paramz TestFTPClass.test_encoding_paramK  sf   (	! 		@ 		@Hx00 @ @

H
---  4;+?@@@$$&&&$$&&&##%%%+//*?@@)>???@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ G,,,)6?;;;;;s   B7C""C&	)C&	N)-r:   r;   r<   r   rR  rV  r]  r`  re  rm  rt  rz  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r  r"  r%  r'  r*  r/  r   r   r   rH  rH    s       - @ @ @ @, , ,- - -B B BQ Q Q
O O O  4 4 4O O O  # # #L L L
I I I
     & & &  , , ,( ( (1 1 1
  6 6 6A A AJ J J
  H H HO O O K K KD D D
80 80 80t( ( (Q Q Q	: 	: 	:P P P+0 +0 +0Z  	 	 	
S 
S 
S9 9 9J J JJ J J< < < < <r   rH  zIPv6 not enabledc                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )TestIPv6Environmentc                 :   t          t          dft          j        t                    | _        | j                                         t          j        t          t                    | _
        | j
                            | j        j        | j        j                   d S )Nr   )r   r   rK  )r   r
   rE   r   r   rL  r   rM  rN  rx   rO  rP  r   r|   r-   s    r   rR  zTestIPv6Environment.setUp_  s~    $fa[(..>@ @ @ 	j;KLLLDK,dk.>?????r   c                     | j                                          | j                                         d | _        t                              d           d S rT  rU  r-   s    r   rV  zTestIPv6Environment.tearDowng  rW  r   c                 Z    |                      | j        j        t          j                   d S r   )rY  rO  r   rE   r   r-   s    r   test_afzTestIPv6Environment.test_afn  s$    99999r   c                     | j                                         5  |                     | j        j        j        d           d d d            d S # 1 swxY w Y   d S )Neprtr  r-   s    r   r  z!TestIPv6Environment.test_makeportq  s    [!!## 	( 	(T[9K &( ( (	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(r  c                     | j                                         \  }}t          j        ||ft                    }|                                 |                     | j        j        j	        d           d S )Nro   epsvr  r  s       r   r  z!TestIPv6Environment.test_makepasvv  sc    [))++
d'tgFFF

5GPPPPPr   c                       fd} j                             d            |              j                             d            |             d S )Nc                  <   fd} g j                             d|                                t          d                                        t          t
                                                   d                              t
                     d S )Nc                 l                         |                     j        j                             d S r   r  r  s    r   r  zATestIPv6Environment.test_transfer.<locals>.retr.<locals>.callback~  s,    DK,@ A ABBBBBr   r  r   )rO  r  rY  rZ  r\   rO   )r  r[  r   s    @r   r  z/TestIPv6Environment.test_transfer.<locals>.retr}  s    C C C C C CHK""68444S!2!233S^^DDDRWWX..	:::::r   TF)rO  rx  )r   r  s   ` r   test_transferz!TestIPv6Environment.test_transfer|  sd    	; 	; 	; 	; 	; 	T"""U###r   N)	r:   r;   r<   rR  rV  r5  r  r  r=  r   r   r   r1  r1  \  st        @ @ @, , ,: : :( ( (
Q Q Q    r   r1  zSSL not availablec                       e Zd ZdZefdZdS )TestTLS_FTPClassMixinzfRepeat TestFTPClass tests starting the TLS layer for both control
    and data connections first.
    c                 t   t          t          df|          | _        | j                                         t	          j        t          |          | _        | j                            | j        j	        | j        j
                   | j                                         | j                                         d S rJ  )rF  r	   rL  r   rM  FTP_TLSrx   rO  rP  r   r|   authprot_prQ  s     r   rR  zTestTLS_FTPClassMixin.setUp  s    ($XFFFnWxHHHDK,dk.>???r   N)r:   r;   r<   r1  r   rR  r   r   r   r?  r?    s7          .      r   r?  c                   p    e Zd ZdZefdZd Zd Zd Zd Z	d Z
d Zd	 Z ed
d          d             ZdS )TestTLS_FTPClasszSpecific TLS_FTP class tests.c                    t          t          df|          | _        | j                                         t	          j        t                    | _        | j                            | j        j	        | j        j
                   d S )Nr   r   ro   )rF  r	   rL  r   rM  rA  rx   rO  rP  r   r|   rQ  s     r   rR  zTestTLS_FTPClass.setUp  sj    ($XFFFnW555DK,dk.>?????r   c                     | j                                          | j                                         d | _        t                              d           d S rT  rU  r-   s    r   rV  zTestTLS_FTPClass.tearDown  rW  r   c                     |                      | j        j        t          j                   | j                                         |                     | j        j        t          j                   d S r   )assertNotIsInstancerO  r   r  r/  rB  r  r-   s    r   test_control_connectionz(TestTLS_FTPClass.test_control_connection  sV      !13=AAAdk.>>>>>r   c                 &   | j                             d          5 }|                     |t          j                   |                     |                    d          t                              | j         j	                             d d d            n# 1 swxY w Y   |                     | j         
                                d           | j                                          | j                             d          5 }|                     |t          j                   |                     |                    d          t                              | j         j	                             d d d            n# 1 swxY w Y   |                     | j         
                                d           | j                                          | j                             d          5 }|                     |t          j                   |                     |                    d          t                              | j         j	                             d d d            n# 1 swxY w Y   |                     | j         
                                d           d S )Nrs   r"   r)   )rO  r  rI  r  r/  rY  r$   r   r3   r   voidresprC  r  prot_c)r   r   s     r   test_data_connectionz%TestTLS_FTPClass.test_data_connection  s   [$$V,, 	E$$T3=999TYYt__&--dk.BCCE E E	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	--//1HIII 	[$$V,, 	E!!$666 TYYt__&--dk.BCCE E E		E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	--//1HIII 	[$$V,, 	E$$T3=999TYYt__&--dk.BCCE E E	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	--//1HIIIIIs8   A,BBB>A,E66E:=E:!A,II Ic                    |                      | j        j        t          j                   | j                                         |                     | j        j        t          j                   | j                                         d S r   )rI  rO  r   r  r/  r  r  r-   s    r   r  zTestTLS_FTPClass.test_login  sj      !13=AAAdk.>>>r   c                     | j                                          |                     t          | j         j                   d S r   )rO  rB  rg  rh  r-   s    r   test_auth_issued_twicez'TestTLS_FTPClass.test_auth_issued_twice  s7    *dk&677777r   c                    | j                                          t          j        t          j                  }d|_        t          j        |_        |                     t          t          j        t          |           |                     t          t          j        t          |           |                     t          t          j        t          t          |           t          j        |t                    | _         | j                             | j        j        | j        j                   |                     | j         j        t          j                   | j                                          |                     | j         j        j        |           |                     | j         j        t          j                   | j                                          | j                             d          5 }|                     |j        |           |                     |t          j                   d d d            d S # 1 swxY w Y   d S )NF)keyfiler  )certfiler  )rT  rS  r  r  rp   rs   )rO  r  r  r  PROTOCOL_TLS_CLIENTcheck_hostname	CERT_NONEverify_moderg  rh  rM  rA  r	  rx   rP  rL  r   r|   rI  r   r/  rB  assertIsr  r  rC  r  r   ctxr   s      r   test_contextzTestTLS_FTPClass.test_context  s   nS455"-*fnh"% 	 	' 	' 	'*fnx"% 	 	' 	' 	'*fnx"*C 	 	9 	9 	9 nS'BBBDK,dk.>???  !13=AAAdk&.444dk.>>>[$$V,, 	7MM$,,,,!!$666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s   1<H::H>H>c                 `   |                      t          | j        j                   | j                            d           |                     | j        j        t          j                   | j                                         |                      t          | j        j        j	                   d S )NT)secure)
rg  rh  rO  cccr  r  r   r  r/  r   r-   s    r   test_ccczTestTLS_FTPClass.test_ccc  s    *dko666&&&dk.>>>*dk&6&=>>>>>r   FzFIXME: bpo-32706c                    | j                                          t          j        t          j                  }|                     |j        t          j                   |                     |j        d           |	                    t                     t          j        |t                    | _         | j                             | j        j        | j        j                   |                     t          j                  5  | j                                          d d d            n# 1 swxY w Y   | j                             | j        j        | j        j                   | j                                          |                     t          j                  5  | j                             d          5 }	 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   | j                                          | j                             d| j        j                   | j                                          | j                                          | j                             d| j        j                   | j                                          | j                             d          5 }	 d d d            d S # 1 swxY w Y   d S )NTrU  rs   	localhost)rO  r  r  r  rV  rY  rY  CERT_REQUIREDrW  load_verify_locationsCAFILErM  rA  rx   rP  rL  r   r|   rg  CertificateErrorrB  rC  r  r[  s      r   test_check_hostnamez$TestTLS_FTPClass.test_check_hostname  s?   nS455#*;<<<+T222!!&)))nS'BBB 	DK,dk.>???s344 	 	K	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	DK,dk.>???s344 	 	((00 D              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	K)9:::K)9:::[$$V,, 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	sZ    D&&D*-D*G3G5GG	GG		GGG+J::J>J>N)r:   r;   r<   r1  r   rR  rV  rJ  rN  r  rQ  r]  ra  r   rh  r   r   r   rE  rE    s        ''- @ @ @ @, , ,? ? ?
J J J4  8 8 87 7 70? ? ? Z)**  +*  r   rE  c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )TestTimeoutsc                 F   t          j                    | _        t          j        t          j        t          j                  | _        | j                            d           t          j	        | j                  | _
        t          j        | j                  | _        d| j        _        | j                                         | j                                         | j                                         t$          j        j
        | _        | j
        t$          j        _
        d S )Nr  )targetT)r   r   evtrE   r   r   r   r   r   	bind_portr|   r   rL  server_threadr   r   r   clearrM  rN  old_portr-   s    r   rR  zTestTimeouts.setUp  s    ?$$M&.&2DEE		R   !+DI66	&-T[AAA$(!  """
)
r   c                 r    | j         t          j        _        | j                                         d | _        d S r   )rq  rM  rN  r|   ro  r\   r-   s    r   rV  zTestTimeouts.tearDown%  s0    -
!!!!r   c                    | j                                          | j                                         	 | j                                         \  }}|                    d           |                    t          j                   | j                                         |	                                 n# t          $ r Y nw xY w| j         	                                 d S # | j         	                                 w xY w)Ns   1 Hola mundo
)r   r   rm  r   r   sendallshutdownrE   SHUT_WRr,   TimeoutErrorr   s      r   rL  zTestTimeouts.server+  s    
 			))++JD$ LL*+++MM&.)))HLLNNNJJLLLL  	 	 	D	 IOODIOOs*   B2 A"C 2
B?<C >B??C C8c                    |                      t          j                               t          j        d           	 t	          j        t                    }t          j        d            n# t          j        d            w xY w|                     |j        	                                d           | j
                                         |                                 d S Nr  )assertIsNonerE   getdefaulttimeoutsetdefaulttimeoutrM  rN  r	   rY  r   
gettimeoutrm  r   r,   r   ftps     r   testTimeoutDefaultzTestTimeouts.testTimeoutDefault@  s    &244555 $$$	+*T""C$T****F$T****,,..333		s   A* *B c                    |                      t          j                               t          j        d           	 t	          j        t          d           }t          j        d            n# t          j        d            w xY w|                      |j                                                   | j	        
                                 |                                 d S Nr  ro   )rz  rE   r{  r|  rM  rN  r	   r   r}  rm  r   r,   r~  s     r   testTimeoutNonezTestTimeouts.testTimeoutNoneL  s    &244555 $$$	+*T4000C$T****F$T****#(--//000		s   A, ,Bc                    t          j        t          d          }|                     |j                                        d           | j                                         |                                 | 	                    t                    5  t          j        t          d           d d d            d S # 1 swxY w Y   d S )Nr  ro   r   )rM  rN  r	   rY  r   r}  rm  r   r,   rg  rh  r~  s     r   testTimeoutValuezTestTimeouts.testTimeoutValueX  s    jr***,,..333		 z** 	( 	(JtQ''''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   B99B= B=c                    t          j                    }|                    t          d           |                     |j                                        d           | j                                         |	                                 d S r  
rM  rN  rP  r	   rY  r   r}  rm  r   r,   r~  s     r   testTimeoutConnectzTestTimeouts.testTimeoutConnectc  sg    jllD"%%%,,..333		r   c                    t          j        d          }|                    t                     |                     |j                                        d           | j                                         |	                                 d S r  r  r~  s     r   testTimeoutDifferentOrderz&TestTimeouts.testTimeoutDifferentOrderj  sj    j$$$D,,..333		r   c                 "   t          j                    }d|_        |                    t                     |                     |j                                        d           | j        	                                 |
                                 d S ry  )rM  rN  rp   rP  r	   rY  r   r}  rm  r   r,   r~  s     r   testTimeoutDirectAccessz$TestTimeouts.testTimeoutDirectAccessq  sj    jllD,,..333		r   N)r:   r;   r<   rR  rV  rL  r  r  r  r  r  r  r   r   r   rj  rj    s        $ $ $" " "  *
 
 

 
 
	( 	( 	(        r   rj  c                       e Zd Zd ZdS )MiscTestCasec                 F    h d}t          j        | t          |           d S )N>   CRLFtestrp  ftpcpB_CRLFMAXLINEMSG_OOBFTP_PORTparse150parse227parse229r!  
print_line)not_exported)r   check__all__rM  )r   r  s     r   test__all__zMiscTestCase.test__all__{  s3       	T6EEEEEEr   N)r:   r;   r<   r  r   r   r   r  r  z  s(        F F F F Fr   r  c                  d    t          j                    } t          j        t           j        g| R   d S r   )r   threading_setupunittestaddModuleCleanupthreading_cleanup)thread_infos    r   setUpModuler    s3    "244K.@O;OOOOOOr   __main__)<r1  rM  rE   r  r  osr   r  r  r  ImportErrorr   r   r  r   test.supportr   r   r   test.support.socket_helperr	   r
   import_deprecatedr   r   requires_working_socketLOOPBACK_TIMEOUTrx   r   rO   r   r   r   r   r   r   r@   r   r   r   r  r\   dirname__file__r	  rf  r   r3  r7  rF  rH  IPV6_ENABLEDr1  r?  rE  rj  r  r  r:   mainr   r   r   <module>r     s   $ $
   				  				      JJJJ   
CCC * ) ) ) ) ) ) )       ) ) ) ) ) ) & & & & & & ( ( ( ( ( ( 3 3 3 3 3 3 3 3 -?,Z88,?,Z88   t , , , ,

"  t#&??	4	4	K	&	 	 	         h)      Dn( n( n( n( n(h) n( n( n(b0  0  0  0  0 X()*: 0  0  0 f ?w||BGOOH55~FFHW\\"'//(33^DDFf3 f3 f3 f3 f3+ f3 f3 f3R) ) ) ) )m_ ) ) )%F %F %F %F %Fm_ %F %F %FP& & & & &^ & & &n< n< n< n< n<8 n< n< n<b M&(:;;* * * * *( * * <;*Z C$%%    L   &% C$%%w w w w wx w w &%wtb b b b b8 b b bJF F F F F8 F F FP P P
 zHMOOOOO s   ) 33