Your IP : 216.73.216.213


Current Path : /opt/alt/python38/lib64/python3.8/test/__pycache__/
Upload File :
Current File : //opt/alt/python38/lib64/python3.8/test/__pycache__/test_smtplib.cpython-38.opt-2.pyc

U

i�f��@spddlZddlZddlZddlmZddlmZddl	Zddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZmZddlmZddlmZmZmZddlm Z ddl!m"Z"ej#d	k�rd
d�Z$e$e
j%_$dd
�Z&Gdd�dej'�Z(dd�Z)dZ*dZ+Gdd�dej'�Z,Gdd�dej'�Z-Gdd�dej'�Z.Gdd�dej'�Z/Gdd�dej'�Z0ddd d!�Z1d"Z2d#Z3d$d%gd&gd'�Z4Gd(d)�d)e5�Z6Gd*d+�d+e
j%�Z7Gd,d-�d-e
j8�Z9Gd.d/�d/ej'�Z:Gd0d1�d1e9�Z;Gd2d3�d3ej'�Z<ed4d5d6�Z=Gd7d8�d8e7�Z>Gd9d:�d:e9�Z?Gd;d<�d<ej'�Z@eAd=k�rle�B�dS)>�N)�EmailMessage)�body_encode)�support�mock_socket)�HOST)�threading_setup�threading_cleanup�join_thread)�requires_hashdigest)�Mock�darwincCsdS�N���selfrr�6/opt/alt/python38/lib64/python3.8/test/test_smtplib.py�handle_expt src
Cs�|��|��z~z|��\}}Wntjk
r8YnTXd}|r�|dkr�t�g|gg�\}}}|rz|�|�}	||	d�}|d8}q>|��W5|��|��XdS)Ni�r�)Zlisten�set�closeZaccept�socket�timeout�select�send)
�evtZbuf�serv�conn�addr�n�r�w�eZsentrrr�server%s 

r"c@sleZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�ZdS)�GeneralTestscCstt_d|_dS)N�)r�smtplibr�portrrrr�setUp=szGeneralTests.setUpcCs
tt_dSr
)rr%rrrr�tearDownAszGeneralTests.tearDowncCsd}d}|�|t�|��dS)Nzabc
.jkl
foo
..bluezabc
..jkl
foo
...blue)�assertEqualr%Z	quotedata)rZteststr�expectedrrr�
testQuoteDataFszGeneralTests.testQuoteDatacCs$t�d�t�t|j�}|��dS)N�220 Hola mundo�r�
reply_withr%�SMTPrr&r�r�smtprrr�
testBasic1Ks
zGeneralTests.testBasic1cCs6t�d�tjt|jdd�}|�|jd�|��dS)Nr,)z	127.0.0.1i�M)�source_address)	rr.r%r/rr&r)r3rr0rrr�testSourceAddressQs

�zGeneralTests.testSourceAddresscCs*t�d�t�dt|jf�}|��dS)Nr,z%s:%sr-r0rrr�
testBasic2Ys
zGeneralTests.testBasic2cCs6t�d�tjt|jdd�}|�|jd�|��dS)Nr,Ztesthost)�local_hostname)	rr.r%r/rr&r)r6rr0rrr�testLocalHostName_s
zGeneralTests.testLocalHostNamec	Cspt�d�|�t���t�d�|�t��d�zt�t|j	�}W5t�d�X|�|j
��d�|��dS)Nr,�)
rr.�assertIsNone�getdefaulttimeout�setdefaulttimeoutr)r%r/rr&�sock�
gettimeoutrr0rrr�testTimeoutDefaultfs

zGeneralTests.testTimeoutDefaultc	Csbt�d�|�t���t�d�ztjt|j	dd�}W5t�d�X|�|j
���|��dS�Nr,r8)r)
rr.r9rr:r;r%r/rr&r<r=rr0rrr�testTimeoutNoners

zGeneralTests.testTimeoutNonecCs:t�d�tjt|jdd�}|�|j��d�|�	�dSr?)
rr.r%r/rr&r)r<r=rr0rrr�testTimeoutValue}s
zGeneralTests.testTimeoutValuec	Csht�d�t��}|�d�t���}|�t|j	�W5QRX|�
�t�dtj
�}|�|��|�dS)N�220 Hello worldrz	^connect:�rr.r%r/Zset_debuglevelrZcaptured_stderr�connectrr&r�re�compile�	MULTILINE�assertRegex�getvalue�rr1�stderrr*rrr�test_debuglevel�s


zGeneralTests.test_debuglevelc	Csht�d�t��}|�d�t���}|�t|j	�W5QRX|�
�t�dtj
�}|�|��|�dS)NrB�z#^\d{2}:\d{2}:\d{2}\.\d{6} connect: rCrJrrr�test_debuglevel_2�s


�zGeneralTests.test_debuglevel_2N)�__name__�
__module__�__qualname__r'r(r+r2r4r5r7r>r@rArLrNrrrrr#;s
r#c	Cs�|��zrzVttd�rtj	}ntj
}d}tjr^|dkr^|dtj�|��rT|��q^|d8}q(Wntj
k
rvYnXW5|��s�t�d�|��t��|��XdS)Ng�?�polli�r�{�G�z�?r)rZis_set�time�sleepr�asyncoreZ	close_all�hasattrrZpoll2rRZ
socket_maprr)r�serv_evt�
client_evtZpoll_funrrrr�debugging_server�s&


rZz&---------- MESSAGE FOLLOWS ----------
z&------------ END MESSAGE ------------
c@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�ZdS)6�DebuggingServerTestsNcCs�t�|_tj|_tjt_tj|_t	�
�|_|jt_t�
�|_t�
�|_tj|_t	�
�t_tjtdfddd�|_|jj��dd�\|_|_|j|j|jf}tjt|d�|_|j��|j��|j��dS)Nr�Znowhere���T��decode_datarM��target�args)r�
thread_keyr�getfqdn�real_getfqdnr�sys�stdout�
old_stdout�io�StringIO�output�	threading�EventrXrY�smtpd�DEBUGSTREAM�old_DEBUGSTREAMZDebuggingServerrr�getsockname�hostr&�ThreadrZ�thread�start�wait�clear�rZ	serv_argsrrrr'�s&



�

zDebuggingServerTests.setUpcCsZ|jt_|j��|j��t|j�|j	t
_tj
��|jt_
|`|��t|j�dSr
)rerrdrYrrXrvr	rtrhrfrgrnrorrp�
doCleanupsrrcrrrrr(�s



zDebuggingServerTests.tearDowncCs$|j��}tjdd|tjtjBd�S)Nz(.*?)^X-Peer:\s*\S+\n(.*)z\1\2)�flags)rkrIrE�subrG�DOTALL)r�test_outputrrr�get_output_without_xpeer�s


�z-DebuggingServerTests.get_output_without_xpeercCs tjt|jddd�}|��dS)N�	localhost��r6r�r%r/rr&�quitr0rrr�	testBasic�szDebuggingServerTests.testBasicc
Cs�t��}zXtj|j|jdd|j|fd�}|�|j�|�|j	|j|f�|�|j
d�|��Wn>tk
r�}z |j
t
jkr�|�d|��W5d}~XYnXdS)Nrr�)r6rr3zcouldn't bind to source port %d)rZfind_unused_portr%r/rrr&�
addCleanuprr)r3r6r��OSError�errnoZ
EADDRINUSEZskipTest)rZsrc_portr1r!rrrr4�s�z&DebuggingServerTests.testSourceAddresscCs@tjt|jddd�}|�|j�d}|�|��|�|��dS�Nrr�r���sOK)	r%r/rr&r�rr)�noopr��rr1r*rrr�testNOOP
s
zDebuggingServerTests.testNOOPcCs@tjt|jddd�}|�|j�d}|�|��|�|��dSr�)	r%r/rr&r�rr)Zrsetr�r�rrr�testRSETs
zDebuggingServerTests.testRSETcCs@tjt|jddd�}|�|j�d}|�|��|�|��dS)Nrr�r�)r�s
SIZE 33554432
HELP)	r%r/rr&r�rr)�ehlor�r�rrr�testELHOs
zDebuggingServerTests.testELHOcCsJtjt|jddd�}|�|j�d}|�d�|�|��|�|�	�dS)Nrr�r�)i�sEXPN not implementedZEXPN)
r%r/rr&r�r�putcmdr)Zgetreplyr�r�rrr�testEXPNNotImplemented s
z+DebuggingServerTests.testEXPNNotImplementedc	Cs^tjt|jddd�}|�|j�|�t��}|�d�W5QRX|�	dt
|j��|��dS)Nr�
r�zhelo
X-INJECTED�prohibited newline characters)
r%r/rr&r�r�assertRaises�
ValueErrorr��assertIn�str�	exceptionr�)rr1�excrrr�&test_issue43124_putcmd_escapes_newline)s�z;DebuggingServerTests.test_issue43124_putcmd_escapes_newlinecCsTtjt|jddd�}|�|j�d}|�|�d�|�|�|�d�|�|�	�dS)Nrr�r�)�s>Cannot VRFY user, but will accept message and attempt delivery�nobody@nowhere.com)
r%r/rr&r�rr)�vrfyZverifyr�r�rrr�testVRFY3szDebuggingServerTests.testVRFYcCsHtjt|jddd�}|�|j�|��d}|�|��|�|��dS)Nrr�r�)i�sDuplicate HELO/EHLO)	r%r/rr&r�rZhelor)r�r�rrr�testSecondHELO<sz#DebuggingServerTests.testSecondHELOcCs<tjt|jddd�}|�|j�|�|��d�|��dS)Nrr�r�s@Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY)	r%r/rr&r�rr)�helpr�r0rrr�testHELPFszDebuggingServerTests.testHELPcCs�d}tjt|jddd�}|�|j�|�dd|�t�d�|�	�|j
��|j�
�|j��dt|tf}|�|j��|�dS)	N�A test messagerr�r��John�SallyrS�%s%s
%s�r%r/rr&r�r�sendmailrTrUr�rYrrXrvrk�flush�	MSG_BEGIN�MSG_ENDr)rI�r�mr1�mexpectrrr�testSendMs



zDebuggingServerTests.testSendcCs�d}tjt|jddd�}|�|j�|�dd|�t�d�|�	�|j
��|j�
�|j��dt|�d	�tf}|�|j��|�dS)
NsA test messagerr�r�r�r�rSr��ascii)r%r/rr&r�rr�rTrUr�rYrrXrvrkr�r��decoder�r)rIr�rrr�testSendBinary_s



z#DebuggingServerTests.testSendBinarycCs�d}tjt|jddd�}|�|j�|�dd|�t�d�|�	�|j
��|j�
�|j��dt|tf}|�|j��|�dS)	Nz.A test
.mes.sage.rr�r�r�r�rSr�r�r�rrr�testSendNeedingDotQuotens



z,DebuggingServerTests.testSendNeedingDotQuotec	Cs�d}tjt|jddd�}|�|j�|�t��}|�dd|�W5QRX|�	dt
|j��t�
d�|��tj��}|�d	|�dS)
N�wazzuuup
linetwoz
hi
X-INJECTEDr�r��	hi@me.com�
you@me.comz2prohibited newline characters: ehlo hi\nX-INJECTEDrSz
X-INJECTED)r%r/rr&r�rr�r�r�r�r�r�rTrUr�rnrorI�assertNotIn)rr�r1r��debugoutrrr�$test_issue43124_escape_localhostname~s��

z9DebuggingServerTests.test_issue43124_escape_localhostnamec	Cs�d}tjt|jddd�}|�|j�|�dd|�|�t��}|�	dddg�W5QRXt
|j�}|�d	|�|�d
|�t
�d�|��tj��}|�d|�|�d
|�|�d|�|�d|�dS)Nr�rr�r�r�r�zX-OPTION
X-INJECTED-1zX-OPTION2
X-INJECTED-2r�z.X-OPTION\nX-INJECTED-1 X-OPTION2\nX-INJECTED-2rSzX-OPTIONz	X-OPTION2zX-INJECTED-1zX-INJECTED-2)r%r/rr&r�rr�r�r��mailr�r�r�rTrUr�rnrorIr�)rr�r1r��msgr�rrr�test_issue43124_escape_options�s*�


z3DebuggingServerTests.test_issue43124_escape_optionscCs�d}tjt|jddd�}|�|j�|�dd|�t�d�|�	�|j
��|j�
�|j��dt|tf}|�|j��|�tj��}t�d	tj�}|�||�dS)
Nr�rr�r�z<>r�rSr�z^sender: <>$)r%r/rr&r�rr�rTrUr�rYrrXrvrkr�r�r�r)rIrnrorErFrGrH)rr�r1r�r��senderrrr�testSendNullSender�s




z'DebuggingServerTests.testSendNullSendercCs�tjj�d�}tjt|jddd�}|�|j	�|j
|ddd�t�d�|�
�|j��|j��|j��|��}|d	=d
t|��tf}|�||�dS)Nr�rr�r�r�r��Z	from_addrZto_addrsrS�X-Peerr�)�email�mime�text�MIMETextr%r/rr&r�r�send_messagerTrUr�rYrrXrvrkr�r~r��	as_stringr�r))rr�r1r}r�rrr�testSendMessage�s



z$DebuggingServerTests.testSendMessagec	Cstjj�d�}d|d<d|d<d|d<d|d	<tjt|jd
dd�}|�|j	�|�
|�t�d
�|�
�|�|d	d�|j��|j��|j��|��}|d=|d	=dt|��tf}|�||�tj��}t�dtj�}|�||�dD]$}t�d� |�tj�}|�||�q�dS)Nr��foo@bar.com�Fromr��To�Sally, Fred�CC�?John Root <root@localhost>, "Dinsdale" <warped@silly.walks.com>�Bccrr�r�rSr�r��^sender: foo@bar.com$)r�r�ZFredzroot@localhostzwarped@silly.walks.com�^recips: .*'{}'.*$)!r�r�r�r�r%r/rr&r�rr�rTrUr�r)rYrrXrvrkr�r~r�r�r�rnrorIrErFrGrH�format�	rr�r1r}r�r�r�r�to_addrrrr�testSendMessageWithAddresses�s6





�z1DebuggingServerTests.testSendMessageWithAddressesc	Cs�tjj�d�}d|d<d|d<tjt|jddd�}|�|j	�|�
|�t�d	�|�
�|j��|j��|j��|��}|d
=dt|��tf}|�||�tj��}t�dtj�}|�||�d
D]$}t�d� |�tj�}|�||�q�dS)Nr�r�r��John, Dinsdaler�rr�r�rSr�r�r��r��Dinsdaler��!r�r�r�r�r%r/rr&r�rr�rTrUr�rYrrXrvrkr�r~r�r�r�r)rnrorIrErFrGrHr�r�rrr� testSendMessageWithSomeAddresses�s.





�z5DebuggingServerTests.testSendMessageWithSomeAddressesc
Cstjj�d�}d|d<d|d<tjt|jddd�}|�|j	�|j
|d	d
d�t�d�|�
�|j��|j��|j��|��}|d
=dt|��tf}|�||�tj��}t�dtj�}|�||�dD]$}t�d� |�tj�}|�!||�q�t�dtj�}	|�||	�dS)Nr�r�r�r�r�rr�r�zjoe@example.comzfoo@example.netr�rSr�r�z^sender: joe@example.com$r�r�z^recips: .*'foo@example.net'.*$)"r�r�r�r�r%r/rr&r�rr�rTrUr�rYrrXrvrkr�r~r�r�r�r)rnrorIrErFrGrHr�ZassertNotRegex)
rr�r1r}r�r�r�rr�Zreciprrr�%testSendMessageWithSpecifiedAddressess2




�z:DebuggingServerTests.testSendMessageWithSpecifiedAddressesc	Cs�tjj�d�}d|d<d|d<d|d<tjt|jdd	d
�}|�|j	�|�
|�t�d�|�
�|j��|j��|j��|��}|d=d
t|��tf}|�||�tj��}t�dtj�}|�||�dD]$}t�d� |�tj�}|�||�q�dS)Nr�zBernard, Biancar�z#the_rescuers@Rescue-Aid-Society.comZSenderr�r�rr�r�rSr�r�z-^sender: the_rescuers@Rescue-Aid-Society.com$r�r�r�r�rrr�testSendMessageWithMultipleFrom/s0





�z4DebuggingServerTests.testSendMessageWithMultipleFromc	Cs4tjj�d�}d|d<d|d<d|d<d|d	<d
|d<d|d
<d|d<d|d<tjt|jddd�}|�|j	�|�
|�t�d�|�
�|j��|j��|j��|d	=|d=|��}|d=dt|��tf}|�||�tj��}t�dtj�}|�||�dD]&}t�d� |�tj�}|�||��qdS)Nr�r�r�r�r�r�r�r�r��Thu, 1 Jan 1970 17:42:00 +0000�Resent-Date�holy@grail.net�Resent-From�&Martha <my_mom@great.cooker.com>, Jeff�	Resent-To�doe@losthope.net�
Resent-Bccrr�r�rSr�r�z^sender: holy@grail.net$)zmy_mom@great.cooker.comZJeffr�r�r�r�rrr�testSendMessageResentLs>





�z*DebuggingServerTests.testSendMessageResentc	Cs�tjj�d�}d|d<d|d<d|d<d|d	<d
|d<d|d
<d|d<d|d<d|d<d|d<d|d
<tjt|jddd�}|�|j	�|�
t��|�|�W5QRX|�	�dS)Nr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�zThu, 2 Jan 1970 17:42:00 +0000rr�r�)
r�r�r�r�r%r/rr&r�rr�r�r��rr�r1rrr�#testSendMessageMultipleResentRaisesps"z8DebuggingServerTests.testSendMessageMultipleResentRaises)rOrPrQ�maxDiffr'r(r~r�r4r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr[�s6	
	
#$r[c@s$eZdZdd�Zdd�Zdd�ZdS)�NonConnectingTestscCs.t��}|�tj|j�|�tj|jd�dS)Nztest msg)r%r/r��SMTPServerDisconnectedr�rr0rrr�testNotConnected�s�z#NonConnectingTests.testNotConnectedcCs&|�ttjdd�|�ttjd�dS)NrZboguszlocalhost:bogus)r�r�r%r/rrrr�testNonnumericPort�s
�
�z%NonConnectingTests.testNonnumericPortc	Cs$t���}|�|j�W5QRXdSr
)r%r/r9r<r0rrr�testSockAttributeExists�s
z*NonConnectingTests.testSockAttributeExistsN)rOrPrQr�r�r�rrrrr��s
r�c@s$eZdZdd�Zdd�Zdd�ZdS)�DefaultArgumentsTestscCsDt�|_d|jd<t��|_tdd�|j_t�t�|j_|j_dS)N�Páolo <főo@bar.com>r�)��ZOK)Zreturn_value)	rr�r%r/r1rr��has_extnr�rrrrr'�s


zDefaultArgumentsTests.setUpcCs`d}|j�|j�|j�|j�|�|jjjddd|�|�|jjjddd|�dS)N)�SMTPUTF8�
BODY=8BITMIMErr�r�r1r�r�r)r�Zcall_args_list)r�expected_mail_optionsrrrr��s��z%DefaultArgumentsTests.testSendMessagecCsNdg}d}|j�|jdd|�|�|dg�|�|jjjddd|�dS)N�STARTTLS)r�r�r�rr�r�)r�mail_optionsr�rrr�testSendMessageWithMailOptions�s�z4DefaultArgumentsTests.testSendMessageWithMailOptionsN)rOrPrQr'r�r�rrrrr��s	r�c@s$eZdZdd�Zdd�Zdd�ZdS)�BadHELOServerTestscCs4tt_t�d�tj|_t��|_	|j	t_d|_
dS)Ns199 no hello for you!r$)rr%rr.rfrgrhrirjrkr&rrrrr'�s

zBadHELOServerTests.setUpcCstt_|jt_dSr
)rr%rhrfrgrrrrr(�szBadHELOServerTests.tearDowncCs|�tjtjt|jdd�dS�Nrr�)r�r%ZSMTPConnectErrorr/rr&rrrr�testFailingHELO�s�z"BadHELOServerTests.testFailingHELON)rOrPrQr'r(r�rrrrr��sr�c@s:eZdZddejddZdd�Zdd�Zd	d
�ZdS)�TooLongLineTestss250 OK�.rM�
cCs�t�|_tj|_t��|_|jt_t�	�|_
t�tjtj
�|_|j�d�t�|j�|_|j
|j|jf}tjt|d�|_|j��|j
��|j
��dS)N�r`)rrcrfrgrhrirjrkrlrmrrZAF_INETZSOCK_STREAMr<Z
settimeoutrZ	bind_portr&�respdatarsr"rtrurvrw)rZservargsrrrr'�s



zTooLongLineTests.setUpcCs6|j��|jt_t|j�|`|��t|j	�dSr
)
rrvrhrfrgr	rtryrrcrrrrr(�s

zTooLongLineTests.tearDowncCs|�tjtjt|jdd�dSr�)r�r%�SMTPResponseExceptionr/rr&rrrr�testLineTooLong�s�z TooLongLineTests.testLineTooLongN)	rOrPrQr%Z_MAXLINEr�r'r(rrrrrr��sr�zJohn AzSally BzRuth C)�Mr.A@somewhere.com�Ms.B@xn--fo-fka.com�Mrs.C@somewhereesle.com)rZsomepasswordz<PENCeUxFREJoU0NnbmhNWitOMjNGNndAZWx3b29kLmlubm9zb2Z0LmNvbT4=rrr)zlist-1zlist-2c@seZdZdS)�ResponseExceptionN)rOrPrQrrrrr�srcs�eZdZdZdZdZdZdZdZdZ	dZ
dZ�fdd�Z�fdd�Z
dd	�Zd
d�Zdd
�Zd(dd�Zd)dd�Zd*dd�Zd+dd�Zdd�Zdd�Zdd�Z�fdd�Z�fdd�Z�fd d!�Z�fd"d#�Z�fd$d%�Zd&d'�Z�ZS),�SimSMTPChannelNr�ccs,d�dd�|D��|_tt|�j||�dS)N�cSsg|]}d�|��qS)z	250-{0}
)r�)�.0�xrrr�
<listcomp>	sz+SimSMTPChannel.__init__.<locals>.<listcomp>)�join�_extrafeatures�superr�__init__)rZextra_featuresrb�kw��	__class__rrrs�zSimSMTPChannel.__init__c
s�|j|jkr�|j�|j�}tdt|�tjd�g|_z|�	|�Wn@t
k
r�}z"|j|_|�d|j
|jf�W5d}~XYnXdSt���dS)NzData:)�file�%s %s)�
smtp_state�AUTHZ_emptystringrZreceived_lines�print�reprrnro�auth_objectr�COMMAND�push�	smtp_code�
smtp_errorr�found_terminator)r�liner!rrrr
s(zSimSMTPChannel.found_terminatorcCs�|js|�d�dS|jr$d|jkr2|�d�dS|jdk	rJ|�d�dS|��}t|�dkrl|�d�dSd|d���d	d
�}zt	||�|_
Wn&tk
r�|�d�|��YdSX|j
|_|�
t|�dkr�|d
nd�dS)Nz503 Error: send EHLO firstrz(500 Error: command "AUTH" not recognizedz3503 Bad sequence of commands: already authenticated)rrMz/501 Syntax: AUTH <mechanism> [initial-response]z_auth_%sr�-�_zQ504 Command parameter not implemented: unsupported  authentication mechanism {!r}rMr)�
seen_greetingr�
extended_smtpr
�authenticated_user�split�len�lower�replace�getattrr�AttributeErrorr�rr)r�argrbZauth_object_namerrr�	smtp_AUTHs2


�
�zSimSMTPChannel.smtp_AUTHcCs,|r||_|�d�n
|�d�|j|_dS)Nz235 Authentication Succeededz&535 Authentication credentials invalid)r$rrr)r�userZvalidrrr�_authenticated4s

zSimSMTPChannel._authenticatedcCst�|�d���d�S)Nr��utf-8)�base64Zdecodebytes�encoder�)r�stringrrr�_decode_base64<szSimSMTPChannel._decode_base64c
Cs�|dkr|�d�np|�|�}z|�d��^}}}Wn:tk
rn}z|�d�||��WY�dSd}~XYnX|�||tdk�dS)Nz334 ��=535 Splitting response {!r} into user and password failed: {}r)rr3r%r�r�r.�sim_auth)rr+�logpassr!r-�passwordr!rrr�_auth_plain?s
�zSimSMTPChannel._auth_plaincCs^|dkr|�d�nFt|d�s6|�|�|_|�d�n$|�|�}|�|j|tdk�|`dS)Nz334 VXNlcm5hbWU6�_auth_login_userz334 UGFzc3dvcmQ6r)rrWr3r:r.r6)rr+r8rrr�_auth_loginLs

zSimSMTPChannel._auth_logincCs|�d�dS)Nz334 QnVHZ1liVWdHeQ==)r�rr+rrr�_auth_buggyYszSimSMTPChannel._auth_buggyc
Cs�|dkr|�d�t��n�|�|�}z|��\}}Wn:tk
rn}z|�d�||��WY�dSd}~XYnXt�td�	d�|�t��	d�d��
�}|�|||k�dS)Nz334 {}r5Frr��md5)rr��sim_cram_md5_challenger3r%r��hmacZHMACr6r1Z	hexdigestr.)rr+r7r-Zhashed_passr!Zvalid_hashed_passrrr�_auth_cram_md5^s"
��zSimSMTPChannel._auth_cram_md5cCs,d}||jd}|�|�||_d|_dS)NzH250-testhost
250-EXPN
250-SIZE 20000000
250-STARTTLS
250-DELIVERBY
z250 HELPT)r
rr"r#)rr+�resprrr�	smtp_EHLOps

zSimSMTPChannel.smtp_EHLOcCs8|tkr&|�dt|t�|�f�n|�d|�dS)N�	250 %s %sz550 No such user: %s)�	sim_usersrr%�	quoteaddrr<rrr�	smtp_VRFY{szSimSMTPChannel.smtp_VRFYcCs�|��}|tkrtt|}t|�D]P\}}t�|�}|t|�dkrZ|�dt||f�q |�dt||f�q n
|�d�dS)Nrz	250-%s %srDz550 No access for you!)r'�	sim_lists�	enumerater%rFr&rrE)rr+Z	list_nameZ	user_listrZ
user_emailZquoted_addrrrr�	smtp_EXPN�s
zSimSMTPChannel.smtp_EXPNcs4|jdkrtt|��|�n|�|j�|��dSr
)�
quit_responserr�	smtp_QUITr�close_when_doner<rrrrL�s
zSimSMTPChannel.smtp_QUITcs6|jdkrt��|�n|�|j�|jr2|��dSr
)�
mail_responser�	smtp_MAILr�
disconnectrMr<rrrrO�s

zSimSMTPChannel.smtp_MAILcsB|jdkrt��|�dS|jd7_|�|j|jd�dS�Nr)�
rcpt_responser�	smtp_RCPT�
rcpt_countrr<rrrrS�s

zSimSMTPChannel.smtp_RCPTcs|jd7_t��|�dSrQ)�
rset_countr�	smtp_RSETr<rrrrV�szSimSMTPChannel.smtp_RSETcs(|jdkrt��|�n|�|j�dSr
)�
data_responser�	smtp_DATArr<rrrrX�s
zSimSMTPChannel.smtp_DATAcCs�dSr
rrrrr�handle_error�szSimSMTPChannel.handle_error)N)N)N)N)rOrPrQrKrNrRrWrTrUrPrr$rrr,r.r3r9r;r=rArCrGrJrLrOrSrVrXrY�
__classcell__rrrrr�s6




rc@s8eZdZeZdd�Zdd�Zdd�Zdd�Zd	d
�Z	dS)�
SimSMTPServercOs$g|_i|_tjj|f|�|�dSr
)�_extra_features�
_addressesrn�
SMTPServerr�rrbrrrrr�szSimSMTPServer.__init__cCs|j|j||||jd�|_dS)Nr^)�
channel_classr\�_decode_data�_SMTPchannel�rrrrrr�handle_accepted�s�zSimSMTPServer.handle_acceptedcCs||jd<||jd<dS)N�from�tos)r])r�peer�mailfrom�rcpttos�datarrr�process_message�s
zSimSMTPServer.process_messagecCs|j�|�dSr
)r\�append)rZfeaturerrr�add_feature�szSimSMTPServer.add_featurecCs�dSr
rrrrrrY�szSimSMTPServer.handle_errorN)
rOrPrQrr`rrdrkrmrYrrrrr[�sr[c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
ed�dd��Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4S)5�SMTPSimTestscCs�t�|_tj|_tjt_t��|_t��|_	t
tdfddd�|_|jj�
�d|_|j|j|j	f}tjt|d�|_|j��|j��|j��dS�Nrr\Tr^rr`)rrcrrdrerrlrmrXrYr[rrrqr&rsrZrtrurvrwrxrrrr'�s



zSMTPSimTests.setUpcCs@|jt_|j��|j��t|j�|`|�	�t
|j�dSr
�rerrdrYrrXrvr	rtryrrcrrrrr(�s


zSMTPSimTests.tearDowncCs tjt|jddd�}|��dS)Nrr�r�r�r0rrrr��szSMTPSimTests.testBasiccCs~tjt|jddd�}|�|ji�dddddd�}|��|�|j|�|D]}|�|�|��qL|�	|�d��|�
�dS)Nrr�r�rZ20000000)�expn�sizeZstarttlsZ	deliverbyr�zunsupported-feature)r%r/rr&r)�esmtp_featuresr��
assertTruer��assertFalser�)rr1Zexpected_features�krrr�testEHLO�s�zSMTPSimTests.testEHLOcCs�tjt|jddd�}t��D]6\}}dtd|t�|�fd�f}|�|�	|�|�qd}dd	|�
d�f}|�|�	|�|�|��dS)
Nrr�r�r�rr�r��&zNo such user: %s)r%r/rr&rE�items�bytesrFr)r�r1r�)rr1Z	addr_spec�name�expected_known�u�expected_unknownrrrr�s��zSMTPSimTests.testVRFYc		Cs�tjt|jddd�}t��D]X\}}g}|D] }|�dt|t�|�f�q,dt	d�
|�d�f}|�|�|�|�qd}d	}|�|�|�|�|�
�dS)
Nrr�r�rr��
r�zPSU-Members-List)rxsNo access for you!)r%r/rr&rHryrlrErFrzrr)rqr�)	rr1Zlistname�membersZusersr�r|r}r~rrr�testEXPNszSMTPSimTests.testEXPNcCsL|j�d�tjt|jddd�}|�tdtd�}|�|d�|�	�dS)N�
AUTH PLAINrr�r�rr���sAuthentication Succeeded�
rrmr%r/rr&�loginr6r)r�rr1rBrrr�testAUTH_PLAIN$s
zSMTPSimTests.testAUTH_PLAINcCsL|j�d�tjt|jddd�}|�tdtd�}|�|d�|�	�dS)N�
AUTH LOGINrr�r�rrr�r�r�rrr�testAUTH_LOGIN+s
zSMTPSimTests.testAUTH_LOGINc	Csd|j�d�tjt|jddd��:}t\|_|_|�	d�|j
d|jdd�}|�|d	�W5QRXdS)
Nr�rr�r��test_auth_login�LOGINT�Zinitial_response_okr��
rrmr%r/rr&r6r-r8r��authZ
auth_loginr)r�rrr�"testAUTH_LOGIN_initial_response_ok2s
z/SMTPSimTests.testAUTH_LOGIN_initial_response_okc	Csd|j�d�tjt|jddd��:}t\|_|_|�	d�|j
d|jdd�}|�|d	�W5QRXdS)
Nr�rr�r�r�r�Fr�r�r�r�rrr�%testAUTH_LOGIN_initial_response_notok:s
z2SMTPSimTests.testAUTH_LOGIN_initial_response_notokc	s��j�d�d�fdd�	}tjt�jddd�}zHt\|_|_	|�
d�d}��tj|��}|j
d	|d
d�W5QRXW5|��XdS)
Nz
AUTH BUGGYcs��d|�dS)Ns
BuGgYbUgGyr4)r))Z	challengerrr�
auth_buggyEsz/SMTPSimTests.testAUTH_BUGGY.<locals>.auth_buggyrr�r�Ztest_auth_buggyz&^Server AUTH mechanism infinite loop.*ZBUGGYFr�)N)rrmr%r/rr&rr6r-r8r�ZassertRaisesRegexZ
SMTPExceptionr�)rr�r1Zexpect�cmrrr�testAUTH_BUGGYBs
zSMTPSimTests.testAUTH_BUGGYr>cCsL|j�d�tjt|jddd�}|�tdtd�}|�|d�|�	�dS)Nz
AUTH CRAM-MD5rr�r�rrr�r�r�rrr�testAUTH_CRAM_MD5Ss
zSMTPSimTests.testAUTH_CRAM_MD5cCsL|j�d�tjt|jddd�}|�tdtd�}|�|d�|�	�dS)NzAUTH BOGUS PLAIN LOGIN CRAM-MD5rr�r�rrr�r�r�rrr�testAUTH_multiple[s
zSMTPSimTests.testAUTH_multiplec
Cs�ddh}zt��Wntk
r(YnX|�d�|D]}|j�d�|��q8|D]�}|j|d��ttj	t
|jddd�}|�d	�t
d
t
d|_|_d|���d
d�}|�|t||��}|�|d�|��W5QRXqTdS)NZPLAINr�zCRAM-MD5zAUTH {})�	mechanismrr�r�ZfoorrZauth_r r!r�)�hashlibr>r��addrrmr�ZsubTestr%r/rr&r�r6r-r8r'r(r�r)r)r)rZ	supportedr�r1�methodrBrrr�test_auth_functioncs(

�
zSMTPSimTests.test_auth_functioncCs�tjt|jddd�}|��\}}|�|d�|�d|j�|��|�	d|j�|�
t|j�|�	d|j�|��|�d|j�|��dS)Nrr�r�r�rr)r%r/rr&r�r)r�rsr�r�rDZehlo_or_helo_if_needed�rr1�code�messagerrr�test_quit_resets_greetingxs
�z&SMTPSimTests.test_quit_resets_greetingc	Cs|t�t|j��}|��\}}|�|d�W5QRX|�tj|jd�t�t|j��}|�	�W5QRX|�tj|jd�dS)Nr�sfoo)
r%r/rr&r�r)r�r�rrr�rrr�test_with_statement�sz SMTPSimTests.test_with_statementc
Csh|�tj��2}t�t|j��}|��d|jj_	W5QRXW5QRX|�
|jjd�|�
|jj
d�dS)Nz421 QUIT FAILED�sQUIT FAILED)r�r%rr/rr&r�rrbrKr)r�rr)r�errorr1rrr� test_with_statement_QUIT_failure�sz-SMTPSimTests.test_with_statement_QUIT_failurec	Csftjt|jddd�}|��d|jj_d|jj_|�	tj
��|�ddd�W5QRX|�|j
�dS)	Nrr�r�z451 Requested action abortedTr�r��test message)r%r/rr&r�rrbrNrPr��SMTPSenderRefusedr�r9r<r0rrr�test__rest_from_mail_cmd�s

z%SMTPSimTests.test__rest_from_mail_cmdc	Csntjt|jddd�}|��d|jj_|�tj	��|�
ddd�W5QRX|�|j�|�
|jjjd�dS)	Nrr�r�z421 closing connectionr�r�r�r)r%r/rr&r�rrbrNr�r�r�r9r<r)rUr0rrr�test_421_from_mail_cmd�s
z#SMTPSimTests.test_421_from_mail_cmdc	Cs�tjt|jddd�}|��ddg|jj_|�tj	��}|�
dddd	gd
�W5QRX|�|j�|�
|jjjd�|�|jjdddi�dS)
Nrr�r�z250 accepted�421 closingr�r�ZFrankZGeorger�r)r�sclosing)r%r/rr&r�rrbrRr�ZSMTPRecipientsRefusedr�r9r<r)rU�assertDictEqualr�rb)rr1rrrr�test_421_from_rcpt_cmd�sz#SMTPSimTests.test_421_from_rcpt_cmdc	Cs~Gdd�dt�}||j_tjt|jddd�}|��|�tj	��|�
ddgd�W5QRX|�|j�|�
|jjjd	�dS)
NcseZdZ�fdd�Z�ZS)z=SMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannelcs&|j|jkr|�d�n
t���dS)Nr�)rZDATArrrrrrrr�szNSMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannel.found_terminator)rOrPrQrrZrrrr�MySimSMTPChannel�sr�rr�r�zJohn@foo.orgz
Sally@foo.orgr�r)rrr`r%r/rr&r�r�Z
SMTPDataErrorr�r9r<r)rbrT)rr�r1rrr�test_421_from_data_cmd�sz#SMTPSimTests.test_421_from_data_cmdcCs�tjt|jddd�}|�|j�|��|�|j�|�	|�
d��|jtj|j
ddddd	gd
�|jtj|jddd	gd�dS)Nrr�r��smtputf8r�r�rr�r��r��Zoptions)r%r/rr&r�rr�rt�
does_esmtprur�r��SMTPNotSupportedErrorr�r�r0rrr�4test_smtputf8_NotSupportedError_if_no_server_support�s0���zASMTPSimTests.test_smtputf8_NotSupportedError_if_no_server_supportcCsHtjt|jddd�}|�|j�|�t|jddd�|�t|j	d�dS)Nrr�r�ZAliceuBöbruÄlice)
r%r/rr&r�rr��UnicodeEncodeErrorr�r�r0rrr�"test_send_unicode_without_SMTPUTF8�s�z/SMTPSimTests.test_send_unicode_without_SMTPUTF8c	Csdt�}d|d<d|d<d|d<tjt|jddd	�}|�|j�|�tj��|�	|�W5QRXdS)
Nr�r�r�r��Nudge nudge, wink, wink ὠ9�Subjectrr�r�)
rr%r/rr&r�rr�r�r�)rr�r1rrr�9test_send_message_error_on_non_ascii_addrs_if_no_smtputf8�s�zFSMTPSimTests.test_send_message_error_on_non_ascii_addrs_if_no_smtputf8cCs�tjt|jddd�}|�|j�t�}tj�	d�|d<tj�	d�|d<|�
|�|�i�|�|j
jdd	�|�|j
jd
dg�dS)Nrr�r�)uMichaël�michael@example.comr�)uRené�rene@example.comr�rer�rfr�)r%r/rr&r�rrr�ZutilsZ
formataddrr�r�r)rr])rr1r�rrr�1test_name_field_not_included_in_envelop_addresses�s�z>SMTPSimTests.test_name_field_not_included_in_envelop_addressesN)rOrPrQr'r(r�rwr�r�r�r�r�r�r�r
r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrn�s4
	
	

rnc@s&eZdZdd�Zdd�Zddd�ZdS)	�SimSMTPUTF8ServercOs"ddg|_tjj|f|�|�dS)Nr�Z8BITMIME)r\rnr^rr_rrrr�s
zSimSMTPUTF8Server.__init__cCs"|j|j||||j|jd�|_dS)N�r_�enable_SMTPUTF8)r`r\rar�rbrcrrrrds�z!SimSMTPUTF8Server.handle_acceptedNcCs(||_||_||_||_||_||_dSr
)Z	last_peer�
last_mailfrom�last_rcpttos�last_message�last_mail_options�last_rcpt_options)rrgrhrirjr�Zrcpt_optionsrrrrksz!SimSMTPUTF8Server.process_message)NN)rOrPrQrrdrkrrrrr��s
�r�c@s@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)�SMTPUTF8SimTestsNcCs�t�|_tj|_tjt_t��|_t��|_	t
tdfdddd�|_|jj�
�d|_|j|j|j	f}tjt|d�|_|j��|j��|j��dS)Nrr\FTr�rr`)rrcrrdrerrlrmrXrYr�rrrqr&rsrZrtrurvrwrxrrrr's


�

zSMTPUTF8SimTests.setUpcCs@|jt_|j��|j��t|j�|`|�	�t
|j�dSr
rprrrrr(-s


zSMTPUTF8SimTests.tearDowncCsHtjt|jddd�}|�|j�|��|�|j�|�|�	d��dS)Nrr�r�r�)
r%r/rr&r�rr�rtr�r�r0rrr�$test_test_server_supports_extensions8s�z5SMTPUTF8SimTests.test_test_server_supports_extensionscCs�d�d�}tjt|jddd�}|�|j�|jdd|dd	gd
�|�|j	j
d�|�|j	jdg�|�|j	j|�|�
d|j	j�|�
d	|j	j�|�|j	jg�dS)N�$¡a test message containing unicode!r/rr�r�uJőhnuSállyr�r�r�)r1r%r/rr&r�rr�r)rr�r�r�r�r�r�r�rrr�,test_send_unicode_with_SMTPUTF8_via_sendmail@s"
�
�z=SMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_sendmailcCs�d�d�}tjt|jddd�}|�|j�|��|�|j	dddgd	�d
�|�|�
d�d
�|�|�|�d
�|�|jj
d�|�|jjdg�|�|jj|�|�d|jj�|�d|jj�|�|jjg�dS)Nr�r/rr�r�uJőr�r�r�r�uJános)r1r%r/rr&r�rr�r)r�Zrcptrjrr�r�r�r�r�r�r�rrr�1test_send_unicode_with_SMTPUTF8_via_low_level_APINs*
��zBSMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_low_level_APIcCs�t�}d|d<d|d<d|d<|�d�t�d�}tjt|jd	d
d�}|�|j	�|�
|�|�i�|�
|jj
d�|�
|jjdg�|�
|jj��|�|�d
|jj�|�d|jj�|�
|jjg�dS)Nr�r�r�r�r�r�u1oh là là, know what I mean, know what I mean?

u<            From: Páolo <főo@bar.com>
            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?
            rr�r�ufőo@bar.comr�r�)rZset_content�textwrap�dedentr%r/rr&r�rr)r�rr�r�r�r�r�r�r�)rr�r*r1rrr�2test_send_message_uses_smtputf8_if_addrs_non_ascii`s(


�zCSMTPUTF8SimTests.test_send_message_uses_smtputf8_if_addrs_non_ascii)
rOrPrQr�r'r(r�r�r�r�rrrrr�sr�spsudoesnotexistr)Zeolc@seZdZdd�ZdS)�!SimSMTPAUTHInitialResponseChannelcCsL|��}|d��dkr>t|�dkr>|dtkr>|�d�dS|�d�dS)Nr�plainrMrz235 Okz571 Bad authentication)r%r'r&�EXPECTED_RESPONSEr)rr+rbrrrr,�s
z+SimSMTPAUTHInitialResponseChannel.smtp_AUTHN)rOrPrQr,rrrrr��sr�c@seZdZeZdS)� SimSMTPAUTHInitialResponseServerN)rOrPrQr�r`rrrrr��sr�c@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�SMTPAUTHInitialResponseSimTestscCs�t�|_tj|_tjt_t��|_t��|_	t
tdfddd�|_|jj�
�d|_|j|j|j	f}tjt|d�|_|j��|j��|j��dSro)rrcrrdrerrlrmrXrYr�rrrqr&rsrZrtrurvrwrxrrrr'�s 

�

z%SMTPAUTHInitialResponseSimTests.setUpcCs@|jt_|j��|j��t|j�|`|�	�t
|j�dSr
rprrrrr(�s


z(SMTPAUTHInitialResponseSimTests.tearDowncCs8|j�d�tjt|jddd�}|�dd�|��dS)Nr�rr�r��psu�doesnotexist)rrmr%r/rr&r�rr0rrr�%testAUTH_PLAIN_initial_response_login�s
�zESMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_logincCsV|j�d�tjt|jddd�}d|_d|_|�d|j	�\}}|�
�|�|d�dS)	Nr�rr�r�r�r�r�r�)rrmr%r/rr&r-r8r�Z
auth_plainrr))rr1r�Zresponserrr�$testAUTH_PLAIN_initial_response_auth�s
�zDSMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_authN)rOrPrQr'r(r�r�rrrrr��sr��__main__)CrVr0Zemail.mime.textr�Z
email.messagerZemail.base64mimerZ
encode_base64Zemail.utilsr�r@rrnr%rirErfrTrr�r�rlZunittestZtestrrZtest.supportrrrr	r
Z
unittest.mockr�platformrZSMTPChannelr"ZTestCaser#rZr�r�r[r�r�r�r�rEr6r?rH�	Exceptionrrr^r[rnr�r�r�r�r�r�rO�mainrrrr�<module>s�_D ��9/k1