o
    HXh                     @   s  	 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zd dlZW n e	y2   dZY nw d dlm
Z
mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d dlZe  ede d dlZd dlZW d   n1 s|w   Y  ejZd	Zd
d d ZdZdZ dZ!dd Z"G dd dej#Z$G dd dej#Z%G dd dej&ej'Z(edurej)*ej)+e,dZ-ej)*ej)+e,dZ.G dd dej&Z/G dd de/e$Z0G dd de/e%Z1G dd  d e(Z2G d!d" d"e
Z3eej4d#G d$d% d%e
Z5eed&G d'd( d(e3Z6eed&G d)d* d*e
Z7G d+d, d,e
Z8G d-d. d.e
Z9d/d0 Z:e;d1kr?e<  dS dS )2    N)TestCase
skipUnless)support)threading_helper)socket_helper)warnings_helper)HOSTHOSTv6ignore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                   C   s   d S N r   r   r   :/opt/python-3.10.19/usr/lib/python3.10/test/test_ftplib.pydefault_error_handler;   s   r   c                       s@   e Zd ZdZdd Zdd Zdd Z fdd	Zd
d Z  Z	S )DummyDTPHandlerFc                 C   s(   t j| | || _d| j_|j| _d S )N )asynchat
async_chat__init__	baseclasslast_received_dataencodingselfconnr   r   r   r   r   E   s   zDummyDTPHandler.__init__c                 C   s(   |  d| jd}| j j|7  _d S )N   replace)recvdecoder   r   r   )r   Znew_datar   r   r   handle_readK   s   zDummyDTPHandler.handle_readc                 C   s(   | j s| jd |   d| _ d S d S )N226 transfer completeT)dtp_conn_closedr   pushcloser   r   r   r   handle_closeO   s
   
zDummyDTPHandler.handle_closec                    sD   | j jd ur| j j}d | j _|s|  S tt| || j d S r   )r   	next_dataclose_when_donesuperr   r"   encoder   )r   Zwhat	__class__r   r   r"   X   s   zDummyDTPHandler.pushc                 C   
   t   d S r   r   r$   r   r   r   handle_error`      
zDummyDTPHandler.handle_error)
__name__
__module____qualname__r!   r   r   r%   r"   r.   __classcell__r   r   r*   r   r   B   s    	r   c                   @   s  e Zd ZeZefddZdd Zdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Z d7d8 Z!d9d: Z"d;d< Z#d=d> Z$d?d@ Z%dAdB Z&dCS )DDummyFTPHandlerc                 C   sv   t j| | | jtjtjd | d g | _d | _	d | _
d| _d| _d | _d | _t| _| d || _d| _d S )N      
r   220 welcomez252.253.254.255)r   r   r   socket
setsockopt
SOL_SOCKETSO_OOBINLINEZset_terminator	in_bufferdtplast_received_cmdr   next_responser&   rest	RETR_DATAnext_retr_datar"   r   fake_pasv_server_ipr   r   r   r   r   r   r   h   s   


zDummyFTPHandler.__init__c                 C   s   | j | d S r   )r<   appendr   datar   r   r   collect_incoming_data|      z%DummyFTPHandler.collect_incoming_datac                 C   s   d | j| j}g | _| jr| | j d| _|dd  }|| _|	d}|dkr7||d d  }nd}t
| d| rMt| d| }|| d S | d|  d S )	N    r    r   r5   Zcmd_z 550 command "%s" not understood.)joinr<   r   r   r?   r"   splitlowerr>   findhasattrgetattr)r   linecmdspaceargmethodr   r   r   found_terminator   s   
z DummyFTPHandler.found_terminatorc                 C   r,   r   r-   r$   r   r   r   r.      r/   zDummyFTPHandler.handle_errorc                 C   s   t j| || jd  d S )Nr6   )r   r   r"   r)   r   rF   r   r   r   r"      s   zDummyFTPHandler.pushc                 C   sl   t tt|d}dt|d d  }|d d |d  }tj||ftd}| j|| d| _	| 
d d S )	N,z%d.%d.%d.%d         timeoutr   &200 active data connection established)listmapintrN   tupler8   create_connectionTIMEOUTdtp_handlerr=   r"   )r   rV   addripportsr   r   r   cmd_port   s   zDummyFTPHandler.cmd_portc           	      C   s   t | j  d df=}|t | d }| j}|dd}|d }|d }| d|||f  | \}}| j	|| d| _
W d    d S 1 sLw   Y  d S )Nr   r5   .rY   r[   z$227 entering passive mode (%s,%d,%d)r_   )r8   create_servergetsockname
settimeoutrf   rC   r   r"   acceptrg   r=   )	r   rV   sockrj   ri   Zp1Zp2r   rh   r   r   r   cmd_pasv   s   
"zDummyFTPHandler.cmd_pasvc                 C   sT   | |d dd \}}}t|}tj||ftd}| j|| d| _| d d S )Nr   r5   rL   r]   r_   r`   )rN   rc   r8   re   rf   rg   r=   r"   )r   rV   afri   rj   rk   r   r   r   cmd_eprt   s
   zDummyFTPHandler.cmd_eprtc                 C   s   t j| j  d dft jd)}|t | d }| d|  | \}}| j|| d| _	W d    d S 1 s;w   Y  d S )Nr   )familyr5   z+229 entering extended passive mode (|||%d|)r_   )
r8   rn   ro   AF_INET6rp   rf   r"   rq   rg   r=   )r   rV   rr   rj   r   rh   r   r   r   cmd_epsv   s   
"zDummyFTPHandler.cmd_epsvc                 C   s   |  | d S r   r"   r   rV   r   r   r   cmd_echo   s   zDummyFTPHandler.cmd_echoc                 C      |  d d S )Nz200 noop okry   rz   r   r   r   cmd_noop      zDummyFTPHandler.cmd_noopc                 C   r|   )Nz331 username okry   rz   r   r   r   cmd_user   r~   zDummyFTPHandler.cmd_userc                 C   r|   )Nz230 password okry   rz   r   r   r   cmd_pass   r~   zDummyFTPHandler.cmd_passc                 C   r|   )Nz230 acct okry   rz   r   r   r   cmd_acct   r~   zDummyFTPHandler.cmd_acctc                 C   r|   )Nz350 rnfr okry   rz   r   r   r   cmd_rnfr   r~   zDummyFTPHandler.cmd_rnfrc                 C   r|   )Nz250 rnto okry   rz   r   r   r   cmd_rnto   r~   zDummyFTPHandler.cmd_rntoc                 C   r|   )Nz250 dele okry   rz   r   r   r   cmd_dele   r~   zDummyFTPHandler.cmd_delec                 C   r|   )N
250 cwd okry   rz   r   r   r   cmd_cwd   r~   zDummyFTPHandler.cmd_cwdc                 C   r|   )Nz250 1000ry   rz   r   r   r   cmd_size   r~   zDummyFTPHandler.cmd_sizec                 C   s   |  d|  d S )Nz257 "%s"ry   rz   r   r   r   cmd_mkd   s   zDummyFTPHandler.cmd_mkdc                 C   r|   )Nz
250 rmd okry   rz   r   r   r   cmd_rmd   r~   zDummyFTPHandler.cmd_rmdc                 C   r|   )Nz257 "pwd ok"ry   rz   r   r   r   cmd_pwd   r~   zDummyFTPHandler.cmd_pwdc                 C   r|   )Nz200 type okry   rz   r   r   r   cmd_type   r~   zDummyFTPHandler.cmd_typec                 C   s   |  d |   d S Nz221 quit ok)r"   r#   rz   r   r   r   cmd_quit   s   
zDummyFTPHandler.cmd_quitc                 C   r|   )Nz226 abor okry   rz   r   r   r   cmd_abor   r~   zDummyFTPHandler.cmd_aborc                 C   r|   )Nz125 stor okry   rz   r   r   r   cmd_stor   r~   zDummyFTPHandler.cmd_storc                 C   s   || _ | d d S )Nz350 rest ok)r@   r"   rz   r   r   r   cmd_rest   s   zDummyFTPHandler.cmd_restc                 C   sN   |  d | jd urt| j}nd}| j | j|d   | j  d | _d S )Nz125 retr okr   )r"   r@   rc   r=   rB   r'   )r   rV   offsetr   r   r   cmd_retr   s   



zDummyFTPHandler.cmd_retrc                 C   $   |  d | j t | j  d S )Nz125 list ok)r"   r=   	LIST_DATAr'   rz   r   r   r   cmd_list      
zDummyFTPHandler.cmd_listc                 C   r   )Nz125 nlst ok)r"   r=   	NLST_DATAr'   rz   r   r   r   cmd_nlst  r   zDummyFTPHandler.cmd_nlstc                 C   r|   )Nz200 opts okry   rz   r   r   r   cmd_opts  r~   zDummyFTPHandler.cmd_optsc                 C   r   )Nz125 mlsd ok)r"   r=   	MLSD_DATAr'   rz   r   r   r   cmd_mlsd
  r   zDummyFTPHandler.cmd_mlsdc                 C   s   dt | | _| d d S )Nxz125 setlongretr ok)rc   rB   r"   rz   r   r   r   cmd_setlongretr  s   zDummyFTPHandler.cmd_setlongretrN)'r0   r1   r2   r   rg   DEFAULT_ENCODINGr   rH   rX   r.   r"   rl   rs   ru   rx   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   r4   d   sF    
	
r4   c                   @   s\   e Zd ZeZejefddZdd Z	dd Z
dd Zd	d
 Zdd ZeZdd Zdd ZdS )DummyFTPServerc                 C   sz   t j|  tj|  d| _| |tj | 	| | 
d d| _t  | _| j d d \| _| _d | _|| _d S )NTr\   F   )	threadingThreadr   asyncore
dispatcherdaemonZcreate_socketr8   SOCK_STREAMbindlistenactiveLockactive_lockro   hostrj   handler_instancer   )r   addressrt   r   r   r   r   r     s   



zDummyFTPServer.__init__c                 C   s$   t  | _t j|  | j  d S r   )r   Event_DummyFTPServer__flagr   startwaitr$   r   r   r   r   &  s   
zDummyFTPServer.startc                 C   sZ   d| _ | j  | j r%tjr%| j  tjddd | j  | j r%tjstj	dd d S )NT皙?r5   )r^   countZ
ignore_all)
r   r   setr   Z
socket_mapr   acquireZlooprelease	close_allr$   r   r   r   run,  s   


zDummyFTPServer.runc                 C   s   d| _ |   d S )NF)r   rM   r$   r   r   r   stop5  s   zDummyFTPServer.stopc                 C   s   | j || jd| _d S )Nr   )handlerr   r   r   r   rh   r   r   r   handle_accepted:     zDummyFTPServer.handle_acceptedc                 C   s   |    d S r   )r#   r$   r   r   r   handle_connect=  s   zDummyFTPServer.handle_connectc                 C   s   dS Nr   r   r$   r   r   r   writableA  s   zDummyFTPServer.writablec                 C   r,   r   r-   r$   r   r   r   r.   D  r/   zDummyFTPServer.handle_errorN)r0   r1   r2   r4   r   r8   AF_INETr   r   r   r   r   r   r   r   r   r.   r   r   r   r   r     s    	r   zkeycert3.pemzpycacert.pemc                       sz   e Zd Z	 dZdZdd Zdd Z fddZ fdd	Z fd
dZ	 fddZ
 fddZdd Z fddZ  ZS )SSLConnectionFc                 C   sF   t t j}|t |j| jdddd}|   | | d| _	d S )NFT)Zsuppress_ragged_eofsZserver_sideZdo_handshake_on_connect)
ssl
SSLContextZPROTOCOL_TLS_SERVERZload_cert_chainCERTFILEZwrap_socketr8   Zdel_channelZ
set_socket_ssl_accepting)r   contextr8   r   r   r   secure_connectionS  s   


zSSLConnection.secure_connectionc              
   C   s   z| j   W ng tjyJ } z6|jd tjtjfv r"W Y d }~d S |jd tjkr4|  W  Y d }~S d|jd v rE|  W  Y d }~S  d }~w t	yn } z|jd t
jkrc|  W  Y d }~S W Y d }~d S d }~ww d| _d S )Nr   ZSSLV3_ALERT_BAD_CERTIFICATEr5   F)r8   Zdo_handshaker   SSLErrorargsSSL_ERROR_WANT_READSSL_ERROR_WANT_WRITESSL_ERROR_EOFr%   OSErrorerrnoZECONNABORTEDr   r   errr   r   r   _do_ssl_handshake^  s(   
zSSLConnection._do_ssl_handshakec              
      s   d| _ z| j | _W n- tjy0 } z|jd tjtjfv r&W Y d }~d S W Y d }~nd }~w ty8   Y nw d| _ t	| dddu rMt
t|   d S 	 d S )NTr   F_ccc)_ssl_closingr8   unwrapr   r   r   r   r   r   rR   r(   r   r#   r   r*   r   r   _do_ssl_shutdownq  s"   zSSLConnection._do_ssl_shutdownc                    6   | j r	|   d S | jr|   d S tt|   d S r   )r   r   r   r   r(   r   handle_read_eventr$   r*   r   r   r     
   zSSLConnection.handle_read_eventc                    r   r   )r   r   r   r   r(   r   handle_write_eventr$   r*   r   r   r     r   z SSLConnection.handle_write_eventc              
      s\   z	t t| |W S  tjy- } z|jd tjtjtjtj	fv r(W Y d }~dS  d }~ww r   )
r(   r   sendr   r   r   r   SSL_ERROR_ZERO_RETURNr   r   )r   rG   r   r*   r   r   r     s   zSSLConnection.sendc              
      s   z	t t| |W S  tjy? } z)|jd tjtjfv r$W Y d }~dS |jd tjtj	fv r:| 
  W Y d }~dS  d }~ww )Nr   rJ   )r(   r   r   r   r   r   r   r   r   r   r%   )r   Zbuffer_sizer   r*   r   r   r     s   zSSLConnection.recvc                 C   r,   r   r-   r$   r   r   r   r.     r/   zSSLConnection.handle_errorc                    s8   t | jtjr| jjd ur|   d S tt|   d S r   )	
isinstancer8   r   	SSLSocketZ_sslobjr   r(   r   r#   r$   r*   r   r   r#     s   zSSLConnection.close)r0   r1   r2   r   r   r   r   r   r   r   r   r   r.   r#   r3   r   r   r*   r   r   M  s    
r   c                   @   s   e Zd Z	 dd ZdS )DummyTLS_DTPHandlerc                 C   s&   t | || | jjr|   d S d S r   )r   r   r   secure_data_channelr   r   r   r   r   r     s   zDummyTLS_DTPHandler.__init__N)r0   r1   r2   r   r   r   r   r   r     s    r   c                   @   s>   e Zd Z	 eZefddZdd Zdd Zdd Z	d	d
 Z
dS )DummyTLS_FTPHandlerc                 C   s    t j| ||d d| _d| _d S )Nr   F)r4   r   r   r   rD   r   r   r   r     s   
zDummyTLS_FTPHandler.__init__c                 C   s   	 |  d |   d S )Nz234 AUTH TLS successful)r"   r   r   rS   r   r   r   cmd_auth  s   
zDummyTLS_FTPHandler.cmd_authc                 C   s   |  d d| _|   d S )Nz 220 Reverting back to clear-textT)r"   r   r   r   r   r   r   cmd_ccc  s   
zDummyTLS_FTPHandler.cmd_cccc                 C   s   	 |  d d S )Nz200 PBSZ=0 successful.ry   r   r   r   r   cmd_pbsz  s   zDummyTLS_FTPHandler.cmd_pbszc                 C   sP   	 |  }|dkr| d d| _d S |dkr!| d d| _d S | d d S )NCz200 Protection set to ClearFPz200 Protection set to PrivateTz(502 Unrecognized PROT type (use C or P).)upperr"   r   )r   rS   rV   r   r   r   cmd_prot  s   



zDummyTLS_FTPHandler.cmd_protN)r0   r1   r2   r   rg   r   r   r   r   r   r   r   r   r   r   r     s    r   c                   @   s   e Zd ZeZdS )DummyTLS_FTPServerN)r0   r1   r2   r   r   r   r   r   r   r     s    r   c                   @   sX  e Zd ZefddZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Z d;d< Z!d=d> Z"d?d@ Z#dAdB Z$dCdD Z%dEdF Z&dGdH Z'dIdJ Z(dKdL Z)dMdN Z*dOdP Z+dQdR Z,dSS )TTestFTPClassc                 C   sF   t tdf|d| _| j  tjt|d| _| j| jj	| jj
 d S Nr   r   r^   r   )r   r   serverr   ftplibFTPrf   clientconnectr   rj   r   r   r   r   r   setUp  s   
zTestFTPClass.setUpc                 C   *   | j   | j  d | _tjdd d S NTr   r   r#   r   r   r   r   r$   r   r   r   tearDown     

zTestFTPClass.tearDownc                 C   s$   |  t|t| |  || d S r   )assertEquallen)r   receivedZexpectedr   r   r   
check_data  s   zTestFTPClass.check_datac                 C   s   |  | j d d S )Nr7   )r   r   Z
getwelcomer$   r   r   r   test_getwelcome  r   zTestFTPClass.test_getwelcomec                 C   sL   |  | jdtd |  | jdtd |  | jdtd d S )Nfooz
pass 12345z
pass *****z
PASS 12345z
PASS *****)r   r   Zsanitizereprr$   r   r   r   test_sanitize  s   zTestFTPClass.test_sanitizec                 C   s   |  t| jjd |  t| jjd |  t| jjd |  tj| jjd |  tj| jjd |  tj| jjd |  tj| jjd |  tj| jjd d S )	Nz
echo 40
0z	echo 40
0z	echo 400zecho 400zecho 499zecho 500zecho 599zecho 999)assertRaises
ValueErrorr   sendcmdr   
error_temp
error_permerror_protor$   r   r   r   test_exceptions  s   zTestFTPClass.test_exceptionsc              	   C   sF   t jt jt jt jt jttf}|D ]}z|d t jy    Y qw d S )Nz(exception not included in all_errors set)	r   error_replyr  r	  r
  Errorr   EOFErrorZ
all_errors)r   
exceptionsr   r   r   r   test_all_errors  s   
zTestFTPClass.test_all_errorsc                 C   sF   |  | jj | jd |  | jj | jd | | jj d S )NTF)
assertTruer   Zpassiveserverset_pasvassertFalser$   r   r   r   test_set_pasv  s
   zTestFTPClass.test_set_pasvc                 C   sD   | j d | j d | tj| j jd | tj| j jd d S )Nzecho 200zecho 299zecho 199zecho 300)r   Zvoidcmdr  r   r  r$   r   r   r   test_voidcmd"  s   zTestFTPClass.test_voidcmdc                 C      | j   d S r   )r   loginr$   r   r   r   
test_login(  r~   zTestFTPClass.test_loginc                 C      | j d d S )Npasswd)r   Zacctr$   r   r   r   	test_acct+  rI   zTestFTPClass.test_acctc                 C   s2   | j dd d| jj_| tj| j jdd d S )NabZ200)r   renamer   r   r?   r  r   r  r$   r   r   r   test_rename.  s   
zTestFTPClass.test_renamec                 C   s.   | j d d| jj_| tj| j jd d S )Nr  Z199)r   deleter   r   r?   r  r   r  r$   r   r   r   test_delete3  s   
zTestFTPClass.test_deletec                 C   r  Nr  )r   sizer$   r   r   r   	test_size8  rI   zTestFTPClass.test_sizec                 C   s   | j d}| |d d S )N/foo)r   mkdr   r   dirr   r   r   test_mkd;     zTestFTPClass.test_mkdc                 C   r  r"  )r   Zrmdr$   r   r   r   test_rmd?  rI   zTestFTPClass.test_rmdc                 C   s   | j d}| |d d S )Nr%  r   )r   cwdr   r'  r   r   r   test_cwdB  r*  zTestFTPClass.test_cwdc                 C   s   | j  }| |d d S )Nzpwd ok)r   pwdr   r'  r   r   r   test_pwdF  s   
zTestFTPClass.test_pwdc                 C   s&   |  | j d |  | jjd  d S r   )r   r   quitrr   r$   r   r   r   	test_quitJ  s   zTestFTPClass.test_quitc                 C   r  r   )r   abortr$   r   r   r   
test_abortO  r~   zTestFTPClass.test_abortc                    s6    fdd}g  j d| d t d S )Nc                         | jj d S r   rE   r   r   r   rG   r   r   r   r   callbackS     z.TestFTPClass.test_retrbinary.<locals>.callbackretrr   r   
retrbinaryr   rM   rA   )r   r8  r   r7  r   test_retrbinaryR  s   zTestFTPClass.test_retrbinaryc                    sL    fdd}dD ]}g  j jd||d d t|d   q	d S )Nc                    r4  r   r5  r6  r7  r   r   r8  Z  r9  z3TestFTPClass.test_retrbinary_rest.<locals>.callback)r   
      r:  r@   r   r;  )r   r8  r@   r   r7  r   test_retrbinary_restY  s   z!TestFTPClass.test_retrbinary_restc                 C   s2   g }| j d|j | d|tdd d S )Nr:  r   
)r   	retrlinesrE   r   rM   rA   r   r   r   r   r   r   test_retrlinesa  s   zTestFTPClass.test_retrlinesc                    sj   t t| jj}| jd| | | jj	j
t g  |d | jjd| fddd |   d S )Nstorr   c                    
     d S r   rE   r   flagr   r   <lambda>m     
 z.TestFTPClass.test_storbinary.<locals>.<lambda>r8  )ioBytesIOrA   r)   r   r   
storbinaryr   r   r   r   seekr  r   fr   rJ  r   test_storbinaryf  s   
zTestFTPClass.test_storbinaryc                 C   s`   t dd| jj}t|}dD ]}|d | jjd||d | 	| j
jjt| qd S )NrB  
)   Z30r   rF  r@  )rA   r   r)   r   r   rO  rP  rR  rQ  r   r   r   r@   str)r   rG   rT  rr   r   r   test_storbinary_restp  s   

z!TestFTPClass.test_storbinary_restc                    s   t dd| jj}t|}| jd| | | j	j
jt  g  |d | jjd| fddd |   tt dd}tjd	tfd
d | t| jjd| W d    d S 1 saw   Y  d S )NrB  rV  rF  r   zstor fooc                    rG  r   rH  rI  rJ  r   r   rL    rM  z-TestFTPClass.test_storlines.<locals>.<lambda>rN  r   T)quiet)rA   r   r)   r   r   rO  rP  	storlinesr   r   r   r   rR  r  StringIOr   Zcheck_warningsBytesWarningr  	TypeError)r   rG   rT  r   rJ  r   test_storlinesx  s   


"zTestFTPClass.test_storlinesc                 C   s.   | j   | | j  tdd d  d S )NrB  rL   )r   Znlstr   r   rN   r$   r   r   r   	test_nlst  s   
$zTestFTPClass.test_nlstc                    s6   g  | j  fdd | d tdd d S )Nc                    s
     | S r   rH  rI  lr   r   rL    rM  z'TestFTPClass.test_dir.<locals>.<lambda>r   rB  )r   r(  r   rM   r   r   r$   r   rb  r   test_dir  s   zTestFTPClass.test_dirc                    s  t  j  t  jjdd t  jjdddgd t  j }|D ]'\}} |t  |t  |  d|  d|  d| q% fd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 |dd d |d!d"d |d#d$d |d%d&d d' t j \}}|D ]	} |	  qd(  
tt j  d(  j D ]	} d)|  qd S )+N/)pathr#  type)rf  factspermuniquec                    s   |  j j_d S r   )r   r   r&   r6  r$   r   r   set_data  r~   z(TestFTPClass.test_mlsd.<locals>.set_datac                    s   |d u rdn|}|d u rdn|}|d u rdn|}|d u rdn|}|  t  j \}} ||  |d |  |d |  |d | d S )Nrg  ri  rj  name)nextr   mlsdr   )rS   rg  ri  rj  rl  _namerh  r   rk  r   r   
test_entry  s   z*TestFTPClass.test_mlsd.<locals>.test_entryz)type=type;perm=perm;unique=unique; name
z*type=ty=pe;perm=perm;unique=unique; name
zty=pe)rg  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)rl  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)ra   r   rn  assertIsInstancerX  dictr  ZassertInrm  islowerr  StopIterationfail)r   Zlsrl  rh  rq  ro  r   r   rp  r   	test_mlsd  sH   
zTestFTPClass.test_mlsdc                 C   B   | j   | | jjjd W d    d S 1 sw   Y  d S )Nrj   r   Zmakeportr   r   r   r>   r$   r   r   r   test_makeport  s
   "zTestFTPClass.test_makeportc                 C   >   | j  \}}tj||ftd}|  | | jjj	d d S )Nr]   Zpasv
r   makepasvr8   re   rf   r#   r   r   r   r>   r   r   rj   r   r   r   r   test_makepasv  s   zTestFTPClass.test_makepasvc                 C   sP   	 d| j _| j  \}}| || jjj tj| j j	
 d |ftd  d S )NTr   r]   )r   trust_server_pasv_ipv4_addressr}  r   r   r   rC   r8   re   rr   getpeernamerf   r#   )r   Zbad_hostrj   r   r   r   *test_makepasv_issue43285_security_disabled  s   

z7TestFTPClass.test_makepasv_issue43285_security_disabledc                 C   sH   |  | jj | j \}}| || jjj tj	||ft
d  d S )Nr]   )r  r   r  r}  ZassertNotEqualr   r   rC   r8   re   rf   r#   )r   Ztrusted_hostrj   r   r   r   1test_makepasv_issue43285_security_enabled_default  s   
z>TestFTPClass.test_makepasv_issue43285_security_enabled_defaultc              
      s   j    fdd}tjtd  _  j  jj jj  j 	d  
|  W d    n1 s4w   Y    jjjd  |  tjtd _  j  jj jj  j 	d  j   W d    n1 spw   Y    jjjd  |  z/tjtd _  j  jj jj  j 	d d jj_W d    n1 sw   Y  W n tjy } z t|d W Y d }~n
d }~ww  d td   jjjd  |  d S )	Nc                	      s<    j jd u rdS z	 j d W dS  ttfy   Y dS w )NFnoopT)r   rr   r  r   r  r   r$   r   r   is_client_connected  s   z=TestFTPClass.test_with_statement.<locals>.is_client_connectedr]   r  r0  z550 error on quitzException not raisedr   )r   r0  r   r   rf   r   r   r   rj   r  r  r   r   r>   r  r?   r	  rX  rv  timesleep)r   r  r   r   r$   r   test_with_statement  s>   



z TestFTPClass.test_with_statementc              
   C   s   | j   t }z#| j j| jj| jjt|fd | 	| j j
 d | | j   W d S  tyF } z|jtjkrA| d|   d }~ww )N)source_addressr5   couldn't bind to port %d)r   r0  r   find_unused_portr   r   r   rj   r   r   rr   ro   r   r   
EADDRINUSEskipTest)r   rj   er   r   r   test_source_address  s   
z TestFTPClass.test_source_addressc              
   C   s   t  }t|f| j_z%| jd}| | d | W d    W d S 1 s(w   Y  W d S  tyI } z|j	t	j
krD| d|   d }~ww )Nra   r5   r  )r   r  r   r   r  transfercmdr   ro   r   r   r  r  )r   rj   rr   r  r   r   r   &test_source_address_passive_connection&  s   &z3TestFTPClass.test_source_address_passive_connectionc                 C   s   |  tdd |  tdd |  tdd |  tdd | tjtjd |  tdd	 |  td
d	 d S )Nz257 "/foo/bar"z/foo/barz257 "/foo/bar" createdz257 ""r   z257 "" createdz250 "/foo/bar"z257 "/foo/b""ar"z	/foo/b"arz257 "/foo/b""ar" created)r   r   parse257r  r  r$   r   r   r   test_parse2571  s   zTestFTPClass.test_parse257c                 C   s$   |  tj| jjd| jj d  d S )Nr   r   )r  r   r  r   r  maxliner$   r   r   r   test_line_too_long=  s   zTestFTPClass.test_line_too_longc                 C   s8   | j d| j jd   g }| tj| j jd|j d S )NzSETLONGRETR %dr   r:  )r   r  r  r  r   r  rC  rE   rD  r   r   r   test_retrlines_too_longA  s
   z$TestFTPClass.test_retrlines_too_longc                 C   s0   t d| jj d }| tj| jjd| d S )N   xr   rF  )rO  rP  r   r  r  r   r  r\  rS  r   r   r   test_storlines_too_longG  s   z$TestFTPClass.test_storlines_too_longc              	   C   s   ddg}|D ]B}| j |d2 |   | j|d | || jj |   |   |   | j	d}| 
|d W d    n1 sCw   Y  qtjtd}| t|j d S )Nzlatin-1r   r   u   /non-ascii dir ®r]   )ZsubTestr   r   r   r   r   r=  rU  rE  r&  r   r   r   rf   r   )r   	encodingsr   Znew_dirr   r   r   r   test_encoding_paramK  s   
z TestFTPClass.test_encoding_paramN)-r0   r1   r2   r   r   r   r   r  r  r  r  r  r  r  r  r  r!  r$  r)  r+  r-  r/  r1  r3  r=  rA  rE  rU  rZ  r`  ra  rd  rw  rz  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r     sT    


:	-r   zIPv6 not enabledc                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestIPv6Environmentc                 C   sJ   t tdftjtd| _| j  tjt	td| _
| j
| jj| jj d S )Nr   )rt   r   r   )r   r	   r8   rw   r   r   r   r   r   rf   r   r   r   rj   r$   r   r   r   r   _  s   
zTestIPv6Environment.setUpc                 C   r   r   r   r$   r   r   r   r   g  r   zTestIPv6Environment.tearDownc                 C   s   |  | jjtj d S r   )r   r   rt   r8   rw   r$   r   r   r   test_afn  r   zTestIPv6Environment.test_afc                 C   rx  )NZeprtry  r$   r   r   r   rz  q  s
   "z!TestIPv6Environment.test_makeportc                 C   r{  )Nr]   Zepsvr|  r~  r   r   r   r  v  s   z!TestIPv6Environment.test_makepasvc                    s4    fdd} j d |   j d |  d S )Nc                     sP    fdd} g  j d|  td tt d t d S )Nc                    r4  r   r5  r6  r7  r   r   r8  ~  r9  zATestIPv6Environment.test_transfer.<locals>.retr.<locals>.callbackr:  r   )r   r<  r   r   rM   rA   rN  r$   )r   r   r:  }  s
   z/TestIPv6Environment.test_transfer.<locals>.retrTF)r   r  )r   r:  r   r$   r   test_transfer|  s
   
z!TestIPv6Environment.test_transferN)	r0   r1   r2   r   r   r  rz  r  r  r   r   r   r   r  \  s    r  zSSL not availablec                   @   s   e Zd Z	 efddZdS )TestTLS_FTPClassMixinc                 C   sZ   t tdf|d| _| j  tjt|d| _| j| jj	| jj
 | j  | j  d S r   )r   r   r   r   r   FTP_TLSrf   r   r   r   rj   authprot_pr   r   r   r   r     s   

zTestTLS_FTPClassMixin.setUpN)r0   r1   r2   r   r   r   r   r   r   r    s    r  c                   @   sd   e Zd Z	 efddZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zedddd ZdS )TestTLS_FTPClassc                 C   sD   t tdf|d| _| j  tjtd| _| j| jj	| jj
 d S )Nr   r   r]   )r   r   r   r   r   r  rf   r   r   r   rj   r   r   r   r   r     s   
zTestTLS_FTPClass.setUpc                 C   r   r   r   r$   r   r   r   r     r   zTestTLS_FTPClass.tearDownc                 C   s2   |  | jjtj | j  | | jjtj d S r   )assertNotIsInstancer   rr   r   r   r  rr  r$   r   r   r   test_control_connection  s   
z(TestTLS_FTPClass.test_control_connectionc                 C   sP  | j d}| |tj | |dt| j j	 W d    n1 s&w   Y  | | j 
 d | j   | j d}| |tj | |dt| j j	 W d    n1 s_w   Y  | | j 
 d | j   | j d}| |tj | |dt| j j	 W d    n1 sw   Y  | | j 
 d d S )Nra   r   r    )r   r  r  r   r   r   r   r   r)   r   Zvoidrespr  rr  Zprot_c)r   rr   r   r   r   test_data_connection  s.   

z%TestTLS_FTPClass.test_data_connectionc                 C   s<   |  | jjtj | j  | | jjtj | j  d S r   )r  r   rr   r   r   r  rr  r$   r   r   r   r    s   
zTestTLS_FTPClass.test_loginc                 C   s   | j   | t| j j d S r   )r   r  r  r  r$   r   r   r   test_auth_issued_twice  s   
z'TestTLS_FTPClass.test_auth_issued_twicec                 C   s   | j   ttj}d|_tj|_| jt	t
jt|d | jt	t
jt|d | jt	t
jtt|d t
j|td| _ | j | jj| jj | | j jtj | j   | | j jj| | | j jtj | j   | j d}| |j| | |tj W d    d S 1 sw   Y  d S )NF)keyfiler   )certfiler   )r  r  r   r   r^   ra   )r   r0  r   r   PROTOCOL_TLS_CLIENTcheck_hostnameZ	CERT_NONEverify_moder  r  r   r  r   rf   r   r   r   rj   r  rr   r   r  ZassertIsr   rr  r  r  r   ctxrr   r   r   r   test_context  s0   


"zTestTLS_FTPClass.test_contextc                 C   sP   |  t| jj | jjdd | | jjtj | j  |  t| jjj	 d S )NT)Zsecure)
r  r  r   cccr  rr  rr   r   r   r   r$   r   r   r   test_ccc  s
   
zTestTLS_FTPClass.test_cccFzFIXME: bpo-32706c              	   C   s  | j   ttj}| |jtj | |jd |	t
 tj|td| _ | j | jj| jj | tj | j   W d    n1 sHw   Y  | j | jj| jj | j   | tj | j d}W d    n1 suw   Y  W d    n1 sw   Y  | j   | j d| jj | j   | j   | j d| jj | j   | j d	}W d    d S 1 sw   Y  d S )NTr  ra   	localhost)r   r0  r   r   r  r   r  ZCERT_REQUIREDr  Zload_verify_locationsCAFILEr   r  rf   r   r   r   rj   r  ZCertificateErrorr  r  r  r  r   r   r   test_check_hostname  s6   






"z$TestTLS_FTPClass.test_check_hostnameN)r0   r1   r2   r   r   r   r  r  r  r  r  r  r   r  r   r   r   r   r    s    r  c                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )TestTimeoutsc                 C   s   t  | _ttjtj| _| jd t	| j| _
t j| jd| _d| j_| j  | j  | j  tjj
| _| j
tj_
d S )Nr?  )targetT)r   r   evtr8   r   r   rr   rp   r   Z	bind_portrj   r   r   server_threadr   r   r   clearr   r   old_portr$   r   r   r   r     s   




zTestTimeouts.setUpc                 C   s   | j tj_| j  d | _d S r   )r  r   r   rj   r  rM   r$   r   r   r   r   %  s   


zTestTimeouts.tearDownc                 C   s   | j   | j  z7z	| j  \}}W n	 ty   Y nw |d |tj	 | j  |
  W | j 
  d S W | j 
  d S | j 
  w )Ns   1 Hola mundo
)rr   r   r  r   rq   TimeoutErrorsendallshutdownr8   SHUT_WRr#   r   r   r   r   r   +  s   




zTestTimeouts.serverc              	   C   sf   |  t  td ztt}W td  ntd  w | |j	 d | j
  |  d S NrW  )assertIsNoner8   getdefaulttimeoutsetdefaulttimeoutr   r   r   r   rr   
gettimeoutr  r   r#   r   ftpr   r   r   testTimeoutDefault@  s   

zTestTimeouts.testTimeoutDefaultc              	   C   sh   |  t  td ztjtd d}W td  ntd  w |  |j  | j	
  |  d S NrW  r]   )r  r8   r  r  r   r   r   rr   r  r  r   r#   r  r   r   r   testTimeoutNoneL  s   

zTestTimeouts.testTimeoutNonec                 C   sp   t jtdd}| |j d | j  |  | 	t
 t jtdd W d    d S 1 s1w   Y  d S )NrW  r]   r   )r   r   r   r   rr   r  r  r   r#   r  r  r  r   r   r   testTimeoutValueX  s   
"zTestTimeouts.testTimeoutValuec                 C   s>   t  }|jtdd | |j d | j  |	  d S r  
r   r   r   r   r   rr   r  r  r   r#   r  r   r   r   testTimeoutConnectc  s
   
zTestTimeouts.testTimeoutConnectc                 C   s>   t jdd}|t | |j d | j  |	  d S r  r  r  r   r   r   testTimeoutDifferentOrderj  s
   

z&TestTimeouts.testTimeoutDifferentOrderc                 C   s@   t  }d|_|t | |j d | j	  |
  d S r  )r   r   r^   r   r   r   rr   r  r  r   r#   r  r   r   r   testTimeoutDirectAccessq  s   

z$TestTimeouts.testTimeoutDirectAccessN)r0   r1   r2   r   r   r   r  r  r  r  r  r  r   r   r   r   r    s    r  c                   @   s   e Zd Zdd ZdS )MiscTestCasec                 C   s   h d}t j| t|d d S )N>   r  ZB_CRLFZparse150ZFTP_PORTZftpcptestZ
print_liner  Zparse229MSG_OOBZparse227ZMAXLINEZCRLF)not_exported)r   Zcheck__all__r   )r   r  r   r   r   test__all__{  s   zMiscTestCase.test__all__N)r0   r1   r2   r  r   r   r   r   r  z  s    r  c                  C   s    t  } tjt jg| R   d S r   )r   Zthreading_setupunittestZaddModuleCleanupZthreading_cleanup)thread_infor   r   r   setUpModule  s   r  __main__)=r   r8   rO  r   osr   r  r  r   ImportErrorr   r   r  r   Ztest.supportr   r   r   Ztest.support.socket_helperr   r	   warningscatch_warningssimplefilterDeprecationWarningr   r   ZLOOPBACK_TIMEOUTrf   r   rA   r   r   r   r   r   r   r4   r   r   r   rf  rM   dirname__file__r   r  r   r   r   r   r   ZIPV6_ENABLEDr  r  r  r  r  r  r0   mainr   r   r   r   <module>   sv    

" 23i	(  
s-ze	
