a 5êdg•¦ã@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z z ddl Z Wne yndZ Yn0ddl m Z mZddlmZddlmZddlmZmZejZdZdd d Zd Zd Zd ZGd d„dejƒZGdd„dejƒZGdd„dej ej!ƒ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-eej.dƒGd d!„d!e ƒƒZ/ee d"ƒGd#d$„d$e-ƒƒZ0ee d"ƒGd%d&„d&e ƒƒZ1Gd'd(„d(e ƒZ2Gd)d*„d*e ƒZ3d+d,„Z4e5d-kre4ƒdS).zTest script for ftplib module.é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.|jr J‚t ¡|_tj |¡|j ¡dSr!)rŸ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.runcCs|js J‚d|_| ¡dS)NF)rŸrGrrrrÚstop&s zDummyFTPServer.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.pemcs|eZdZdZdZdZdd„Zdd„Z‡fdd„Z‡fd d „Z ‡fd d „Z ‡fd d„Z ‡fdd„Z dd„Z ‡fdd„Z‡ZS)Ú SSLConnectionz3An asyncore.dispatcher subclass supporting TLS/SSL.FcCsBt ¡}| 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-Ú__doc__r¾rÌrÀrÊrÎrÏrÐrÑrr*rr.rrr&rrº>s     rºc@seZdZdZdd„ZdS)ÚDummyTLS_DTPHandlerz.A DummyDTPHandler subclass supporting TLS/SSL.cCs"t |||¡|jjr| ¡dSr!)r r rÚsecure_data_channelrÀrrrrr ªszDummyTLS_DTPHandler.__init__N)r+r,r-rÕr rrrrrÖ§srÖc@s@eZdZdZeZefdd„Zdd„Zdd„Z dd „Z d d „Z d S) ÚDummyTLS_FTPHandlerz.A DummyFTPHandler subclass supporting TLS/SSL.cCs tj|||dd|_d|_dS)Nr²F)r/r r×rËr?rrrr µszDummyTLS_FTPHandler.__init__cCs| d¡| ¡dS)zSet up secure control channel.z234 AUTH TLS successfulN)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)z»Negotiate size of buffer for secure data transfer. For TLS/SSL the only valid value for the parameter is '0'. Any other value is accepted but ignored. z200 PBSZ=0 successful.NrsrÙrrrÚcmd_pbszÄszDummyTLS_FTPHandler.cmd_pbszcCsJ| ¡}|dkr"| d¡d|_n$|dkr<| d¡d|_n | d¡dS) zSetup un/secure data channel.ÚCz200 Protection set to ClearFÚPz200 Protection set to PrivateTz(502 Unrecognized PROT type (use C or P).N)Úupperrr×)rrMrPrrrÚcmd_protËs  zDummyTLS_FTPHandler.cmd_protN) r+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Úfrr6rÚtest_storbinaryWs zTestFTPClass.test_storbinarycCs`t dd¡ |jj¡}t |¡}dD]6}| d¡|jjd||d|  |j j j t |ƒ¡q$dS)Nr/Ú )éZ30rr3r-)r<rr%rèrr:r;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/rAr3rzstor foocs ˆ d¡Sr!r4r5r6rrr8qrDz-TestFTPClass.test_storlines..r9r T)Úquiet)r<rr%rèrr:r;Ú storlinesròrår£rr=rÚStringIOrZcheck_warningsÚ BytesWarningr÷Ú TypeError)rrBr?rr6rÚ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!r4r5©Úlrrr8rDz'TestFTPClass.test_dir..r r/)rèrrïrGr‹rrrrMrÚ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)rQÚ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)rRz*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)rWz*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èrYÚassertIsInstancerCÚdictrZassertInrXÚislowerr÷Ú StopIterationÚfail)rZlsrWrSr\rZr’rr[rÚ 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)z/Test the opt-in to the old vulnerable behavior.TrrWN) rèÚtrust_server_pasv_ipv4_addressrfrï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èrirfZassertNotEqualrå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ÆrrrrrÚis_client_connectedàs z=TestFTPClass.test_with_statement..is_client_connectedrWrmrz550 error on quitzException not raisedr©)rèrrærçr`rérår¢rdrùrrïr£r9rr:rûrCraÚtimeÚsleep)rrnrÉ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[r0rs) rrtrrèrrÚ transfercmdrïrirÆrÇrurv)rrdrlrwrrrÚ&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ÿr0r@r1rrrÚtest_retrlines_too_long2s  ÿz$TestFTPClass.test_retrlines_too_longcCs0t d|jjd¡}| tj|jjd|¡dS)Nóxr–r3)r:r;rèr}r÷rærÿrGr>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@r2rrò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ýrrrr r rrrrrrrr r"r*r.r2r@rErKrLrOrbrdrhrkrlrqrxrzr|r~rrrƒ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)NZeprtrcrrrrrdbs  ÿz!TestIPv6Environment.test_makeportcCs>|j ¡\}}tj||ftd}| ¡| |jjj d¡dS)NrWZepsvrergrrrrhgsz!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<r9r)rñrr'ns z/TestIPv6Environment.test_transfer..retrTF)rèr)rr'rrrÚ test_transferms    z!TestIPv6Environment.test_transferN) r+r,r-rërîr…rdrhr†rrrrr„Ms r„zSSL not availablec@seZdZdZefdd„ZdS)ÚTestTLS_FTPClassMixinzfRepeat TestFTPClass tests starting the TLS layer for both control and data connections first. cCsZttdf|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”rërrrrr‡{sr‡c@sfeZdZdZefdd„Zdd„Zdd„Zdd „Zd d „Z d d „Z dd„Z dd„Z e ddƒdd„ƒZdS)ÚTestTLS_FTPClasszSpecific TLS_FTP class tests.cCsDttdf|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èryrŒ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¿)r‘rr¿©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Šry©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Šryr–rrrÚtest_check_hostnameæs,   ( >    z$TestTLS_FTPClass.test_check_hostnameN)r+r,r-rÕr”rërîrrŽr rr˜ršrrrrrrr‹‹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©NrB) Ú 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©NrBrW) r¨r3r©rªrærçrrlr«r r¨rr¬rrrÚtestTimeoutNone=s  zTestTimeouts.testTimeoutNonecCsntjtdd}| |j ¡d¡|j ¡| ¡|  t ¡tjtddWdƒn1s`0YdS)NrBrWr) 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µrrrrržs   ržc@seZdZdd„ZdS)Ú MiscTestCasecCshd£}tj|t|ddS)N> ZCRLFÚtestr{ZFTP_PORTrÿZparse150Zparse227Z print_lineZB_CRLFZMAXLINEZparse229ÚMSG_OOBZftpcp)Ú 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âržr„r‡r‹r¶rZthreading_setupZ run_unittestZthreading_cleanup)ZtestsÚ thread_inforrrÚ test_mainssý r¼Ú__main__)6rÕrær™r r3r:rÇÚosr—ror»Ú ImportErrorZunittestrrr·rZ test.supportrZtest.support.socket_helperrrZLOOPBACK_TIMEOUTr`r”r<r‹rrr r r/ršr˜r•rQrGÚdirnameÚ__file__r½rœrºrÖrØrárâZ IPV6_ENABLEDr„r‡r‹ržr¶r¼r+rrrrÚs`      "23 i (s -ze