Your IP : 216.73.216.213


Current Path : /opt/alt/python36/lib64/python3.6/test/__pycache__/
Upload File :
Current File : //opt/alt/python36/lib64/python3.6/test/__pycache__/test_smtplib.cpython-36.pyc

3

� fE��
@s�ddlZddlZddlZddlmZddlmZddl	Zddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlmZmZddlmZdZdZdZyddlZWnek
r�dZYnXejZej d	k�rd
d�Z!e!ej"_!dd
�Z#Gdd�dej$�Z%dd�Z&dZ'dZ(ej)ed�Gdd�dej$��Z*Gdd�dej$�Z+Gdd�dej$�Z,ej)ed�Gdd�dej$��Z-ej)ed�Gdd�dej$��Z.dd d!d"�Z/d?Z0d%Z1d#d&gd'gd(�Z2Gd)d*�d*e3�Z4Gd+d,�d,ej"�Z5Gd-d.�d.ej6�Z7ej)ed�Gd/d0�d0ej$��Z8Gd1d2�d2e7�Z9ej)ed�Gd3d4�d4ej$��Z:ed5d6d7�Z;Gd8d9�d9e5�Z<Gd:d;�d;e7�Z=ej)ed�Gd<d=�d=ej$��Z>e?d>k�r�ej@�dS)@�N)�EmailMessage)�body_encode)�support�mock_socket)�Mock�	localhostz	127.0.0.1z::1�darwincCsdS)N�)�selfr	r	�6/opt/alt/python36/lib64/python3.6/test/test_smtplib.py�handle_expt%src
Cs�|j�|j�z�y|j�\}}Wntjk
r8YnXXd}xH|r�|dkr�tjg|gg�\}}}|r||j|�}	||	d�}|d8}q@W|j�Wd|j�|j�XdS)Ni�r�)Zlisten�setZaccept�socket�timeout�select�send�close)
�evtZbuf�serv�conn�addr�n�r�w�eZsentr	r	r�server*s 
rc@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�port)r
r	r	r�setUpBszGeneralTests.setUpcCs
tt_dS)N)rr)r
r	r	r�tearDownFszGeneralTests.tearDowncCsd}d}|j|tj|��dS)Nzabc
.jkl
foo
..bluezabc
..jkl
foo
...blue)�assertEqualrZ	quotedata)r
Zteststr�expectedr	r	r�
testQuoteDataKszGeneralTests.testQuoteDatacCs$tjd�tjt|j�}|j�dS)Ns220 Hola mundo)r�
reply_withr�SMTP�HOSTr r)r
�smtpr	r	r�
testBasic1Ps
zGeneralTests.testBasic1cCs6tjd�tjt|jdd�}|j|jd�|j�dS)Ns220 Hola mundo�	127.0.0.1�M)�source_address)r+r,)r+r,)	rr&rr'r(r r#r-r)r
r)r	r	r�testSourceAddressVs


zGeneralTests.testSourceAddresscCs*tjd�tjdt|jf�}|j�dS)Ns220 Hola mundoz%s:%s)rr&rr'r(r r)r
r)r	r	r�
testBasic2^s
zGeneralTests.testBasic2cCs6tjd�tjt|jdd�}|j|jd�|j�dS)Ns220 Hola mundoZtesthost)�local_hostname)	rr&rr'r(r r#r0r)r
r)r	r	r�testLocalHostNameds
zGeneralTests.testLocalHostNamecCsptjd�|jtj��tjd�|jtj�d�ztjt|j	�}Wdtjd�X|j|j
j�d�|j�dS)Ns220 Hola mundo�)
rr&�assertIsNone�getdefaulttimeout�setdefaulttimeoutr#rr'r(r �sock�
gettimeoutr)r
r)r	r	r�testTimeoutDefaultks

zGeneralTests.testTimeoutDefaultcCsbtjd�|jtj��tjd�ztjt|j	dd�}Wdtjd�X|j|j
j��|j�dS)Ns220 Hola mundor2)r)
rr&r3rr4r5rr'r(r r6r7r)r
r)r	r	r�testTimeoutNonews

zGeneralTests.testTimeoutNonecCs:tjd�tjt|jdd�}|j|jj�d�|j	�dS)Ns220 Hola mundor2)r)
rr&rr'r(r r#r6r7r)r
r)r	r	r�testTimeoutValue�s
zGeneralTests.testTimeoutValuec
Cshtjd�tj�}|jd�tj��}|jt|j	�WdQRX|j
�tjdtj
�}|j|j�|�dS)Ns220 Hello worldr
z	^connect:)rr&rr'�set_debuglevelr�captured_stderr�connectr(r r�re�compile�	MULTILINE�assertRegex�getvalue)r
r)�stderrr$r	r	r�test_debuglevel�s


zGeneralTests.test_debuglevelc
Cshtjd�tj�}|jd�tj��}|jt|j	�WdQRX|j
�tjdtj
�}|j|j�|�dS)Ns220 Hello world�z#^\d{2}:\d{2}:\d{2}\.\d{6} connect: )rr&rr'r;rr<r=r(r rr>r?r@rArB)r
r)rCr$r	r	r�test_debuglevel_2�s


zGeneralTests.test_debuglevel_2N)�__name__�
__module__�__qualname__r!r"r%r*r.r/r1r8r9r:rDrFr	r	r	rr@s
rcCs�|j�zvyZttd�rtj}ntj}d}x8tjr`|dkr`|dtj�|j�rV|j�P|d8}q*WWnt	j
k
rzYnXWd|j�s�tjd�|j�tj
�|j�XdS)N�polli�rg{�G�z�?r
g�?)r�hasattrr�asyncoreZpoll2rJZ
socket_mapZis_setrrr�time�sleepZ	close_all)r�serv_evt�
client_evtZpoll_funrr	r	r�debugging_server�s&


rQz&---------- MESSAGE FOLLOWS ----------
z&------------ END MESSAGE ------------
z!Threading required for this test.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�ZdS)4�DebuggingServerTestsNcCs�tj|_tjt_tj|_tj�|_	|j	t_t
j�|_t
j�|_
tj|_tj�t_tjtdfddd�|_|jjj�d|_|j|j|j
f}t
jt|d�|_|jj�|jj�|jj�dS)	Nr�nowherer
T)�decode_data)�target�args���)rSrW)r�getfqdn�real_getfqdnr�sys�stdout�
old_stdout�io�StringIO�output�	threading�EventrOrP�smtpd�DEBUGSTREAM�old_DEBUGSTREAMZDebuggingServerr(r�getsocknamer �ThreadrQ�thread�start�wait�clear)r
�	serv_argsr	r	rr!�s"






zDebuggingServerTests.setUpcCsD|jt_|jj�|jj�|jj�|j	t
_tj
j�|jt_
dS)N)rYrrXrPrrOrirg�joinr\rZr[rbrcrrd)r
r	r	rr"�s



zDebuggingServerTests.tearDowncCs tjt|jddd�}|j�dS)Nr�)r0r)rr'r(r �quit)r
r)r	r	r�	testBasic�szDebuggingServerTests.testBasiccCs�tj�}yFtjt|jddd|fd�}|j|jd|f�|j|jd�|j	�Wn>t
k
r�}z"|jtjkrz|j
d|��WYdd}~XnXdS)Nrrmz	127.0.0.1)r0rr-zcouldn't bind to port %d)rZfind_unused_portrr'r(r r#r-r0rn�OSError�errnoZ
EADDRINUSEZskipTest)r
r r)rr	r	rr.�sz&DebuggingServerTests.testSourceAddresscCs4tjt|jddd�}d}|j|j�|�|j�dS)Nrrm)r0r��OK)rrrs)rr'r(r r#�nooprn)r
r)r$r	r	r�testNOOPszDebuggingServerTests.testNOOPcCs4tjt|jddd�}d}|j|j�|�|j�dS)Nrrm)r0rrr�OK)rrrv)rr'r(r r#Zrsetrn)r
r)r$r	r	r�testRSETszDebuggingServerTests.testRSETcCs4tjt|jddd�}d}|j|j�|�|j�dS)Nrrm)r0rrr�
SIZE 33554432
HELP)rrrx)rr'r(r r#�ehlorn)r
r)r$r	r	r�testELHOszDebuggingServerTests.testELHOcCs>tjt|jddd�}d}|jd�|j|j�|�|j�dS)Nrrm)r0r��EXPN not implementedZEXPN)r{r|)rr'r(r �putcmdr#Zgetreplyrn)r
r)r$r	r	r�testEXPNNotImplementeds

z+DebuggingServerTests.testEXPNNotImplementedcCs^tjt|jddd�}|j|j�|jt��}|jd�WdQRX|j	dt
|j��|j�dS)Nr�
)r0rzhelo
X-INJECTEDzprohibited newline characters)
rr'r(r �
addCleanupr�assertRaises�
ValueErrorr}�assertIn�str�	exceptionrn)r
r)�excr	r	r�&test_issue43124_putcmd_escapes_newline!sz;DebuggingServerTests.test_issue43124_putcmd_escapes_newlinecCsHtjt|jddd�}d	}|j|jd�|�|j|jd�|�|j�dS)
Nrrm)r0r�s*Cannot VRFY user, but will accept message sand attempt deliveryznobody@nowhere.com�>Cannot VRFY user, but will accept message and attempt delivery)r�r�)rr'r(r r#�vrfyZverifyrn)r
r)r$r	r	r�testVRFY+szDebuggingServerTests.testVRFYcCs<tjt|jddd�}|j�d}|j|j�|�|j�dS)Nrrm)r0r��Duplicate HELO/EHLO)r�r�)rr'r(r Zhelor#rn)r
r)r$r	r	r�testSecondHELO3s
z#DebuggingServerTests.testSecondHELOcCs0tjt|jddd�}|j|j�d�|j�dS)Nrrm)r0rs#Supported commands: EHLO HELO MAIL sRCPT DATA RSET NOOP QUIT VRFYs@Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY)rr'r(r r#�helprn)r
r)r	r	r�testHELP<s
zDebuggingServerTests.testHELPcCszd}tjt|jddd�}|jdd|�tjd�|j�|jj	�|j
j�|jj
�dt|tf}|j|jj�|�dS)	NzA test messagerrm)r0r�John�Sallyg{�G�z�?z%s%s
%s)rr'r(r �sendmailrMrNrnrPrrOrir_�flush�	MSG_BEGIN�MSG_ENDr#rB)r
�mr)�mexpectr	r	r�testSendBs



zDebuggingServerTests.testSendcCs�d}tjt|jddd�}|jdd|�tjd�|j�|jj	�|j
j�|jj
�dt|jd	�tf}|j|jj�|�dS)
NsA test messagerrm)r0rr�r�g{�G�z�?z%s%s
%s�ascii)rr'r(r r�rMrNrnrPrrOrir_r�r��decoder�r#rB)r
r�r)r�r	r	r�testSendBinarySs



z#DebuggingServerTests.testSendBinarycCszd}tjt|jddd�}|jdd|�tjd�|j�|jj	�|j
j�|jj
�dt|tf}|j|jj�|�dS)	Nz.A test
.mes.sage.rrm)r0rr�r�g{�G�z�?z%s%s
%s)rr'r(r r�rMrNrnrPrrOrir_r�r�r�r#rB)r
r�r)r�r	r	r�testSendNeedingDotQuoteas



z,DebuggingServerTests.testSendNeedingDotQuotecCs�d}tjt|jddd�}|j|j�|jt��}|jdd|�WdQRX|j	dt
|j��tj
d�|j�tjj�}|jd	|�dS)
Nzwazzuuup
linetwoz
hi
X-INJECTEDr)r0rz	hi@me.comz
you@me.comz2prohibited newline characters: ehlo hi\nX-INJECTEDg{�G�z�?z
X-INJECTED)rr'r(r r�rr�r�r�r�r�r�rMrNrnrbrcrB�assertNotIn)r
r�r)r��debugoutr	r	r�$test_issue43124_escape_localhostnameps

z9DebuggingServerTests.test_issue43124_escape_localhostnamecCs�d}tjt|jddd�}|j|j�|jdd|�|jt��}|j	dddg�WdQRXt
|j�}|jd	|�|jd
|�t
jd�|j�tjj�}|jd|�|jd
|�|jd|�|jd|�dS)Nzwazzuuup
linetworr)r0rz	hi@me.comz
you@me.comzX-OPTION
X-INJECTED-1zX-OPTION2
X-INJECTED-2zprohibited newline charactersz.X-OPTION\nX-INJECTED-1 X-OPTION2\nX-INJECTED-2g{�G�z�?zX-OPTIONz	X-OPTION2zX-INJECTED-1zX-INJECTED-2)rr'r(r r�rr�r�r��mailr�r�r�rMrNrnrbrcrBr�)r
r�r)r��msgr�r	r	r�test_issue43124_escape_options�s$


z3DebuggingServerTests.test_issue43124_escape_optionscCs�d}tjt|jddd�}|jdd|�tjd�|j�|jj	�|j
j�|jj
�dt|tf}|j|jj�|�tjj�}tjd	tj�}|j||�dS)
NzA test messagerrm)r0rz<>r�g{�G�z�?z%s%s
%sz^sender: <>$)rr'r(r r�rMrNrnrPrrOrir_r�r�r�r#rBrbrcr>r?r@rA)r
r�r)r�r��senderr	r	r�testSendNullSender�s




z'DebuggingServerTests.testSendNullSendercCs�tjjjd�}tjt|jddd�}|j|ddd�t	j
d�|j�|jj
�|jj�|jj�tjd�|d	<d
t|j�tf}|j|jj�|�dS)NzA test messagerrm)r0rr�r�)�	from_addr�to_addrsg{�G�z�?zX-Peerz%s%s
%s)�email�mime�text�MIMETextrr'r(r �send_messagerMrNrnrPrrOrir_r�r�
gethostbynamer��	as_stringr�r#rB)r
r�r)r�r	r	r�testSendMessage�s



z$DebuggingServerTests.testSendMessagecCstjjjd�}d|d<d|d<d|d<d|d	<tjt|jd
dd�}|j|�t	j
d
�|j�|j|d	d�|j
j�|jj�|jj�tjd
�|d<|d	=dt|j�tf}|j|jj�|�tjj�}tjdtj�}|j||�x,dD]$}tjdj|�tj�}|j||�q�WdS)NzA test messagezfoo@bar.com�Fromr��TozSally, Fred�CCz?John Root <root@localhost>, "Dinsdale" <warped@silly.walks.com>�Bccrrm)r0rg{�G�z�?zX-Peerz%s%s
%sz^sender: foo@bar.com$r��Fred�root@localhost�warped@silly.walks.comz^recips: .*'{}'.*$)r�r�r�r�r�) r�r�r�r�rr'r(r r�rMrNrnr#rPrrOrir_r�rr�r�r�r�rBrbrcr>r?r@rA�format)r
r�r)r�r�r�r�to_addrr	r	r�testSendMessageWithAddresses�s2





z1DebuggingServerTests.testSendMessageWithAddressescCs�tjjjd�}d|d<d|d<tjt|jddd�}|j|�t	j
d	�|j�|jj
�|jj�|jj�tjd�|d
<dt|j�tf}|j|jj�|�tjj�}tjdtj�}|j||�x,dD]$}tjdj|�tj�}|j||�q�WdS)NzA test messagezfoo@bar.comr�zJohn, Dinsdaler�rrm)r0rg{�G�z�?zX-Peerz%s%s
%sz^sender: foo@bar.com$r��Dinsdalez^recips: .*'{}'.*$)r�r�) r�r�r�r�rr'r(r r�rMrNrnrPrrOrir_r�rr�r�r�r�r#rBrbrcr>r?r@rAr�)r
r�r)r�r�r�rr�r	r	r� testSendMessageWithSomeAddresses�s(






z5DebuggingServerTests.testSendMessageWithSomeAddressesc	Cstjjjd�}d|d<d|d<tjt|jddd�}|j|d	d
d�t	j
d�|j�|jj
�|jj�|jj�tjd�|d
<dt|j�tf}|j|jj�|�tjj�}tjdtj�}|j||�x,dD]$}tjdj|�tj�}|j ||�q�Wtjdtj�}|j||�dS)NzA test messagezfoo@bar.comr�zJohn, Dinsdaler�rrm)r0rzjoe@example.comzfoo@example.net)r�r�g{�G�z�?zX-Peerz%s%s
%sz^sender: joe@example.com$r�r�z^recips: .*'{}'.*$z^recips: .*'foo@example.net'.*$)r�r�)!r�r�r�r�rr'r(r r�rMrNrnrPrrOrir_r�rr�r�r�r�r#rBrbrcr>r?r@rAr�ZassertNotRegex)	r
r�r)r�r�r�rr�Zrecipr	r	r�%testSendMessageWithSpecifiedAddresses�s,





z:DebuggingServerTests.testSendMessageWithSpecifiedAddressescCs�tjjjd�}d|d<d|d<d|d<tjt|jdd	d
�}|j|�t	j
d�|j�|jj
�|jj�|jj�tjd�|d<d
t|j�tf}|j|jj�|�tjj�}tjdtj�}|j||�x,dD]$}tjdj|�tj�}|j||�q�WdS)NzA test messagezBernard, Biancar�z#the_rescuers@Rescue-Aid-Society.comZSenderzJohn, Dinsdaler�rrm)r0rg{�G�z�?zX-Peerz%s%s
%sz-^sender: the_rescuers@Rescue-Aid-Society.com$r�r�z^recips: .*'{}'.*$)r�r�) r�r�r�r�rr'r(r r�rMrNrnrPrrOrir_r�rr�r�r�r�r#rBrbrcr>r?r@rAr�)r
r�r)r�r�r�rr�r	r	r�testSendMessageWithMultipleFroms*






z4DebuggingServerTests.testSendMessageWithMultipleFromcCs2tjjjd�}d|d<d|d<d|d<d|d	<d
|d<d|d
<d|d<d|d<tjt|jddd�}|j|�t	j
d�|j�|jj
�|jj�|jj�|d	=|d=tjd�|d<dt|j�tf}|j|jj�|�tjj�}tjdtj�}|j||�x.dD]&}tjdj|�tj�}|j||��qWdS)NzA test messagezfoo@bar.comr�r�r�zSally, Fredr�z?John Root <root@localhost>, "Dinsdale" <warped@silly.walks.com>r�zThu, 1 Jan 1970 17:42:00 +0000zResent-Datezholy@grail.netzResent-Fromz&Martha <my_mom@great.cooker.com>, Jeffz	Resent-To�doe@losthope.netz
Resent-Bccrrm)r0rg{�G�z�?zX-Peerz%s%s
%sz^sender: holy@grail.net$�my_mom@great.cooker.com�Jeffz^recips: .*'{}'.*$)r�r�r�) r�r�r�r�rr'r(r r�rMrNrnrPrrOrir_r�rr�r�r�r�r#rBrbrcr>r?r@rAr�)r
r�r)r�r�r�rr�r	r	r�testSendMessageResent0s8






z*DebuggingServerTests.testSendMessageResentc	Cs�tjjjd�}d|d<d|d<d|d<d|d	<d
|d<d|d
<d|d<d|d<d|d<d|d<d|d
<tjt|jddd�}|jt	��|j
|�WdQRX|j�dS)NzA test messagezfoo@bar.comr�r�r�zSally, Fredr�z?John Root <root@localhost>, "Dinsdale" <warped@silly.walks.com>r�zThu, 1 Jan 1970 17:42:00 +0000zResent-Datezholy@grail.netzResent-Fromz&Martha <my_mom@great.cooker.com>, Jeffz	Resent-Tozdoe@losthope.netz
Resent-BcczThu, 2 Jan 1970 17:42:00 +0000rrm)r0r)r�r�r�r�rr'r(r r�r�r�r)r
r�r)r	r	r�#testSendMessageMultipleResentRaisesRs z8DebuggingServerTests.testSendMessageMultipleResentRaises)rGrHrI�maxDiffr!r"ror.rurwrzr~r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r	r	r	rrR�s4

	!"rRc@seZdZdd�Zdd�ZdS)�NonConnectingTestscCs.tj�}|jtj|j�|jtj|jd�dS)Nztest msg)rr'r��SMTPServerDisconnectedryr)r
r)r	r	r�testNotConnectedfsz#NonConnectingTests.testNotConnectedcCs&|jttjdd�|jttjd�dS)NrZboguszlocalhost:bogus)r�rprr')r
r	r	r�testNonnumericPortps

z%NonConnectingTests.testNonnumericPortN)rGrHrIr�r�r	r	r	rr�ds
r�c@s$eZdZdd�Zdd�Zdd�ZdS)�DefaultArgumentsTestscCsDt�|_d|jd<tj�|_tdd�|j_t�t�|j_|j_dS)NuPáolo <főo@bar.com>r����OK)Zreturn_value)r�r�)	rr�rr'r)rry�has_extnr�)r
r	r	rr!zs


zDefaultArgumentsTests.setUpcCs`d}|jj|j�|jj|j�|j|jjjddd|�|j|jjjddd|�dS)N�SMTPUTF8�
BODY=8BITMIMErrmr
)r�r�)r)r�r�r#r��call_args_list)r
�expected_mail_optionsr	r	rr��sz%DefaultArgumentsTests.testSendMessagecCsNdg}d}|jj|jdd|�|j|dg�|j|jjjddd|�dS)N�STARTTLSr��
BODY=8BITMIMErrm)r�r�r�)r)r�r�r#r�r�)r
�mail_optionsr�r	r	r�testSendMessageWithMailOptions�sz4DefaultArgumentsTests.testSendMessageWithMailOptionsN)rGrHrIr!r�r�r	r	r	rr�xs	r�c@s$eZdZdd�Zdd�Zdd�ZdS)�BadHELOServerTestscCs4tt_tjd�tj|_tj�|_	|j	t_d|_
dS)Ns199 no hello for you!r)rrrr&rZr[r\r]r^r_r )r
r	r	rr!�s

zBadHELOServerTests.setUpcCstt_|jt_dS)N)rrr\rZr[)r
r	r	rr"�szBadHELOServerTests.tearDowncCs|jtjtjt|jdd�dS)Nrrm)r�rZSMTPConnectErrorr'r(r )r
r	r	r�testFailingHELO�sz"BadHELOServerTests.testFailingHELON)rGrHrIr!r"r�r	r	r	rr��sr�c@s:eZdZddejddZdd�Zdd�Zd	d
�ZdS)�TooLongLineTestss250 OK�.rE�
cCs�tj|_tj�|_|jt_tj�|_t	j	t	j
t	j�|_|jj
d�tj|j�|_|j|j|jf}tjt|d�}|j�|j|j�|jj�|jj�dS)N�)rUrV)rZr[r\r]r^r_r`rarrZAF_INETZSOCK_STREAMr6Z
settimeoutrZ	bind_portr �respdatarfrrhr�rlrirj)r
Zservargsrgr	r	rr!�s


zTooLongLineTests.setUpcCs|jj�|jt_dS)N)rrir\rZr[)r
r	r	rr"�s
zTooLongLineTests.tearDowncCs|jtjtjt|jdd�dS)Nrrm)r�r�SMTPResponseExceptionr'r(r )r
r	r	r�testLineTooLong�sz TooLongLineTests.testLineTooLongN)	rGrHrIrZ_MAXLINEr�r!r"r�r	r	r	rr��sr�zJohn AzSally BzRuth C)zMr.A@somewhere.comzMs.B@xn--fo-fka.comzMrs.C@somewhereesle.com�Mr.A@somewhere.com�somepasswordz<PENCeUxFREJoU0NnbmhNWitOMjNGNndAZWx3b29kLmlubm9zb2Z0LmNvbT4=zMrs.C@somewhereesle.comzMs.B@xn--fo-fka.com)zlist-1zlist-2c@seZdZdS)�ResponseExceptionN)rGrHrIr	r	r	rr��sr�cs�eZdZdZdZdZdZdZdZdZ	dZ
dZ�fdd�Z�fdd�Z
dd	�Zd
d�Zdd
�Zd&dd�Zd'dd�Zd(dd�Zdd�Zdd�Zdd�Z�fdd�Z�fdd�Z�fdd�Z�fd d!�Z�fd"d#�Zd$d%�Z�ZS))�SimSMTPChannelNr�ccs,djdd�|D��|_tt|�j||�dS)N�cSsg|]}dj|��qS)z	250-{0}
)r�)�.0�xr	r	r�
<listcomp>�sz+SimSMTPChannel.__init__.<locals>.<listcomp>)rl�_extrafeatures�superr��__init__)r
Zextra_featuresrV�kw)�	__class__r	rr��szSimSMTPChannel.__init__cs�|j|jkr�|jj|j�}tdt|�tjd�g|_y|j	|�Wn>t
k
r�}z"|j|_|jd|j
|jf�dSd}~XnXt�j�dS)NzData:)�filez%s %s)�
smtp_state�AUTHZ_emptystringrlZreceived_lines�print�reprrbrc�auth_objectr��COMMAND�push�	smtp_code�
smtp_errorr��found_terminator)r
�liner)r�r	rr��szSimSMTPChannel.found_terminatorcCs�|js|jd�dS|js&d|jkr4|jd�dS|jdk	rL|jd�dS|j�}t|�d
krn|jd�dSd|d	j�jd
d�}yt	||�|_
Wn$tk
r�|jdj|��dSX|j
|_|j
t|�dkr�|dnd�dS)Nz503 Error: send EHLO firstr�z(500 Error: command "AUTH" not recognizedz3503 Bad sequence of commands: already authenticatedr
rEz/501 Syntax: AUTH <mechanism> [initial-response]z_auth_%sr�-�_zQ504 Command parameter not implemented: unsupported  authentication mechanism {!r})r
rE)�
seen_greetingr��
extended_smtpr��authenticated_user�split�len�lower�replace�getattrr��AttributeErrorr�r�r�)r
�argrVZauth_object_namer	r	r�	smtp_AUTH�s.



zSimSMTPChannel.smtp_AUTHcCs,|r||_|jd�n
|jd�|j|_dS)Nz235 Authentication Succeededz&535 Authentication credentials invalid)r�r�r�r�)r
�userZvalidr	r	r�_authenticateds

zSimSMTPChannel._authenticatedcCstj|jd��jd�S)Nr�zutf-8)�base64Zdecodebytes�encoder�)r
�stringr	r	r�_decode_base64szSimSMTPChannel._decode_base64cCs�|dkr|jd�nh|j|�}y|jd��^}}}Wn2tk
rf}z|jdj||��dSd}~XnX|j||tdk�dS)Nz334 �z=535 Splitting response {!r} into user and password failed: {}r
)r�r	r�r�r�r�sim_auth)r
r�logpassr�r�passwordrr	r	r�_auth_plains

zSimSMTPChannel._auth_plaincCs^|dkr|jd�nFt|d�s6|j|�|_|jd�n$|j|�}|j|j|tdk�|`dS)Nz334 VXNlcm5hbWU6�_auth_login_userz334 UGFzc3dvcmQ6r
)r�rKr	rrr)r
rr
r	r	r�_auth_login$s

zSimSMTPChannel._auth_logincCs�|dkr|jdjt��n�|j|�}y|j�\}}Wn2tk
rf}z|jdj||��dSd}~XnXtjtdj	d�|jt�j	d�d�j
�}|j|||k�dS)Nz334 {}z=535 Splitting response {!r} into user and password failed: {}Fr
r�Zmd5)r�r��sim_cram_md5_challenger	r�r��hmacZHMACrrZ	hexdigestr)r
rrrZhashed_passrZvalid_hashed_passr	r	r�_auth_cram_md51s


zSimSMTPChannel._auth_cram_md5cCs,d}||jd}|j|�||_d|_dS)NzH250-testhost
250-EXPN
250-SIZE 20000000
250-STARTTLS
250-DELIVERBY
z250 HELPT)r�r�r�r�)r
r�respr	r	r�	smtp_EHLOCs

zSimSMTPChannel.smtp_EHLOcCs8|tkr&|jdt|tj|�f�n|jd|�dS)Nz	250 %s %sz550 No such user: %s)�	sim_usersr�r�	quoteaddr)r
rr	r	r�	smtp_VRFYNszSimSMTPChannel.smtp_VRFYcCs�|j�}|tkrxt|}xht|�D]P\}}tj|�}|t|�dkr\|jdt||f�q"|jdt||f�q"Wn
|jd�dS)Nr
z	250-%s %sz	250 %s %sz550 No access for you!)r��	sim_lists�	enumeraterrr�r�r)r
rZ	list_nameZ	user_listrZ
user_emailZquoted_addrr	r	r�	smtp_EXPNUs
zSimSMTPChannel.smtp_EXPNcs4|jdkrtt|�j|�n|j|j�|j�dS)N)�
quit_responser�r��	smtp_QUITr��close_when_done)r
r)r�r	rrbs
zSimSMTPChannel.smtp_QUITcs6|jdkrt�j|�n|j|j�|jr2|j�dS)N)�
mail_responser��	smtp_MAILr��
disconnectr)r
r)r�r	rr is

zSimSMTPChannel.smtp_MAILcsB|jdkrt�j|�dS|jd7_|j|j|jd�dS)Nr
)�
rcpt_responser��	smtp_RCPT�
rcpt_countr�)r
r)r�r	rr#qs

zSimSMTPChannel.smtp_RCPTcs|jd7_t�j|�dS)Nr
)�
rset_countr��	smtp_RSET)r
r)r�r	rr&xszSimSMTPChannel.smtp_RSETcs(|jdkrt�j|�n|j|j�dS)N)�
data_responser��	smtp_DATAr�)r
r)r�r	rr(|s
zSimSMTPChannel.smtp_DATAcCs�dS)Nr	)r
r	r	r�handle_error�szSimSMTPChannel.handle_error)N)N)N)rGrHrIrrr"r'r$r%r!r�r�r�r�rrr	rrrrrrrr r#r&r(r)�
__classcell__r	r	)r�rr��s4



r�c@s8eZdZeZdd�Zdd�Zdd�Zdd�Zd	d
�Z	dS)�
SimSMTPServercOs$g|_i|_tjj|f|�|�dS)N)�_extra_features�
_addressesrb�
SMTPServerr�)r
rVr�r	r	rr��szSimSMTPServer.__init__cCs|j|j||||jd�|_dS)N)rT)�
channel_classr,�_decode_data�_SMTPchannel)r
rrr	r	r�handle_accepted�s
zSimSMTPServer.handle_acceptedcCs||jd<||jd<dS)N�from�tos)r-)r
�peer�mailfrom�rcpttos�datar	r	r�process_message�s
zSimSMTPServer.process_messagecCs|jj|�dS)N)r,�append)r
Zfeaturer	r	r�add_feature�szSimSMTPServer.add_featurecCs�dS)Nr	)r
r	r	rr)�szSimSMTPServer.handle_errorN)
rGrHrIr�r/r�r2r9r;r)r	r	r	rr+�sr+c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�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-S).�SMTPSimTestscCs�tj|_tjt_tj�|_tj�|_tt	dfddd�|_
|j
jj�d|_|j
|j|jf}tj
t|d�|_|jj�|jj�|jj�dS)	NrrSr
T)rT)rUrVrW)rSrW)rrXrYrr`rarOrPr+r(rrer rfrQrgrhrirj)r
rkr	r	rr!�s



zSMTPSimTests.setUpcCs*|jt_|jj�|jj�|jj�dS)N)	rYrrXrPrrOrirgrl)r
r	r	rr"�s

zSMTPSimTests.tearDowncCs tjt|jddd�}|j�dS)Nrr�)r0r)rr'r(r rn)r
r)r	r	rro�szSMTPSimTests.testBasiccCs�tjt|jddd�}|j|ji�dddddd�}|j�|j|j|�x|D]}|j|j|��qNW|j	|jd��|j
�dS)Nrr�)r0rr�Z20000000)�expn�sizeZstarttlsZ	deliverbyr�zunsupported-feature)rr'r(r r#�esmtp_featuresry�
assertTruer��assertFalsern)r
r)Zexpected_features�kr	r	r�testEHLO�s
zSMTPSimTests.testEHLOcCs�tjt|jddd�}xBtj�D]6\}}dtd|tj|�fd�f}|j|j	|�|�qWd}dd	|j
d�f}|j|j	|�|�|j�dS)
Nrr�)r0rrrz%s %sr�znobody@nowhere.comi&zNo such user: %s)rr'r(r r�items�bytesrr#r�rrn)r
r)Z	addr_spec�name�expected_known�u�expected_unknownr	r	rr��szSMTPSimTests.testVRFYc	Cs�tjt|jddd�}xhtj�D]\\}}g}x(|D] }|jdt|tj|�f�q0Wdt	dj
|�d�f}|j|j|�|�qWd}d}|j|j|�|�|j
�dS)Nrr�)r0rz%s %srr�
r�zPSU-Members-List�&�No access for you!)rKrL)rr'r(r rrDr:rrrErlr#r=rn)	r
r)Zlistname�membersZusersr�rGrHrIr	r	r�testEXPN�s
 zSMTPSimTests.testEXPNcCsL|jjd�tjt|jddd�}|jtdtd�}|j|d	�|j	�dS)
Nz
AUTH PLAINrr�)r0rrr
���Authentication Succeeded)rOrP)
rr;rr'r(r �loginrr#r)r
r)rr	r	r�testAUTH_PLAIN�s
zSMTPSimTests.testAUTH_PLAINcCsL|jjd�tjt|jddd�}|jtdtd�}|j|d	�|j	�dS)
Nz
AUTH LOGINrr�)r0rrr
rO�Authentication Succeeded)rOrS)
rr;rr'r(r rQrr#r)r
r)rr	r	r�testAUTH_LOGIN�s
zSMTPSimTests.testAUTH_LOGINcCsL|jjd�tjt|jddd�}|jtdtd�}|j|d	�|j	�dS)
Nz
AUTH CRAM-MD5rr�)r0rrr
rO�Authentication Succeeded)rOrU)
rr;rr'r(r rQrr#r)r
r)rr	r	r�testAUTH_CRAM_MD5s
zSMTPSimTests.testAUTH_CRAM_MD5cCsL|jjd�tjt|jddd�}|jtdtd�}|j|d	�|j	�dS)
NzAUTH BOGUS PLAIN LOGIN CRAM-MD5rr�)r0rrr
rO�Authentication Succeeded)rOrW)
rr;rr'r(r rQrr#r)r
r)rr	r	r�testAUTH_multiple	s
zSMTPSimTests.testAUTH_multiplecCs�dddh}x|D]}|jjdj|��qWx�|D]�}|j|d��ttjt|jddd�}|jd	�t	d
t	d|_
|_d|j�j
d
d�}|j|t||��}|j|d�|j�WdQRXq0WdS)NzCRAM-MD5ZPLAINZLOGINzAUTH {})�	mechanismrr�)r0rZfoorr
Zauth_r�r�rO�Authentication Succeeded)rOrZ)rr;r�ZsubTestrr'r(r ryrrr
r�r��authrr#r)r
Z	supportedrYr)�methodrr	r	r�test_auth_functions





zSMTPSimTests.test_auth_functioncCs�tjt|jddd�}|j�\}}|j|d�|jd|j�|j�|j	d|j�|j
t|j�|j	d|j�|j�|jd|j�|j�dS)Nrr�)r0rrrr>)rr'r(r ryr#r�r?rnr�r=Zehlo_or_helo_if_needed)r
r)�code�messager	r	r�test_quit_resets_greeting s
z&SMTPSimTests.test_quit_resets_greetingcCs|tjt|j��}|j�\}}|j|d�WdQRX|jtj|jd�tjt|j��}|j	�WdQRX|jtj|jd�dS)Nrrsfoo)
rr'r(r rtr#r�r�rr)r
r)r^r_r	r	r�test_with_statement/sz SMTPSimTests.test_with_statementcCsh|jtj��2}tjt|j��}|j�d|jj_	WdQRXWdQRX|j
|jjd�|j
|jj
d�dS)Nz421 QUIT FAILEDi�sQUIT FAILED)r�rr�r'r(r rtrr1rr#r�r�r�)r
�errorr)r	r	r� test_with_statement_QUIT_failure8sz-SMTPSimTests.test_with_statement_QUIT_failurecCsftjt|jddd�}|j�d|jj_d|jj_|j	tj
��|jddd�WdQRX|j|j
�dS)	Nrr�)r0rz451 Requested action abortedTr�r�ztest message)rr'r(r rtrr1rr!r��SMTPSenderRefusedr�r3r6)r
r)r	r	r�test__rest_from_mail_cmdDs

z%SMTPSimTests.test__rest_from_mail_cmdcCsntjt|jddd�}|j�d|jj_|jtj	��|j
ddd�WdQRX|j|j�|j
|jjjd�dS)	Nrr�)r0rz421 closing connectionr�r�ztest messager)rr'r(r rtrr1rr�rdr�r3r6r#r%)r
r)r	r	r�test_421_from_mail_cmdNs
z#SMTPSimTests.test_421_from_mail_cmdcCs�tjt|jddd�}|j�ddg|jj_|jtj	��}|j
dddd	gd
�WdQRX|j|j�|j
|jjjd�|j|jjdddi�dS)Nrr�)r0rz250 acceptedz421 closingr�r�ZFrankZGeorgeztest messager��closing)rgrh)rr'r(r rtrr1r"r�ZSMTPRecipientsRefusedr�r3r6r#r%�assertDictEqualr�rV)r
r)rr	r	r�test_421_from_rcpt_cmdWsz#SMTPSimTests.test_421_from_rcpt_cmdcCs~Gdd�dt�}||j_tjt|jddd�}|j�|jtj	��|j
ddgd�WdQRX|j|j�|j
|jjjd	�dS)
NcseZdZ�fdd�Z�ZS)z=SMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannelcs&|j|jkr|jd�n
t�j�dS)Nz421 closing)r�ZDATAr�r�r�)r
)r�r	rr�cszNSMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannel.found_terminator)rGrHrIr�r*r	r	)r�r�MySimSMTPChannelbsrkrr�)r0rzJohn@foo.orgz
Sally@foo.orgztest messager)r�rr/rr'r(r rtr�Z
SMTPDataErrorr�r3r6r#r1r$)r
rkr)r	r	r�test_421_from_data_cmdasz#SMTPSimTests.test_421_from_data_cmdcCs�tjt|jddd�}|j|j�|j�|j|j�|j	|j
d��|jtj|j
ddddd	gd
�|jtj|jddd	gd�dS)Nrrm)r0r�smtputf8r�r�r�z
BODY=8BITMIMEr�)r�)�options)rr'r(r r�rryr@�
does_esmtprAr�r��SMTPNotSupportedErrorr�r�)r
r)r	r	r�4test_smtputf8_NotSupportedError_if_no_server_supportpszASMTPSimTests.test_smtputf8_NotSupportedError_if_no_server_supportcCsHtjt|jddd�}|j|j�|jt|jddd�|jt|j	d�dS)Nrrm)r0rZAliceuBöbr�uÄlice)
rr'r(r r�rr��UnicodeEncodeErrorr�r�)r
r)r	r	r�"test_send_unicode_without_SMTPUTF8s
z/SMTPSimTests.test_send_unicode_without_SMTPUTF8c	Csdt�}d|d<d|d<d|d<tjt|jddd	�}|j|j�|jtj��|j	|�WdQRXdS)
NuPáolo <főo@bar.com>r�r�r�uNudge nudge, wink, wink ὠ9�Subjectrrm)r0r)
rrr'r(r r�rr�rpr�)r
r�r)r	r	r�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|j�t�}tjj	d�|d<tjj	d
�|d	<|j
|j|�i�|j|j
jd
d�|j|j
jddg�dS)Nrrm)r0r�Michaël�michael@example.comr��René�rene@example.comr�r3r4)rvrw)rxry)rr'r(r r�rrr�ZutilsZ
formataddrrir�r#rr-)r
r)r_r	r	r�1test_name_field_not_included_in_envelop_addresses�sz>SMTPSimTests.test_name_field_not_included_in_envelop_addressesN)rGrHrIr!r"rorCr�rNrRrTrVrXr]r`rarcrerfrjrlrqrsrurzr	r	r	rr<�s,	
	

r<c@s&eZdZdd�Zdd�Zddd�ZdS)	�SimSMTPUTF8ServercOs"ddg|_tjj|f|�|�dS)Nr�Z8BITMIME)r,rbr.r�)r
rVr�r	r	rr��s
zSimSMTPUTF8Server.__init__cCs"|j|j||||j|jd�|_dS)N)rT�enable_SMTPUTF8)r/r,r0r|r1)r
rrr	r	rr2�s
z!SimSMTPUTF8Server.handle_acceptedNcCs(||_||_||_||_||_||_dS)N)Z	last_peer�
last_mailfrom�last_rcpttos�last_message�last_mail_options�last_rcpt_options)r
r5r6r7r8r�Zrcpt_optionsr	r	rr9�sz!SimSMTPUTF8Server.process_message)NN)rGrHrIr�r2r9r	r	r	rr{�sr{c@s@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)�SMTPUTF8SimTestsNcCs�tj|_tjt_tj�|_tj�|_tt	dfd	ddd�|_
|j
jj�d|_|j
|j|jf}tj
t|d�|_|jj�|jj�|jj�dS)
NrrSr
FT)rTr|)rUrVrW)rSrW)rrXrYrr`rarOrPr{r(rrer rfrQrgrhrirj)r
rkr	r	rr!�s





zSMTPUTF8SimTests.setUpcCs*|jt_|jj�|jj�|jj�dS)N)	rYrrXrPrrOrirgrl)r
r	r	rr"�s

zSMTPUTF8SimTests.tearDowncCsHtjt|jddd�}|j|j�|j�|j|j�|j|j	d��dS)Nrrm)r0rrm)
rr'r(r r�rryr@ror�)r
r)r	r	r�$test_test_server_supports_extensions�sz5SMTPUTF8SimTests.test_test_server_supports_extensionscCs�djd�}tjt|jddd�}|j|j�|jdd|dd	gd
�|j|j	j
d�|j|j	jdg�|j|j	j|�|j
d|j	j�|j
d	|j	j�|j|j	jg�dS)Nu$¡a test message containing unicode!zutf-8rrm)r0ruJőhnuSállyz
BODY=8BITMIMEr�)r�)rrr'r(r r�rr�r#rr}r~rr�r�r�)r
r�r)r	r	r�,test_send_unicode_with_SMTPUTF8_via_sendmail�s

z=SMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_sendmailcCs�djd�}tjt|jddd�}|j|j�|j�|j|j	dddgd	�d
�|j|j
d�d�|j|j|�d�|j|jj
d�|j|jjdg�|j|jj|�|jd|jj�|jd|jj�|j|jjg�dS)Nu$¡a test message containing unicode!zutf-8rrm)r0ruJőz
BODY=8BITMIMEr�)rnrr�OKuJános)rrr�)rrr�)rrr�)rrr'r(r r�rryr#r�Zrcptr8rr}r~rr�r�r�)r
r�r)r	r	r�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<|jd�tjd�}tjt|jd	d
d�}|j|j	�|j
|j|�i�|j
|jj
d�|j
|jjdg�|j
|jjj�|�|jd
|jj�|jd|jj�|j
|jjg�dS)NuPáolo <főo@bar.com>r�r�r�uNudge nudge, wink, wink ὠ9rtu1oh 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?
            rrm)r0rufőo@bar.comz
BODY=8BITMIMEr�)rZset_content�textwrap�dedentrr'r(r r�rr#r�rr}r~rr�r�r�r�)r
r�r$r)r	r	r�2test_send_message_uses_smtputf8_if_addrs_non_asciis"
	zCSMTPUTF8SimTests.test_send_message_uses_smtputf8_if_addrs_non_ascii)
rGrHrIr�r!r"r�r�r�r�r	r	r	rr��sr�spsudoesnotexistr�)Zeolc@seZdZdd�ZdS)�!SimSMTPAUTHInitialResponseChannelcCsL|j�}|dj�dkr>t|�dkr>|dtkr>|jd�dS|jd�dS)Nr�plainrEr
z235 Okz571 Bad authentication)r�r�r��EXPECTED_RESPONSEr�)r
rrVr	r	rr(s
z+SimSMTPAUTHInitialResponseChannel.smtp_AUTHN)rGrHrIrr	r	r	rr�'sr�c@seZdZeZdS)� SimSMTPAUTHInitialResponseServerN)rGrHrIr�r/r	r	r	rr�6sr�c@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�SMTPAUTHInitialResponseSimTestscCs�tj|_tjt_tj�|_tj�|_tt	dfddd�|_
|j
jj�d|_|j
|j|jf}tj
t|d�|_|jj�|jj�|jj�dS)	NrrSr
T)rT)rUrVrW)rSrW)rrXrYrr`rarOrPr�r(rrer rfrQrgrhrirj)r
rkr	r	rr!<s



z%SMTPAUTHInitialResponseSimTests.setUpcCs*|jt_|jj�|jj�|jj�dS)N)	rYrrXrPrrOrirgrl)r
r	r	rr"Ns

z(SMTPAUTHInitialResponseSimTests.tearDowncCs8|jjd�tjt|jddd�}|jdd�|j�dS)Nz
AUTH PLAINrr�)r0r�psu�doesnotexist)rr;rr'r(r rQr)r
r)r	r	r�%testAUTH_PLAIN_initial_response_loginVs


zESMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_logincCsV|jjd�tjt|jddd�}d|_d|_|jd|j	�\}}|j
�|j|d�dS)	Nz
AUTH PLAINrr�)r0rr�r�r�rO)rr;rr'r(r rr
r[Z
auth_plainrr#)r
r)r^Zresponser	r	r�$testAUTH_PLAIN_initial_response_auth]s

zDSMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_authN)rGrHrIr!r"r�r�r	r	r	rr�:sr��__main__)r�r�)ArLrZemail.mime.textr�Z
email.messagerZemail.base64mimerZ
encode_base64Zemail.utilsrrrbrr]r>rZrMrrqr�ZunittestZtestrrZ
unittest.mockrr(ZHOSTv4ZHOSTv6r`�ImportError�platformrZSMTPChannelrZTestCaserrQr�r�Z
skipUnlessrRr�r�r�r�rrrr�	Exceptionr�r�r.r+r<r{r�r�r�r�r�rG�mainr	r	r	r�<module>s�
_



4

g
-