a ze@sddlZddlZddlZddlmZddlmZddl Zddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZmZddlmZddlmZddlmZmZm Z ddl!m"Z"ej#Z#ej$d krd d Z%e%e j&_%d d Z'GdddZ(Gddde(ej)Z*Gddde(ej)Z+ddZ,dZ-dZ.Gdddej)Z/Gdddej)Z0Gdddej)Z1Gdddej)Z2Gd d!d!ej)Z3d"d#d$d%Z4d&Z5d'Z6d(d)gd*gd+Z7Gd,d-d-e8Z9Gd.d/d/e j&Z:Gd0d1d1e j;ZGd6d7d7ej)Z?ed8d9d:Z@Gd;d<dd>e<ZBGd?d@d@ej)ZCeDdAkreEdS)BN) EmailMessage) body_encode)support mock_socket)hashlib_helper) socket_helper)threading_setupthreading_cleanup join_thread)MockdarwincCsdSNselfrrE/opt/bitninja-python-dojo/embedded/lib/python3.9/test/test_smtplib.py handle_expt!src Cs||zz|\}}Wntjy6YnT0d}|r|dkrtg|gg\}}}|rx||} || d}|d8}q<|W||n||0dS)Nir)listensetacceptsockettimeoutselectsendclose) evtbufservconnaddrnrwesentrrrserver&s$      r&c@steZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZdS) GeneralTestscCstt_d|_dS)N)rsmtplibrportrrrrsetUp>szGeneralTests.setUpcCs tt_dSr )rr)rrrrtearDownBszGeneralTests.tearDowncCsd}d}||t|dS)Nzabc .jkl foo ..bluezabc ..jkl foo ...blue) assertEqualr)Z quotedata)rZteststrexpectedrrr testQuoteDataGszGeneralTests.testQuoteDatacCs$td|t|j}|dS)N220 Hola mundor reply_withclientHOSTr*rrr3rrr testBasic1Ls zGeneralTests.testBasic1cCs6td|jt|jdd}||jd|dS)Nr0)z 127.0.0.1iM)source_address)rr2r3r4r*r-r7rr5rrrtestSourceAddressRs   zGeneralTests.testSourceAddresscCs*td|dt|jf}|dS)Nr0z%s:%sr1r5rrr testBasic2Zs zGeneralTests.testBasic2cCs6td|jt|jdd}||jd|dS)Nr0Ztesthost)local_hostname)rr2r3r4r*r-r:rr5rrrtestLocalHostName`s zGeneralTests.testLocalHostNamec Csztd|ttd|tdz|t|j}Wtdn td0||j d| dS)Nr0) rr2 assertIsNonegetdefaulttimeoutsetdefaulttimeoutr-r3r4r*sock gettimeoutrr5rrrtestTimeoutDefaultgs  zGeneralTests.testTimeoutDefaultc Csltd|ttdz |jt|jdd}Wtdn td0||j | dSNr0r<r) rr2r=rr>r?r3r4r*r@rArr5rrrtestTimeoutNoness  zGeneralTests.testTimeoutNonecCsJtd|t"|jt|jddWdn1s<0YdS)Nr0rrD)rr2 assertRaises ValueErrorr3r4r*rrrrtestTimeoutZero~s  zGeneralTests.testTimeoutZerocCs:td|jt|jdd}||jd|dSrC) rr2r3r4r*r-r@rArr5rrrtestTimeoutValues zGeneralTests.testTimeoutValuecCs|td|}|dt}|t|jWdn1sH0Y| t dt j }| ||dS)N220 Hello worldrz ^connect:rr2r3Zset_debuglevelrZcaptured_stderrconnectr4r*rrecompile MULTILINE assertRegexgetvaluerr3stderrr.rrrtest_debuglevels   ,zGeneralTests.test_debuglevelcCs|td|}|dt}|t|jWdn1sH0Y| t dt j }| ||dS)NrJz#^\d{2}:\d{2}:\d{2}\.\d{6} connect: rKrRrrrtest_debuglevel_2s   ,zGeneralTests.test_debuglevel_2N)__name__ __module__ __qualname__r+r,r/r6r8r9r;rBrErHrIrTrVrrrrr'<s   r'c@seZdZejZdS)SMTPGeneralTestsN)rWrXrYr)SMTPr3rrrrrZsrZcs<eZdZejZeee ddddZ fddZ Z S)LMTPGeneralTestsAF_UNIXz test requires Unix domain socketc CsTd}tdz|||j}Wtdn td0||j|dS)N!/some/local/lmtp/delivery/programrJ) rr2r3r*r?r=r@rAr)r local_hostr3rrr"testUnixDomainSocketTimeoutDefaults z3LMTPGeneralTests.testUnixDomainSocketTimeoutDefaultcsJtd}|t|j|ddWdn1s<0YdS)Nr^rrD)superrHrFrGr3)rr_ __class__rrrHs  z LMTPGeneralTests.testTimeoutZero) rWrXrYr)ZLMTPr3unittestZ skipUnlesshasattrrr`rH __classcell__rrrbrr\s r\c Cs|zzVttdrtj}ntj}d}tjr^|dkr^|dtj|rT|q^|d8}q(Wnt j ytYn0W|st d|t |n,|st d|t |0dS)Npollir{Gz?rg?)rrerasyncoreZpoll2rgZ socket_mapis_setrrrtimesleepZ close_all)rserv_evt client_evtZpoll_funr!rrrdebugging_servers0     roz&---------- MESSAGE FOLLOWS ---------- z&------------ END MESSAGE ------------ c@seZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3Zd4d5ZdS)6DebuggingServerTestsNcCst|_tj|_tjt_tj|_t |_ |j t_t |_t |_tj|_t t_tjtdfddd|_|jjdd\|_|_|j|j|jf}t jt|d|_|j|j|jdS)NrZnowhereT decode_datarUtargetargs)r thread_keyrgetfqdn real_getfqdnrsysstdout old_stdoutioStringIOoutput threadingEventrmrnsmtpd DEBUGSTREAMold_DEBUGSTREAMZDebuggingServerr4r getsocknamehostr*ThreadrothreadstartwaitclearrZ serv_argsrrrr+s&       zDebuggingServerTests.setUpcCsZ|jt_|j|jt|j|j t _ t j |jt _ |`|t|jdSr )rzrryrnrrmrr rr}r{r|rrrr doCleanupsr rxrrrrr,s    zDebuggingServerTests.tearDowncCs$|j}tjdd|tjtjBdS)Nz(.*?)^X-Peer:\s*\S+\n(.*)z\1\2)flags)rrQrMsubrODOTALL)r test_outputrrrget_output_without_xpeers  z-DebuggingServerTests.get_output_without_xpeercCs"tjt|jdtjd}|dSN localhostr:rr)r[r4r*rLOOPBACK_TIMEOUTquitrsmtprrr testBasics zDebuggingServerTests.testBasicc Cst}zZtj|j|jdtj|j|fd}||j | |j |j|f| |j d| Wn@ty}z(|jtjkr|d|WYd}~n d}~00dS)Nr)r:rr7zcouldn't bind to source port %d)rZfind_unused_portr)r[rr*rr addCleanuprr-r7r:rOSErrorerrnoZ EADDRINUSEZskipTest)rZsrc_portrr$rrrr8s   z&DebuggingServerTests.testSourceAddresscCsBtjt|jdtjd}||jd}|| || dSNrrsOK) r)r[r4r*rrrrr-nooprrrr.rrrtestNOOP,s  zDebuggingServerTests.testNOOPcCsBtjt|jdtjd}||jd}|| || dSr) r)r[r4r*rrrrr-ZrsetrrrrrtestRSET4s  zDebuggingServerTests.testRSETcCsBtjt|jdtjd}||jd}|| || dS)Nrr)rs SIZE 33554432 HELP) r)r[r4r*rrrrr-ehlorrrrrtestELHO<s  zDebuggingServerTests.testELHOcCsLtjt|jdtjd}||jd}|d| | || dS)Nrr)isEXPN not implementedZEXPN) r)r[r4r*rrrrputcmdr-ZgetreplyrrrrrtestEXPNNotImplementedEs   z+DebuggingServerTests.testEXPNNotImplementedcCsttjt|jdtjd}||j|t }| dWdn1sL0Y| dt |j |dS)Nrrzhelo X-INJECTEDprohibited newline characters)r)r[r4r*rrrrrFrGrassertInstr exceptionr)rrexcrrr&test_issue43124_putcmd_escapes_newlineOs   (z;DebuggingServerTests.test_issue43124_putcmd_escapes_newlinecCsVtjt|jdtjd}||jd}|| d||| d|| dS)Nrr)s>Cannot VRFY user, but will accept message and attempt deliverynobody@nowhere.com) r)r[r4r*rrrrr-vrfyZverifyrrrrrtestVRFYYs  zDebuggingServerTests.testVRFYcCsJtjt|jdtjd}||j|d}| ||| dS)Nrr)isDuplicate HELO/EHLO) r)r[r4r*rrrrZhelor-rrrrrtestSecondHELOcs  z#DebuggingServerTests.testSecondHELOcCs>tjt|jdtjd}||j|| d| dS)Nrrs@Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY) r)r[r4r*rrrrr-helprrrrrtestHELPns   zDebuggingServerTests.testHELPcCsd}tjt|jdtjd}||j|dd|t d| |j |j|jdt|tf}||j|dS)NA test messagerrJohnSallyrh%s%s %sr)r[r4r*rrrrsendmailrkrlrrnrrmrrflush MSG_BEGINMSG_ENDr-rQrmrmexpectrrrtestSendvs      zDebuggingServerTests.testSendcCsd}tjt|jdtjd}||j|dd|t d| |j |j|jdt|dtf}||j|dS) NsA test messagerrrrrhrascii)r)r[r4r*rrrrrrkrlrrnrrmrrrrdecoderr-rQrrrrtestSendBinarys      z#DebuggingServerTests.testSendBinarycCsd}tjt|jdtjd}||j|dd|t d| |j |j|jdt|tf}||j|dS)Nz.A test .mes.sage.rrrrrhrrrrrrtestSendNeedingDotQuotes      z,DebuggingServerTests.testSendNeedingDotQuotecCsd}tjt|jdtjd}||j|t }| dd|Wdn1sT0Y| dt |j td|tj}|d|dS) Nwazzuuup linetwoz hi X-INJECTEDr hi@me.com you@me.comz2prohibited newline characters: ehlo hi\nX-INJECTEDrhz X-INJECTED)r)r[r4r*rrrrrFrGrrrrrkrlrrrrQ assertNotIn)rrrrdebugoutrrr$test_issue43124_escape_localhostnames   ,  z9DebuggingServerTests.test_issue43124_escape_localhostnamecCsd}tjt|jdtjd}||j|dd|| t  }| dddgWdn1sd0Yt |j }|d||d |td |tj}|d ||d ||d ||d|dS)NrrrrrzX-OPTION X-INJECTED-1zX-OPTION2 X-INJECTED-2rz.X-OPTION\nX-INJECTED-1 X-OPTION2\nX-INJECTED-2rhzX-OPTIONz X-OPTION2z X-INJECTED-1z X-INJECTED-2)r)r[r4r*rrrrrrFrGmailrrrrkrlrrrrQr)rrrrmsgrrrrtest_issue43124_escape_optionss&  .        z3DebuggingServerTests.test_issue43124_escape_optionscCsd}tjt|jdtjd}||j|dd|t d| |j |j|jdt|tf}||j|tj}tdtj}|||dS) Nrrrz<>rrhrz ^sender: <>$)r)r[r4r*rrrrrrkrlrrnrrmrrrrrr-rQrrrMrNrOrP)rrrrrsenderrrrtestSendNullSenders        z'DebuggingServerTests.testSendNullSendercCstjjd}tjt|jdtj d}| |j |j |dddt d||j|j|j|}|d=d t|tf}|||dS) NrrrrrZ from_addrZto_addrsrhX-Peerr)emailmimetextMIMETextr)r[r4r*rrrr send_messagerkrlrrnrrmrrrrr as_stringrr-)rrrrrrrrtestSendMessages      z$DebuggingServerTests.testSendMessagec Cstjjd}d|d<d|d<d|d<d|d <tjt|jd tj d }| |j | |t d |||d d|j|j|j|}|d =|d =dt|tf}|||tj}tdtj }|!||dD]$}td"|tj }|!||qdS)Nr foo@bar.comFromrTo Sally, FredCC?John Root , "Dinsdale" Bccrrrhrr^sender: foo@bar.com$)rrZFredzroot@localhostzwarped@silly.walks.com^recips: .*'{}'.*$)#rrrrr)r[r4r*rrrrrrkrlrr-rnrrmrrrrrrrrrrQrMrNrOrPformat rrrrrrrr to_addrrrrtestSendMessageWithAddressess:           z1DebuggingServerTests.testSendMessageWithAddressesc Cstjjd}d|d<d|d<tjt|jdtj d}| |j | |t d||j|j|j|}|d =d t|tf}|||tj}td tj }|!||d D]$}td "|tj }|!||qdS)NrrrJohn, DinsdalerrrrhrrrrDinsdaler#rrrrr)r[r4r*rrrrrrkrlrrnrrmrrrrrrrr-rrrQrMrNrOrPrrrrr testSendMessageWithSomeAddresses$s2           z5DebuggingServerTests.testSendMessageWithSomeAddressesc Cstjjd}d|d<d|d<tjt|jdtj d}| |j |j |dd d t d ||j|j|j|}|d =d t|tf}|||tj}tdtj }|!||dD]$}td"|tj }|#||qtdtj } |!|| dS)Nrrrrrrrzjoe@example.comzfoo@example.netrrhrrz^sender: joe@example.com$rrz^recips: .*'foo@example.net'.*$)$rrrrr)r[r4r*rrrrrrkrlrrnrrmrrrrrrrr-rrrQrMrNrOrPrZassertNotRegex) rrrrrrrr rZreciprrr%testSendMessageWithSpecifiedAddressesAs6          z:DebuggingServerTests.testSendMessageWithSpecifiedAddressesc Cstjjd}d|d<d|d<d|d<tjt|jdtj d }| |j | |t d ||j|j|j|}|d =d t|tf}|||tj}td tj }|!||dD]$}td"|tj }|!||qdS)NrzBernard, Biancarz#the_rescuers@Rescue-Aid-Society.comZSenderrrrrrhrrz-^sender: the_rescuers@Rescue-Aid-Society.com$rrrrrrrtestSendMessageWithMultipleFrom`s4           z4DebuggingServerTests.testSendMessageWithMultipleFromc Cs6tjjd}d|d<d|d<d|d<d|d <d |d <d |d <d|d<d|d<tjt|jdtj d}| |j | |t d||j|j|j|d =|d=|}|d=dt|tf}|||tj}tdtj }|!||dD]&}td"|tj }|!||q dS)NrrrrrrrrrThu, 1 Jan 1970 17:42:00 +0000 Resent-Dateholy@grail.net Resent-From&Martha , Jeff Resent-Todoe@losthope.net Resent-Bccrrrhrrz^sender: holy@grail.net$)zmy_mom@great.cooker.comZJeffrrrrrrrtestSendMessageResent~sB           z*DebuggingServerTests.testSendMessageResentcCstjjd}d|d<d|d<d|d<d|d <d |d <d |d <d|d<d|d<d|d <d |d<d|d <tjt|jdtj d}| |j | t ||Wdn1s0Y| dS)NrrrrrrrrrrrrrrrrrzThu, 2 Jan 1970 17:42:00 +0000rr)rrrrr)r[r4r*rrrrrFrGrrrrrrr#testSendMessageMultipleResentRaisess&   (z8DebuggingServerTests.testSendMessageMultipleResentRaises)rWrXrYmaxDiffr+r,rrr8rrrrrrrrrrrrrrrrrrrrrrrrrrps6     $%rpc@s$eZdZddZddZddZdS)NonConnectingTestscCs.t}|tj|j|tj|jddS)Nztest msg)r)r[rFSMTPServerDisconnectedrrrrrrtestNotConnecteds z#NonConnectingTests.testNotConnectedcCs&|ttjdd|ttjddS)NrZboguszlocalhost:bogus)rFrr)r[rrrrtestNonnumericPorts   z%NonConnectingTests.testNonnumericPortcCs8t}||jWdn1s*0YdSr )r)r[r=r@rrrrtestSockAttributeExistss z*NonConnectingTests.testSockAttributeExistsN)rWrXrYrrrrrrrrs rc@s$eZdZddZddZddZdS)DefaultArgumentsTestscCsDt|_d|jd<t|_tdd|j_tt|j_|j_dS)NPáolo r)ZOK)Z return_value) rrr)r[rr rhas_extnrrrrrr+s   zDefaultArgumentsTests.setUpcCs`d}|j|j|j|j||jjjddd|||jjjddd|dS)N)SMTPUTF8 BODY=8BITMIMErrrrrr-rZcall_args_list)rexpected_mail_optionsrrrrsz%DefaultArgumentsTests.testSendMessagecCsNdg}d}|j|jdd|||dg||jjjddd|dS)NSTARTTLS)r rrrrr )r mail_optionsr rrrtestSendMessageWithMailOptionssz4DefaultArgumentsTests.testSendMessageWithMailOptionsN)rWrXrYr+rr rrrrrs rc@s$eZdZddZddZddZdS)BadHELOServerTestscCs4tt_tdtj|_t|_ |j t_d|_ dS)Ns199 no hello for you!r() rr)rr2r{r|r}r~rrr*rrrrr+s   zBadHELOServerTests.setUpcCstt_|jt_dSr )rr)r}r{r|rrrrr,szBadHELOServerTests.tearDowncCs|tjtjt|jdddSNrr)rFr)ZSMTPConnectErrorr[r4r*rrrrtestFailingHELOs  z"BadHELOServerTests.testFailingHELON)rWrXrYr+r,rrrrrrsrc@s:eZdZddejddZddZddZd d Zd S) TooLongLineTestss250 OK.rU cCst|_tj|_t|_|jt_t |_ t t j t j |_|jdt|j|_|j |j|jf}tjt|d|_|j|j |j dS)Nru)rrxr{r|r}r~rrrrrrAF_INET SOCK_STREAMr@ settimeoutrZ bind_portr*respdatarr&rrrr)rZservargsrrrr+s     zTooLongLineTests.setUpcCs6|j|jt_t|j|`|t|j dSr ) rrr}r{r|r rrr rxrrrrr,s   zTooLongLineTests.tearDowncCs|tjtjt|jdddSr)rFr)SMTPResponseExceptionr[r4r*rrrrtestLineTooLongs  z TooLongLineTests.testLineTooLongN) rWrXrYr)Z_MAXLINErr+r,rrrrrrsrzJohn AzSally BzRuth C)Mr.A@somewhere.comMs.B@xn--fo-fka.comMrs.C@somewhereesle.com)rZ somepasswordz=rz+SimSMTPChannel.__init__..)join_extrafeaturesrar __init__)rZextra_featuresrwkwrbrrr(;s zSimSMTPChannel.__init__c s|j|jkr|j|j}tdt|tjdg|_z| |WnBt y}z*|j |_| d|j |jfWYd}~n d}~00dStdS)NzData:)file%s %s) smtp_stateAUTHZ _emptystringr&Zreceived_linesprintreprrr auth_objectrCOMMANDpush smtp_code smtp_errorrafound_terminator)rliner$rbrrr5As ,zSimSMTPChannel.found_terminatorcCs|js|ddS|jr$d|jvr2|ddS|jdurJ|ddS|}t|dvrl|ddSd|dd d }zt |||_ Wn$t y|d |YdS0|j |_| t|d kr|d nddS)Nz503 Error: send EHLO firstr-z(500 Error: command "AUTH" not recognizedz3503 Bad sequence of commands: already authenticated)rrUz/501 Syntax: AUTH [initial-response]z_auth_%sr-_zQ504 Command parameter not implemented: unsupported authentication mechanism {!r}rUr) seen_greetingr2 extended_smtpr'authenticated_usersplitlenlowerreplacegetattrr0AttributeErrorrr-r,)rargrwZauth_object_namerrr smtp_AUTHOs2      zSimSMTPChannel.smtp_AUTHcCs,|r||_|dn |d|j|_dS)Nz235 Authentication Succeededz&535 Authentication credentials invalid)r;r2r1r,)ruserZvalidrrr_authenticatedhs   zSimSMTPChannel._authenticatedcCst|ddS)Nrutf-8)base64Z decodebytesencoder)rstringrrr_decode_base64pszSimSMTPChannel._decode_base64c Cs|dur|dnn||}z|d^}}}Wn8tyl}z |d||WYd}~dSd}~00|||tdkdS)Nz334 =535 Splitting response {!r} into user and password failed: {}r)r2rJr<rGrrEsim_auth)rrBlogpassr8rDpasswordr$rrr _auth_plainss  zSimSMTPChannel._auth_plaincCs^|dur|dnFt|ds6|||_|dn$||}||j|tdk|`dS)Nz334 VXNlcm5hbWU6_auth_login_userz334 UGFzc3dvcmQ6r)r2rerJrQrErM)rrBrOrrr _auth_logins     zSimSMTPChannel._auth_logincCs|ddS)Nz334 QnVHZ1liVWdHeQ==)r2rrBrrr _auth_buggyszSimSMTPChannel._auth_buggyc Cs|dur|dtn||}z|\}}Wn8tyl}z |d||WYd}~dSd}~00ttd d|t dd }| |||kdS)Nz334 {}rLFrrmd5) r2rsim_cram_md5_challengerJr<rGhmacZHMACrMrH hexdigestrE)rrBrNrDZ hashed_passr$Zvalid_hashed_passrrr_auth_cram_md5s   zSimSMTPChannel._auth_cram_md5cCs,d}||jd}||||_d|_dS)NzH250-testhost 250-EXPN 250-SIZE 20000000 250-STARTTLS 250-DELIVERBY z250 HELPT)r'r2r9r:)rrBresprrr smtp_EHLOs  zSimSMTPChannel.smtp_EHLOcCs8|tvr&|dt|t|fn|d|dS)N 250 %s %sz550 No such user: %s) sim_usersr2r) quoteaddrrSrrr smtp_VRFYszSimSMTPChannel.smtp_VRFYcCs|}|tvrtt|}t|D]P\}}t|}|t|dkrZ|dt||fq |dt||fq n |ddS)Nrz 250-%s %sr\z550 No access for you!)r> sim_lists enumerater)r^r=r2r])rrBZ list_nameZ user_listr!Z user_emailZ quoted_addrrrr smtp_EXPNs zSimSMTPChannel.smtp_EXPNcs4|jdurtt||n||j|dSr ) quit_responserar  smtp_QUITr2close_when_donerSrbrrrds  zSimSMTPChannel.smtp_QUITcs6|jdurt|n||j|jr2|dSr ) mail_responsera smtp_MAILr2 disconnectrerSrbrrrgs   zSimSMTPChannel.smtp_MAILcsB|jdurt|dS|jd7_||j|jddSNr) rcpt_responsera smtp_RCPT rcpt_countr2rSrbrrrks   zSimSMTPChannel.smtp_RCPTcs|jd7_t|dSri) rset_countra smtp_RSETrSrbrrrnszSimSMTPChannel.smtp_RSETcs(|jdurt|n ||jdSr ) data_responsera smtp_DATAr2rSrbrrrps zSimSMTPChannel.smtp_DATAcCsdSr rrrrr handle_errorszSimSMTPChannel.handle_error)N)N)N)N)rWrXrYrcrfrjrorlrmrhr-r;r(r5rCrErJrPrRrTrYr[r_rbrdrgrkrnrprqrfrrrbrr /s6          r c@s8eZdZeZddZddZddZddZd d Z d S) SimSMTPServercOs*g|_i|_tjj|g|Ri|dSr )_extra_features _addressesr SMTPServerr(rrwr)rrrr(szSimSMTPServer.__init__cCs|j|j||||jd|_dS)Nrs) channel_classrs _decode_data _SMTPchannelrrr rrrhandle_accepteds zSimSMTPServer.handle_acceptedcCs||jd<||jd<dS)Nfromtos)rt)rpeermailfromrcpttosdatarrrprocess_messages zSimSMTPServer.process_messagecCs|j|dSr )rsappend)rZfeaturerrr add_featureszSimSMTPServer.add_featurecCsdSr rrrrrrqszSimSMTPServer.handle_errorN) rWrXrYr rwr(r{rrrqrrrrrrs rrc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ edddZedddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3Zd4S)5 SMTPSimTestscCst|_tj|_tjt_t|_t|_ t t dfddd|_ |j j d|_|j |j|j f}tjt|d|_|j|j|jdSNrrqTrsrru)rrxrryrzrrrrmrnrrr4rrr*rrorrrrrrrrr+s    zSMTPSimTests.setUpcCs@|jt_|j|jt|j|`| t |j dSr rzrryrnrrmrr rrr rxrrrrr,s   zSMTPSimTests.tearDowncCs"tjt|jdtjd}|dSrrrrrrr!s zSMTPSimTests.testBasiccCstjt|jdtjd}||jidddddd}|||j||D]}| | |qN| | d| dS)Nrrr"Z20000000)expnsizeZstarttlsZ deliverbyrzunsupported-feature) r)r[r4r*rrr-esmtp_featuresr assertTruer assertFalser)rrZexpected_featureskrrrtestEHLO's  zSMTPSimTests.testEHLOcCstjt|jdtjd}tD]6\}}dtd|t |fdf}| | ||qd}dd| df}| | ||| dS) Nrrrr+rr&zNo such user: %s)r)r[r4r*rrr]itemsbytesr^r-rrHr)rrZ addr_specnameexpected_knownuexpected_unknownrrrr=s  zSMTPSimTests.testVRFYc Cstjt|jdtjd}tD]X\}}g}|D] }|dt |t |fq.dt d |df}| |||qd}d}| ||||dS) Nrrr+r rzPSU-Members-List)rsNo access for you!)r)r[r4r*rrr`rrr]r^rr&r-rr) rrZlistnamemembersZusersrrrrrrrtestEXPNLs zSMTPSimTests.testEXPNcCsN|jdtjt|jdtjd}|t dt d}| |d| dS)N AUTH PLAINrrrrsAuthentication Succeeded rrr)r[r4r*rrloginrMr-rrrrZrrrtestAUTH_PLAIN\s   zSMTPSimTests.testAUTH_PLAINcCsN|jdtjt|jdtjd}|t dt d}| |d| dS)N AUTH LOGINrrrrrrrrrrtestAUTH_LOGINds   zSMTPSimTests.testAUTH_LOGINcCsz|jdtjt|jdtjdD}t\|_ |_ | d|j d|j dd}||dWdn1sl0YdS) Nrrrtest_auth_loginLOGINTZinitial_response_okrrrr)r[r4r*rrrMrDrOrauthZ auth_loginr-rrrr"testAUTH_LOGIN_initial_response_okls    z/SMTPSimTests.testAUTH_LOGIN_initial_response_okcCsz|jdtjt|jdtjdD}t\|_ |_ | d|j d|j dd}||dWdn1sl0YdS) NrrrrrFrrrrrrr%testAUTH_LOGIN_initial_response_notokus    z2SMTPSimTests.testAUTH_LOGIN_initial_response_notokcsjdd fdd }tjtjdtjd}zdt\|_ |_ | dd} tj | }|jd|d d Wdn1s0YW|n |0dS) Nz AUTH BUGGYcsd|dS)Ns BuGgYbUgGyrK)r-)Z challengerrr auth_buggys z/SMTPSimTests.testAUTH_BUGGY..auth_buggyrrZtest_auth_buggyz&^Server AUTH mechanism infinite loop.*ZBUGGYFr)N)rrr)r[r4r*rrrMrDrOrZassertRaisesRegexZ SMTPExceptionrr)rrrexpectcmrrrtestAUTH_BUGGY~s   0zSMTPSimTests.testAUTH_BUGGYrUcCsN|jdtjt|jdtjd}|t dt d}| |d| dS)Nz AUTH CRAM-MD5rrrrrrrrrrtestAUTH_CRAM_MD5s   zSMTPSimTests.testAUTH_CRAM_MD5cCsN|jdtjt|jdtjd}|t dt d}| |d| dS)NzAUTH BOGUS PLAIN LOGIN CRAM-MD5rrrrrrrrrrtestAUTH_multiples   zSMTPSimTests.testAUTH_multiplec Csddh}z tWnty&Yn 0|d|D]}|jd|q6|D]}|j|dtj t |j dt j d}|dtd td |_|_d |d d }||t||}||d|WdqR1s0YqRdS)NZPLAINrzCRAM-MD5zAUTH {}) mechanismrrZfoorrZauth_r7r8r)hashlibrUrGaddrrrZsubTestr)r[r4r*rrrrMrDrOr>r?rr@r-r)rZ supportedrrmethodrZrrrtest_auth_functions(      zSMTPSimTests.test_auth_functioncCstjt|jdtjd}|\}}||d|d|j | | d|j | t|j| d|j | |d|j | dS)Nrrrr)r)r[r4r*rrrr-rrrrrLZehlo_or_helo_if_neededrrcodemessagerrrtest_quit_resets_greetings   z&SMTPSimTests.test_quit_resets_greetingcCstt|j(}|\}}||dWdn1s<0Y|tj|jdtt|j}| Wdn1s0Y|tj|jddS)Nrsfoo) r)r[r4r*rr-rFrrrrrrrtest_with_statements *&z SMTPSimTests.test_with_statementc Cs|tjP}tt|j"}|d|jj_ Wdn1sD0YWdn1sb0Y| |j j d| |j j ddS)Nz421 QUIT FAILEDs QUIT FAILED)rFr)rr[r4r*rrryrcr-rr3r4)rerrorrrrr test_with_statement_QUIT_failures Fz-SMTPSimTests.test_with_statement_QUIT_failurecCs|tjt|jdtjd}|d|jj_ d|jj_ | tj | dddWdn1sb0Y||jdS)Nrrz451 Requested action abortedTrr test message)r)r[r4r*rrrrryrfrhrFSMTPSenderRefusedrr=r@rrrrtest__rest_from_mail_cmds   ,z%SMTPSimTests.test__rest_from_mail_cmdcCstjt|jdtjd}|d|jj_ | tj | dddWdn1sX0Y| |j||jjjddS)Nrrz421 closing connectionrrrr)r)r[r4r*rrrrryrfrFrrr=r@r-rmrrrrtest_421_from_mail_cmds  , z#SMTPSimTests.test_421_from_mail_cmdcCstjt|jdtjd}|ddg|jj_ | tj "}| dgddWdn1s`0Y| |j||jjjd||jjdd d idS) Nrrz 250 accepted 421 closingr)rFrankZGeorgerrr)rsclosing)r)r[r4r*rrrrryrjrFZSMTPRecipientsRefusedrr=r@r-rmassertDictEqualrrw)rrr"rrrtest_421_from_rcpt_cmds 0 z#SMTPSimTests.test_421_from_rcpt_cmdcCsGdddt}||j_tjt|jdtjd}| | tj  | ddgdWdn1sh0Y| |j||jjjddS) NcseZdZfddZZS)z=SMTPSimTests.test_421_from_data_cmd..MySimSMTPChannelcs&|j|jkr|dn tdS)Nr)r,ZDATAr2rar5rrbrrr5s  zNSMTPSimTests.test_421_from_data_cmd..MySimSMTPChannel.found_terminator)rWrXrYr5rfrrrbrMySimSMTPChannelsrrrz John@foo.orgz Sally@foo.orgrr)r rrwr)r[r4r*rrrrFZ SMTPDataErrorrr=r@r-ryrl)rrrrrrtest_421_from_data_cmds . z#SMTPSimTests.test_421_from_data_cmdcCstjt|jdtjd}||j|| |j | | d|j tj|jdddddgd |j tj|jdddgd dS) Nrrsmtputf8rrr"rrr options)r)r[r4r*rrrrrr does_esmtprrrFSMTPNotSupportedErrorrrrrrr4test_smtputf8_NotSupportedError_if_no_server_supports"    zASMTPSimTests.test_smtputf8_NotSupportedError_if_no_server_supportcCsJtjt|jdtjd}||j|t |j ddd|t |j ddS)NrrZAliceuBöbr"uÄlice) r)r[r4r*rrrrrFUnicodeEncodeErrorrrrrrr"test_send_unicode_without_SMTPUTF8s z/SMTPSimTests.test_send_unicode_without_SMTPUTF8cCszt}d|d<d|d<d|d<tjt|jdtjd}||j| tj | |Wdn1sl0YdS) NrrrrNudge nudge, wink, wink ὠ9Subjectrr) rr)r[r4r*rrrrrFrr)rrrrrr9test_send_message_error_on_non_ascii_addrs_if_no_smtputf8's zFSMTPSimTests.test_send_message_error_on_non_ascii_addrs_if_no_smtputf8cCstjt|jdtjd}||jt}t j d|d<t j d|d<| | |i||jjdd||jjd d gdS) Nrr)uMichaëlmichael@example.comr)uRenérene@example.comrr|rr}r)r)r[r4r*rrrrrrZutilsZ formataddrrrr-rrt)rrrrrr1test_name_field_not_included_in_envelop_addresses5s z>SMTPSimTests.test_name_field_not_included_in_envelop_addressesN)rWrXrYr+r,rrrrrrrrrrZrequires_hashdigestrrrrrrrrrrrrrrrrrrrs6          rc@s&eZdZddZddZdddZdS) SimSMTPUTF8ServercOs(ddg|_tjj|g|Ri|dS)NrZ8BITMIME)rsrrur(rvrrrr(Gs zSimSMTPUTF8Server.__init__cCs"|j|j||||j|jd|_dS)Nrtenable_SMTPUTF8)rwrsrxrryrzrrrr{Ns  z!SimSMTPUTF8Server.handle_acceptedNcCs(||_||_||_||_||_||_dSr )Z last_peer last_mailfrom last_rcpttos last_messagelast_mail_optionslast_rcpt_options)rr~rrrr Z rcpt_optionsrrrrUs z!SimSMTPUTF8Server.process_message)NN)rWrXrYr(r{rrrrrrEs rc@s@eZdZdZddZddZddZdd Zd d Zd d Z dS)SMTPUTF8SimTestsNcCst|_tj|_tjt_t|_t|_ t t dfdddd|_ |j j d|_|j |j|j f}tjt|d|_|j|j|jdS)NrrqFTrrru)rrxrryrzrrrrmrnrr4rrr*rrorrrrrrrrr+cs     zSMTPUTF8SimTests.setUpcCs@|jt_|j|jt|j|`| t |j dSr rrrrrr,ws   zSMTPUTF8SimTests.tearDowncCsJtjt|jdtjd}||j|| |j | | ddS)Nrrr) r)r[r4r*rrrrrrrrrrrr$test_test_server_supports_extensionss  z5SMTPUTF8SimTests.test_test_server_supports_extensionscCsdd}tjt|jdtjd}||j|j dd|ddgd | |j j d| |j j dg| |j j||d|j j|d|j j| |j jgdS) N$¡a test message containing unicode!rFrruJőhnuSállyrrr)rHr)r[r4r*rrrrrr-rrrrrrrrrrr,test_send_unicode_with_SMTPUTF8_via_sendmails   z=SMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_sendmailcCsdd}tjt|jdtjd}||j| | |j dddgdd | | d d | | |d | |jjd| |jjd g| |jj||d|jj|d|jj| |jjgdS) NrrFrruJőrrrruJános)rHr)r[r4r*rrrrrr-rZrcptrrrrrrrrrrrr1test_send_unicode_with_SMTPUTF8_via_low_level_APIs&  zBSMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_low_level_APIcCst}d|d<d|d<d|d<|dtd}tjt|jd tj d }| |j | | |i| |jjd | |jjdg| |jj||d |jj|d |jj| |jjgdS)Nrrrrrru1oh là là, know what I mean, know what I mean? u< From: Páolo To: Dinsdale Subject: Nudge nudge, wink, wink ὠ9 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit MIME-Version: 1.0 oh là là, know what I mean, know what I mean? rru főo@bar.comrr)rZ set_contenttextwrapdedentr)r[r4r*rrrrr-rrrrrrrrr)rrr.rrrr2test_send_message_uses_smtputf8_if_addrs_non_asciis$   zCSMTPUTF8SimTests.test_send_message_uses_smtputf8_if_addrs_non_ascii) rWrXrYrr+r,rrrrrrrrr_s  rspsudoesnotexistr")Zeolc@seZdZddZdS)!SimSMTPAUTHInitialResponseChannelcCsL|}|ddkr>t|dkr>|dtkr>|ddS|ddS)NrplainrUrz235 Okz571 Bad authentication)r<r>r=EXPECTED_RESPONSEr2)rrBrwrrrrCs   z+SimSMTPAUTHInitialResponseChannel.smtp_AUTHN)rWrXrYrCrrrrrsrc@seZdZeZdS) SimSMTPAUTHInitialResponseServerN)rWrXrYrrwrrrrrsrc@s,eZdZddZddZddZddZd S) SMTPAUTHInitialResponseSimTestscCst|_tj|_tjt_t|_t|_ t t dfddd|_ |j j d|_|j |j|j f}tjt|d|_|j|j|jdSr)rrxrryrzrrrrmrnrr4rrr*rrorrrrrrrrr+s     z%SMTPAUTHInitialResponseSimTests.setUpcCs@|jt_|j|jt|j|`| t |j dSr rrrrrr,s   z(SMTPAUTHInitialResponseSimTests.tearDowncCs:|jdtjt|jdtjd}|dd| dS)Nrrrpsu doesnotexist) rrr)r[r4r*rrrrrrrr%testAUTH_PLAIN_initial_response_logins    zESMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_logincCsX|jdtjt|jdtjd}d|_d|_ | d|j \}}| | |ddS)Nrrrrrrr)rrr)r[r4r*rrrDrOrZ auth_plainrr-)rrrresponserrr$testAUTH_PLAIN_initial_response_auth s  zDSMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_authN)rWrXrYr+r,rrrrrrrs r__main__)FrirGZemail.mime.textrZ email.messagerZemail.base64mimerZ encode_base64Z email.utilsrrWrrr)r~rMr{rkrrrrrdtestrrZ test.supportrrrr r Z unittest.mockr r4platformrZ SMTPChannelr&r'ZTestCaserZr\rorrrprrrrr]rMrVr` Exceptionrr rurrrrrrrrrrWmainrrrrs      cX 9Eo 1