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.opt-2.pyc

3

��2aE��
@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	�1/opt/alt/python36/lib64/python3.6/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)
�evt�buf�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)�assertEqualr Z	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'r r(r)r!r$r.r)r
r*r	r	r�testSourceAddressVs


zGeneralTests.testSourceAddresscCs*tjd�tjdt|jf�}|j�dS)Ns220 Hola mundoz%s:%s)rr'r r(r)r!r)r
r*r	r	r�
testBasic2^s
zGeneralTests.testBasic2cCs6tjd�tjt|jdd�}|j|jd�|j�dS)Ns220 Hola mundoZtesthost)�local_hostname)	rr'r r(r)r!r$r1r)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$r r(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 mundor3)r)
rr'r4rr5r6r r(r)r!r7r8r)r
r*r	r	r�testTimeoutNonews

zGeneralTests.testTimeoutNonecCs:tjd�tjt|jdd�}|j|jj�d�|j	�dS)Ns220 Hola mundor3)r)
rr'r r(r)r!r$r7r8r)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'r r(�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'r r(r<rr=r>r)r!rr?r@rArBrC)r
r*rDr%r	r	r�test_debuglevel_2�s


zGeneralTests.test_debuglevel_2N)�__name__�
__module__�__qualname__r"r#r&r+r/r0r2r9r:r;rErGr	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�asyncoreZpoll2rKZ
socket_mapZis_setrrr�time�sleepZ	close_all)r�serv_evt�
client_evtZpoll_funrr	r	r�debugging_server�s&


rRz&---------- 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���)rTrX)r�getfqdn�real_getfqdnr�sys�stdout�
old_stdout�io�StringIO�output�	threading�EventrPrQ�smtpd�DEBUGSTREAM�old_DEBUGSTREAMZDebuggingServerr)r�getsocknamer!�ThreadrR�thread�start�wait�clear)r
�	serv_argsr	r	rr"�s"






zDebuggingServerTests.setUpcCsD|jt_|jj�|jj�|jj�|j	t
_tj
j�|jt_
dS)N)rZrrYrQrrPrjrh�joinr]r[r\rcrdrre)r
r	r	rr#�s



zDebuggingServerTests.tearDowncCs tjt|jddd�}|j�dS)Nr�)r1r)r r(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)Nrrnz	127.0.0.1)r1rr.zcouldn't bind to port %d)rZfind_unused_portr r(r)r!r$r.r1ro�OSError�errnoZ
EADDRINUSEZskipTest)r
r!r*rr	r	rr/�sz&DebuggingServerTests.testSourceAddresscCs4tjt|jddd�}d}|j|j�|�|j�dS)Nrrn)r1r��OK)rsrt)r r(r)r!r$�noopro)r
r*r%r	r	r�testNOOPszDebuggingServerTests.testNOOPcCs4tjt|jddd�}d}|j|j�|�|j�dS)Nrrn)r1rrs�OK)rsrw)r r(r)r!r$Zrsetro)r
r*r%r	r	r�testRSETszDebuggingServerTests.testRSETcCs4tjt|jddd�}d}|j|j�|�|j�dS)Nrrn)r1rrs�
SIZE 33554432
HELP)rsry)r r(r)r!r$�ehloro)r
r*r%r	r	r�testELHOszDebuggingServerTests.testELHOcCs>tjt|jddd�}d}|jd�|j|j�|�|j�dS)Nrrn)r1r��EXPN not implementedZEXPN)r|r})r r(r)r!�putcmdr$Zgetreplyro)r
r*r%r	r	r�testEXPNNotImplementeds

z+DebuggingServerTests.testEXPNNotImplementedcCs^tjt|jddd�}|j|j�|jt��}|jd�WdQRX|j	dt
|j��|j�dS)Nr�
)r1rzhelo
X-INJECTEDzprohibited newline characters)
r r(r)r!�
addCleanupr�assertRaises�
ValueErrorr~�assertIn�str�	exceptionro)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)
Nrrn)r1r�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�)r r(r)r!r$�vrfyZverifyro)r
r*r%r	r	r�testVRFY+szDebuggingServerTests.testVRFYcCs<tjt|jddd�}|j�d}|j|j�|�|j�dS)Nrrn)r1r��Duplicate HELO/EHLO)r�r�)r r(r)r!Zhelor$ro)r
r*r%r	r	r�testSecondHELO3s
z#DebuggingServerTests.testSecondHELOcCs0tjt|jddd�}|j|j�d�|j�dS)Nrrn)r1rs#Supported commands: EHLO HELO MAIL sRCPT DATA RSET NOOP QUIT VRFYs@Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY)r r(r)r!r$�helpro)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 messagerrn)r1r�John�Sallyg{�G�z�?z%s%s
%s)r r(r)r!�sendmailrNrOrorQrrPrjr`�flush�	MSG_BEGIN�MSG_ENDr$rC)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 messagerrn)r1rr�r�g{�G�z�?z%s%s
%s�ascii)r r(r)r!r�rNrOrorQrrPrjr`r�r��decoder�r$rC)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.rrn)r1rr�r�g{�G�z�?z%s%s
%s)r r(r)r!r�rNrOrorQrrPrjr`r�r�r�r$rC)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�)r1rz	hi@me.comz
you@me.comz2prohibited newline characters: ehlo hi\nX-INJECTEDg{�G�z�?z
X-INJECTED)r r(r)r!r�rr�r�r�r�r�r�rNrOrorcrdrC�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�)r1rz	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)r r(r)r!r�rr�r�r��mailr�r�r�rNrOrorcrdrCr�)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 messagerrn)r1rz<>r�g{�G�z�?z%s%s
%sz^sender: <>$)r r(r)r!r�rNrOrorQrrPrjr`r�r�r�r$rCrcrdr?r@rArB)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 messagerrn)r1rr�r�)�	from_addr�to_addrsg{�G�z�?zX-Peerz%s%s
%s)�email�mime�text�MIMETextr r(r)r!�send_messagerNrOrorQrrPrjr`r�r�
gethostbynamer��	as_stringr�r$rC)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>�Bccrrn)r1rg{�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�r r(r)r!r�rNrOror$rQrrPrjr`r�rr�r�r�r�rCrcrdr?r@rArB�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�rrn)r1rg{�G�z�?zX-Peerz%s%s
%sz^sender: foo@bar.com$r��Dinsdalez^recips: .*'{}'.*$)r�r�) r�r�r�r�r r(r)r!r�rNrOrorQrrPrjr`r�rr�r�r�r�r$rCrcrdr?r@rArBr�)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�rrn)r1rzjoe@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�r r(r)r!r�rNrOrorQrrPrjr`r�rr�r�r�r�r$rCrcrdr?r@rArBr�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�rrn)r1rg{�G�z�?zX-Peerz%s%s
%sz-^sender: the_rescuers@Rescue-Aid-Society.com$r�r�z^recips: .*'{}'.*$)r�r�) r�r�r�r�r r(r)r!r�rNrOrorQrrPrjr`r�rr�r�r�r�r$rCrcrdr?r@rArBr�)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-Bccrrn)r1rg{�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�r r(r)r!r�rNrOrorQrrPrjr`r�rr�r�r�r�r$rCrcrdr?r@rArBr�)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 +0000rrn)r1r)r�r�r�r�r r(r)r!r�r�r�r)r
r�r*r	r	r�#testSendMessageMultipleResentRaisesRs z8DebuggingServerTests.testSendMessageMultipleResentRaises)rHrIrJ�maxDiffr"r#rpr/rvrxr{rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r	r	r	rrS�s4

	!"rSc@seZdZdd�Zdd�ZdS)�NonConnectingTestscCs.tj�}|jtj|j�|jtj|jd�dS)Nztest msg)r r(r��SMTPServerDisconnectedrzr)r
r*r	r	r�testNotConnectedfsz#NonConnectingTests.testNotConnectedcCs&|jttjdd�|jttjd�dS)NrZboguszlocalhost:bogus)r�rqr r()r
r	r	r�testNonnumericPortps

z%NonConnectingTests.testNonnumericPortN)rHrIrJr�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�r r(r*rrz�has_extnr�)r
r	r	rr"zs


zDefaultArgumentsTests.setUpcCs`d}|jj|j�|jj|j�|j|jjjddd|�|j|jjjddd|�dS)N�SMTPUTF8�
BODY=8BITMIMErrnr
)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=8BITMIMErrn)r�r�r�)r*r�r�r$r�r�)r
�mail_optionsr�r	r	r�testSendMessageWithMailOptions�sz4DefaultArgumentsTests.testSendMessageWithMailOptionsN)rHrIrJr"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)rr rr'r[r\r]r^r_r`r!)r
r	r	rr"�s

zBadHELOServerTests.setUpcCstt_|jt_dS)N)rr r]r[r\)r
r	r	rr#�szBadHELOServerTests.tearDowncCs|jtjtjt|jdd�dS)Nrrn)r�r ZSMTPConnectErrorr(r)r!)r
r	r	r�testFailingHELO�sz"BadHELOServerTests.testFailingHELON)rHrIrJr"r#r�r	r	r	rr��sr�c@s:eZdZddejddZdd�Zdd�Zd	d
�ZdS)�TooLongLineTestss250 OK�.rF�
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�)rVrW)r[r\r]r^r_r`rarbrrZAF_INETZSOCK_STREAMr7Z
settimeoutrZ	bind_portr!�respdatargrrir�rmrjrk)r
Zservargsrhr	r	rr"�s


zTooLongLineTests.setUpcCs|jj�|jt_dS)N)rrjr]r[r\)r
r	r	rr#�s
zTooLongLineTests.tearDowncCs|jtjtjt|jdd�dS)Nrrn)r�r �SMTPResponseExceptionr(r)r!)r
r	r	r�testLineTooLong�sz TooLongLineTests.testLineTooLongN)	rHrIrJr Z_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)rHrIrJr	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>)rm�_extrafeatures�superr��__init__)r
Zextra_featuresrW�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_emptystringrmZreceived_lines�print�reprrcrd�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
rFz/501 Syntax: AUTH <mechanism> [initial-response]z_auth_%sr�-�_zQ504 Command parameter not implemented: unsupported  authentication mechanism {!r})r
rF)�
seen_greetingr��
extended_smtpr��authenticated_user�split�len�lower�replace�getattrr��AttributeErrorr�r�r�)r
�argrWZauth_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�rLr
rrr)r
rrr	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��hmacZHMACrrZ	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�	enumerater rr�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)rHrIrJrr r#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�
_addressesrc�
SMTPServerr�)r
rWr�r	r	rr��szSimSMTPServer.__init__cCs|j|j||||jd�|_dS)N)rU)�
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)
rHrIrJr�r0r�r3r:r<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)	NrrTr
T)rU)rVrWrX)rTrX)rrYrZrrarbrPrQr,r)rrfr!rgrRrhrirjrk)r
rlr	r	rr"�s



zSMTPSimTests.setUpcCs*|jt_|jj�|jj�|jj�dS)N)	rZrrYrQrrPrjrhrm)r
r	r	rr#�s

zSMTPSimTests.tearDowncCs tjt|jddd�}|j�dS)Nrr�)r1r)r r(r)r!ro)r
r*r	r	rrp�szSMTPSimTests.testBasiccCs�tjt|jddd�}|j|ji�dddddd�}|j�|j|j|�x|D]}|j|j|��qNW|j	|jd��|j
�dS)Nrr�)r1rr�Z20000000)�expn�sizeZstarttlsZ	deliverbyr�zunsupported-feature)r r(r)r!r$�esmtp_featuresrz�
assertTruer��assertFalsero)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�)r1rrsz%s %sr�znobody@nowhere.comi&zNo such user: %s)r r(r)r!r�items�bytesrr$r�rro)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�)r1rz%s %srs�
r�zPSU-Members-List�&�No access for you!)rLrM)r r(r)r!rrEr;rrrFrmr$r>ro)	r
r*Zlistname�membersZusersr�rHrIrJr	r	r�testEXPN�s
 zSMTPSimTests.testEXPNcCsL|jjd�tjt|jddd�}|jtdtd�}|j|d	�|j	�dS)
Nz
AUTH PLAINrr�)r1rrr
���Authentication Succeeded)rPrQ)
rr<r r(r)r!�loginrr$r)r
r*rr	r	r�testAUTH_PLAIN�s
zSMTPSimTests.testAUTH_PLAINcCsL|jjd�tjt|jddd�}|jtdtd�}|j|d	�|j	�dS)
Nz
AUTH LOGINrr�)r1rrr
rP�Authentication Succeeded)rPrT)
rr<r r(r)r!rRrr$r)r
r*rr	r	r�testAUTH_LOGIN�s
zSMTPSimTests.testAUTH_LOGINcCsL|jjd�tjt|jddd�}|jtdtd�}|j|d	�|j	�dS)
Nz
AUTH CRAM-MD5rr�)r1rrr
rP�Authentication Succeeded)rPrV)
rr<r r(r)r!rRrr$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�)r1rrr
rP�Authentication Succeeded)rPrX)
rr<r r(r)r!rRrr$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�)r1rZfoorr
Zauth_r�r�rP�Authentication Succeeded)rPr[)rr<r�ZsubTestr r(r)r!rzrrrr�r�authrr$r)r
Z	supportedrZr*�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�)r1rrsr?)r r(r)r!rzr$r�r@ror�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)Nrssfoo)
r r(r)r!rur$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�r r�r(r)r!rurr2rr$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�)r1rz451 Requested action abortedTr�r�ztest message)r r(r)r!rurr2r r"r��SMTPSenderRefusedr�r4r7)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�)r1rz421 closing connectionr�r�ztest messager)r r(r)r!rurr2r r�rer�r4r7r$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�)r1rz250 acceptedz421 closingr�r�ZFrankZGeorgeztest messager��closing)rhri)r r(r)r!rurr2r#r�ZSMTPRecipientsRefusedr�r4r7r$r&�assertDictEqualr�rW)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)rHrIrJr�r+r	r	)r�r�MySimSMTPChannelbsrlrr�)r1rzJohn@foo.orgz
Sally@foo.orgztest messager)r�rr0r r(r)r!rur�Z
SMTPDataErrorr�r4r7r$r2r%)r
rlr*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)Nrrn)r1r�smtputf8r�r�r�z
BODY=8BITMIMEr�)r�)�options)r r(r)r!r�rrzrA�
does_esmtprBr�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)Nrrn)r1rZAliceuBöbr�uÄlice)
r r(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�Subjectrrn)r1r)
rr r(r)r!r�rr�rqr�)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)Nrrn)r1r�Michaël�michael@example.comr��René�rene@example.comr�r4r5)rwrx)ryrz)r r(r)r!r�rrr�ZutilsZ
formataddrrjr�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)rHrIrJr"r#rprDr�rOrSrUrWrYr^rarbrdrfrgrkrmrrrtrvr{r	r	r	rr=�s,	
	

r=c@s&eZdZdd�Zdd�Zddd�ZdS)	�SimSMTPUTF8ServercOs"ddg|_tjj|f|�|�dS)Nr�Z8BITMIME)r-rcr/r�)r
rWr�r	r	rr��s
zSimSMTPUTF8Server.__init__cCs"|j|j||||j|jd�|_dS)N)rU�enable_SMTPUTF8)r0r-r1r}r2)r
rrr	r	rr3�s
z!SimSMTPUTF8Server.handle_acceptedNcCs(||_||_||_||_||_||_dS)N)Z	last_peer�
last_mailfrom�last_rcpttos�last_message�last_mail_options�last_rcpt_options)r
r6r7r8r9r�Zrcpt_optionsr	r	rr:�sz!SimSMTPUTF8Server.process_message)NN)rHrIrJr�r3r:r	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)
NrrTr
FT)rUr})rVrWrX)rTrX)rrYrZrrarbrPrQr|r)rrfr!rgrRrhrirjrk)r
rlr	r	rr"�s





zSMTPUTF8SimTests.setUpcCs*|jt_|jj�|jj�|jj�dS)N)	rZrrYrQrrPrjrhrm)r
r	r	rr#�s

zSMTPUTF8SimTests.tearDowncCsHtjt|jddd�}|j|j�|j�|j|j�|j|j	d��dS)Nrrn)r1rrn)
r r(r)r!r�rrzrArpr�)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-8rrn)r1ruJőhnuSállyz
BODY=8BITMIMEr�)r�)rr r(r)r!r�rr�r$rr~rr�r�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-8rrn)r1ruJőz
BODY=8BITMIMEr�)rors�OKuJános)rsr�)rsr�)rsr�)rr r(r)r!r�rrzr$r�Zrcptr9rr~rr�r�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 ὠ9ruu1oh 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?
            rrn)r1rufőo@bar.comz
BODY=8BITMIMEr�)rZset_content�textwrap�dedentr r(r)r!r�rr$r�rr~rr�r�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)
rHrIrJr�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�plainrFr
z235 Okz571 Bad authentication)r�r�r��EXPECTED_RESPONSEr�)r
rrWr	r	rr(s
z+SimSMTPAUTHInitialResponseChannel.smtp_AUTHN)rHrIrJrr	r	r	rr�'sr�c@seZdZeZdS)� SimSMTPAUTHInitialResponseServerN)rHrIrJr�r0r	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)	NrrTr
T)rU)rVrWrX)rTrX)rrYrZrrarbrPrQr�r)rrfr!rgrRrhrirjrk)r
rlr	r	rr"<s



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

z(SMTPAUTHInitialResponseSimTests.tearDowncCs8|jjd�tjt|jddd�}|jdd�|j�dS)Nz
AUTH PLAINrr�)r1r�psu�doesnotexist)rr<r r(r)r!rRr)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�)r1rr�r�r�rP)rr<r r(r)r!rrr\Z
auth_plainrr$)r
r*r_Zresponser	r	r�$testAUTH_PLAIN_initial_response_auth]s

zDSMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_authN)rHrIrJr"r#r�r�r	r	r	rr�:sr��__main__)r�r�)ArMrZemail.mime.textr�Z
email.messagerZemail.base64mimerZ
encode_base64Zemail.utilsrrrcr r^r?r[rNrrrr�ZunittestZtestrrZ
unittest.mockrr)ZHOSTv4ZHOSTv6ra�ImportError�platformrZSMTPChannelrZTestCaserrRr�r�Z
skipUnlessrSr�r�r�r�rrrr�	Exceptionr�r�r/r,r=r|r�r�r�r�r�rH�mainr	r	r	r�<module>s�
_



4

g
-