a 5êdg•¦ã@sddlZddlZddlZddlZddlZddlZddlZddlZddlZz ddl Z Wne yjdZ Yn0ddl m Z m Z ddlmZddlmZddlmZmZejZdZddd Zd Zd Zd ZGd d „d ejƒZGdd„dejƒZGdd„dejej ƒZ!e dur|ej" #ej" $e%¡d¡Z&ej" #ej" $e%¡d¡Z'Gdd„dejƒZ(Gdd„de(eƒZ)Gdd„de(eƒZ*Gdd„de!ƒZ+Gdd„de ƒZ,e ej-dƒGdd „d e ƒƒZ.e e d!ƒGd"d#„d#e,ƒƒZ/e e d!ƒGd$d%„d%e ƒƒZ0Gd&d'„d'e ƒZ1Gd(d)„d)e ƒZ2d*d+„Z3e4d,kre3ƒdS)-éN)ÚTestCaseÚ skipUnless)Úsupport)Ú socket_helper)ÚHOSTÚHOSTv6úutf-8z abcde12345 ièunon-ascii char ® ufoo 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 cs@eZdZdZdd„Zdd„Zdd„Z‡fdd „Zd d „Z‡Z S) ÚDummyDTPHandlerFcCs(tj ||¡||_d|j_|j|_dS)NÚ)ÚasynchatÚ async_chatÚ__init__Ú baseclassÚlast_received_dataÚencoding©ÚselfÚconnr©rú,/usr/local/lib/python3.9/test/test_ftplib.pyr 6szDummyDTPHandler.__init__cCs(| d¡ |jd¡}|jj|7_dS)NéÚreplace)ÚrecvÚdecoderrr)rZnew_datarrrÚ handle_read<szDummyDTPHandler.handle_readcCs$|js |j d¡| ¡d|_dS)Nú226 transfer completeT)Údtp_conn_closedrÚpushÚclose©rrrrÚ handle_close@s zDummyDTPHandler.handle_closecsD|jjdur|jj}d|j_|s(| ¡Stt|ƒ | |j¡¡dS©N)rÚ next_dataÚclose_when_doneÚsuperr rÚencoder)rZwhat©Ú __class__rrrIs  zDummyDTPHandler.pushcCst‚dSr!©Ú ExceptionrrrrÚ handle_errorQszDummyDTPHandler.handle_error) Ú__name__Ú __module__Ú __qualname__rr rr rr*Ú __classcell__rrr&rr 3s  r c@seZdZeZefdd„Zdd„Zdd„Zdd„Z d d „Z d d „Z d d„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Z d7d8„Z!d9d:„Z"d;d<„Z#d=d>„Z$d?d@„Z%dAdB„Z&dCS)DÚDummyFTPHandlercCsvtj ||¡|j tjtjd¡| d¡g|_d|_ d|_ d|_ d|_ d|_ d|_t|_| d¡||_d|_dS)Néó r ú 220 welcomez252.253.254.255)r r r ÚsocketÚ setsockoptÚ SOL_SOCKETÚ SO_OOBINLINEZset_terminatorÚ in_bufferÚdtpÚlast_received_cmdrÚ next_responser"ÚrestÚ RETR_DATAÚnext_retr_datarrÚfake_pasv_server_ip©rrrrrrr Ys  zDummyFTPHandler.__init__cCs|j |¡dSr!)r7Úappend©rÚdatarrrÚcollect_incoming_datamsz%DummyFTPHandler.collect_incoming_datacCsªd |j¡ |j¡}g|_|jr2| |j¡d|_| d¡d ¡}||_|  d¡}|dkrn||dd…}nd}t |d|ƒr˜t |d|ƒ}||ƒn| d|¡dS) Nór ú réÿÿÿÿr0Zcmd_z 550 command "%s" not understood.) Újoinr7rrr:rÚsplitÚlowerr9ÚfindÚhasattrÚgetattr)rÚlineÚcmdÚspaceÚargÚmethodrrrÚfound_terminatorps   z DummyFTPHandler.found_terminatorcCst‚dSr!r(rrrrr*ƒszDummyFTPHandler.handle_errorcCstj || |j¡d¡dS)Nr1)r r rr%rrArrrr†szDummyFTPHandler.pushcCslttt| d¡ƒƒ}dt|dd…ƒ}|dd|d}tj||ftd}|j||d|_ |  d¡dS) Nú,z %d.%d.%d.%dééé©Útimeout©rú&200 active data connection established) ÚlistÚmapÚintrHÚtupler3Úcreate_connectionÚTIMEOUTÚ dtp_handlerr8r)rrPÚaddrÚipÚportÚsrrrÚcmd_port‰s zDummyFTPHandler.cmd_portc Cs¤t |j ¡ddf¡x}| t¡| ¡d}|j}| dd¡}|d}|d}| d|||f¡| ¡\}}|j ||d|_ Wdƒn1s–0YdS)Nrr0Ú.rSrUz$227 entering passive mode (%s,%d,%d)rY) r3Ú create_serverÚ getsocknameÚ settimeoutr`r>rrÚacceptrar8) rrPÚsockrdrcZp1Zp2rrbrrrÚcmd_pasv‘s   zDummyFTPHandler.cmd_pasvcCsT| |d¡dd…\}}}t|ƒ}tj||ftd}|j||d|_| d¡dS)Nrr0rFrWrYrZ)rHr]r3r_r`rar8r)rrPÚafrcrdrerrrÚcmd_eprt›s zDummyFTPHandler.cmd_eprtcCs‚tj|j ¡ddftjdP}| t¡| ¡d}| d|¡| ¡\}}|j||d|_ Wdƒn1st0YdS)Nr)Úfamilyr0z+229 entering extended passive mode (|||%d|)rY) r3rhriÚAF_INET6rjr`rrkrar8)rrPrlrdrrbrrrÚcmd_epsv¢sÿ   zDummyFTPHandler.cmd_epsvcCs| |¡dSr!©r©rrPrrrÚcmd_echo«szDummyFTPHandler.cmd_echocCs| d¡dS)Nz 200 noop okrsrtrrrÚcmd_noop¯szDummyFTPHandler.cmd_noopcCs| d¡dS)Nz331 username okrsrtrrrÚcmd_user²szDummyFTPHandler.cmd_usercCs| d¡dS)Nz230 password okrsrtrrrÚcmd_passµszDummyFTPHandler.cmd_passcCs| d¡dS)Nz 230 acct okrsrtrrrÚcmd_acct¸szDummyFTPHandler.cmd_acctcCs| d¡dS)Nz 350 rnfr okrsrtrrrÚcmd_rnfr»szDummyFTPHandler.cmd_rnfrcCs| d¡dS)Nz 250 rnto okrsrtrrrÚcmd_rnto¾szDummyFTPHandler.cmd_rntocCs| d¡dS)Nz 250 dele okrsrtrrrÚcmd_deleÁszDummyFTPHandler.cmd_delecCs| d¡dS)Nú 250 cwd okrsrtrrrÚcmd_cwdÄszDummyFTPHandler.cmd_cwdcCs| d¡dS)Nz250 1000rsrtrrrÚcmd_sizeÇszDummyFTPHandler.cmd_sizecCs| d|¡dS)Nz257 "%s"rsrtrrrÚcmd_mkdÊszDummyFTPHandler.cmd_mkdcCs| d¡dS)Nz 250 rmd okrsrtrrrÚcmd_rmdÍszDummyFTPHandler.cmd_rmdcCs| d¡dS)Nz 257 "pwd ok"rsrtrrrÚcmd_pwdÐszDummyFTPHandler.cmd_pwdcCs| d¡dS)Nz 200 type okrsrtrrrÚcmd_typeÓszDummyFTPHandler.cmd_typecCs| d¡| ¡dS©Nz 221 quit ok)rrrtrrrÚcmd_quitÖs zDummyFTPHandler.cmd_quitcCs| d¡dS)Nz 226 abor okrsrtrrrÚcmd_aborÚszDummyFTPHandler.cmd_aborcCs| d¡dS)Nz 125 stor okrsrtrrrÚcmd_storÝszDummyFTPHandler.cmd_storcCs||_| d¡dS)Nz 350 rest ok)r;rrtrrrÚcmd_restàszDummyFTPHandler.cmd_restcCsN| d¡|jdur t|jƒ}nd}|j |j|d…¡|j ¡d|_dS)Nz 125 retr okr)rr;r]r8r=r#)rrPÚoffsetrrrÚcmd_reträs    zDummyFTPHandler.cmd_retrcCs$| d¡|j t¡|j ¡dS)Nz 125 list ok)rr8Ú LIST_DATAr#rtrrrÚcmd_listîs  zDummyFTPHandler.cmd_listcCs$| d¡|j t¡|j ¡dS)Nz 125 nlst ok)rr8Ú NLST_DATAr#rtrrrÚcmd_nlstós  zDummyFTPHandler.cmd_nlstcCs| d¡dS)Nz 200 opts okrsrtrrrÚcmd_optsøszDummyFTPHandler.cmd_optscCs$| d¡|j t¡|j ¡dS)Nz 125 mlsd ok)rr8Ú MLSD_DATAr#rtrrrÚcmd_mlsdûs  zDummyFTPHandler.cmd_mlsdcCsdt|ƒ|_| d¡dS)NÚxz125 setlongretr ok)r]r=rrtrrrÚcmd_setlongretrszDummyFTPHandler.cmd_setlongretrN)'r+r,r-r raÚDEFAULT_ENCODINGr rCrRr*rrfrmrorrrurvrwrxryrzr{r|r~rr€rr‚rƒr…r†r‡rˆrŠrŒrŽrr‘r“rrrrr/UsD    r/c@s\eZdZeZejefdd„Zdd„Z dd„Z dd„Z d d „Z d d „Z e Zd d„Zdd„ZdS)ÚDummyFTPServercCsztj |¡tj |¡d|_| |tj¡|  |¡|  d¡d|_ t  ¡|_ |j ¡dd…\|_|_d|_||_dS)NTrVFé)Ú threadingÚThreadr ÚasyncoreÚ dispatcherÚdaemonZ create_socketr3Ú SOCK_STREAMÚbindÚlistenÚactiveÚLockÚ active_lockriÚhostrdÚhandler_instancer)rÚaddressrnrrrrr s     zDummyFTPServer.__init__cCs$t ¡|_tj |¡|j ¡dSr!)r—ÚEventÚ_DummyFTPServer__flagr˜ÚstartÚwaitrrrrr§s  zDummyFTPServer.startcCsPd|_|j ¡|jr@tjr@|j ¡tjddd|j ¡qtj dddS)NTçš™™™™™¹?r0)rXÚcount©Z ignore_all) rŸr¦Úsetr™Z socket_mapr¡ÚacquireZloopÚreleaseÚ close_allrrrrÚruns    zDummyFTPServer.runcCsd|_| ¡dS)NF)rŸrGrrrrÚstop&szDummyFTPServer.stopcCs|j||jd|_dS)N©r)Úhandlerrr£©rrrbrrrÚhandle_accepted+szDummyFTPServer.handle_acceptedcCs | ¡dSr!)rrrrrÚhandle_connect.szDummyFTPServer.handle_connectcCsdS©NrrrrrrÚwritable2szDummyFTPServer.writablecCst‚dSr!r(rrrrr*5szDummyFTPServer.handle_errorN)r+r,r-r/r³r3ÚAF_INETr”r r§r°r±rµr¶rr¸r*rrrrr•s  r•z keycert3.pemz pycacert.pemcsxeZdZdZdZdd„Zdd„Z‡fdd„Z‡fdd „Z‡fd d „Z ‡fd d „Z ‡fdd„Z dd„Z ‡fdd„Z ‡ZS)Ú SSLConnectionFcCsBt ¡}| t¡|j|jdddd}| ¡| |¡d|_dS)NFT)Zsuppress_ragged_eofsZ server_sideZdo_handshake_on_connect) ÚsslÚ SSLContextZload_cert_chainÚCERTFILEZ wrap_socketr3Z del_channelZ set_socketÚ_ssl_accepting)rÚcontextr3rrrÚsecure_connectionDs ý zSSLConnection.secure_connectionc Csòz|j ¡WnØtjy }zx|jdtjtjfvrDWYd}~dS|jdtjkrh| ¡WYd}~Sd|jdvrŠ| ¡WYd}~S‚WYd}~nVd}~0t yæ}z0|jdt j krÒ| ¡WYd}~SWYd}~nd}~00d|_ dS)NrZSSLV3_ALERT_BAD_CERTIFICATEr0F) r3Z do_handshaker»ÚSSLErrorÚargsÚSSL_ERROR_WANT_READÚSSL_ERROR_WANT_WRITEÚ SSL_ERROR_EOFr ÚOSErrorÚerrnoZ ECONNABORTEDr¾©rÚerrrrrÚ_do_ssl_handshakeOs  ÿ*zSSLConnection._do_ssl_handshakec sœd|_z|j ¡|_WnZtjy`}z0|jdtjtjfvrLWYd}~dSWYd}~nd}~0typYn0d|_t |ddƒdur˜t t |ƒ  ¡ndS)NTrFÚ_ccc) Ú _ssl_closingr3Úunwrapr»rÁrÂrÃrÄrÆrLr$rºrrÈr&rrÚ_do_ssl_shutdownbs ÿ" zSSLConnection._do_ssl_shutdowncs2|jr| ¡n|jr | ¡ntt|ƒ ¡dSr!)r¾rÊrÌrÎr$rºÚhandle_read_eventrr&rrrÏvs   zSSLConnection.handle_read_eventcs2|jr| ¡n|jr | ¡ntt|ƒ ¡dSr!)r¾rÊrÌrÎr$rºÚhandle_write_eventrr&rrrÐ~s   z SSLConnection.handle_write_eventc slztt|ƒ |¡WStjyf}z:|jdtjtjtjtj fvrPWYd}~dS‚WYd}~n d}~00dSr·) r$rºÚsendr»rÁrÂrÅÚSSL_ERROR_ZERO_RETURNrÃrÄ)rrBrÉr&rrrцsþzSSLConnection.sendc sztt|ƒ |¡WStjyŠ}z^|jdtjtjfvrHWYd}~dS|jdtjtj fvrt|  ¡WYd}~dS‚WYd}~n d}~00dS)NrrD) r$rºrr»rÁrÂrÃrÄrÅrÒr )rZ buffer_sizerÉr&rrrs ÿzSSLConnection.recvcCst‚dSr!r(rrrrr*œszSSLConnection.handle_errorcs6t|jtjƒr$|jjdur$| ¡ntt|ƒ ¡dSr!) Ú isinstancer3r»Ú SSLSocketZ_sslobjrÎr$rºrrr&rrrŸs  ÿ zSSLConnection.close)r+r,r-r¾rÌrÀrÊrÎrÏrÐrÑrr*rr.rrr&rrº>s     rºc@seZdZdd„ZdS)ÚDummyTLS_DTPHandlercCs"t |||¡|jjr| ¡dSr!)r r rÚsecure_data_channelrÀrrrrr ªszDummyTLS_DTPHandler.__init__N)r+r,r-r rrrrrÕ§srÕc@s<eZdZeZefdd„Zdd„Zdd„Zdd„Z d d „Z d S) ÚDummyTLS_FTPHandlercCs tj|||dd|_d|_dS)Nr²F)r/r rÖrËr?rrrr µszDummyTLS_FTPHandler.__init__cCs| d¡| ¡dS)Nz234 AUTH TLS successful)rrÀ©rrMrrrÚcmd_authºs zDummyTLS_FTPHandler.cmd_authcCs| d¡d|_| ¡dS)Nz 220 Reverting back to clear-textT)rrËrÎrØrrrÚcmd_ccc¿s zDummyTLS_FTPHandler.cmd_ccccCs| d¡dS)Nz200 PBSZ=0 successful.rsrØrrrÚcmd_pbszÄszDummyTLS_FTPHandler.cmd_pbszcCsJ| ¡}|dkr"| d¡d|_n$|dkr<| d¡d|_n | d¡dS)NÚCz200 Protection set to ClearFÚPz200 Protection set to PrivateTz(502 Unrecognized PROT type (use C or P).)ÚupperrrÖ)rrMrPrrrÚcmd_protËs  zDummyTLS_FTPHandler.cmd_protN) r+r,r-rÕrar”r rÙrÚrÛrßrrrrr×°s  r×c@seZdZeZdS)ÚDummyTLS_FTPServerN)r+r,r-r×r³rrrrràØsràc@sXeZdZefdd„Zdd„Zdd„Zdd„Zd d „Zd d „Z d d„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Zd7d8„Zd9d:„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Ú TestFTPClasscCsFttdf|d|_|j ¡tjt|d|_|j |jj |jj ¡dS©Nrr²©rXr) r•rÚserverr§ÚftplibÚFTPr`ÚclientÚconnectr¢rd©rrrrrÚsetUpÞs zTestFTPClass.setUpcCs*|j ¡|j ¡d|_tjdddS©NTr«©rçrrär±r™r¯rrrrÚtearDownäs  zTestFTPClass.tearDowncCs$| t|ƒt|ƒ¡| ||¡dSr!)Ú assertEqualÚlen)rÚreceivedZexpectedrrrÚ check_dataëszTestFTPClass.check_datacCs| |j ¡d¡dS)Nr2)rîrçZ getwelcomerrrrÚtest_getwelcomeïszTestFTPClass.test_getwelcomecCsL| |j d¡tdƒ¡| |j d¡tdƒ¡| |j d¡tdƒ¡dS)NÚfooz pass 12345z pass *****z PASS 12345z PASS *****)rîrçZsanitizeÚreprrrrrÚ test_sanitizeòszTestFTPClass.test_sanitizecCsž| t|jjd¡| t|jjd¡| t|jjd¡| tj|jjd¡| tj|jjd¡| tj|jjd¡| tj|jjd¡| tj|jjd¡dS) Nz echo 40 0z echo 40 0z echo 40 0zecho 400zecho 499zecho 500zecho 599zecho 999)Ú assertRaisesÚ ValueErrorrçÚsendcmdråÚ error_tempÚ error_permÚ error_protorrrrÚtest_exceptions÷szTestFTPClass.test_exceptionsc CsLtjtjtjtjtjttf}|D]&}z |dƒ‚Wq tjyDYq 0q dS)Nz(exception not included in all_errors set) råÚ error_replyrùrúrûÚErrorrÆÚEOFErrorZ all_errors)rÚ exceptionsr’rrrÚtest_all_errorss  þ zTestFTPClass.test_all_errorscCsF| |jj¡|j d¡| |jj¡|j d¡| |jj¡dS)NTF)Ú assertTruerçZ passiveserverÚset_pasvÚ assertFalserrrrÚ test_set_pasv s   zTestFTPClass.test_set_pasvcCsD|j d¡|j d¡| tj|jjd¡| tj|jjd¡dS)Nzecho 200zecho 299zecho 199zecho 300)rçZvoidcmdrörårýrrrrÚ test_voidcmds  zTestFTPClass.test_voidcmdcCs|j ¡dSr!)rçÚloginrrrrÚ test_loginszTestFTPClass.test_logincCs|j d¡dS)NÚpasswd)rçZacctrrrrÚ test_acctszTestFTPClass.test_acctcCs2|j dd¡d|jj_| tj|jjdd¡dS)NÚaÚbZ200)rçÚrenamerär£r:rörårýrrrrÚ test_renames zTestFTPClass.test_renamecCs.|j d¡d|jj_| tj|jjd¡dS)NróZ199)rçÚdeleterär£r:rörårýrrrrÚ test_delete$s  zTestFTPClass.test_deletecCs|j d¡dS©Nró)rçÚsizerrrrÚ test_size)szTestFTPClass.test_sizecCs|j d¡}| |d¡dS)Nú/foo)rçÚmkdrî©rÚdirrrrÚtest_mkd,s zTestFTPClass.test_mkdcCs|j d¡dSr)rçZrmdrrrrÚtest_rmd0szTestFTPClass.test_rmdcCs|j d¡}| |d¡dS)Nrr})rçÚcwdrîrrrrÚtest_cwd3s zTestFTPClass.test_cwdcCs|j ¡}| |d¡dS)Nzpwd ok)rçÚpwdrîrrrrÚtest_pwd7s zTestFTPClass.test_pwdcCs&| |j ¡d¡| |jjd¡dSr„)rîrçÚquitrlrrrrÚ test_quit;szTestFTPClass.test_quitcCs|j ¡dSr!)rçÚabortrrrrÚ test_abort@szTestFTPClass.test_abortcs6‡‡fdd„}g‰ˆj d|¡ˆ d ˆ¡t¡dS)Ncsˆ | ˆjj¡¡dSr!©r@rrçr©rB©rðrrrÚcallbackDsz.TestFTPClass.test_retrbinary..callbackÚretrr ©rçÚ retrbinaryrñrGr<)rr%rr$rÚtest_retrbinaryCszTestFTPClass.test_retrbinarycsL‡‡fdd„}dD]4}g‰ˆjjd||dˆ d ˆ¡t|d…¡qdS)Ncsˆ | ˆjj¡¡dSr!r"r#r$rrr%Ksz3TestFTPClass.test_retrbinary_rest..callback)ré ér&©r;r r')rr%r;rr$rÚtest_retrbinary_restJs z!TestFTPClass.test_retrbinary_restcCs2g}|j d|j¡| d |¡t dd¡¡dS)Nr&r ú )rçÚ retrlinesr@rñrGr<r©rrðrrrÚtest_retrlinesRszTestFTPClass.test_retrlinescsjt t |jj¡¡}|j d|¡| |jj j t¡g‰|  d¡|jjd|‡fdd„d|  ˆ¡dS)NÚstorrcs ˆ d¡Sr!©r@©r’©ÚflagrrÚ^rDz.TestFTPClass.test_storbinary..©r%) ÚioÚBytesIOr<r%rçrÚ storbinaryrñrär£rÚseekr©rÚfrr5rÚtest_storbinaryWs zTestFTPClass.test_storbinarycCs`t dd¡ |jj¡}t |¡}dD]6}| d¡|jjd||d|  |j j j t |ƒ¡q$dS)Nr.Ú )éZ30rr2r,)r<rr%rçrr9r:r<r;rîrär£r;Ústr)rrBr>ÚrrrrÚtest_storbinary_restas   z!TestFTPClass.test_storbinary_restcsÎt dd¡ |jj¡}t |¡}|j d|¡| |j j j t¡g‰|  d¡|jjd|‡fdd„d|  ˆ¡t t dd¡¡}tjd tfd d $| t|jjd|¡Wdƒn1sÀ0YdS) Nr.r@r2rzstor foocs ˆ d¡Sr!r3r4r5rrr7qrDz-TestFTPClass.test_storlines..r8r T)Úquiet)r<rr%rçrr9r:Ú storlinesrñrär£rr<rÚStringIOrZcheck_warningsÚ BytesWarningröÚ TypeError)rrBr>rr5rÚtest_storlinesis   zTestFTPClass.test_storlinescCs.|j ¡| |j ¡t d¡dd…¡dS)Nr.rF)rçZnlstrîrrHrrrrÚ test_nlstys zTestFTPClass.test_nlstcs6g‰|j ‡fdd„¡| d ˆ¡t dd¡¡dS)Ncs ˆ |¡Sr!r3r4©Úlrrr7rDz'TestFTPClass.test_dir..r r.)rçrrîrGr‹rrrrLrÚtest_dir}szTestFTPClass.test_dircsÊtˆj ¡ƒtˆjjddƒtˆjjdddgdƒtˆj ¡ƒ}|D]N\}}ˆ |t¡ˆ |t¡ˆ |¡ˆ d|¡ˆ d|¡ˆ d|¡qJ‡fdd „‰d*‡‡fd d „ }|d ƒ|d dd|ddd|ddd|ddd|ddd|ddd|ddd|ddd|dd d|d!d"d|d#d$d|d%d&dˆd'ƒtˆj ¡ƒ\}}|D]}ˆ |  ¡¡qlˆd(ƒˆ  t tˆj ¡¡ˆd(ƒˆj ¡D]}ˆ  d)|¡q°dS)+Nú/)ÚpathrÚtype)rPÚfactsÚpermÚuniquecs|ˆjj_dSr!)rär£r"r#rrrÚset_datasz(TestFTPClass.test_mlsd..set_datacsš|dur dn|}|durdn|}|dur,dn|}|dur.test_entryz)type=type;perm=perm;unique=unique; name z*type=ty=pe;perm=perm;unique=unique; name zty=pe)rQz*type==type;perm=perm;unique=unique; name z=typez+type=t=y=pe;perm=perm;unique=unique; name zt=y=pez)type=====;perm=perm;unique=unique; name z====z*type=type;perm=perm;unique=unique; na me zna me)rVz*type=type;perm=perm;unique=unique; name zname z*type=type;perm=perm;unique=unique; name z namez,type=type;perm=perm;unique=unique; n am e zn am ez*type=type;perm=perm;unique=unique; na;me zna;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 zunexpected data %s)NNNN) r[rçrXÚassertIsInstancerBÚdictrZassertInrWÚislowerröÚ StopIterationÚfail)rZlsrVrRr[rYr’rrZrÚ test_mlsd‚sF                    zTestFTPClass.test_mlsdcCs@|j ¡"| |jjjd¡Wdƒn1s20YdS)Nrd©rçZmakeportrîrär£r9rrrrÚ test_makeport¼s  ÿzTestFTPClass.test_makeportcCs>|j ¡\}}tj||ftd}| ¡| |jjj d¡dS)NrWZpasv© rçÚmakepasvr3r_r`rrîrär£r9©rr¢rdrrrrÚ test_makepasvÂszTestFTPClass.test_makepasvcCsNd|j_|j ¡\}}| ||jjj¡tj|jj   ¡d|ft d  ¡dS)NTrrW) rçÚtrust_server_pasv_ipv4_addressrerîrär£r>r3r_rlÚ getpeernamer`r)rZbad_hostrdrrrÚ*test_makepasv_issue43285_security_disabledÉs ÿÿz7TestFTPClass.test_makepasv_issue43285_security_disabledcCsH| |jj¡|j ¡\}}| ||jjj¡tj ||ft d  ¡dS)NrW) rrçrhreZassertNotEqualrär£r>r3r_r`r)rZ trusted_hostrdrrrÚ1test_makepasv_issue43285_security_enabled_defaultÔs  ÿz>TestFTPClass.test_makepasv_issue43285_security_enabled_defaultc s؈j ¡‡fdd„}tjtd@ˆ_ˆj ˆjjˆjj¡ˆj  d¡ˆ  |ƒ¡Wdƒn1sh0Yˆ  ˆjj j d¡ˆ |ƒ¡tjtd>ˆ_ˆj ˆjjˆjj¡ˆj  d¡ˆj ¡Wdƒn1sà0Yˆ  ˆjj j d¡ˆ |ƒ¡z`tjtd>ˆ_ˆj ˆjjˆjj¡ˆj  d¡dˆjj _Wdƒn1s\0YWn8tjy }zˆ  t|ƒd¡WYd}~nd}~00ˆ d¡t d¡ˆ  ˆjj j d¡ˆ |ƒ¡dS) Nc s>ˆjjdurdSzˆj d¡Wnttfy8YdS0dS)NFÚnoopT)rçrlrørÆrÿrrrrÚis_client_connectedàs z=TestFTPClass.test_with_statement..is_client_connectedrWrlrz550 error on quitzException not raisedr©)rçrrårær`rèrär¢rdrørrîr£r9rr:rúrBr`ÚtimeÚsleep)rrmrÉrrrÚtest_with_statementÝs2   *  (  .&  z TestFTPClass.test_with_statementc Csœ|j ¡t ¡}zD|jj|jj|jjt|fd|  |jj   ¡d|¡|j ¡Wn@t y–}z(|j t jkr€| d|¡‚WYd}~n d}~00dS)N)Úsource_addressr0úcouldn't bind to port %d)rçrrÚfind_unused_portrèrär¢rdrrîrlrirÆrÇÚ EADDRINUSEÚskipTest)rrdÚerrrÚtest_source_address s ÿ z TestFTPClass.test_source_addressc Csžt ¡}t|f|j_zD|j d¡$}| | ¡d|¡Wdƒn1sL0YWn@ty˜}z(|j t j kr‚|  d|¡‚WYd}~n d}~00dS)Nr[r0rr) rrsrrçrqÚ transfercmdrîrirÆrÇrtru)rrdrlrvrrrÚ&test_source_address_passive_connections 6 z3TestFTPClass.test_source_address_passive_connectioncCs‚| t d¡d¡| t d¡d¡| t d¡d¡| t d¡d¡| tjtjd¡| t d¡d ¡| t d ¡d ¡dS) Nz257 "/foo/bar"z/foo/barz257 "/foo/bar" createdz257 ""r z257 "" createdz250 "/foo/bar"z257 "/foo/b""ar"z /foo/b"arz257 "/foo/b""ar" created)rîråÚparse257rörýrrrrÚ test_parse257"szTestFTPClass.test_parse257cCs$| tj|jjd|jjd¡dS)Nr’r–)rörårþrçrøÚmaxlinerrrrÚtest_line_too_long.sÿzTestFTPClass.test_line_too_longcCs8|j d|jjd¡g}| tj|jjd|j¡dS)NzSETLONGRETR %dr–r&)rçrør|rörårþr/r@r0rrrÚtest_retrlines_too_long2s  ÿz$TestFTPClass.test_retrlines_too_longcCs0t d|jjd¡}| tj|jjd|¡dS)Nóxr–r2)r9r:rçr|rörårþrFr=rrrÚtest_storlines_too_long8sz$TestFTPClass.test_storlines_too_longc Cs°ddg}|D]„}|j|dd| ¡|j|d| ||jj¡| ¡| ¡| ¡|j  d¡}|  |d¡Wdƒq 1s†0Yq t j t d}| t|j¡dS)Nzlatin-1rr²u/non-ascii dir ®rW)ZsubTestrírêrîrçrr)r?r1rrñrårær`r”)rÚ encodingsrZnew_dirrçrrrÚtest_encoding_param<s  , z TestFTPClass.test_encoding_paramN)-r+r,r-r”rêrírñròrõrürrrrr rrrrrrrrr!r)r-r1r?rDrJrKrNrarcrgrjrkrprwryr{r}r~r€r‚rrrrráÜsR    :  -   rázIPv6 not enabledc@s<eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd S)ÚTestIPv6EnvironmentcCsJttdftjtd|_|j ¡tjt td|_ |j   |jj |jj ¡dS)Nr)rnrrã)r•rr3rqr”rär§rårær`rçrèr¢rdrrrrrêPsþ zTestIPv6Environment.setUpcCs*|j ¡|j ¡d|_tjdddSrërìrrrrríXs  zTestIPv6Environment.tearDowncCs| |jjtj¡dSr!)rîrçrnr3rqrrrrÚtest_af_szTestIPv6Environment.test_afcCs@|j ¡"| |jjjd¡Wdƒn1s20YdS)NZeprtrbrrrrrcbs  ÿz!TestIPv6Environment.test_makeportcCs>|j ¡\}}tj||ftd}| ¡| |jjj d¡dS)NrWZepsvrdrfrrrrggsz!TestIPv6Environment.test_makepasvcs4‡fdd„}ˆj d¡|ƒˆj d¡|ƒdS)NcsP‡‡fdd„}g‰ˆj d|¡ˆ td ˆ¡ƒttƒ¡ˆ d ˆ¡t¡dS)Ncsˆ | ˆjj¡¡dSr!r"r#r$rrr%oszATestIPv6Environment.test_transfer..retr..callbackr&r )rçr(rîrïrGr<r8r)rðrr&ns z/TestIPv6Environment.test_transfer..retrTF)rçr)rr&rrrÚ test_transferms    z!TestIPv6Environment.test_transferN) r+r,r-rêrír„rcrgr…rrrrrƒMs rƒzSSL not availablec@seZdZefdd„ZdS)ÚTestTLS_FTPClassMixincCsZttdf|d|_|j ¡tjt|d|_|j |jj |jj ¡|j  ¡|j  ¡dSrâ) ràrrär§råÚFTP_TLSr`rçrèr¢rdÚauthÚprot_prérrrrês   zTestTLS_FTPClassMixin.setUpN)r+r,r-r”rêrrrrr†{sr†c@sbeZdZefdd„Zdd„Zdd„Zdd„Zd d „Zd d „Z d d„Z dd„Z e ddƒdd„ƒZ dS)ÚTestTLS_FTPClasscCsDttdf|d|_|j ¡tjtd|_|j |jj |jj ¡dS)Nrr²rW) ràrrär§rår‡r`rçrèr¢rdrérrrrês zTestTLS_FTPClass.setUpcCs*|j ¡|j ¡d|_tjdddSrërìrrrrrí•s  zTestTLS_FTPClass.tearDowncCs2| |jjtj¡|j ¡| |jjtj¡dSr!)ÚassertNotIsInstancerçrlr»rÔrˆr\rrrrÚtest_control_connectionœs z(TestTLS_FTPClass.test_control_connectioncCsR|j d¡:}| |tj¡| | d¡t |jj ¡¡Wdƒn1sL0Y| |j  ¡d¡|j  ¡|j d¡:}|  |tj¡| | d¡t |jj ¡¡Wdƒn1s¾0Y| |j  ¡d¡|j  ¡|j d¡:}| |tj¡| | d¡t |jj ¡¡Wdƒn1s20Y| |j  ¡d¡dS)Nr[rr)rçrxr‹r»rÔrîrr‹r%rZvoidrespr‰r\Zprot_c)rrlrrrÚtest_data_connection¡s(  ÿ"   ÿ"   ÿ$z%TestTLS_FTPClass.test_data_connectioncCs<| |jjtj¡|j ¡| |jjtj¡|j ¡dSr!)r‹rçrlr»rÔrr\rrrrr»s zTestTLS_FTPClass.test_logincCs|j ¡| t|jj¡dSr!)rçrˆrör÷rrrrÚtest_auth_issued_twiceÃs z'TestTLS_FTPClass.test_auth_issued_twicecCs |j ¡t tj¡}d|_tj|_|jt t j t |d|jt t j t |d|jt t j t t |dt j |t d|_|j |jj|jj¡| |jjtj¡|j ¡| |jjj|¡| |jjtj¡|j ¡|j d¡,}| |j|¡| |tj¡Wdƒn1s0YdS)NF)Úkeyfiler¿)Úcertfiler¿)rrr¿©r¿rXr[)rçrr»r¼ÚPROTOCOL_TLS_CLIENTÚcheck_hostnameZ CERT_NONEÚ verify_moderör÷rår‡r½r`rèrär¢rdr‹rlrÔrˆZassertIsr¿r\r‰rx©rÚctxrlrrrÚ test_contextÇs.   ÿ ÿ ÿ  zTestTLS_FTPClass.test_contextcCsP| t|jj¡|jjdd| |jjtj¡|j ¡| t|jjj ¡dS)NT)Zsecure) rör÷rçÚcccrr\rlr»rÔrÍrrrrÚtest_cccßs  zTestTLS_FTPClass.test_cccFzFIXME: bpo-32706c Cs’|j ¡t tj¡}| |jtj¡| |jd¡|  t ¡t j |t d|_|j |jj|jj¡| tj¡|j ¡Wdƒn1s0Y|j |jj|jj¡|j ¡| tj¡<|j d¡}Wdƒn1sê0YWdƒn1s 0Y|j ¡|j d|jj¡|j ¡|j ¡|j d|jj¡|j ¡|j d¡}Wdƒn1s„0YdS)NTr‘r[Ú localhost)rçrr»r¼r’rîr”Z CERT_REQUIREDr“Zload_verify_locationsÚCAFILErår‡r`rèrär¢rdröZCertificateErrorrˆr‰rxr•rrrÚtest_check_hostnameæs,   ( >    z$TestTLS_FTPClass.test_check_hostnameN)r+r,r-r”rêrírŒrrrŽr—r™rrœrrrrrŠ‹s rŠc@sTeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dS)Ú TestTimeoutscCs„t ¡|_t tjtj¡|_|j d¡t  |j¡|_ tj |j d|_ d|j _|j  ¡|j ¡|j ¡tjj |_|j tj_ dS)Nr+)ÚtargetT)r—r¥Úevtr3r¹rœrlrjrZ bind_portrdr˜räÚ server_threadr›r§r¨ÚclearråræÚold_portrrrrrês      zTestTimeouts.setUpcCs|jtj_|j ¡d|_dSr!)r¢rårærdr rGrrrrrís  zTestTimeouts.tearDowncCs„|j ¡|j ¡z^z|j ¡\}}Wntjy<Yn*0| d¡| tj ¡|j ¡|  ¡W|j  ¡n |j  ¡0dS)Ns 1 Hola mundo ) rlržrŸr¬rkr3rXÚsendallÚshutdownÚSHUT_WRrr´rrrräs      zTestTimeouts.serverc Csf| t ¡¡t d¡zt t¡}Wt d¡n t d¡0| |j  ¡d¡|j   ¡|  ¡dS©NrA) Ú assertIsNoner3ÚgetdefaulttimeoutÚsetdefaulttimeoutrårærrîrlÚ gettimeoutrŸr¨r©rÚftprrrÚtestTimeoutDefault1s   zTestTimeouts.testTimeoutDefaultc Csh| t ¡¡t d¡ztjtdd}Wt d¡n t d¡0| |j ¡¡|j   ¡|  ¡dS©NrArW) r§r3r¨r©rårærrlrªrŸr¨rr«rrrÚtestTimeoutNone=s  zTestTimeouts.testTimeoutNonecCsntjtdd}| |j ¡d¡|j ¡| ¡|  t ¡tjtddWdƒn1s`0YdS)NrArWr) rårærrîrlrªrŸr¨rrör÷r«rrrÚtestTimeoutValueIs   zTestTimeouts.testTimeoutValuecCs>t ¡}|jtdd| |j ¡d¡|j ¡|  ¡dSr®© rårærèrrîrlrªrŸr¨rr«rrrÚtestTimeoutConnectTs  zTestTimeouts.testTimeoutConnectcCs>tjdd}| t¡| |j ¡d¡|j ¡|  ¡dSr®r±r«rrrÚtestTimeoutDifferentOrder[s    z&TestTimeouts.testTimeoutDifferentOrdercCs@t ¡}d|_| t¡| |j ¡d¡|j  ¡|  ¡dSr¦) rårærXrèrrîrlrªrŸr¨rr«rrrÚtestTimeoutDirectAccessbs   z$TestTimeouts.testTimeoutDirectAccessN) r+r,r-rêrírär­r¯r°r²r³r´rrrrrs   rc@seZdZdd„ZdS)Ú MiscTestCasecCshd£}tj|t|ddS)N> Z print_lineZCRLFZB_CRLFrþZparse227ÚMSG_OOBZMAXLINEÚtestZFTP_PORTrzZparse229ZftpcpZparse150)Ú blacklist)rZ check__all__rå)rr¸rrrÚ test__all__lszMiscTestCase.test__all__N)r+r,r-r¹rrrrrµksrµcCsBttttttg}t ¡}ztj|ŽWtj |Žn tj |Ž0dSr!) rárrƒr†rŠrµrZthreading_setupZ run_unittestZthreading_cleanup)ZtestsÚ thread_inforrrÚ test_mainssý r»Ú__main__)5rår™r r3r9rÇÚosr—rnr»Ú ImportErrorZunittestrrr·rZ test.supportrZtest.support.socket_helperrrZLOOPBACK_TIMEOUTr`r”r<r‹rrr r r/ršr˜r•rPrGÚdirnameÚ__file__r½r›rºrÕr×ràráZ IPV6_ENABLEDrƒr†rŠrrµr»r+rrrrÚs^      "23 i (s -ze