Your IP : 216.73.216.85


Current Path : /opt/alt/python39/lib64/python3.9/test/__pycache__/
Upload File :
Current File : //opt/alt/python39/lib64/python3.9/test/__pycache__/test_smtplib.cpython-39.opt-2.pyc

a

XC?h���@s�ddlZddlZddlZddlmZddlmZddl	Zddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZmZddlmZddlmZddlmZmZm Z ddl!m"Z"ej#Z#ej$d	k�rd
d�Z%e%e
j&_%dd
�Z'Gdd�d�Z(Gdd�de(ej)�Z*Gdd�de(ej)�Z+dd�Z,dZ-dZ.Gdd�dej)�Z/Gdd�dej)�Z0Gdd�dej)�Z1Gdd�dej)�Z2Gd d!�d!ej)�Z3d"d#d$d%�Z4d&Z5d'Z6d(d)gd*gd+�Z7Gd,d-�d-e8�Z9Gd.d/�d/e
j&�Z:Gd0d1�d1e
j;�Z<Gd2d3�d3ej)�Z=Gd4d5�d5e<�Z>Gd6d7�d7ej)�Z?ed8d9d:�Z@Gd;d<�d<e:�ZAGd=d>�d>e<�ZBGd?d@�d@ej)�ZCeDdAk�r�e�E�dS)B�N)�EmailMessage)�body_encode)�support�mock_socket)�hashlib_helper)�
socket_helper)�threading_setup�threading_cleanup�join_thread)�Mock�darwincCsdS�N���selfrr�6/opt/alt/python39/lib64/python3.9/test/test_smtplib.py�handle_expt!src
Cs�|��|��z�z|��\}}Wntjy6YnT0d}|r�|dkr�t�g|gg�\}}}|rx|�|�}	||	d�}|d8}q<|��W|��|��n|��|��0dS)Ni�r�)Zlisten�setZaccept�socket�timeout�select�send�close)
�evtZbuf�serv�conn�addr�n�r�w�eZsentrrr�server&s$



�r"c@steZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�ZdS)�GeneralTestscCstt_d|_dS)N�)r�smtplibr�portrrrr�setUp>szGeneralTests.setUpcCs
tt_dSr
)rr%rrrr�tearDownBszGeneralTests.tearDowncCsd}d}|�|t�|��dS)Nzabc
.jkl
foo
..bluezabc
..jkl
foo
...blue)�assertEqualr%Z	quotedata)rZteststr�expectedrrr�
testQuoteDataGszGeneralTests.testQuoteDatacCs$t�d�|�t|j�}|��dS)N�220 Hola mundo�r�
reply_with�client�HOSTr&r�rr/rrr�
testBasic1Ls
zGeneralTests.testBasic1cCs6t�d�|jt|jdd�}|�|jd�|��dS)Nr,)z	127.0.0.1i�M)�source_address)rr.r/r0r&r)r3rr1rrr�testSourceAddressRs

�zGeneralTests.testSourceAddresscCs*t�d�|�dt|jf�}|��dS)Nr,z%s:%sr-r1rrr�
testBasic2Zs
zGeneralTests.testBasic2cCs6t�d�|jt|jdd�}|�|jd�|��dS)Nr,Ztesthost)�local_hostname)rr.r/r0r&r)r6rr1rrr�testLocalHostName`s
zGeneralTests.testLocalHostNamec	Cszt�d�|�t���t�d�|�t��d�z|�t|j�}Wt�d�nt�d�0|�|j	�
�d�|��dS)Nr,�)rr.�assertIsNone�getdefaulttimeout�setdefaulttimeoutr)r/r0r&�sock�
gettimeoutrr1rrr�testTimeoutDefaultgs

zGeneralTests.testTimeoutDefaultc	Cslt�d�|�t���t�d�z |jt|jdd�}Wt�d�nt�d�0|�|j	�
��|��dS�Nr,r8�r)rr.r9rr:r;r/r0r&r<r=rr1rrr�testTimeoutNoness

zGeneralTests.testTimeoutNonecCsJt�d�|�t��"|jt|jdd�Wd�n1s<0YdS)Nr,rr@)rr.�assertRaises�
ValueErrorr/r0r&rrrr�testTimeoutZero~s
zGeneralTests.testTimeoutZerocCs:t�d�|jt|jdd�}|�|j��d�|��dSr?)	rr.r/r0r&r)r<r=rr1rrr�testTimeoutValue�s
zGeneralTests.testTimeoutValuecCs|t�d�|��}|�d�t���}|�t|j�Wd�n1sH0Y|�	�t
�dt
j�}|�
|��|�dS)N�220 Hello worldrz	^connect:�rr.r/Zset_debuglevelrZcaptured_stderr�connectr0r&r�re�compile�	MULTILINE�assertRegex�getvalue�rr/�stderrr*rrr�test_debuglevel�s


,zGeneralTests.test_debuglevelcCs|t�d�|��}|�d�t���}|�t|j�Wd�n1sH0Y|�	�t
�dt
j�}|�
|��|�dS)NrF�z#^\d{2}:\d{2}:\d{2}\.\d{6} connect: rGrNrrr�test_debuglevel_2�s


,�zGeneralTests.test_debuglevel_2N)�__name__�
__module__�__qualname__r'r(r+r2r4r5r7r>rArDrErPrRrrrrr#<s
r#c@seZdZejZdS)�SMTPGeneralTestsN)rSrTrUr%�SMTPr/rrrrrV�srVcs<eZdZejZe�ee	d�d�dd��Z
�fdd�Z�ZS)�LMTPGeneralTestsZAF_UNIXz test requires Unix domain socketc	CsTd}t�d�z|�||j�}Wt�d�nt�d�0|�|j���|��dS)N�!/some/local/lmtp/delivery/programrF)	rr.r/r&r;r9r<r=r)r�
local_hostr/rrr�"testUnixDomainSocketTimeoutDefault�s
z3LMTPGeneralTests.testUnixDomainSocketTimeoutDefaultcsJt���d}|�t��|j|dd�Wd�n1s<0YdS)NrYrr@)�superrDrBrCr/)rrZ��	__class__rrrD�s
z LMTPGeneralTests.testTimeoutZero)
rSrTrUr%ZLMTPr/�unittestZ
skipUnless�hasattrrr[rD�
__classcell__rrr]rrX�s

rXc	Cs�|��z�zVttd�rtj}ntj}d}tjr^|dkr^|dtj�|��rT|��q^|d8}q(Wnt	j
ytYn0W|��s�t�d�|��t�
�|��n,|��s�t�d�|��t�
�|��0dS)N�polli�r�{�G�z�?rg�?)rr`r�asyncoreZpoll2rbZ
socket_mapZis_setrrr�time�sleepZ	close_all)r�serv_evt�
client_evtZpoll_funrrrr�debugging_server�s0


�
riz&---------- 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_datarQ��target�args)r�
thread_keyr�getfqdn�real_getfqdnr�sys�stdout�
old_stdout�io�StringIO�output�	threading�Eventrgrh�smtpd�DEBUGSTREAM�old_DEBUGSTREAMZDebuggingServerr0r�getsockname�hostr&�Threadri�thread�start�wait�clear�rZ	serv_argsrrrr'�s&



�

zDebuggingServerTests.setUpcCsZ|jt_|j��|j��t|j�|j	t
_tj
��|jt_
|`|��t|j�dSr
)rtrrsrhrrgr�r
r�rwrurvr}r~rr�
doCleanupsr	rrrrrrr(s



zDebuggingServerTests.tearDowncCs$|j��}tjdd|tjtjBd�S)Nz(.*?)^X-Peer:\s*\S+\n(.*)z\1\2)�flags)rzrMrI�subrK�DOTALL)r�test_outputrrr�get_output_without_xpeers
�z-DebuggingServerTests.get_output_without_xpeercCs"tjt|jdtjd�}|��dS�N�	localhost�r6r�r%rWr0r&r�LOOPBACK_TIMEOUT�quit�r�smtprrr�	testBasics�zDebuggingServerTests.testBasicc
Cs�t��}zZtj|j|jdtj|j|fd�}|�|j	�|�
|j|j|f�|�
|jd�|�
�Wn@ty�}z(|jtjkr�|�d|��WYd}~n
d}~00dS)Nr�)r6rr3zcouldn't bind to source port %d)rZfind_unused_portr%rWr�r&rr��
addCleanuprr)r3r6r��OSError�errnoZ
EADDRINUSEZskipTest)rZsrc_portr�r!rrrr4s�z&DebuggingServerTests.testSourceAddresscCsBtjt|jdtjd�}|�|j�d}|�|�	�|�|�
�dS�Nr�r���sOK)r%rWr0r&rr�r�rr)�noopr��rr�r*rrr�testNOOP,s�zDebuggingServerTests.testNOOPcCsBtjt|jdtjd�}|�|j�d}|�|�	�|�|�
�dSr�)r%rWr0r&rr�r�rr)Zrsetr�r�rrr�testRSET4s�zDebuggingServerTests.testRSETcCsBtjt|jdtjd�}|�|j�d}|�|�	�|�|�
�dS)Nr�r�)r�s
SIZE 33554432
HELP)r%rWr0r&rr�r�rr)�ehlor�r�rrr�testELHO<s�zDebuggingServerTests.testELHOcCsLtjt|jdtjd�}|�|j�d}|�d�|�	|�
�|�|��dS)Nr�r�)i�sEXPN not implementedZEXPN)r%rWr0r&rr�r�r�putcmdr)Zgetreplyr�r�rrr�testEXPNNotImplementedEs�
z+DebuggingServerTests.testEXPNNotImplementedcCsttjt|jdtjd�}|�|j�|�t	��}|�
d�Wd�n1sL0Y|�dt|j
��|��dS)Nr�r�zhelo
X-INJECTED�prohibited newline characters)r%rWr0r&rr�r�rrBrCr��assertIn�str�	exceptionr�)rr��excrrr�&test_issue43124_putcmd_escapes_newlineOs�(z;DebuggingServerTests.test_issue43124_putcmd_escapes_newlinecCsVtjt|jdtjd�}|�|j�d}|�|�	d�|�|�|�
d�|�|��dS)Nr�r�)�s>Cannot VRFY user, but will accept message and attempt delivery�nobody@nowhere.com)r%rWr0r&rr�r�rr)�vrfyZverifyr�r�rrr�testVRFYYs�zDebuggingServerTests.testVRFYcCsJtjt|jdtjd�}|�|j�|��d}|�	|��|�|�
�dS)Nr�r�)i�sDuplicate HELO/EHLO)r%rWr0r&rr�r�rZhelor)r�r�rrr�testSecondHELOcs�z#DebuggingServerTests.testSecondHELOcCs>tjt|jdtjd�}|�|j�|�|�	�d�|�
�dS)Nr�r�s@Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY)r%rWr0r&rr�r�rr)�helpr�r�rrr�testHELPns�zDebuggingServerTests.testHELPcCs�d}tjt|jdtjd�}|�|j�|�dd|�t	�
d�|��|j�
�|j��|j��dt|tf}|�|j��|�dS)N�A test messager�r��John�Sallyrc�%s%s
%s�r%rWr0r&rr�r�r�sendmailrerfr�rhrrgr�rz�flush�	MSG_BEGIN�MSG_ENDr)rM�r�mr��mexpectrrr�testSendvs�



zDebuggingServerTests.testSendcCs�d}tjt|jdtjd�}|�|j�|�dd|�t	�
d�|��|j�
�|j��|j��dt|�d�tf}|�|j��|�dS)	NsA test messager�r�r�r�rcr��ascii)r%rWr0r&rr�r�rr�rerfr�rhrrgr�rzr�r��decoder�r)rMr�rrr�testSendBinary�s�



z#DebuggingServerTests.testSendBinarycCs�d}tjt|jdtjd�}|�|j�|�dd|�t	�
d�|��|j�
�|j��|j��dt|tf}|�|j��|�dS)Nz.A test
.mes.sage.r�r�r�r�rcr�r�r�rrr�testSendNeedingDotQuote�s�



z,DebuggingServerTests.testSendNeedingDotQuotecCs�d}tjt|jdtjd�}|�|j�|�t	��}|�
dd|�Wd�n1sT0Y|�dt|j
��t�d�|��tj��}|�d|�dS)	N�wazzuuup
linetwoz
hi
X-INJECTEDr��	hi@me.com�
you@me.comz2prohibited newline characters: ehlo hi\nX-INJECTEDrcz
X-INJECTED)r%rWr0r&rr�r�rrBrCr�r�r�r�rerfr�r}r~rM�assertNotIn)rr�r�r��debugoutrrr�$test_issue43124_escape_localhostname�s�,�

z9DebuggingServerTests.test_issue43124_escape_localhostnamecCs�d}tjt|jdtjd�}|�|j�|�dd|�|�	t
�� }|�dddg�Wd�n1sd0Yt|j
�}|�d|�|�d	|�t�d
�|��tj��}|�d|�|�d|�|�d
|�|�d|�dS)Nr�r�r�r�r�zX-OPTION
X-INJECTED-1zX-OPTION2
X-INJECTED-2r�z.X-OPTION\nX-INJECTED-1 X-OPTION2\nX-INJECTED-2rczX-OPTIONz	X-OPTION2zX-INJECTED-1zX-INJECTED-2)r%rWr0r&rr�r�rr�rBrC�mailr�r�r�rerfr�r}r~rMr�)rr�r�r��msgr�rrr�test_issue43124_escape_options�s&�.


z3DebuggingServerTests.test_issue43124_escape_optionscCs�d}tjt|jdtjd�}|�|j�|�dd|�t	�
d�|��|j�
�|j��|j��dt|tf}|�|j��|�tj��}t�dtj�}|�||�dS)	Nr�r�r�z<>r�rcr�z^sender: <>$)r%rWr0r&rr�r�rr�rerfr�rhrrgr�rzr�r�r�r)rMr}r~rIrJrKrL)rr�r�r�r��senderrrr�testSendNullSender�s �




z'DebuggingServerTests.testSendNullSendercCs�tjj�d�}tjt|jdtj	d�}|�
|j�|j|ddd�t
�d�|��|j��|j��|j��|��}|d=d	t|��tf}|�||�dS)
Nr�r�r�r�r��Z	from_addrZto_addrsrc�X-Peerr�)�email�mime�text�MIMETextr%rWr0r&rr�r�r�send_messagererfr�rhrrgr�rzr�r�r��	as_stringr�r))rr�r�r�r�rrr�testSendMessage�s�



z$DebuggingServerTests.testSendMessagec	Cstjj�d�}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��}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>�Bccr�r�rcr�r��^sender: foo@bar.com$)r�r�ZFredzroot@localhostzwarped@silly.walks.com�^recips: .*'{}'.*$)#r�r�r�r�r%rWr0r&rr�r�rr�rerfr�r)rhrrgr�rzr�r�r�r�r�r}r~rMrIrJrKrL�format�	rr�r�r�r�r�r�r�to_addrrrr�testSendMessageWithAddressess:�





�z1DebuggingServerTests.testSendMessageWithAddressesc	Cs�tjj�d�}d|d<d|d<tjt|jdtj	d�}|�
|j�|�|�t
�d�|��|j��|j��|j��|��}|d	=d
t|��tf}|�||�tj��}t�dtj �}|�!||�dD]$}t�d
�"|�tj �}|�!||�q�dS)Nr�r�r��John, Dinsdaler�r�r�rcr�r�r��r��Dinsdaler��#r�r�r�r�r%rWr0r&rr�r�rr�rerfr�rhrrgr�rzr�r�r�r�r�r)r}r~rMrIrJrKrLr�r�rrr� testSendMessageWithSomeAddresses$s2�





�z5DebuggingServerTests.testSendMessageWithSomeAddressesc
Cstjj�d�}d|d<d|d<tjt|jdtj	d�}|�
|j�|j|dd	d
�t
�d�|��|j��|j��|j��|��}|d=d
t|��tf}|�||�tj��}t�dtj �}|�!||�dD]$}t�d�"|�tj �}|�#||�q�t�dtj �}	|�!||	�dS)Nr�r�r�r�r�r�r�zjoe@example.comzfoo@example.netr�rcr�r�z^sender: joe@example.com$r�r�z^recips: .*'foo@example.net'.*$)$r�r�r�r�r%rWr0r&rr�r�rr�rerfr�rhrrgr�rzr�r�r�r�r�r)r}r~rMrIrJrKrLr�ZassertNotRegex)
rr�r�r�r�r�r�rr�Zreciprrr�%testSendMessageWithSpecifiedAddressesAs6�




�z:DebuggingServerTests.testSendMessageWithSpecifiedAddressesc	Cstjj�d�}d|d<d|d<d|d<tjt|jdtj	d	�}|�
|j�|�|�t
�d
�|��|j��|j��|j��|��}|d=dt|��tf}|�||�tj��}t�d
tj �}|�!||�dD]$}t�d�"|�tj �}|�!||�q�dS)Nr�zBernard, Biancar�z#the_rescuers@Rescue-Aid-Society.comZSenderr�r�r�r�rcr�r�z-^sender: the_rescuers@Rescue-Aid-Society.com$r�r�r�r�rrr�testSendMessageWithMultipleFrom`s4�





�z4DebuggingServerTests.testSendMessageWithMultipleFromc	Cs6tjj�d�}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��}t�dtj �}|�!||�dD]&}t�d�"|�tj �}|�!||��q
dS)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-Bccr�r�rcr�r�z^sender: holy@grail.net$)zmy_mom@great.cooker.comZJeffr�r�r�r�rrr�testSendMessageResent~sB�





�z*DebuggingServerTests.testSendMessageResentcCs�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|jdtj	d�}|�
|j�|�t
��|�|�Wd�n1s�0Y|��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 +0000r�r�)r�r�r�r�r%rWr0r&rr�r�rrBrCr��rr�r�rrr�#testSendMessageMultipleResentRaises�s&�(z8DebuggingServerTests.testSendMessageMultipleResentRaises)rSrTrU�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�rrrrrj�s6	


$%rjc@s$eZdZdd�Zdd�Zdd�ZdS)�NonConnectingTestscCs.t��}|�tj|j�|�tj|jd�dS)Nztest msg)r%rWrB�SMTPServerDisconnectedr�rr�rrr�testNotConnected�s
�z#NonConnectingTests.testNotConnectedcCs&|�ttjdd�|�ttjd�dS)Nr�Zboguszlocalhost:bogus)rBr�r%rWrrrr�testNonnumericPort�s
�
�z%NonConnectingTests.testNonnumericPortcCs8t���}|�|j�Wd�n1s*0YdSr
)r%rWr9r<r�rrr�testSockAttributeExists�s
z*NonConnectingTests.testSockAttributeExistsN)rSrTrUr�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%rWr�rr��has_extnr�rrrrr'�s


zDefaultArgumentsTests.setUpcCs`d}|j�|j�|j�|j�|�|jjjddd|�|�|jjjddd|�dS)N)�SMTPUTF8�
BODY=8BITMIMEr�r�r�r�r�r)r�Zcall_args_list)r�expected_mail_optionsrrrr��s��z%DefaultArgumentsTests.testSendMessagecCsNdg}d}|j�|jdd|�|�|dg�|�|jjjddd|�dS)N�STARTTLS)rrrrrr)r�mail_optionsrrrr�testSendMessageWithMailOptions�s�z4DefaultArgumentsTests.testSendMessageWithMailOptionsN)rSrTrUr'r�rrrrrr��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.rurvrwrxryrzr&rrrrr'�s

zBadHELOServerTests.setUpcCstt_|jt_dSr
)rr%rwrurvrrrrr(�szBadHELOServerTests.tearDowncCs|�tjtjt|jdd�dS�Nr�r)rBr%ZSMTPConnectErrorrWr0r&rrrr�testFailingHELO�s
�z"BadHELOServerTests.testFailingHELON)rSrTrUr'r(r
rrrrr�src@s:eZdZddejddZdd�Zdd�Zd	d
�ZdS)�TooLongLineTestss250 OK�.rQ�
cCs�t�|_tj|_t��|_|jt_t�	�|_
t�tjtj
�|_|j�d�t�|j�|_|j
|j|jf}tjt|d�|_|j��|j
��|j
��dS)N�ro)rrrrurvrwrxryrzr{r|rrZAF_INETZSOCK_STREAMr<Z
settimeoutrZ	bind_portr&�respdatar�r"r�r�r�r�)rZservargsrrrr's



zTooLongLineTests.setUpcCs6|j��|jt_t|j�|`|��t|j	�dSr
)
rr�rwrurvr
r�r�r	rrrrrrr(s

zTooLongLineTests.tearDowncCs|�tjtjt|jdd�dSr	)rBr%�SMTPResponseExceptionrWr0r&rrrr�testLineTooLongs
�z TooLongLineTests.testLineTooLongN)	rSrTrUr%Z_MAXLINErr'r(rrrrrrsrzJohn 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)rSrTrUrrrrr.�rcs�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�ccs0d�dd�|D��|_tt|�j|i|��dS)N�cSsg|]}d�|��qS)z	250-{0}
)r�)�.0�xrrr�
<listcomp>=rz+SimSMTPChannel.__init__.<locals>.<listcomp>)�join�_extrafeaturesr\r�__init__)rZextra_featuresrq�kwr]rrr;s�zSimSMTPChannel.__init__c
s�|j|jkr�|j�|j�}tdt|�tjd�g|_z|�	|�WnBt
y�}z*|j|_|�d|j
|jf�WYd}~n
d}~00dSt���dS)NzData:)�file�%s %s)�
smtp_state�AUTHZ_emptystringrZreceived_lines�print�reprr}r~�auth_objectr�COMMAND�push�	smtp_code�
smtp_errorr\�found_terminator)r�liner!r]rrr,As,zSimSMTPChannel.found_terminatorcCs�|js|�d�dS|jr$d|jvr2|�d�dS|jdurJ|�d�dS|��}t|�dvrl|�d�dSd|d���d	d
�}zt	||�|_
Wn$ty�|�d�|��YdS0|j
|_|�
t|�dkr�|d
nd�dS)Nz503 Error: send EHLO firstr$z(500 Error: command "AUTH" not recognizedz3503 Bad sequence of commands: already authenticated)rrQz/501 Syntax: AUTH <mechanism> [initial-response]z_auth_%sr�-�_zQ504 Command parameter not implemented: unsupported  authentication mechanism {!r}rQr)�
seen_greetingr)�
extended_smtpr�authenticated_user�split�len�lower�replace�getattrr'�AttributeErrorr�r$r#)r�argrqZauth_object_namerrr�	smtp_AUTHOs2


�
�zSimSMTPChannel.smtp_AUTHcCs,|r||_|�d�n
|�d�|j|_dS)Nz235 Authentication Succeededz&535 Authentication credentials invalid)r2r)r(r#)r�userZvalidrrr�_authenticatedhs

zSimSMTPChannel._authenticatedcCst�|�d���d�S)Nr��utf-8)�base64Zdecodebytes�encoder�)r�stringrrr�_decode_base64pszSimSMTPChannel._decode_base64c
Cs�|dur|�d�nn|�|�}z|�d��^}}}Wn8tyl}z |�d�||��WYd}~dSd}~00|�||tdk�dS)Nz334 ��=535 Splitting response {!r} into user and password failed: {}r)r)rAr3rCr�r<�sim_auth)rr9�logpassr/r;�passwordr!rrr�_auth_plainss
�zSimSMTPChannel._auth_plaincCs^|dur|�d�nFt|d�s6|�|�|_|�d�n$|�|�}|�|j|tdk�|`dS)Nz334 VXNlcm5hbWU6�_auth_login_userz334 UGFzc3dvcmQ6r)r)r`rArHr<rD)rr9rFrrr�_auth_login�s

zSimSMTPChannel._auth_logincCs|�d�dS)Nz334 QnVHZ1liVWdHeQ==)r)�rr9rrr�_auth_buggy�szSimSMTPChannel._auth_buggyc
Cs�|dur|�d�t��n�|�|�}z|��\}}Wn8tyl}z |�d�||��WYd}~dSd}~00t�td�	d�|�t��	d�d��
�}|�|||k�dS)Nz334 {}rCFrr��md5)r)r��sim_cram_md5_challengerAr3rC�hmacZHMACrDr?Z	hexdigestr<)rr9rEr;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)rr)r0r1)rr9�resprrr�	smtp_EHLO�s

zSimSMTPChannel.smtp_EHLOcCs8|tvr&|�dt|t�|�f�n|�d|�dS)N�	250 %s %sz550 No such user: %s)�	sim_usersr)r%�	quoteaddrrJrrr�	smtp_VRFY�szSimSMTPChannel.smtp_VRFYcCs�|��}|tvrtt|}t|�D]P\}}t�|�}|t|�dkrZ|�dt||f�q |�dt||f�q n
|�d�dS)Nrz	250-%s %srRz550 No access for you!)r5�	sim_lists�	enumerater%rTr4r)rS)rr9Z	list_nameZ	user_listrZ
user_emailZquoted_addrrrr�	smtp_EXPN�s
zSimSMTPChannel.smtp_EXPNcs4|jdurtt|��|�n|�|j�|��dSr
)�
quit_responser\r�	smtp_QUITr)�close_when_donerJr]rrrZ�s
zSimSMTPChannel.smtp_QUITcs6|jdurt��|�n|�|j�|jr2|��dSr
)�
mail_responser\�	smtp_MAILr)�
disconnectr[rJr]rrr]�s

zSimSMTPChannel.smtp_MAILcsB|jdurt��|�dS|jd7_|�|j|jd�dS�Nr)�
rcpt_responser\�	smtp_RCPT�
rcpt_countr)rJr]rrra�s

zSimSMTPChannel.smtp_RCPTcs|jd7_t��|�dSr_)�
rset_countr\�	smtp_RSETrJr]rrrd�szSimSMTPChannel.smtp_RSETcs(|jdurt��|�n|�|j�dSr
)�
data_responser\�	smtp_DATAr)rJr]rrrf�s
zSimSMTPChannel.smtp_DATAcCs�dSr
rrrrr�handle_error�szSimSMTPChannel.handle_error)N)N)N)N)rSrTrUrYr\r`rerbrcr^r$r2rr,r:r<rArGrIrKrOrQrUrXrZr]rardrfrgrarrr]rr/s6




rc@s8eZdZeZdd�Zdd�Zdd�Zdd�Zd	d
�Z	dS)�
SimSMTPServercOs*g|_i|_tjj|g|�Ri|��dSr
)�_extra_features�
_addressesr}�
SMTPServerr�rrqr rrrr�szSimSMTPServer.__init__cCs|j|j||||jd�|_dS)Nrm)�
channel_classri�_decode_data�_SMTPchannel�rrrrrr�handle_accepted�s
�zSimSMTPServer.handle_acceptedcCs||jd<||jd<dS)N�from�tos)rj)r�peer�mailfrom�rcpttos�datarrr�process_message�s
zSimSMTPServer.process_messagecCs|j�|�dSr
)ri�append)rZfeaturerrr�add_feature�szSimSMTPServer.add_featurecCs�dSr
rrrrrrg�szSimSMTPServer.handle_errorN)
rSrTrUrrmrrqrxrzrgrrrrrh�srhc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
ejddd�dd��Zejddd�dd��Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6S)7�SMTPSimTestscCs�t�|_tj|_tjt_t��|_t��|_	t
tdfddd�|_|jj�
�d|_|j|j|j	f}tjt|d�|_|j��|j��|j��dS�NrrkTrmrro)rrrrrsrtrr{r|rgrhrhr0rr�r&r�rir�r�r�r�r�rrrr's



zSMTPSimTests.setUpcCs@|jt_|j��|j��t|j�|`|�	�t
|j�dSr
�rtrrsrhrrgr�r
r�r�r	rrrrrrr(s


zSMTPSimTests.tearDowncCs"tjt|jdtjd�}|��dSr�r�r�rrrr�!s�zSMTPSimTests.testBasiccCs�tjt|jdtjd�}|�|ji�dddddd�}|��|�|j|�|D]}|�	|�
|��qN|�|�
d��|��dS)Nr�r�rZ20000000)�expn�sizeZstarttlsZ	deliverbyr�zunsupported-feature)
r%rWr0r&rr�r)�esmtp_featuresr��
assertTruer��assertFalser�)rr�Zexpected_features�krrr�testEHLO's ��zSMTPSimTests.testEHLOcCs�tjt|jdtjd�}t��D]6\}}dtd|t�	|�fd�f}|�
|�|�|�qd}dd|�d�f}|�
|�|�|�|�
�dS)	Nr�r�r�r"r�r��&zNo such user: %s)r%rWr0r&rr�rS�items�bytesrTr)r�r?r�)rr�Z	addr_spec�name�expected_known�u�expected_unknownrrrr�=s���zSMTPSimTests.testVRFYc		Cs�tjt|jdtjd�}t��D]X\}}g}|D] }|�dt	|t�
|�f�q.dtd�|�d�f}|�
|�|�|�qd}d}|�
|�|�|�|��dS)	Nr�r�r"r��
r�zPSU-Members-List)r�sNo access for you!)r%rWr0r&rr�rVr�ryrSrTr�rr)r~r�)	rr�Zlistname�membersZusersr�r�r�r�rrr�testEXPNLs�zSMTPSimTests.testEXPNcCsN|j�d�tjt|jdtjd�}|�t	dt	d�}|�
|d�|��dS)N�
AUTH PLAINr�r�rr���sAuthentication Succeeded�rrzr%rWr0r&rr��loginrDr)r�rr�rPrrr�testAUTH_PLAIN\s�zSMTPSimTests.testAUTH_PLAINcCsN|j�d�tjt|jdtjd�}|�t	dt	d�}|�
|d�|��dS)N�
AUTH LOGINr�r�rrr�r�r�rrr�testAUTH_LOGINds�zSMTPSimTests.testAUTH_LOGINcCsz|j�d�tjt|jdtjd��D}t\|_	|_
|�d�|jd|j
dd�}|�|d�Wd�n1sl0YdS)	Nr�r�r��test_auth_login�LOGINT�Zinitial_response_okr��rrzr%rWr0r&rr�rDr;rFr��authZ
auth_loginr)r�rrr�"testAUTH_LOGIN_initial_response_okls�
z/SMTPSimTests.testAUTH_LOGIN_initial_response_okcCsz|j�d�tjt|jdtjd��D}t\|_	|_
|�d�|jd|j
dd�}|�|d�Wd�n1sl0YdS)	Nr�r�r�r�r�Fr�r�r�r�rrr�%testAUTH_LOGIN_initial_response_notokus�
z2SMTPSimTests.testAUTH_LOGIN_initial_response_notokcs��j�d�d�fdd�	}tjt�jdtjd�}zdt\|_	|_
|�d�d}��tj
|�� }|jd|d	d
�Wd�n1s�0YW|��n
|��0dS)Nz
AUTH BUGGYcs��d|�dS)Ns
BuGgYbUgGyrB)r))Z	challengerrr�
auth_buggy�sz/SMTPSimTests.testAUTH_BUGGY.<locals>.auth_buggyr�r�Ztest_auth_buggyz&^Server AUTH mechanism infinite loop.*ZBUGGYFr�)N)rrzr%rWr0r&rr�rDr;rFr�ZassertRaisesRegexZ
SMTPExceptionr�r)rr�r�Zexpect�cmrrr�testAUTH_BUGGY~s�
0zSMTPSimTests.testAUTH_BUGGYrLT)ZopensslcCsN|j�d�tjt|jdtjd�}|�t	dt	d�}|�
|d�|��dS)Nz
AUTH CRAM-MD5r�r�rrr�r�r�rrr�testAUTH_CRAM_MD5�s�zSMTPSimTests.testAUTH_CRAM_MD5cCsN|j�d�tjt|jdtjd�}|�t	dt	d�}|�
|d�|��dS)NzAUTH BOGUS PLAIN LOGIN CRAM-MD5r�r�rrr�r�r�rrr�testAUTH_multiple�s�zSMTPSimTests.testAUTH_multiplec	Cs�ddh}zt��Wnty&Yn0|�d�|D]}|j�d�|��q6|D]�}|j|d���tj	t
|jdtj
d�}|�d�td	td
|_|_d|���dd
�}|�|t||��}|�|d�|��Wd�qR1s�0YqRdS)NZPLAINr�zCRAM-MD5zAUTH {})�	mechanismr�r�ZfoorrZauth_r.r/r�)�hashlibrLrC�addrrzr�ZsubTestr%rWr0r&rr�r�rDr;rFr5r6r�r7r)r)rZ	supportedr�r��methodrPrrr�test_auth_function�s(

�
zSMTPSimTests.test_auth_functioncCs�tjt|jdtjd�}|��\}}|�|d�|�d|j	�|�
�|�d|j	�|�t|j�|�d|j	�|�
�|�d|j	�|�
�dS)Nr�r�r�r)r%rWr0r&rr�r�r)r�r�r�r�rHZehlo_or_helo_if_needed�rr��code�messagerrr�test_quit_resets_greeting�s
�z&SMTPSimTests.test_quit_resets_greetingcCs�t�t|j��(}|��\}}|�|d�Wd�n1s<0Y|�tj|jd�t�t|j��}|�	�Wd�n1s�0Y|�tj|jd�dS)Nr�sfoo)
r%rWr0r&r�r)rBr�rrr�rrr�test_with_statement�s*&z SMTPSimTests.test_with_statementc	Cs�|�tj��P}t�t|j��"}|��d|jj_	Wd�n1sD0YWd�n1sb0Y|�
|jjd�|�
|jj
d�dS)Nz421 QUIT FAILED�sQUIT FAILED)rBr%rrWr0r&r�rrorYr)r�r*r+)r�errorr�rrr� test_with_statement_QUIT_failure�sFz-SMTPSimTests.test_with_statement_QUIT_failurecCs|tjt|jdtjd�}|��d|jj_	d|jj_
|�tj��|�
ddd�Wd�n1sb0Y|�|j�dS)Nr�r�z451 Requested action abortedTr�r��test message)r%rWr0r&rr�r�rror\r^rB�SMTPSenderRefusedr�r9r<r�rrr�test__rest_from_mail_cmd�s�

,z%SMTPSimTests.test__rest_from_mail_cmdcCs�tjt|jdtjd�}|��d|jj_	|�
tj��|�ddd�Wd�n1sX0Y|�
|j�|�|jjjd�dS)Nr�r�z421 closing connectionr�r�r�r)r%rWr0r&rr�r�rror\rBr�r�r9r<r)rcr�rrr�test_421_from_mail_cmd�s�
,z#SMTPSimTests.test_421_from_mail_cmdcCs�tjt|jdtjd�}|��ddg|jj_	|�
tj��"}|�dgd�d�Wd�n1s`0Y|�
|j�|�|jjjd�|�|jjdd	d
i�dS)Nr�r�z250 accepted�421 closingr�)r��FrankZGeorger�rr�)r�sclosing)r%rWr0r&rr�r�rror`rBZSMTPRecipientsRefusedr�r9r<r)rc�assertDictEqualr�rq)rr�rrrr�test_421_from_rcpt_cmd�s�0z#SMTPSimTests.test_421_from_rcpt_cmdcCs�Gdd�dt�}||j_tjt|jdtjd�}|�	�|�
tj�� |�ddgd�Wd�n1sh0Y|�
|j�|�|jjjd�dS)	NcseZdZ�fdd�Z�ZS)z=SMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannelcs&|j|jkr|�d�n
t���dS)Nr�)r#ZDATAr)r\r,rr]rrr,szNSMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannel.found_terminator)rSrTrUr,rarrr]r�MySimSMTPChannelsr�r�r�zJohn@foo.orgz
Sally@foo.orgr�r)rrrmr%rWr0r&rr�r�rBZ
SMTPDataErrorr�r9r<r)rorb)rr�r�rrr�test_421_from_data_cmd�s�.z#SMTPSimTests.test_421_from_data_cmdcCs�tjt|jdtjd�}|�|j�|��|�	|j
�|�|�d��|j
tj|jdddddgd	�|j
tj|jdddgd
�dS)Nr�r��smtputf8r�r�rrr�r�Zoptions)r%rWr0r&rr�r�rr�r��
does_esmtpr�r�rB�SMTPNotSupportedErrorr�r�r�rrr�4test_smtputf8_NotSupportedError_if_no_server_supports"���zASMTPSimTests.test_smtputf8_NotSupportedError_if_no_server_supportcCsJtjt|jdtjd�}|�|j�|�t	|j
ddd�|�t	|jd�dS)Nr�r�ZAliceuBöbruÄlice)r%rWr0r&rr�r�rrB�UnicodeEncodeErrorr�r�r�rrr�"test_send_unicode_without_SMTPUTF8s�z/SMTPSimTests.test_send_unicode_without_SMTPUTF8cCszt�}d|d<d|d<d|d<tjt|jdtjd�}|�|j�|�	tj
��|�|�Wd�n1sl0YdS)	Nr�r�r�r��Nudge nudge, wink, wink ὠ9�Subjectr�r�)rr%rWr0r&rr�r�rrBr�r�)rr�r�rrr�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|jdtjd�}|�|j�t�}t	j
�d�|d<t	j
�d�|d<|�|�
|�i�|�|jjdd�|�|jjd	d
g�dS)Nr�r�)uMichaël�michael@example.comr�)uRené�rene@example.comr�rrr�rsr�)r%rWr0r&rr�r�rrr�ZutilsZ
formataddrr�r�r)rrj)rr�r�rrr�1test_name_field_not_included_in_envelop_addresses5s�z>SMTPSimTests.test_name_field_not_included_in_envelop_addressesN)rSrTrUr'r(r�r�r�r�r�r�r�r�r�rZrequires_hashdigestr�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr{s6		

		
r{c@s&eZdZdd�Zdd�Zddd�ZdS)	�SimSMTPUTF8ServercOs(ddg|_tjj|g|�Ri|��dS)NrZ8BITMIME)rir}rkrrlrrrrGs
zSimSMTPUTF8Server.__init__cCs"|j|j||||j|jd�|_dS)N�rn�enable_SMTPUTF8)rmrirnr�rorprrrrqNs

�z!SimSMTPUTF8Server.handle_acceptedNcCs(||_||_||_||_||_||_dSr
)Z	last_peer�
last_mailfrom�last_rcpttos�last_message�last_mail_options�last_rcpt_options)rrtrurvrwrZrcpt_optionsrrrrxUsz!SimSMTPUTF8Server.process_message)NN)rSrTrUrrqrxrrrrr�Es
�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)NrrkFTr�rro)rrrrrsrtrr{r|rgrhr�r0rr�r&r�rir�r�r�r�r�rrrr'cs


�

zSMTPUTF8SimTests.setUpcCs@|jt_|j��|j��t|j�|`|�	�t
|j�dSr
r}rrrrr(ws


zSMTPUTF8SimTests.tearDowncCsJtjt|jdtjd�}|�|j�|��|�	|j
�|�	|�d��dS)Nr�r�r�)r%rWr0r&rr�r�rr�r�r�r�r�rrr�$test_test_server_supports_extensions�s�z5SMTPUTF8SimTests.test_test_server_supports_extensionscCs�d�d�}tjt|jdtjd�}|�|j�|j	dd|ddgd	�|�
|jjd�|�
|jj
dg�|�
|jj|�|�d|jj�|�d|jj�|�
|jjg�dS)
N�$¡a test message containing unicode!r=r�r�uJőhnuSállyrrr�)r?r%rWr0r&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|jdtjd�}|�|j�|�	�|�
|jdddgd�d	�|�
|�d
�d	�|�
|�
|�d	�|�
|jjd�|�
|jjd
g�|�
|jj|�|�d|jj�|�d|jj�|�
|jjg�dS)Nr�r=r�r�uJőrrr�r�uJános)r?r%rWr0r&rr�r�rr�r)r�Zrcptrwrr�r�r�r�r�r�r�rrr�1test_send_unicode_with_SMTPUTF8_via_low_level_API�s&
��zBSMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_low_level_APIcCs�t�}d|d<d|d<d|d<|�d�t�d�}tjt|jd	tj	d
�}|�
|j�|�|�
|�i�|�|jjd�|�|jjdg�|�|jj��|�|�d|jj�|�d
|jj�|�|jjg�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?
            r�r�ufőo@bar.comrr)rZset_content�textwrap�dedentr%rWr0r&rr�r�rr)r�rr�r�r�r�r�r�r�)rr�r*r�rrr�2test_send_message_uses_smtputf8_if_addrs_non_ascii�s$


�zCSMTPUTF8SimTests.test_send_message_uses_smtputf8_if_addrs_non_ascii)
rSrTrUr�r'r(r�r�r�r�rrrrr�_s	r�spsudoesnotexistr)Zeolc@seZdZdd�ZdS)�!SimSMTPAUTHInitialResponseChannelcCsL|��}|d��dkr>t|�dkr>|dtkr>|�d�dS|�d�dS)Nr�plainrQrz235 Okz571 Bad authentication)r3r5r4�EXPECTED_RESPONSEr))rr9rqrrrr:�s
z+SimSMTPAUTHInitialResponseChannel.smtp_AUTHN)rSrTrUr:rrrrr��sr�c@seZdZeZdS)� SimSMTPAUTHInitialResponseServerN)rSrTrUr�rmrrrrr��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��dSr|)rrrrrsrtrr{r|rgrhr�r0rr�r&r�rir�r�r�r�r�rrrr'�s


�

z%SMTPAUTHInitialResponseSimTests.setUpcCs@|jt_|j��|j��t|j�|`|�	�t
|j�dSr
r}rrrrr(�s


z(SMTPAUTHInitialResponseSimTests.tearDowncCs:|j�d�tjt|jdtjd�}|�dd�|�	�dS)Nr�r�r��psu�doesnotexist)
rrzr%rWr0r&rr�r�rr�rrr�%testAUTH_PLAIN_initial_response_logins�zESMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_logincCsX|j�d�tjt|jdtjd�}d|_d|_	|�
d|j�\}}|��|�
|d�dS)Nr�r�r�r�r�r�r�)rrzr%rWr0r&rr�r;rFr�Z
auth_plainrr))rr�r�Zresponserrr�$testAUTH_PLAIN_initial_response_auth	s�zDSMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_authN)rSrTrUr'r(r�r�rrrrr��sr��__main__)Frdr>Zemail.mime.textr�Z
email.messagerZemail.base64mimerZ
encode_base64Zemail.utilsr�rNrr}r%rxrIrurerr�r�r{r_�testrrZtest.supportrrrr	r
Z
unittest.mockrr0�platformrZSMTPChannelr"r#ZTestCaserVrXrir�r�rjr�r�rrrSrDrMrV�	Exceptionrrrkrhr{r�r�r�r�r�r�rS�mainrrrr�<module>s�cX ��9Eo1