
    z%iѧ                     (   	 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j.                  d
       ej0                  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jF                  ejH                        Z%eejL                  jO                  ejL                  jQ                  e)      d      Z*ejL                  jO                  ejL                  jQ                  e)      d      Z+ G d dejF                        Z, G d de,e!      Z- G d d e,e"      Z. G d! d"e%      Z/ G d# d$e
      Z0 eejb                  d%       G d& d'e
             Z2 eed(       G d) d*e0             Z3 eed(       G d+ d,e
             Z4 G d- d.e
      Z5 G d/ d0e
      Z6d1 Z7e8d2k(  r ejr                          yy# e	$ r dZY w xY w)3    N)TestCase
skipUnless)support)threading_helper)socket_helper)warnings_helper)asynchat)asyncore)HOSTHOSTv6T)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                       y N r       D/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/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                  | |       || _        d| j                  _        |j
                  | _        y )N )r	   
async_chat__init__	baseclasslast_received_dataencodingselfconnr   s      r   r   zDummyDTPHandler.__init__C   s8    $$T40",.)!**r   c                     | j                  d      j                  | j                  d      }| j                  xj                  |z  c_        y )N   replace)recvdecoder   r   r   )r   new_datas     r   handle_readzDummyDTPHandler.handle_readI   s5    99T?))$--C))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+   r8   __classcell__r5   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 | _
        d| _        d| _        d | _        d | _        t        | _        | j#                  d       || _        d| _        y )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__f   s    $$T40v00&2E2EqIG$!%"$	'		-   $5 r   c                 :    | j                   j                  |       y r   )rJ   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   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oa &&(!$		#B;uqyz"CC4#&T6C<0F3KII8#=>r   c                     t                y r   r7   r-   s    r   r8   zDummyFTPHandler.handle_error   r9   r   c                 |    t         j                  j                  | |j                  | j                        dz          y )NrC   )r	   r   r+   r3   r   rU   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]   tuplerE   create_connectionTIMEOUTdtp_handlerrK   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   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 	>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   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   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   )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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)rN   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+   rN   ru   rK   rP   r1   )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+   rK   	LIST_DATAr1   r   s     r   cmd_listzDummyFTPHandler.cmd_list   .    		- i   "r   c                     | j                  d       | j                  j                  t               | j                  j                          y )Nz125 nlst ok)r+   rK   	NLST_DATAr1   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+   rK   	MLSD_DATAr1   r   s     r   cmd_mlsdzDummyFTPHandler.cmd_mlsd  r   r   c                 L    dt        |      z  | _        | j                  d       y )Nxz125 setlongretr ok)ru   rP   r+   r   s     r   cmd_setlongretrzDummyFTPHandler.cmd_setlongretr  s    !CHn		&'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@   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_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12		'A$>>+#{{668!<	49 $ r   c                     t        j                         | _        t         j                  j	                  |        | j                  j                          y r   )r   Event_DummyFTPServer__flagr   startwaitr-   s    r   r   zDummyFTPServer.start$  s4    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皙?rB   )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                 2    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   r7   r-   s    r   r8   zDummyFTPServer.handle_errorB  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 r   r   zkeycert3.pemzpycacert.pemc                   l     e 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 )SSLConnectionFc                    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_socketrE   del_channel
set_socket_ssl_accepting)r   contextrE   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_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\  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_closingrE   unwrapr  r  r  r  r  r  ra   r2   r   r,   )r   r  r5   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!  r2   r   handle_read_eventr   r5   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!  r2   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   )
r2   r   sendr  r  r  r  SSL_ERROR_ZERO_RETURNr  r  )r   rV   r  r5   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   )r2   r   r$   r  r  r  r  r  r  r)  r.   )r   buffer_sizer  r5   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   r7   r-   s    r   r8   zSSLConnection.handle_error  s    !#r   c                     t        | j                  t        j                        r'| j                  j                  | j                          y t        t        | #          y r   )	
isinstancerE   r  	SSLSocket_sslobjr!  r2   r   r,   r$  s    r   r,   zSSLConnection.close  s>    4;;6KK''3%%'mT02r   )r:   r;   r<   r  r  r  r  r!  r#  r&  r(  r$   r8   r,   r=   r>   s   @r   r   r   K  sC    A		'	,&	(	?	@	
		$	3 	3r   r   c                       e Zd Z	 d Zy)DummyTLS_DTPHandlerc                     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)r:   r;   r<   r   r   r   r   r2  r2    s
    <	)r   r2  c                   4    e Zd Z	 eZefdZd Zd Zd Z	d Z
y)DummyTLS_FTPHandlerc                 P    t         j                  | ||       d| _        d| _        y )Nr   F)r@   r   r4  r  rR   s      r   r   zDummyTLS_FTPHandler.__init__  s&    $$T4($C',D$DIr   c                 H    	 | j                  d       | j                          y )Nz234 AUTH TLS successful)r+   r  r   rb   s     r   cmd_authzDummyTLS_FTPHandler.cmd_auth  s    0II/0""$r   c                 T    | j                  d       d| _        | j                          y )Nz 220 Reverting back to clear-textT)r+   r  r!  r9  s     r   cmd_ccczDummyTLS_FTPHandler.cmd_ccc  s"    II89DI!!#r   c                 (    	 | j                  d       y )Nz200 PBSZ=0 successful.r   r9  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 )NCz200 Protection set to ClearFPz200 Protection set to PrivateTz(502 Unrecognized PROT type (use C or P).)upperr+   r4  )r   rb   re   s      r   cmd_protzDummyTLS_FTPHandler.cmd_prot  sU    /**,Ccz		78+0(		9:+/(		DEr   N)r:   r;   r<   r2  ry   r   r   r:  r<  r>  rC  r   r   r   r6  r6    s'    <)*: 	
	%
	$
	0
	Fr   r6  c                       e Zd ZeZy)DummyTLS_FTPServerN)r:   r;   r<   r6  r   r   r   r   rE  rE    s    %r   rE  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   rN  r,   rK  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 )NrD   )rX  rN  
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 *****)rX  rN  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
ValueErrorrN  sendcmdrL  
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)	rL  error_replyri  rj  rk  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)
assertTruerN  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                 D   | j                   j                  d       | j                   j                  d       | j                  t        j                  | j                   j                  d       | j                  t        j                  | j                   j                  d       y )Nzecho 200zecho 299zecho 199zecho 300)rN  voidcmdrf  rL  rn  r-   s    r   test_voidcmdzTestFTPClass.test_voidcmd   sj    J'J'&,,dkk.A.A:N&,,dkk.A.A:Nr   c                 8    | j                   j                          y r   )rN  loginr-   s    r   
test_loginzTestFTPClass.test_login&      r   c                 :    | j                   j                  d       y )Npasswd)rN  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b200)rN  renamerK  r   rM   rf  rL  rn  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 )Nra  199)rN  deleterK  r   rM   rf  rL  rn  r-   s    r   test_deletezTestFTPClass.test_delete1  sH    5!5:$$2&,,dkk.@.@%Hr   c                 :    | j                   j                  d       y Nra  )rN  sizer-   s    r   	test_sizezTestFTPClass.test_size6  s    r   c                 ^    | j                   j                  d      }| j                  |d       y )N/foo)rN  mkdrX  r   dirs     r   test_mkdzTestFTPClass.test_mkd9  s$    kkoof%f%r   c                 :    | j                   j                  d       y r  )rN  rmdr-   s    r   test_rmdzTestFTPClass.test_rmd=  s    r   c                 ^    | j                   j                  d      }| j                  |d       y )Nr  r   )rN  cwdrX  r  s     r   test_cwdzTestFTPClass.test_cwd@  s$    kkoof%l+r   c                 \    | j                   j                         }| j                  |d       y )Nzpwd ok)rN  pwdrX  r  s     r   test_pwdzTestFTPClass.test_pwdD  s"    kkooh'r   c                     | j                  | j                  j                         d       | j                  | j                  j                  d        y r   )rX  rN  quitr   r-   s    r   	test_quitzTestFTPClass.test_quitH  s9    ))+];))40r   c                 8    | j                   j                          y r   )rN  abortr-   s    r   
test_abortzTestFTPClass.test_abortM  r  r   c                       fd}g  j                   j                  d|        j                  dj                        t               y )Nc                 n    j                  | j                  j                  j                               y r   rT   r%   rN  r   rV   rZ  r   s    r   callbackz.TestFTPClass.test_retrbinary.<locals>.callbackQ  "    OODKK(<(<=>r   retrr   rN  
retrbinaryr\  r\   rO   )r   r  rZ  s   ` @r   test_retrbinaryzTestFTPClass.test_retrbinaryP  s8    	?vx0)95r   c                       fd}dD ]J  }g  j                   j                  d||        j                  dj                        t        |d         L y )Nc                 n    j                  | j                  j                  j                               y r   r  r  s    r   r  z3TestFTPClass.test_retrbinary_rest.<locals>.callbackX  r  r   )r   
      r  rN   r   r  )r   r  rN   rZ  s   `  @r   test_retrbinary_restz!TestFTPClass.test_retrbinary_restW  sU    	? 	ADHKK""68$"?OOBGGH-y/?@	Ar   c                     g }| j                   j                  d|j                         | j                  dj	                  |      t
        j                  dd             y )Nr  r   
)rN  	retrlinesrT   r\  r\   rO   r#   r   rZ  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               g |j                  d       | j                  j                  d|fd       | j                         y )Nstorr   c                 &    j                  d       S r   rT   r   flags    r   <lambda>z.TestFTPClass.test_storbinary.<locals>.<lambda>k  s    T[[=N r   r  )ioBytesIOrO   r3   rN  r   
storbinaryr\  rK  r   r   seekru  )r   fr  s     @r   test_storbinaryzTestFTPClass.test_storbinaryd  s    JJy''(<(<=>vq)44GGS	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  )rO   r#   r3   rN  r   r  r  r  r  rX  rK  r   rN   str)r   rV   r  rs       r   test_storbinary_restz!TestFTPClass.test_storbinary_restn  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                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  r   T)quiet)rO   r#   r3   rN  r   r  r  	storlinesr\  rK  r   r   r  ru  StringIOr   check_warningsBytesWarningrf  	TypeError)r   rV   r  r  s      @r   test_storlineszTestFTPClass.test_storlinesv  s     .55dkk6J6JKJJtfa(44GGS	q	j!6QRKK	))&$78++R,>dK 	Oi)>)>
AN	O 	O 	Os   +-E!!E*c                     | j                   j                          | j                  | j                   j                         t        j	                  d      d d        y )Nr  rZ   )rN  nlstrX  r   r]   r-   s    r   	test_nlstzTestFTPClass.test_nlst  s?    ))+Y__V-DSb-IJr   c                     g | j                   j                  fd       | j                  dj                        t        j                  dd             y )Nc                 &    j                  |       S r   r  )r   ls    r   r  z'TestFTPClass.test_dir.<locals>.<lambda>  s    !((1+ r   r   r  )rN  r  rX  r\   r   r#   )r   r  s    @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   )rK  r   r0   )rV   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)nextrN  mlsdrX  )	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
r   zunexpected data %s)NNNN)rs   rN  r  assertIsInstancer  dictru  assertInr  islowerrf  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|   rN  makeportrX  rK  r   rL   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
rN  makepasvrE   rw   rx   r,   rX  rK  r   rL   r   r   r|   r    s       r   test_makepasvzTestFTPClass.test_makepasv  sW    [[))+
d''tgF

55GGPr   c                 b   	 d| j                   _        | j                   j                         \  }}| j                  || j                  j
                  j                         t        j                  | j                   j                  j                         d   |ft              j                          y )NTr   ro   )rN  trust_server_pasv_ipv4_addressr  rX  rK  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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   )rx  rN  r  r  assertNotEqualrK  r   rQ   rE   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)rN  r   rh  r  rp  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   )rN  r  rL  rM  rx   rO  rK  r   r|   rh  ru  rX  r   rL   rx  rM   r  rj  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_addressrB   couldn't bind to port %d)rN  r  r   find_unused_portrO  rK  r   r|   r   rX  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   rB   r  )r   r  r   rN  r  transfercmdrX  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 ""r   z257 "" createdz250 "/foo/bar"z257 "/foo/b""ar"z	/foo/b"arz257 "/foo/b""ar" created)rX  rL  parse257rf  rn  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   )rf  rL  ro  rN  rh  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  )rN  rh  r#  rf  rL  ro  r  rT   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  rN  r#  rf  rL  ro  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   )subTestrU  rQ  rX  rN  r   r  r  r  r  r\  rL  rM  rx   r   )r   	encodingsr   new_dirrN  s        r   test_encoding_paramz TestFTPClass.test_encoding_paramI  s    (	! 		@Hx0 @

H
-  4;;+?+?@$$&$$&##%++//*?@)>?@ @		@ G,)6??;@ @s   B&DD	N)-r:   r;   r<   r   rQ  rU  r\  r_  rd  rl  rs  ry  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   rG  rG    s    - @,-BQ
O4O#L
I
 &,(1
6AJ
HO KD
80t(Q	:P+0Z	
S9JJ<r   rG  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   rJ  )r   r   rE   r   r   rK  r   rL  rM  rx   rN  rO  r   r|   r-   s    r   rQ  zTestIPv6Environment.setUp]  sl    $fa[(..>@ 	jj;KLDKK,,dkk.>.>?r   c                     | j                   j                          | j                  j                          d | _        t	        j
                  d       y rS  rT  r-   s    r   rU  zTestIPv6Environment.tearDowne  rV  r   c                 l    | j                  | j                  j                  t        j                         y r   )rX  rN  r   rE   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                     fd} g j                   j                  d|        j                  t        dj	                              t        t
                     j                  dj	                        t
               y )Nc                 n    j                  | j                  j                  j                               y r   r  r  s    r   r  zATestIPv6Environment.test_transfer.<locals>.retr.<locals>.callback|  s"    DKK,@,@ ABr   r  r   )rN  r  rX  rY  r\   rO   )r  rZ  r   s    @r   r  z/TestIPv6Environment.test_transfer.<locals>.retr{  s]    CHKK""684S!23S^DRWWX.	:r   TF)rN  rw  )r   r  s   ` r   test_transferz!TestIPv6Environment.test_transferz  s8    	; 	T"U#r   N)	r:   r;   r<   rQ  rU  r4  r  r  r<  r   r   r   r0  r0  Z  s"    @,:(
Qr   r0  zSSL not availablec                       e Zd Z	 efdZy)TestTLS_FTPClassMixinc                    t        t        df|      | _        | j                  j                          t	        j
                  t        |      | _        | j                  j                  | j                  j                  | j                  j                         | j                  j                          | j                  j                          y rI  )rE  r   rK  r   rL  FTP_TLSrx   rN  rO  r   r|   authprot_prP  s     r   rQ  zTestTLS_FTPClassMixin.setUp  s~    ($XFnnWxHDKK,,dkk.>.>?r   N)r:   r;   r<   r   rQ  r   r   r   r>  r>    s     . r   r>  c                   `    e 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_FTPClassc                 .   t        t        df|      | _        | j                  j                          t	        j
                  t              | _        | j                  j                  | j                  j                  | j                  j                         y )Nr   r   ro   )rE  r   rK  r   rL  r@  rx   rN  rO  r   r|   rP  s     r   rQ  zTestTLS_FTPClass.setUp  s\    ($XFnnW5DKK,,dkk.>.>?r   c                     | j                   j                          | j                  j                          d | _        t	        j
                  d       y rS  rT  r-   s    r   rU  zTestTLS_FTPClass.tearDown  rV  r   c                    | j                  | j                  j                  t        j                         | j                  j                          | j                  | j                  j                  t        j                         y r   )assertNotIsInstancerN  r   r  r/  rA  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)   )rN  r  rH  r  r/  rX  r$   r   r3   r   voidresprB  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   )rH  rN  r   r  r/  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   )rN  rA  rf  rg  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  )rS  rR  r  r  rp   rs   )rN  r  r  r  PROTOCOL_TLS_CLIENTcheck_hostname	CERT_NONEverify_moderf  r  rL  r@  r	  rx   rO  rK  r   r|   rH  r   r/  rA  assertIsr  r  rB  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)
rf  rg  rN  cccr~  r  r   r  r/  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)NTrT  rs   	localhost)rN  r  r  r  rU  rX  rX  CERT_REQUIREDrV  load_verify_locationsCAFILErL  r@  rx   rO  rK  r   r|   rf  CertificateErrorrA  rB  r  rZ  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)r:   r;   r<   r   rQ  rU  rI  rM  r  rP  r\  r`  r   rg  r   r   r   rD  rD    sN    '- @,?
J4870? )* +r   rD  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   evtrE   r   r   r   r   r   	bind_portr|   r   rK  server_threadr   r   r   clearrL  rM  old_portr-   s    r   rQ  zTestTimeouts.setUp  s    ??$MM&..&2D2DE			R !++DII6	&--T[[A$(!  "

))

r   c                     | j                   t        j                  _        | j                  j                          d | _        y r   )rp  rL  rM  r|   rn  r\   r-   s    r   rU  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   rl  r   r   sendallshutdownrE   SHUT_WRr,   TimeoutErrorr   s      r   rK  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  )assertIsNonerE   getdefaulttimeoutsetdefaulttimeoutrL  rM  r   rX  r   
gettimeoutrl  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   )ry  rE   rz  r{  rL  rM  r   r   r|  rl  r   r,   r}  s     r   testTimeoutNonezTestTimeouts.testTimeoutNoneJ  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   )rL  rM  r   rX  r   r|  rl  r   r,   rf  rg  r}  s     r   testTimeoutValuezTestTimeouts.testTimeoutValueV  sx    jjr*,,.3		 z* 	(JJtQ'	( 	( 	(s   B**B3c                    t        j                         }|j                  t        d       | j	                  |j
                  j                         d       | j                  j                          |j                          y r  
rL  rM  rO  r   rX  r   r|  rl  r   r,   r}  s     r   testTimeoutConnectzTestTimeouts.testTimeoutConnecta  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.testTimeoutDifferentOrderh  sO    jj$D,,.3		r   c                    t        j                         }d|_        |j                  t               | j                  |j                  j                         d       | j                  j                          |j                          y rx  )rL  rM  rp   rO  r   rX  r   r|  rl  r   r,   r}  s     r   testTimeoutDirectAccessz$TestTimeouts.testTimeoutDirectAccesso  sS    jjlD,,.3		r   N)r:   r;   r<   rQ  rU  rK  r  r  r  r  r  r  r   r   r   ri  ri    s/    $"*

	(r   ri  c                       e Zd Zd Zy)MiscTestCasec                 D    h d}t        j                  | t        |       y )N>   CRLFtestro  ftpcpB_CRLFMAXLINEMSG_OOBFTP_PORTparse150parse227parse229r   
print_line)not_exported)r   check__all__rL  )r   r  s     r   test__all__zMiscTestCase.test__all__y  s     	T6Er   N)r:   r;   r<   r  r   r   r   r  r  x  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__):rL  rE   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   rO   r   r   r   r   r   r   r@   r   r   r   r  r\   dirname__file__r	  re  r   r2  r6  rE  rG  IPV6_ENABLEDr0  r>  rD  ri  r  r  r:   mainr   r   r   <module>r     s3   $
   	  	    *  ) & ( ! ! 3    t ,

"
"  t#&??	4	4	K	&	 h))  Dn(h)) n(b0 X(()*:*: 0 f ?ww||BGGOOH5~FHWW\\"''//(3^DFf3++ f3R)m_ )%Fm_ %FP&^ &n<8 n<b M&&(:;*( * <*Z C$%L  & C$%wx w &wtb8 bJF8 FP
 zHMMO m#  
Cs   H HH