
    daf                     (   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	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mZ  ej0                  d       ej2                  ZdZddz  ZdZdZdZd Z  G d dejB                        Z" G d dejB                        Z# G d dejH                  ejJ                        Z&e	ejN                  jQ                  ejN                  jS                  e*      dd      Z+ejN                  jQ                  ejN                  jS                  e*      dd      Z, G d dejH                        Z- G d de-e"      Z. G d  d!e-e#      Z/ G d" d#e&      Z0 G d$ d%e      Z1 eejd                  d&       G d' d(e             Z3 ee	d)       G d* d+e1             Z4 ee	d)       G d, d-e             Z5 G d. d/e      Z6 G d0 d1e      Z7d2 Z8e9d3k(  r ejt                          yy# e
$ r dZ	Y w xY w)4zTest script for ftplib module.    N)TestCase
skipUnless)support)threading_helper)socket_helper)warnings_helper)asynchat)asyncore)HOSTHOSTv6T)moduleutf-8u   abcde¹²³¤¦
i  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                       y N r       +/root/Python-3.12.4/Lib/test/test_ftplib.pydefault_error_handlerr   9   s     	r   c                   :     e Zd ZdZd Zd Zd Z fdZd Z xZ	S )DummyDTPHandlerFc                     t         j                  j                  | |       || _        t	               | j                  _        |j                  | _        y r   )r	   
async_chat__init__	baseclass	bytearraylast_received_dataencodingselfconnr   s      r   r   zDummyDTPHandler.__init__C   s:    $$T40",5K)!**r   c                 d    | j                  d      }| j                  xj                  |z  c_        y )N   )recvr   r   )r   new_datas     r   handle_readzDummyDTPHandler.handle_readI   s$    99T?))X5)r   c                     | j                   s3| j                  j                  d       | j                          d| _         y y )N226 transfer completeT)dtp_conn_closedr   pushcloser   s    r   handle_closezDummyDTPHandler.handle_closeM   s6     ##NN 78JJL#'D  $r   c                     | j                   j                  '| j                   j                  }d | j                   _        |s| j                         S t        t        |   |j                  | j                               y r   )r   	next_dataclose_when_donesuperr   r)   encoder   )r   what	__class__s     r   r)   zDummyDTPHandler.pushV   s\    >>##/>>++D'+DNN$''))ot)$++dmm*DEr   c                     t                y r   r   r+   s    r   handle_errorzDummyDTPHandler.handle_error^       r   )
__name__
__module____qualname__r(   r   r%   r,   r)   r6   __classcell__r3   s   @r   r   r   @   s"    O+6(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&y")#DummyFTPHandlerc                    t         j                  j                  | |       | j                  j	                  t        j
                  t        j                  d       | j                  d       g | _        d | _	        d | _
        t               | _        d| _        d | _        d | _        t         | _        | j%                  d       || _        d| _        y )N      
 220 welcomez252.253.254.255)r	   r   r   socket
setsockopt
SOL_SOCKETSO_OOBINLINEset_terminator	in_bufferdtplast_received_cmdr   r   next_responser.   rest	RETR_DATAnext_retr_datar)   r   fake_pasv_server_ipr   r    r   s      r   r   zDummyFTPHandler.__init__f   s    $$T40v00&2E2EqIG$!%"++	'		-   $5 r   c                 :    | j                   j                  |       y r   )rI   appendr   datas     r   collect_incoming_dataz%DummyFTPHandler.collect_incoming_dataz   s    d#r   c                    dj                  | j                        j                  | j                        }g | _        | j                  r"| j                  | j                         d| _        |j                  d      d   j                         }|| _        |j                  d      }|dk7  r	||dz   d  }nd}t        | d|z         rt        | d|z         } ||       y | j                  d|z         y )	Nr   rB    r   r@   cmd_z 550 command "%s" not understood.)joinrI   decoder   rL   r)   splitlowerrK   findhasattrgetattr)r   linecmdspaceargmethods         r   found_terminatorz DummyFTPHandler.found_terminator}   s    xx'..t}}=IId(()!#Djjoa &&(!$		#B;uqyz"CC4#&T6C<0F3KII8#=>r   c                     t                y r   r5   r+   s    r   r6   zDummyFTPHandler.handle_error   r7   r   c                 |    t         j                  j                  | |j                  | j                        dz          y )NrA   )r	   r   r)   r1   r   rT   s     r   r)   zDummyFTPHandler.push   s*      t{{4=='AG'KLr   c                    t        t        t        |j                  d                  }dt	        |d d       z  }|d   dz  |d   z   }t        j                  ||ft              }| j                  ||       | _	        | j                  d       y )	N,z%d.%d.%d.%d         timeoutr   &200 active data connection established)listmapintr]   tuplerD   create_connectionTIMEOUTdtp_handlerrJ   r)   )r   re   addripportss         r   cmd_portzDummyFTPHandler.cmd_port   s    CSYYs^,-E$r(O+Q#a($$b$ZA##A#6		:;r   c                    t        j                  | j                   j                         d   df      5 }|j                  t               |j                         d   }| j
                  }|j                  dd      }|dz  }|dz  }| j                  d|||fz         |j                         \  }}| j                  ||       | _
        d d d        y # 1 sw Y   y xY w)Nr   r@   .rk   rm   z$227 entering passive mode (%s,%d,%d)rq   )rD   create_servergetsockname
settimeoutrx   rP   replacer)   acceptry   rJ   )	r   re   sockr|   r{   p1p2r    rz   s	            r   cmd_pasvzDummyFTPHandler.cmd_pasv   s    !!4;;#:#:#<Q#?"CD 	>OOG$##%a(D))BC%BD3JrTCZII<r2rlJKJD$'''=DH	> 	> 	>s   BCCc                     |j                  |d         dd \  }}}t        |      }t        j                  ||ft              }| j                  ||       | _        | j                  d       y )Nr   r@   rY   ro   rq   rr   )r]   ru   rD   rw   rx   ry   rJ   r)   )r   re   afr{   r|   r}   s         r   cmd_eprtzDummyFTPHandler.cmd_eprt   sd    yyQ(2.B4y$$b$ZA##A#6		:;r   c                    t        j                  | j                   j                         d   dft         j                        5 }|j	                  t
               |j                         d   }| j                  d|z         |j                         \  }}| j                  ||       | _	        d d d        y # 1 sw Y   y xY w)Nr   )familyr@   z+229 entering extended passive mode (|||%d|)rq   )
rD   r   r   AF_INET6r   rx   r)   r   ry   rJ   )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JD$'''=DH	> 	> 	>s   A(B44B=c                 &    | j                  |       y r   r)   r   re   s     r   cmd_echozDummyFTPHandler.cmd_echo   s    		#r   c                 &    | j                  d       y )Nz200 noop okr   r   s     r   cmd_noopzDummyFTPHandler.cmd_noop       		- r   c                 &    | j                  d       y )Nz331 username okr   r   s     r   cmd_userzDummyFTPHandler.cmd_user       		#$r   c                 &    | j                  d       y )Nz230 password okr   r   s     r   cmd_passzDummyFTPHandler.cmd_pass   r   r   c                 &    | j                  d       y )Nz230 acct okr   r   s     r   cmd_acctzDummyFTPHandler.cmd_acct   r   r   c                 &    | j                  d       y )Nz350 rnfr okr   r   s     r   cmd_rnfrzDummyFTPHandler.cmd_rnfr   r   r   c                 &    | j                  d       y )Nz250 rnto okr   r   s     r   cmd_rntozDummyFTPHandler.cmd_rnto   r   r   c                 &    | j                  d       y )Nz250 dele okr   r   s     r   cmd_delezDummyFTPHandler.cmd_dele   r   r   c                 &    | j                  d       y )N
250 cwd okr   r   s     r   cmd_cwdzDummyFTPHandler.cmd_cwd       		,r   c                 &    | j                  d       y )Nz250 1000r   r   s     r   cmd_sizezDummyFTPHandler.cmd_size   s    		*r   c                 ,    | j                  d|z         y )Nz257 "%s"r   r   s     r   cmd_mkdzDummyFTPHandler.cmd_mkd   s    		*c/"r   c                 &    | j                  d       y )Nz
250 rmd okr   r   s     r   cmd_rmdzDummyFTPHandler.cmd_rmd   r   r   c                 &    | j                  d       y )Nz257 "pwd ok"r   r   s     r   cmd_pwdzDummyFTPHandler.cmd_pwd   s    		.!r   c                 &    | j                  d       y )Nz200 type okr   r   s     r   cmd_typezDummyFTPHandler.cmd_type   r   r   c                 F    | j                  d       | j                          y Nz221 quit ok)r)   r*   r   s     r   cmd_quitzDummyFTPHandler.cmd_quit   s    		- 

r   c                 &    | j                  d       y )Nz226 abor okr   r   s     r   cmd_aborzDummyFTPHandler.cmd_abor   r   r   c                 &    | j                  d       y )Nz125 stor okr   r   s     r   cmd_storzDummyFTPHandler.cmd_stor   r   r   c                 4    || _         | j                  d       y )Nz350 rest ok)rM   r)   r   s     r   cmd_restzDummyFTPHandler.cmd_rest   s    			- r   c                     | j                  d       | j                  t        | j                        }nd}| j                  j                  | j                  |d         | j                  j                          d | _        y )Nz125 retr okr   )r)   rM   ru   rJ   rO   r/   )r   re   offsets      r   cmd_retrzDummyFTPHandler.cmd_retr   s^    		- 99 ^FFd))&'23  "	r   c                     | j                  d       | j                  j                  t               | j                  j                          y )Nz125 list ok)r)   rJ   	LIST_DATAr/   r   s     r   cmd_listzDummyFTPHandler.cmd_list   .    		- i   "r   c                     | j                  d       | j                  j                  t               | j                  j                          y )Nz125 nlst ok)r)   rJ   	NLST_DATAr/   r   s     r   cmd_nlstzDummyFTPHandler.cmd_nlst   r   r   c                 &    | j                  d       y )Nz200 opts okr   r   s     r   cmd_optszDummyFTPHandler.cmd_opts  r   r   c                     | j                  d       | j                  j                  t               | j                  j                          y )Nz125 mlsd ok)r)   rJ   	MLSD_DATAr/   r   s     r   cmd_mlsdzDummyFTPHandler.cmd_mlsd  r   r   c                 L    dt        |      z  | _        | j                  d       y )Nxz125 setlongretr ok)ru   rO   r)   r   s     r   cmd_setlongretrzDummyFTPHandler.cmd_setlongretr  s    !CHn		&'r   N)'r8   r9   r:   r   ry   DEFAULT_ENCODINGr   rV   rg   r6   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>   b   s    !K&6 5($?& M<><>!%%!!!! # "!!!!#
#
!#
(r   r>   c                   ^    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y	)
DummyFTPServerc                    t         j                  j                  |        t        j                  j                  |        d| _        | j                  |t        j                         | j                  |       | j                  d       d| _        t        j                         | _        | j                  j                         d d \  | _        | _        d | _        || _        y )NTrn   F   )	threadingThreadr   r
   
dispatcherdaemoncreate_socketrD   SOCK_STREAMbindlistenactiveLockactive_lockr   hostr|   handler_instancer   )r   addressr   r   s       r   r   zDummyFTPServer.__init__  s    !!$'$$T*2v112		'A$>>+#{{668!<	49 $ r   c                     | j                   rJ t        j                         | _        t        j                  j                  |        | j                  j                          y r   )r   r   Event_DummyFTPServer__flagr   startwaitr+   s    r   r   zDummyFTPServer.start$  s@    ;;oo't$r   c                 z   d| _         | j                  j                          | j                   rxt        j                  rh| j
                  j                          t        j                  dd       | j
                  j                          | j                   rt        j                  rht        j                  d       y )NT皙?r@   )rp   count
ignore_all)
r   r   setr
   
socket_mapr   acquirelooprelease	close_allr+   s    r   runzDummyFTPServer.run*  sy    kkh11$$&MM#Q/$$& kkh11 	d+r   c                 N    | j                   sJ d| _         | j                          y )NF)r   r[   r+   s    r   stopzDummyFTPServer.stop3  s    {{{		r   c                 H    | j                  || j                        | _        y )Nr   )handlerr   r   r   r    rz   s      r   handle_acceptedzDummyFTPServer.handle_accepted8  s     $TDMM Jr   c                 $    | j                          y r   )r*   r+   s    r   handle_connectzDummyFTPServer.handle_connect;  s    

r   c                      yNr   r   r+   s    r   writablezDummyFTPServer.writable?  s    r   c                     t                y r   r5   r+   s    r   r6   zDummyFTPServer.handle_errorB  r7   r   N)r8   r9   r:   r>   r   rD   AF_INETr   r   r   r   r   r   r   r%   r   r6   r   r   r   r   r     s?    G#)>><L !,
K K r   r   certdataz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                        }|j                  t               |j                  | j                  ddd      }| j                          | j                  |       d| _	        y )NFT)suppress_ragged_eofsserver_sidedo_handshake_on_connect)
ssl
SSLContextPROTOCOL_TLS_SERVERload_cert_chainCERTFILEwrap_socketrD   del_channel
set_socket_ssl_accepting)r   contextrD   s      r   secure_connectionzSSLConnection.secure_connectionQ  sk    nnS%<%<=G##H-((>C59AF ) HF OOF#"&Dr   c                 *   	 | j                   j                          d| _        y # t        j                  $ r}|j
                  d   t        j                  t        j                  fv rY d }~y |j
                  d   t        j                  k(  r| j                         cY d }~S d|j
                  d   v r| j                         cY d }~S  d }~wt        $ r?}|j
                  d   t        j                  k(  r| j                         cY d }~S Y d }~y d }~ww xY w)NFr   SSLV3_ALERT_BAD_CERTIFICATEr@   )rD   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\  s    ,((* ',# << 	88A;3#:#:#&#;#;#= =XXa[C$5$55,,..2chhqkA,,.. /88A;%"4"44,,.. 5/sD   $ D/C+/CD  C DCD/DDDc                 b   d| _         	 | j                  j                         | _        d| _         t        | dd      du rt        t        | 3          y y # t        j                  $ r>}|j
                  d   t        j                  t        j                  fv rY d }~y Y d }~vd }~wt        $ r Y w xY w)NTr   F_ccc)_ssl_closingrD   unwrapr  r  r  r  r  r  ra   r0   r  r*   )r   r  r3   s     r   _do_ssl_shutdownzSSLConnection._do_ssl_shutdowno  s     $D"kk002 !&DtVU+u4mT02 << 88A;3#:#:#&#;#;#= ==  
 s   A B.&/BB.-B.c                     | j                   r| j                          y | j                  r| j                          y t        t
        |           y r   )r  r  r!  r#  r0   r  handle_read_eventr   r3   s    r   r%  zSSLConnection.handle_read_event  s:    ""&&(""%%'mT<>r   c                     | j                   r| j                          y | j                  r| j                          y t        t
        |           y r   )r  r  r!  r#  r0   r  handle_write_eventr&  s    r   r(  z SSLConnection.handle_write_event  s:    ""&&(""%%'mT=?r   c                    	 t         t        |   |      S # t        j                  $ rX}|j
                  d   t        j                  t        j                  t        j                  t        j                  fv rY d }~y d }~ww xY wr   )
r0   r  sendr  r  r  r  SSL_ERROR_ZERO_RETURNr  r  )r   rU   r  r3   s      r   r*  zSSLConnection.send  sm    ]D6t<<<< 88A;3#4#4c6O6O#&#:#:#&#;#;#= = s    BAA<;A<<Bc                 T   	 t         t        |   |      S # t        j                  $ r~}|j
                  d   t        j                  t        j                  fv rY d }~y|j
                  d   t        j                  t        j                  fv r| j                          Y d }~y d }~ww xY w)Nr   r   )r0   r  r#   r  r  r  r  r  r  r+  r,   )r   buffer_sizer  r3   s      r   r#   zSSLConnection.recv  s    	]D6{CC<< 88A;3#:#:#&#;#;#= =88A;3#4#4c6O6O"PP%%'s     B'/B"?B"!B""B'c                     t                y r   r5   r+   s    r   r6   zSSLConnection.handle_error  s    !#r   c                     t        | j                  t        j                        r'| j                  j                  | j                          y t        t        | #          y r   )	
isinstancerD   r  	SSLSocket_sslobjr#  r0   r  r*   r&  s    r   r*   zSSLConnection.close  s>    4;;6KK''3%%'mT02r   )r8   r9   r:   __doc__r  r!  r  r  r#  r%  r(  r*  r#   r6   r*   r;   r<   s   @r   r  r  K  sC    A		'	,&	(	?	@	
		$	3 	3r   r  c                       e Zd ZdZd Zy)DummyTLS_DTPHandlerz.A DummyDTPHandler subclass supporting TLS/SSL.c                     t         j                  | ||       | j                  j                  r| j	                          y y r   )r   r   r   secure_data_channelr  r   s      r   r   zDummyTLS_DTPHandler.__init__  s2    $$T4;~~11&&( 2r   N)r8   r9   r:   r3  r   r   r   r   r5  r5    s
    <	)r   r5  c                   6    e Zd ZdZeZefdZd Zd Z	d Z
d Zy)DummyTLS_FTPHandlerz.A DummyFTPHandler subclass supporting TLS/SSL.c                 P    t         j                  | ||       d| _        d| _        y )Nr   F)r>   r   r7  r   rQ   s      r   r   zDummyTLS_FTPHandler.__init__  s&    $$T4($C',D$DIr   c                 F    | j                  d       | j                          y)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""$r   c                 T    | j                  d       d| _        | j                          y )Nz 220 Reverting back to clear-textT)r)   r   r#  r<  s     r   cmd_ccczDummyTLS_FTPHandler.cmd_ccc  s"    II89DI!!#r   c                 &    | j                  d       y)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                     |j                         }|dk(  r| j                  d       d| _        y|dk(  r| j                  d       d| _        y| j                  d       y)	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)   r7  )r   rb   re   s      r   cmd_protzDummyTLS_FTPHandler.cmd_prot  sR    **,Ccz		78+0(		9:+/(		DEr   N)r8   r9   r:   r3  r5  ry   r   r   r=  r?  rA  rF  r   r   r   r9  r9    s'    <)*: 	
	%
	$
	0
	Fr   r9  c                       e Zd ZeZy)DummyTLS_FTPServerN)r8   r9   r:   r9  r   r   r   r   rH  rH    s    %r   rH  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,y*)+TestFTPClassc                 0   t        t        df|      | _        | j                  j                          t	        j
                  t        |      | _        | j                  j                  | j                  j                  | j                  j                         y Nr   r   rp   r   )r   r   serverr   ftplibFTPrx   clientconnectr   r|   r   r   s     r   setUpzTestFTPClass.setUp  s^    $dAYBjj8DDKK,,dkk.>.>?r   c                     | j                   j                          | j                  j                          d | _        t	        j
                  d       y NTr   rQ  r*   rN  r   r
   r   r+   s    r   tearDownzTestFTPClass.tearDown  7    d+r   c                 p    | j                  t        |      t        |             | j                  ||       y r   )assertEquallen)r   receivedexpecteds      r   
check_datazTestFTPClass.check_data  s*    XH68,r   c                 X    | j                  | j                  j                         d       y )NrC   )r[  rQ  
getwelcomer+   s    r   test_getwelcomezTestFTPClass.test_getwelcome  s    //1=Ar   c                 <   | j                  | j                  j                  d      t        d             | j                  | j                  j                  d      t        d             | j                  | j                  j                  d      t        d             y )Nfooz
pass 12345z
pass *****z
PASS 12345z
PASS *****)r[  rQ  sanitizereprr+   s    r   test_sanitizezTestFTPClass.test_sanitize  sm    --e4d5kB--l;T,=OP--l;T,=OPr   c                    | j                  t        | j                  j                  d       | j                  t        | j                  j                  d       | j                  t        | j                  j                  d       | j                  t        j
                  | j                  j                  d       | j                  t        j
                  | j                  j                  d       | j                  t        j                  | j                  j                  d       | j                  t        j                  | j                  j                  d       | j                  t        j                  | j                  j                  d       y )	Nz
echo 40
0z	echo 40
0z	echo 400zecho 400zecho 499zecho 500zecho 599zecho 999)assertRaises
ValueErrorrQ  sendcmdrO  
error_temp
error_permerror_protor+   s    r   test_exceptionszTestFTPClass.test_exceptions  s    *dkk&9&9>J*dkk&9&9<H*dkk&9&9<H&++T[[-@-@*M&++T[[-@-@*M&++T[[-@-@*M&++T[[-@-@*M&,,dkk.A.A:Nr   c                    t         j                  t         j                  t         j                  t         j                  t         j
                  t        t        f}|D ]
  }	  |d       y # t         j                  $ r Y #w xY w)Nz(exception not included in all_errors set)	rO  error_replyrl  rm  rn  Errorr  EOFError
all_errors)r   
exceptionsr   s      r   test_all_errorszTestFTPClass.test_all_errors  sr    ((&*;*;V=N=N((&,, 
  	ABCC	 $$ s   A((A>=A>c                 N   | j                  | j                  j                         | j                  j                  d       | j                  | j                  j                         | j                  j                  d       | j	                  | j                  j                         y )NTF)
assertTruerQ  passiveserverset_pasvassertFalser+   s    r   test_set_pasvzTestFTPClass.test_set_pasv  sj    112T"112U#223r   c                    | j                  | j                  j                  d      d       | j                  | j                  j                  d      d       | j                  t        j
                  | j                  j                  d       | j                  t        j
                  | j                  j                  d       y )Nzecho 200200zecho 299299zecho 199zecho 300)r[  rQ  voidcmdri  rO  rq  r+   s    r   test_voidcmdzTestFTPClass.test_voidcmd   s    ,,Z8%@,,Z8%@&,,dkk.A.A:N&,,dkk.A.A:Nr   c                 8    | j                   j                          y r   )rQ  loginr+   s    r   
test_loginzTestFTPClass.test_login&      r   c                 :    | j                   j                  d       y )Npasswd)rQ  acctr+   s    r   	test_acctzTestFTPClass.test_acct)  s    "r   c                     | j                   j                  dd       d| j                  j                  _        | j                  t        j                  | j                   j                  dd       y )Nabr~  )rQ  renamerN  r   rL   ri  rO  rq  r+   s    r   test_renamezTestFTPClass.test_rename,  sL    3$5:$$2&,,dkk.@.@#sKr   c                     | j                   j                  d       d| j                  j                  _        | j                  t        j                  | j                   j                  d       y )Nrd  199)rQ  deleterN  r   rL   ri  rO  rq  r+   s    r   test_deletezTestFTPClass.test_delete1  sH    5!5:$$2&,,dkk.@.@%Hr   c                 :    | j                   j                  d       y Nrd  )rQ  sizer+   s    r   	test_sizezTestFTPClass.test_size6  s    r   c                 ^    | j                   j                  d      }| j                  |d       y )N/foo)rQ  mkdr[  r   dirs     r   test_mkdzTestFTPClass.test_mkd9  s$    kkoof%f%r   c                 :    | j                   j                  d       y r  )rQ  rmdr+   s    r   test_rmdzTestFTPClass.test_rmd=  s    r   c                 ^    | j                   j                  d      }| j                  |d       y )Nr  r   )rQ  cwdr[  r  s     r   test_cwdzTestFTPClass.test_cwd@  s$    kkoof%l+r   c                 \    | j                   j                         }| j                  |d       y )Nzpwd ok)rQ  pwdr[  r  s     r   test_pwdzTestFTPClass.test_pwdD  s"    kkooh'r   c                     | j                  | j                  j                         d       | j                  | j                  j                  d        y r   )r[  rQ  quitr   r+   s    r   	test_quitzTestFTPClass.test_quitH  s9    ))+];))40r   c                 8    | j                   j                          y r   )rQ  abortr+   s    r   
test_abortzTestFTPClass.test_abortM  r  r   c                     g }| j                   j                  d|j                         | j                  dj	                  |      t
        j                  | j                   j                               y Nretrr   rQ  
retrbinaryrS   r_  r[   rN   r1   r   r   r]  s     r   test_retrbinaryzTestFTPClass.test_retrbinaryP  sO    vx7*!(()=)=>	@r   c                     dD ]w  }g }| j                   j                  d|j                  |       | j                  dj	                  |      t
        |d  j                  | j                   j                               y y )N)r   
      r  rM   r   r  )r   rM   r]  s      r   test_retrbinary_restz!TestFTPClass.test_retrbinary_restV  sl     	KDHKK""68??"FOOCHHX.%de,33DKK4H4HIK	Kr   c                     g }| j                   j                  d|j                         | j                  dj	                  |      t
        j                  dd             y )Nr  rB   
)rQ  	retrlinesrS   r_  r[   rN   r   r  s     r   test_retrlineszTestFTPClass.test_retrlines]  sC    fhoo6)9+<+<VR+HIr   c                    t        j                  t        j                  | j                  j
                              }| j                  j                  d|       | j                  | j                  j                  j                  t        j                  | j                  j
                               g |j                  d       | j                  j                  d|fd       | j                         y )Nstorr   c                 &    j                  d       S r   rS   r   flags    r   <lambda>z.TestFTPClass.test_storbinary.<locals>.<lambda>j  s    T[[=N r   callback)ioBytesIOrN   r1   rQ  r   
storbinaryr_  rN  r   r   seekrx  )r   fr  s     @r   test_storbinaryzTestFTPClass.test_storbinaryb  s    JJy''(<(<=>vq)44GG!(()=)=>	@ 	q	vq3NOr   c                 ~   t         j                  dd      j                  | j                  j                        }t        j                  |      }dD ]j  }|j                  d       | j                  j                  d||       | j                  | j                  j                  j                  t        |             l y )Nr  
)   30r   r  r  )rN   r   r1   rQ  r   r  r  r  r  r[  rN  r   rM   str)r   rU   r  rs       r   test_storbinary_restz!TestFTPClass.test_storbinary_restm  s      .55dkk6J6JKJJt 	HAFF1IKK""611"5T[[99>>AG	Hr   c                     t         j                  dd      j                  | j                  j                        }t        j                  |      }| j                  j                  d|       | j                  | j                  j                  j                  t         j                  | j                  j                               g |j                  d       | j                  j                  d|fd       | j                         t        j                  t         j                  dd            }t        j                   dt"        fd	
      5  | j%                  t&        | j                  j                  d|       d d d        y # 1 sw Y   y xY w)Nr  r  r  r   zstor fooc                 &    j                  d       S r   r  r  s    r   r  z-TestFTPClass.test_storlines.<locals>.<lambda>~  s    D@Q r   r  rB   T)quiet)rN   r   r1   rQ  r   r  r  	storlinesr_  rN  r   r   r  rx  StringIOr   check_warningsBytesWarningri  	TypeError)r   rU   r  r  s      @r   test_storlineszTestFTPClass.test_storlinesu  s"     .55dkk6J6JKJJtfa(44GG!(()=)=>	@ 	q	j!6QRKK	))&$78++R,>dK 	Oi)>)>
AN	O 	O 	Os   -FFc                     | j                   j                          | j                  | j                   j                         t        j	                  d      d d        y )Nr  rY   )rQ  nlstr[  r   r]   r+   s    r   	test_nlstzTestFTPClass.test_nlst  s?    ))+Y__V-DSb-IJr   c                     g }| j                   j                  |j                         | j                  dj	                  |      t
        j                  dd             y )NrB   r  )rQ  r  rS   r[  r[   r   r   )r   ls     r   test_dirzTestFTPClass.test_dir  s@    !Y%6%6vr%BCr   c                     t         j                  j                                t         j                  j                  d             t         j                  j                  dddg             t         j                  j                               }|D ]x  \  }} j                  |t                j                  |t
                j                  |        j                  d|        j                  d|        j                  d|       z  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                  j                               \  }}|D ]!  } j                  |j                                #  d&        j                  t        t         j                  j                                 d&        j                  j                         D ]  } j                  d'|z          y ))N/)pathr  type)r  factspermuniquec                 <    | j                   j                  _        y r   )rN  r   r.   )rU   r   s    r   set_dataz(TestFTPClass.test_mlsd.<locals>.set_data  s    59DKK((2r   c                 4   |dn|}|dn|}|dn|}|dn|} |        t        j                  j                               \  }}j                  ||       j                  |d   |       j                  |d   |       j                  |d   |       y )Nr  r  r  name)nextrQ  mlsdr[  )	rb   r  r  r  r  _namer  r   r  s	          r   
test_entryz*TestFTPClass.test_mlsd.<locals>.test_entry  s    !\6tD!\6tD!'XVF!\6tDTN 0 0 23LE5UD)U6]D1U6]D1U8_f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
rB   zunexpected data %s)NNNN)rs   rQ  r  assertIsInstancer  dictrx  assertInr  islowerri  StopIterationfail)r   lsr  r  r  r  r   r  s   `      @r   	test_mlsdzTestFTPClass.test_mlsd  s   T[[ T[[3'(T[[3vv.>?@$++""$% 	+KD%!!$,!!%.OOD!MM&%(MM&%(MM(E*	+	:
	6 	@AAPAPBR@vNAPAPAPC)TAPAPBR@vN>?DKK,,./u 	)AOOAIIK(	) 	-t{{/?/?/AB!!# 	0AII*Q./	0r   c                     | j                   j                         5  | j                  | j                  j                  j
                  d       d d d        y # 1 sw Y   y xY w)Nr|   rQ  makeportr[  rN  r   rK   r+   s    r   test_makeportzTestFTPClass.test_makeport  sJ    [[!!# 	(T[[99KK &(	( 	( 	(   1AAc                     | j                   j                         \  }}t        j                  ||ft              }|j                          | j                  | j                  j                  j                  d       y )Nro   pasv
rQ  makepasvrD   rw   rx   r*   r[  rN  r   rK   r   r   r|   r    s       r   test_makepasvzTestFTPClass.test_makepasv  sW    [[))+
d''tgF

55GGPr   c                 `   d| j                   _        | j                   j                         \  }}| j                  || j                  j
                  j                         t        j                  | j                   j                  j                         d   |ft              j                          y)z/Test the opt-in to the old vulnerable behavior.Tr   ro   N)rQ  trust_server_pasv_ipv4_addressr   r[  rN  r   rP   rD   rw   r   getpeernamerx   r*   )r   bad_hostr|   s      r   *test_makepasv_issue43285_security_disabledz7TestFTPClass.test_makepasv_issue43285_security_disabled  s    592--/$$++66JJ	L 	  $++"2"2">">"@"CT!J)0	227%'r   c                 >   | j                  | j                  j                         | j                  j                         \  }}| j	                  || j
                  j                  j                         t        j                  ||ft              j                          y )Nro   )r{  rQ  r  r   assertNotEqualrN  r   rP   rD   rw   rx   r*   )r   trusted_hostr|   s      r   1test_makepasv_issue43285_security_enabled_defaultz>TestFTPClass.test_makepasv_issue43285_security_enabled_default  su    CCD![[113ddkk::NN	P 	  ,!5wGMMOr   c                      j                   j                           fd}t        j                  t              5  _          j                   j                   j                  j                   j                  j                          j                   j                  d        j                   |              d d d         j                   j                  j                  j                  d        j                   |              t        j                  t              5  _          j                   j                   j                  j                   j                  j                          j                   j                  d        j                   j                          d d d         j                   j                  j                  j                  d        j                   |              	 t        j                  t              5  _          j                   j                   j                  j                   j                  j                          j                   j                  d       d j                  j                  _        d d d         j!                  d       t'        j(                  d        j                   j                  j                  j                  d        j                   |              y # 1 sw Y   GxY w# 1 sw Y   mxY w# 1 sw Y   xY w# t        j"                  $ r%} j                  t%        |      d       Y d }~d }~ww xY w)Nc                       j                   j                  y	  j                   j                  d       y# t        t        f$ r Y yw xY w)NFnoopT)rQ  r   rk  r  rs  r+   s   r   is_client_connectedz=TestFTPClass.test_with_statement.<locals>.is_client_connected  sK    {{'##F+  X& s   6 AAro   r  r  z550 error on quitzException not raisedr   )rQ  r  rO  rP  rx   rR  rN  r   r|   rk  rx  r[  r   rK   r{  rL   r  rm  r  timesleep)r   r  r  s   `  r   test_with_statementz TestFTPClass.test_with_statement  sY   	 ZZ( 	3DKKK 0 0$++2B2BCKK'OO/12	3 	55GGP,./ ZZ( 	DKKK 0 0$++2B2BCKK'KK	 	55GGP,./	.G, Q##DKK$4$4dkk6F6FG##F+=P,,:Q II,- 	

355GGP,./=	3 	3	 	Q Q    	<SX':;;	<sJ   A;K;A?L,L! B LL! ;LLLL! !M4MMc                 "   | j                   j                          t        j                         }	 | j                   j	                  | j
                  j                  | j
                  j                  t        |f       | j                  | j                   j                  j                         d   |       | j                   j                          y # t        $ r7}|j                  t        j                  k(  r| j                  d|z          d }~ww xY w)N)source_addressr@   couldn't bind to port %d)rQ  r  r   find_unused_portrR  rN  r   r|   r   r[  r   r   r  r  
EADDRINUSEskipTest)r   r|   es      r   test_source_addressz TestFTPClass.test_source_address  s    --/	KK 0 0$++2B2B04d|   =T[[--99;A>EKK 	ww%***84?@	s   BC 	D2D		Dc                    t        j                         }t        |f| j                  _        	 | j                  j                  d      5 }| j                  |j                         d   |       d d d        y # 1 sw Y   y xY w# t        $ r7}|j                  t        j                  k(  r| j                  d|z          d }~ww xY w)Nrs   r@   r  )r   r  r   rQ  r  transfercmdr[  r   r  r  r  r  )r   r|   r   r  s       r   &test_source_address_passive_connectionz3TestFTPClass.test_source_address_passive_connection$  s    --/&*D\"	((0 >D  !1!1!3A!6=> > > 	ww%***84?@	s5   B $A5,B 5A>:B >B 	C
2B<<Cc                    | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  t        j                  d       | j                  t        j                  d      d	       | j                  t        j                  d
      d	       y )Nz257 "/foo/bar"z/foo/barz257 "/foo/bar" createdz257 ""rB   z257 "" createdz250 "/foo/bar"z257 "/foo/b""ar"z	/foo/b"arz257 "/foo/b""ar" created)r[  rO  parse257ri  rq  r+   s    r   test_parse257zTestFTPClass.test_parse257/  s    )9:JG)ABJO2B7)9:B?&,,foo?OP 	);<kJ)CDkRr   c                     | j                  t        j                  | j                  j                  d| j                  j
                  z  dz         y )Nr   r   )ri  rO  rr  rQ  rk  maxliner+   s    r   test_line_too_longzTestFTPClass.test_line_too_long;  s9    &,,(;(; 3 33a7	9r   c                     | j                   j                  d| j                   j                  dz  z         g }| j                  t        j
                  | j                   j                  d|j                         y )NzSETLONGRETR %dr   r  )rQ  rk  r"  ri  rO  rr  r  rS   r  s     r   test_retrlines_too_longz$TestFTPClass.test_retrlines_too_long?  sX    ,0C0Ca0GHI&,,++//	Jr   c                     t        j                  d| j                  j                  z  dz        }| j	                  t
        j                  | j                  j                  d|       y )N   xr   r  )r  r  rQ  r"  ri  rO  rr  r  )r   r  s     r   test_storlines_too_longz$TestFTPClass.test_storlines_too_longE  sF    JJtdkk111A56&,,(=(=vqIr   c                 (   ddg}|D ]  }| j                  |      5  | j                          | j                  |       | j                  || j                  j
                         | j                          | j                          | j                          | j                  j                  d      }| j                  |d       d d d         t        j                  t              }| j                  t        |j
                         y # 1 sw Y   
xY w)Nzlatin-1r   r   u   /non-ascii dir ®ro   )subTestrX  rT  r[  rQ  r   r  r  r  r  r_  rO  rP  rx   r   )r   	encodingsr   new_dirrQ  s        r   test_encoding_paramz TestFTPClass.test_encoding_paramI  s    (	! 		@Hx0 @

H
-  4;;+?+?@$$&$$&##%++//*?@)>?@ @		@ G,)6??;@ @s   B&DD	N)-r8   r9   r:   r   rT  rX  r_  rb  rg  ro  rv  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   r   rJ  rJ    s    - @,-BQ
O4O#L
I
 &,(1
@KJ
	HO"KD
80t(Q	:P+0Z	
S9JJ<r   rJ  zIPv6 not enabledc                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestIPv6Environmentc                 ^   t        t        dft        j                  t              | _        | j
                  j                          t        j                  t        t              | _
        | j                  j                  | j
                  j                  | j
                  j                         y )Nr   )r   r   rM  )r   r   rD   r   r   rN  r   rO  rP  rx   rQ  rR  r   r|   r+   s    r   rT  zTestIPv6Environment.setUp]  sl    $fa[(..>@ 	jj;KLDKK,,dkk.>.>?r   c                     | j                   j                          | j                  j                          d | _        t	        j
                  d       y rV  rW  r+   s    r   rX  zTestIPv6Environment.tearDowne  rY  r   c                 l    | j                  | j                  j                  t        j                         y r   )r[  rQ  r   rD   r   r+   s    r   test_afzTestIPv6Environment.test_afl  s    9r   c                     | j                   j                         5  | j                  | j                  j                  j
                  d       d d d        y # 1 sw Y   y xY w)Neprtr  r+   s    r   r  z!TestIPv6Environment.test_makeporto  sJ    [[!!# 	(T[[99KK &(	( 	( 	(r  c                     | j                   j                         \  }}t        j                  ||ft              }|j                          | j                  | j                  j                  j                  d       y )Nro   epsvr  r  s       r   r  z!TestIPv6Environment.test_makepasvt  sW    [[))+
d''tgF

55GGPr   c                       fd} j                   j                  d        |         j                   j                  d        |        y )Nc                      g } j                   j                  d| j                         j                  dj	                  |       t
        j                  j                   j                               y r  )rQ  r  rS   r[  r[   rN   r1   r   )r]  r   s    r   r  z/TestIPv6Environment.test_transfer.<locals>.retr{  sR    HKK""68??;SXXh/&--dkk.B.BCEr   TF)rQ  rz  )r   r  s   ` r   test_transferz!TestIPv6Environment.test_transferz  s9    	E
 	T"U#r   N)	r8   r9   r:   rT  rX  r3  r  r  r:  r   r   r   r/  r/  Z  s"    @,:(
Q	r   r/  zSSL not availablec                       e Zd ZdZefdZy)TestTLS_FTPClassMixinzfRepeat TestFTPClass tests starting the TLS layer for both control
    and data connections first.
    c                    t        t        df|      | _        | j                  j                          t	        j
                  t        |      | _        | j                  j                  | j                  j                  | j                  j                         | j                  j                          | j                  j                          y rL  )rH  r   rN  r   rO  FTP_TLSrx   rQ  rR  r   r|   authprot_prS  s     r   rT  zTestTLS_FTPClassMixin.setUp  s~    ($XFnnWxHDKK,,dkk.>.>?r   N)r8   r9   r:   r3  r   rT  r   r   r   r<  r<    s     . r   r<  c                   b    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y)TestTLS_FTPClasszSpecific TLS_FTP class tests.c                 .   t        t        df|      | _        | j                  j                          t	        j
                  t              | _        | j                  j                  | j                  j                  | j                  j                         y )Nr   r   ro   )rH  r   rN  r   rO  r>  rx   rQ  rR  r   r|   rS  s     r   rT  zTestTLS_FTPClass.setUp  s\    ($XFnnW5DKK,,dkk.>.>?r   c                     | j                   j                          | j                  j                          d | _        t	        j
                  d       y rV  rW  r+   s    r   rX  zTestTLS_FTPClass.tearDown  rY  r   c                    | j                  | j                  j                  t        j                         | j                  j                          | j                  | j                  j                  t        j                         y r   )assertNotIsInstancerQ  r   r  r1  r?  r  r+   s    r   test_control_connectionz(TestTLS_FTPClass.test_control_connection  sN      !1!13==Adkk..>r   c                    | j                   j                  d      5 }| j                  |t        j                         | j                  |j                  d      t        j                  | j                   j                               d d d        | j                  | j                   j                         d       | j                   j                          | j                   j                  d      5 }| j                  |t        j                         | j                  |j                  d      t        j                  | j                   j                               d d d        | j                  | j                   j                         d       | j                   j                          | j                   j                  d      5 }| j                  |t        j                         | j                  |j                  d      t        j                  | j                   j                               d d d        | j                  | j                   j                         d       y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   NxY w)Nrs   r"   r'   )rQ  r  rF  r  r1  r[  r#   r   r1   r   voidrespr@  r  prot_c)r   r   s     r   test_data_connectionz%TestTLS_FTPClass.test_data_connection  s   [[$$V, 	E$$T3==9TYYt_&--dkk.B.BCE	E 	--/1HI 	[[$$V, 	E!!$6 TYYt_&--dkk.B.BCE		E 	--/1HI 	[[$$V, 	E$$T3==9TYYt_&--dkk.B.BCE	E 	--/1HI-	E 	E	E 	E	E 	Es&   A)I,A)I%<A)I2I"%I/2I;c                 <   | j                  | j                  j                  t        j                         | j                  j                          | j                  | j                  j                  t        j                         | j                  j                          y r   )rF  rQ  r   r  r1  r  r  r+   s    r   r  zTestTLS_FTPClass.test_login  s^      !1!13==Adkk..>r   c                     | j                   j                          | j                  t        | j                   j                         y r   )rQ  r?  ri  rj  r+   s    r   test_auth_issued_twicez'TestTLS_FTPClass.test_auth_issued_twice  s,    *dkk&6&67r   c                    | j                   j                          t        j                  t        j                        }d|_        t        j                  |_        | j                  t        t        j                  t        |       | j                  t        t        j                  t        |       | j                  t        t        j                  t        t        |       t        j                  |t              | _         | j                   j                  | j                  j                   | j                  j"                         | j%                  | j                   j&                  t        j(                         | j                   j+                          | j-                  | j                   j&                  j.                  |       | j1                  | j                   j&                  t        j(                         | j                   j3                          | j                   j5                  d      5 }| j-                  |j.                  |       | j1                  |t        j(                         d d d        y # 1 sw Y   y xY w)NF)keyfiler  )certfiler  )rQ  rP  r  r  rp   rs   )rQ  r  r  r  PROTOCOL_TLS_CLIENTcheck_hostname	CERT_NONEverify_moderi  r  rO  r>  r  rx   rR  rN  r   r|   rF  r   r1  r?  assertIsr  r  r@  r  r   ctxr   s      r   test_contextzTestTLS_FTPClass.test_context  s   nnS445"--)V^^X"% 	 	')V^^h"% 	 	')V^^h"*C 	 	9 nnS'BDKK,,dkk.>.>?  !1!13==Adkk&&..4dkk..>[[$$V, 	7MM$,,,!!$6	7 	7 	7s   +=I11I:c                    | j                  t        | j                  j                         | j                  j	                  d       | j                  | j                  j                  t        j                         | j                  j                          | j                  t        | j                  j                  j                         y )NT)secure)
ri  rj  rQ  cccr  r  r   r  r1  r"  r+   s    r   test_ccczTestTLS_FTPClass.test_ccc  s{    *dkkoo6&dkk..>*dkk&6&6&=&=>r   FzFIXME: bpo-32706c                    | j                   j                          t        j                  t        j                        }| j                  |j                  t        j                         | j                  |j                  d       |j                  t               t        j                  |t              | _         | j                   j                  | j                  j                   | j                  j"                         | j%                  t        j&                        5  | j                   j)                          d d d        | j                   j                  | j                  j                   | j                  j"                         | j                   j+                          | j%                  t        j&                        5  | j                   j-                  d      5 }	 d d d        d d d        | j                   j                          | j                   j                  d| j                  j"                         | j                   j)                          | j                   j                          | j                   j                  d| j                  j"                         | j                   j+                          | j                   j-                  d      5 }	 d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)NTrR  rs   	localhost)rQ  r  r  r  rS  r[  rV  CERT_REQUIREDrT  load_verify_locationsCAFILErO  r>  rx   rR  rN  r   r|   ri  CertificateErrorr?  r@  r  rX  s      r   test_check_hostnamez$TestTLS_FTPClass.test_check_hostname  s   nnS445#*;*;<++T2!!&)nnS'B 	DKK,,dkk.>.>?s334 	KK	 	DKK,,dkk.>.>?s334 	((0 D	 	K)9)9:K)9)9:[[$$V, 		 	#	 	 	 		 	s<   K<K2K%K2K?K"%K/	*K22K<?LN)r8   r9   r:   r3  r   rT  rX  rG  rK  r  rN  rZ  r^  r   re  r   r   r   rB  rB    sN    '- @,?
J4870? )* +r   rB  c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestTimeoutsc                    t        j                         | _        t        j                  t        j                  t        j
                        | _        | j                  j                  d       t        j                  | j                        | _
        t        j                  | j                        | _        d| j                  _        | j                  j                          | j                  j!                          | j                  j#                          t$        j&                  j                  | _        | j                  t$        j&                  _
        y )Nr  )targetT)r   r   evtrD   r   r   r   r   r   	bind_portr|   r   rN  server_threadr   r   r   clearrO  rP  old_portr+   s    r   rT  zTestTimeouts.setUp  s    ??$MM&..&2D2DE			R !++DII6	&--T[[A$(!  "

))

r   c                     | j                   t        j                  _        | j                  j                          d | _        y r   )rn  rO  rP  r|   rl  r[   r+   s    r   rX  zTestTimeouts.tearDown!  s+    --

!!r   c                    | j                   j                          | j                  j                          	 | j                   j	                         \  }}|j                  d       |j                  t        j                         | j                  j                          |j                          | j                   j                          y # t        $ r Y &w xY w# | j                   j                          w xY w)Ns   1 Hola mundo
)r   r   rj  r   r   sendallshutdownrD   SHUT_WRr*   TimeoutErrorr   s      r   rN  zTestTimeouts.server'  s    
 				))+JD$ LL*+MM&..)HHLLNJJLIIOO  		 IIOOs*   C AC 	CC CC C3c                    | j                  t        j                                t        j                  d       	 t	        j
                  t              }t        j                  d        | j                  |j                  j                         d       | j                  j                          |j                          y # t        j                  d        w xY wNr  )assertIsNonerD   getdefaulttimeoutsetdefaulttimeoutrO  rP  r   r[  r   
gettimeoutrj  r   r*   r   ftps     r   testTimeoutDefaultzTestTimeouts.testTimeoutDefault<  s    &2245  $	+**T"C$$T*,,.3		 $$T*s   B= =Cc                    | j                  t        j                                t        j                  d       	 t	        j
                  t        d       }t        j                  d        | j                  |j                  j                                | j                  j                          |j                          y # t        j                  d        w xY wNr  ro   )rw  rD   rx  ry  rO  rP  r   r   rz  rj  r   r*   r{  s     r   testTimeoutNonezTestTimeouts.testTimeoutNoneH  s    &2245  $	+**T40C$$T*#((--/0		 $$T*s   B> >Cc                 l   t        j                  t        d      }| j                  |j                  j                         d       | j                  j                          |j                          | j                  t              5  t        j                  t        d       d d d        y # 1 sw Y   y xY w)Nr  ro   r   )rO  rP  r   r[  r   rz  rj  r   r*   ri  rj  r{  s     r   testTimeoutValuezTestTimeouts.testTimeoutValueT  sx    jjr*,,.3		 z* 	(JJtQ'	( 	( 	(s   B**B3c                    t        j                         }|j                  t        d       | j	                  |j
                  j                         d       | j                  j                          |j                          y r  
rO  rP  rR  r   r[  r   rz  rj  r   r*   r{  s     r   testTimeoutConnectzTestTimeouts.testTimeoutConnect_  sP    jjlD"%,,.3		r   c                    t        j                  d      }|j                  t               | j	                  |j
                  j                         d       | j                  j                          |j                          y r  r  r{  s     r   testTimeoutDifferentOrderz&TestTimeouts.testTimeoutDifferentOrderf  sO    jj$D,,.3		r   c                    t        j                         }d|_        |j                  t               | j                  |j                  j                         d       | j                  j                          |j                          y rv  )rO  rP  rp   rR  r   r[  r   rz  rj  r   r*   r{  s     r   testTimeoutDirectAccessz$TestTimeouts.testTimeoutDirectAccessm  sS    jjlD,,.3		r   N)r8   r9   r:   rT  rX  rN  r}  r  r  r  r  r  r   r   r   rg  rg    s/    $"*

	(r   rg  c                       e Zd Zd Zy)MiscTestCasec                 D    h d}t        j                  | t        |       y )N>   CRLFtestrr  ftpcpB_CRLFMAXLINEMSG_OOBFTP_PORTparse150parse227parse229r  
print_line)not_exported)r   check__all__rO  )r   r  s     r   test__all__zMiscTestCase.test__all__w  s     	T6Er   N)r8   r9   r:   r  r   r   r   r  r  v  s    Fr   r  c                  t    t        j                         } t        j                  t         j                  g|   y r   )r   threading_setupunittestaddModuleCleanupthreading_cleanup)thread_infos    r   setUpModuler    s*    "224K.@@O;Or   __main__);r3  rO  rD   r  r  osr   r  r  r  ImportErrorr   r   r  r   test.supportr   r   r   r	   r
   test.support.socket_helperr   r   requires_working_socketLOOPBACK_TIMEOUTrx   r   rN   r   r   r   r   r   r   r>   r   r   r   r  r[   dirname__file__r  rc  r  r5  r9  rH  rJ  IPV6_ENABLEDr/  r<  rB  rg  r  r  r8   mainr   r   r   <module>r     s1   $
   	  	    *  ) & ( ! ! 3    t ,

"
"  ,d2	4	4	K	&	 h))  Dn(h)) n(b0 X(()*:*: 0 f ?ww||BGGOOH5z>RHWW\\"''//(3ZPFf3++ f3R)m_ )%Fm_ %FP&^ &n<8 n<b M&&(:;(( ( <(V C$%L  & C$%wx w &wtb8 bJF8 FP
 zHMMO i#  
Cs   H HH