a 5êdgÀEã@sŠddlZddlZddlZddlZddlZddlZddlZddlmZm Z ddl m Z ddl mZddl mZejZdZdZeedƒrÈddlZdZej ej e¡p¦ejd ¡Zej ej e¡pÂejd ¡Ze ed ƒZd Zd ZGdd„dejƒZ Gdd„dej!ej"ƒZ#Gdd„deƒZ$er6ddl%m&Z&Gdd„de&e ƒZ'eGdd„de$ƒƒZ(eGdd„de$ƒƒZ)Gdd„deƒZ*dd„Z+e,dkr†e+ƒdS) éN)ÚTestCaseÚ skipUnless)Úsupport)Úhashlib_helper)Ú socket_helperFÚPOP3_SSLTz keycert3.pemz pycacert.pemzSSL not supporteds1 1 2 2 3 3 4 4 5 5 . stFrom: postmaster@python.org Content-Type: text/plain MIME-Version: 1.0 Subject: Dummy line1 line2 line3 . c@sØeZdZgdgdœZdZdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„ZeZdd„ZeZdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„ZerÔd*d+„Zd,d-„Zd.d/„Zd0S)1ÚDummyPOP3Handlerzpython-testlib-pop-server)ZUIDLÚIMPLEMENTATIONFcCs8tj ||¡| d¡g|_| d¡d|_d|_dS)Nó ú(+OK dummy pop3 server ready. F)ÚasynchatÚ async_chatÚ__init__Úset_terminatorÚ in_bufferÚpushÚ tls_activeÚ tls_starting©ÚselfÚconn©rú,/usr/local/lib/python3.9/test/test_poplib.pyr2s   zDummyPOP3Handler.__init__cCs|j |¡dS©N)rÚappend©rÚdatarrrÚcollect_incoming_data:sz&DummyPOP3Handler.collect_incoming_datacCsŽd |j¡}t|dƒ}g|_| d¡d ¡}| d¡}|dkrR||dd…}nd}t|d|ƒr|t|d|ƒ}||ƒn| d |¡dS) Nóú ISO-8859-1ú réÿÿÿÿéÚZcmd_z$-ERR unrecognized POP3 command "%s".) ÚjoinrÚstrÚsplitÚlowerÚfindÚhasattrÚgetattrr)rÚlineÚcmdÚspaceÚargÚmethodrrrÚfound_terminator=s    z!DummyPOP3Handler.found_terminatorcCs‚dSrr©rrrrÚ handle_errorMszDummyPOP3Handler.handle_errorcCstj || d¡d¡dS)Nrr )r r rÚencoderrrrrPszDummyPOP3Handler.pushcCs| |¡dSr©r©rr.rrrÚcmd_echoSszDummyPOP3Handler.cmd_echocCs |dkr| d¡| d¡dS)NÚguidoz-ERR no such userz+OK password requiredr4r5rrrÚcmd_userWs zDummyPOP3Handler.cmd_usercCs |dkr| d¡| d¡dS)NÚpythonz-ERR wrong passwordz+OK 10 messagesr4r5rrrÚcmd_pass\s zDummyPOP3Handler.cmd_passcCs| d¡dS)Nz +OK 10 100r4r5rrrÚcmd_stataszDummyPOP3Handler.cmd_statcCs4|r| d||f¡n| d¡tj |t¡dS)Nz +OK %s %sz+OK)rr r Ú LIST_RESPr5rrrÚcmd_listds zDummyPOP3Handler.cmd_listcCs$| dttƒ¡tj |t¡dS)Nz +OK %s bytes)rÚlenÚ RETR_RESPr r r5rrrÚcmd_retrmszDummyPOP3Handler.cmd_retrcCs| d¡dS)Nz +OK message marked for deletion.r4r5rrrÚcmd_delesszDummyPOP3Handler.cmd_delecCs| d¡dS©Nz+OK done nothing.r4r5rrrÚcmd_noopvszDummyPOP3Handler.cmd_noopcCs| d¡dSrBr4r5rrrÚcmd_rpopyszDummyPOP3Handler.cmd_rpopcCs| d¡dSrBr4r5rrrÚcmd_apop|szDummyPOP3Handler.cmd_apopcCs| d¡| ¡dS)Nz +OK closing.)rZclose_when_doner5rrrÚcmd_quits zDummyPOP3Handler.cmd_quitcCs t|jƒ}|jstrg|d<|S©NZSTLS)ÚdictÚCAPASrÚ SUPPORTS_SSL)rZ_capasrrrÚ _get_capasƒs  zDummyPOP3Handler._get_capascCsZ| d¡| ¡rL| ¡ ¡D],\}}|g}|r:| |¡| d |¡¡q| d¡dS)Nz+OK Capability list followsr Ú.)rrKÚitemsÚextendr$)rr.ZcapÚparamsZ_lnrrrÚcmd_capa‰s  zDummyPOP3Handler.cmd_capacCs| |jrdnd¡dS)Nz+OK I know RFC6856z-ERR What is UTF8?!)rÚ enable_UTF8r5rrrÚcmd_utf8“s ÿþzDummyPOP3Handler.cmd_utf8cCsv|jdurh| d¡t ¡}| t¡|j|jdddd}| ¡|  |¡d|_d|_ g|_ |  ¡n | d¡dS)NFz+OK Begin TLS negotiationT)Z server_sideZdo_handshake_on_connectZsuppress_ragged_eofsz*-ERR Command not permitted when TLS active) rrÚsslÚ SSLContextZload_cert_chainÚCERTFILEZ wrap_socketÚsocketZ del_channelZ set_socketrrÚ_do_tls_handshake)rr.ÚcontextZtls_sockrrrÚcmd_stlsšs    ý  zDummyPOP3Handler.cmd_stlsc Csz|j ¡Wnætjy®}z†|jdtjtjfvrDWYd}~dS|jdtjkrh| ¡WYd}~Sd|jdvs„d|jdvr˜| ¡WYd}~S‚WYd}~n\d}~0t yô}z0|jdt j krà| ¡WYd}~SWYd}~nd}~00d|_ d|_ dS)NrZSSLV3_ALERT_BAD_CERTIFICATEr"ZSSLV3_ALERT_CERTIFICATE_UNKNOWNTF)rVZ do_handshakerSZSSLErrorÚargsZSSL_ERROR_WANT_READZSSL_ERROR_WANT_WRITEZ SSL_ERROR_EOFÚ handle_closeÚOSErrorÚerrnoZ ECONNABORTEDrr)rÚerrrrrrW¬s& ÿ ÿ*z"DummyPOP3Handler._do_tls_handshakecCsB|jr| ¡n.ztj |¡Wntjy<| ¡Yn0dSr)rrWr r Ú handle_readrSZ SSLEOFErrorr[r1rrrr_Ás  zDummyPOP3Handler.handle_readN)Ú__name__Ú __module__Ú __qualname__rIrQrrr0r2rr6r8r:r;r=Zcmd_uidlr@Zcmd_toprArCrDrErFrKrPrRrJrYrWr_rrrrr-s6  rc@sZeZdZeZejfdd„Zdd„Zdd„Z dd„Z d d „Z d d „Z e Z d d„Zdd„ZdS)ÚDummyPOP3ServercCsttj |¡tj |¡d|_| |tj¡|  |¡|  d¡d|_ t  ¡|_ |j ¡dd…\|_|_d|_dS)NTéFé)Ú threadingÚThreadrÚasyncoreÚ dispatcherÚdaemonZ create_socketrVÚ SOCK_STREAMÚbindÚlistenÚactiveÚLockÚ active_lockÚ getsocknameÚhostÚportÚhandler_instance)rÚaddressÚafrrrrÎs     zDummyPOP3Server.__init__cCs$t ¡|_tj |¡|j ¡dSr)rfÚEventÚ_DummyPOP3Server__flagrgÚstartÚwaitr1rrrryÚs  zDummyPOP3Server.startc Csvd|_|j ¡zR|jrTtjrT|jtjdddWdƒq1sH0YqWtjddntjdd0dS)NTgš™™™™™¹?r")ÚtimeoutÚcount)Z ignore_all)rnrxÚsetrhZ socket_maprpZloopZ close_allr1rrrÚrunàs  0zDummyPOP3Server.runcCsd|_| ¡dS©NF)rnr$r1rrrÚstopêszDummyPOP3Server.stopcCs| |¡|_dSr)Úhandlerrt)rrÚaddrrrrÚhandle_acceptedïszDummyPOP3Server.handle_acceptedcCs | ¡dSr)Úcloser1rrrÚhandle_connectòszDummyPOP3Server.handle_connectcCsdS)Nrrr1rrrÚwritableöszDummyPOP3Server.writablecCs‚dSrrr1rrrr2ùszDummyPOP3Server.handle_errorN)r`rarbrrrVÚAF_INETrryr~r€rƒr…r_r†r2rrrrrcÊs  rcc@sôeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Ze d¡dd„ƒZe d¡d d!„ƒZd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zed.d/„ƒZed0d1„ƒZed2d3„ƒZd4S)5Ú TestPOP3ClasscCs| | d¡¡dS)Nó+OK)Ú assertTrueÚ startswith©rÚresprrrÚassertOKþszTestPOP3Class.assertOKcCs8tttfƒ|_|j ¡tj|jj|jjt j d|_ dS©N©r{) rcÚHOSTÚPORTÚserverryÚpoplibÚPOP3rrrsÚ test_supportÚLOOPBACK_TIMEOUTÚclientr1rrrÚsetUps  ÿzTestPOP3Class.setUpcCs|j ¡|j ¡d|_dSr)r˜r„r“r€r1rrrÚtearDowns  zTestPOP3Class.tearDowncCs| |j ¡d¡dS)Ns(+OK dummy pop3 server ready. )Ú assertEqualr˜Z getwelcomer1rrrÚtest_getwelcome s ÿzTestPOP3Class.test_getwelcomecCs| tj|jjd¡dS)Nz echo -err)Ú assertRaisesr”Ú error_protor˜Ú _shortcmdr1rrrÚtest_exceptionsszTestPOP3Class.test_exceptionscCs*| |j d¡¡| tj|jjd¡dS)Nr7Úinvalid)rŽr˜Úuserrr”ržr1rrrÚ test_userszTestPOP3Class.test_usercCs*| |j d¡¡| tj|jjd¡dS)Nr9r¡)rŽr˜Zpass_rr”ržr¢r1rrrÚ test_pass_szTestPOP3Class.test_pass_cCs| |j ¡d¡dS)N)é éd)r›r˜Ústatr1rrrÚ test_statszTestPOP3Class.test_statcCs>| |j ¡dd…gd¢df¡| |j d¡ d¡¡dS)Nr")s1 1s2 2s3 3s4 4s5 5éÚ1sOK 1 1)r›r˜ÚlistrŠÚendswithr1rrrÚ test_lists ÿÿzTestPOP3Class.test_listcCs*dgd¢df}|j d¡}| ||¡dS)Nó +OK 116 bytes©sFrom: postmaster@python.orgsContent-Type: text/plainsMIME-Version: 1.0sSubject: Dummyrsline1sline2sline3éqÚfoo)r˜Zretrr›)rÚexpectedr±rrrÚ test_retr%s ü zTestPOP3Class.test_retrcCs&| tj|jjdtjdd¡dS)Nzecho +%sr¥Úa)rr”ržr˜rŸZ_MAXLINEr1rrrÚtest_too_long_lines.sÿz!TestPOP3Class.test_too_long_linescCs| |j d¡¡dS©Nr±)rŽr˜Zdeler1rrrÚ test_dele2szTestPOP3Class.test_delecCs| |j ¡¡dSr)rŽr˜Únoopr1rrrÚ test_noop5szTestPOP3Class.test_noopcCs| |j d¡¡dSr¶)rŽr˜Zrpopr1rrrÚ test_rpop8szTestPOP3Class.test_rpopÚmd5cCs| |j dd¡¡dS)Nr±Z dummypassword)rŽr˜Úapopr1rrrÚtest_apop_normal;szTestPOP3Class.test_apop_normalcCsVddd}t |jd|¡&| tj|jjdd¡Wdƒn1sH0YdS)Nr‰óttttg}t ¡}ztj|ŽWtj|Žn tj|Ž0dSr)rˆrêràrér–Zthreading_setupZ run_unittestZthreading_cleanup)ZtestsÚ thread_inforrrÚ test_mainsÿ rüÚ__main__)-r”rhr rVÚosr]rfZunittestrrÚtestrr–Z test.supportrrr‘r’rJr)rSÚpathr$ÚdirnameÚ__file__ÚcurdirrUrØrÝr<r?r rrirgrcrˆZtest.test_ftplibrÞrßràrérêrür`rrrrÚsJ      3  )!9