a
    äzeåî  ã                   @   sš  d dl Z d dlZd dlZd dlmZ d dlmZ d dl	Zd dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZ d dlmZ d dlmZ d dlmZmZm Z  d dl!m"Z" ej#Z#ej$d	krd
d„ Z%e%ej&_%dd„ Z'G dd„ dƒZ(G dd„ de(ej)ƒZ*G dd„ de(ej)ƒZ+dd„ Z,dZ-dZ.G dd„ dej)ƒZ/G dd„ dej)ƒZ0G dd„ dej)ƒZ1G dd„ dej)ƒZ2G d d!„ d!ej)ƒZ3d"d#d$d%œZ4d&Z5d'Z6d(d)gd*gd+œZ7G d,d-„ d-e8ƒZ9G d.d/„ d/ej&ƒZ:G d0d1„ d1ej;ƒZ<G d2d3„ d3ej)ƒZ=G d4d5„ d5e<ƒZ>G d6d7„ d7ej)ƒZ?ed8d9d:Z@G d;d<„ d<e:ƒZAG d=d>„ d>e<ƒZBG d?d@„ d@ej)ƒZCeDdAkr–e E¡  dS )Bé    N)ÚEmailMessage)Úbody_encode)ÚsupportÚmock_socket)Úhashlib_helper)Úsocket_helper)Úthreading_setupÚthreading_cleanupÚjoin_thread)ÚMockÚdarwinc                 C   s   d S ©N© ©Úselfr   r   ú'/usr/lib/python3.9/test/test_smtplib.pyÚhandle_expt!   s    r   c           
      C   s´   |  ¡  |  ¡  zŒz| ¡ \}}W n tjy6   Y nT0 d}|r‚|dkr‚t g |gg ¡\}}}|rx| |¡}	||	d … }|d8 }q<| ¡  W | ¡  |  ¡  n| ¡  |  ¡  0 d S )Niô  r   é   )ÚlistenÚsetÚacceptÚsocketÚtimeoutÚselectÚsendÚclose)
ÚevtÚbufÚservÚconnÚaddrÚnÚrÚwÚeÚsentr   r   r   Úserver&   s$    



ÿr&   c                   @   st   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚGeneralTestsc                 C   s   t t_d| _d S )Né   )r   Úsmtplibr   Úportr   r   r   r   ÚsetUp>   s    zGeneralTests.setUpc                 C   s
   t t_ d S r   )r   r)   r   r   r   r   ÚtearDownB   s    zGeneralTests.tearDownc                 C   s   d}d}|   |t |¡¡ d S )Nzabc
.jklfoo
..bluezabc
..jkl
foo
...blue)ÚassertEqualr)   Z	quotedata)r   ZteststrÚexpectedr   r   r   ÚtestQuoteDataG   s    zGeneralTests.testQuoteDatac                 C   s$   t  d¡ |  t| j¡}| ¡  d S )Nó   220 Hola mundo©r   Ú
reply_withÚclientÚHOSTr*   r   ©r   r3   r   r   r   Ú
testBasic1L   s    
zGeneralTests.testBasic1c                 C   s6   t  d¡ | jt| jdd}|  |jd¡ | ¡  d S )Nr0   )z	127.0.0.1i¤M  )Úsource_address)r   r2   r3   r4   r*   r-   r7   r   r5   r   r   r   ÚtestSourceAddressR   s    

ÿzGeneralTests.testSourceAddressc                 C   s*   t  d¡ |  dt| jf ¡}| ¡  d S )Nr0   z%s:%sr1   r5   r   r   r   Ú
testBasic2Z   s    
zGeneralTests.testBasic2c                 C   s6   t  d¡ | jt| jdd}|  |jd¡ | ¡  d S )Nr0   Ztesthost)Úlocal_hostname)r   r2   r3   r4   r*   r-   r:   r   r5   r   r   r   ÚtestLocalHostName`   s    
zGeneralTests.testLocalHostNamec              	   C   sz   t  d¡ |  t  ¡ ¡ t  d¡ |  t  ¡ d¡ z|  t| j¡}W t  d ¡ nt  d ¡ 0 |  |j	 
¡ d¡ | ¡  d S )Nr0   é   )r   r2   ÚassertIsNoneÚgetdefaulttimeoutÚsetdefaulttimeoutr-   r3   r4   r*   ÚsockÚ
gettimeoutr   r5   r   r   r   ÚtestTimeoutDefaultg   s    

zGeneralTests.testTimeoutDefaultc              	   C   sl   t  d¡ |  t ¡ ¡ t d¡ z | jt| jd d}W t d ¡ nt d ¡ 0 |  |j	 
¡ ¡ | ¡  d S ©Nr0   r<   ©r   )r   r2   r=   r   r>   r?   r3   r4   r*   r@   rA   r   r5   r   r   r   ÚtestTimeoutNones   s    

zGeneralTests.testTimeoutNonec                 C   sJ   t  d¡ |  t¡" | jt| jdd W d   ƒ n1 s<0    Y  d S )Nr0   r   rD   )r   r2   ÚassertRaisesÚ
ValueErrorr3   r4   r*   r   r   r   r   ÚtestTimeoutZero~   s    
zGeneralTests.testTimeoutZeroc                 C   s:   t  d¡ | jt| jdd}|  |j ¡ d¡ | ¡  d S rC   )	r   r2   r3   r4   r*   r-   r@   rA   r   r5   r   r   r   ÚtestTimeoutValueƒ   s    
zGeneralTests.testTimeoutValuec                 C   s|   t  d¡ |  ¡ }| d¡ t ¡ }| t| j¡ W d   ƒ n1 sH0    Y  | 	¡  t
 dt
j¡}|  | ¡ |¡ d S )Nó   220 Hello worldr   z	^connect:©r   r2   r3   Zset_debuglevelr   Zcaptured_stderrÚconnectr4   r*   r   ÚreÚcompileÚ	MULTILINEÚassertRegexÚgetvalue©r   r3   Ústderrr.   r   r   r   Útest_debuglevel‰   s    


,zGeneralTests.test_debuglevelc                 C   s|   t  d¡ |  ¡ }| d¡ t ¡ }| t| j¡ W d   ƒ n1 sH0    Y  | 	¡  t
 dt
j¡}|  | ¡ |¡ d S )NrJ   é   z#^\d{2}:\d{2}:\d{2}\.\d{6} connect: rK   rR   r   r   r   Útest_debuglevel_2“   s    


,ÿzGeneralTests.test_debuglevel_2N)Ú__name__Ú
__module__Ú__qualname__r+   r,   r/   r6   r8   r9   r;   rB   rE   rH   rI   rT   rV   r   r   r   r   r'   <   s   
r'   c                   @   s   e Zd ZejZdS )ÚSMTPGeneralTestsN)rW   rX   rY   r)   ÚSMTPr3   r   r   r   r   rZ   Ÿ   s   rZ   c                       s<   e Zd ZejZe ee	dƒd¡dd„ ƒZ
‡ fdd„Z‡  ZS )ÚLMTPGeneralTestsÚAF_UNIXz test requires Unix domain socketc              	   C   sT   d}t  d¡ z|  || j¡}W t  d ¡ nt  d ¡ 0 |  |j ¡ ¡ | ¡  d S )Nú!/some/local/lmtp/delivery/programrJ   )	r   r2   r3   r*   r?   r=   r@   rA   r   )r   Ú
local_hostr3   r   r   r   Ú"testUnixDomainSocketTimeoutDefault¨   s    
z3LMTPGeneralTests.testUnixDomainSocketTimeoutDefaultc                    sJ   t ƒ  ¡  d}|  t¡ | j|dd W d   ƒ n1 s<0    Y  d S )Nr^   r   rD   )ÚsuperrH   rF   rG   r3   )r   r_   ©Ú	__class__r   r   rH   ³   s    
z LMTPGeneralTests.testTimeoutZero)rW   rX   rY   r)   ZLMTPr3   ÚunittestZ
skipUnlessÚhasattrr   r`   rH   Ú__classcell__r   r   rb   r   r\   ¤   s   

r\   c              	   C   sÔ   |  ¡  zšzVttdƒrtj}ntj}d}tjr^|dkr^|dtjƒ | ¡ rT|  ¡  q^|d8 }q(W n t	j
yt   Y n0 W | ¡ s’t d¡ |  ¡  t ¡  |  ¡  n,| ¡ s¾t d¡ |  ¡  t ¡  |  ¡  0 d S )NÚpolliè  r   ç{®Gáz„?r   g      à?)r   re   r   ÚasyncoreZpoll2rg   Z
socket_mapÚis_setr   r   r   ÚtimeÚsleepZ	close_all)r   Úserv_evtÚ
client_evtZpoll_funr!   r   r   r   Údebugging_serverº   s0    


û
ro   z&---------- MESSAGE FOLLOWS ----------
z&------------ END MESSAGE ------------
c                   @   sà   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ ZdS )6ÚDebuggingServerTestsNc                 C   sÌ   t ƒ | _tj| _tjt_tj| _t	 
¡ | _| jt_t ¡ | _t ¡ | _tj| _t	 
¡ t_tjtdfddd| _| jj ¡ d d… \| _| _| j| j| jf}tjt|d| _| j ¡  | j ¡  | j ¡  d S )Nr   ©ZnowhereéÿÿÿÿT©Údecode_datarU   ©ÚtargetÚargs)r   Ú
thread_keyr   ÚgetfqdnÚreal_getfqdnr   ÚsysÚstdoutÚ
old_stdoutÚioÚStringIOÚoutputÚ	threadingÚEventrm   rn   ÚsmtpdÚDEBUGSTREAMÚold_DEBUGSTREAMZDebuggingServerr4   r   ÚgetsocknameÚhostr*   ÚThreadro   ÚthreadÚstartÚwaitÚclear©r   Z	serv_argsr   r   r   r+   æ   s&    



ÿ

zDebuggingServerTests.setUpc                 C   sZ   | j t_| j ¡  | j ¡  t| jƒ | j	t
_tj ¡  | jt_| `|  ¡  t| jŽ  d S r   )rz   r   ry   rn   r   rm   r‹   r
   r‰   r}   r{   r|   rƒ   r„   r   r…   Ú
doCleanupsr	   rx   r   r   r   r   r,     s    



zDebuggingServerTests.tearDownc                 C   s$   | j  ¡ }tjdd|tjtjB dS )Nz(.*?)^X-Peer:\s*\S+\n(.*)z\1\2)Úflags)r€   rQ   rM   ÚsubrO   ÚDOTALL)r   Útest_outputr   r   r   Úget_output_without_xpeer  s    
ÿz-DebuggingServerTests.get_output_without_xpeerc                 C   s"   t jt| jdtjd}| ¡  d S ©NÚ	localhost©r:   r   ©r)   r[   r4   r*   r   ÚLOOPBACK_TIMEOUTÚquit©r   Úsmtpr   r   r   Ú	testBasic  s    ÿzDebuggingServerTests.testBasicc              
   C   s¨   t  ¡ }zZtj| j| jdtj| j|fd}|  |j	¡ |  
|j| j|f¡ |  
|jd¡ | ¡  W n@ ty¢ } z(|jtjkrŒ|  d| ¡ ‚ W Y d }~n
d }~0 0 d S )Nr•   )r:   r   r7   zcouldn't bind to source port %d)r   Zfind_unused_portr)   r[   r‡   r*   r   r˜   Ú
addCleanupr   r-   r7   r:   r™   ÚOSErrorÚerrnoZ
EADDRINUSEZskipTest)r   Zsrc_portr›   r$   r   r   r   r8     s    þz&DebuggingServerTests.testSourceAddressc                 C   sB   t jt| jdtjd}|  |j¡ d}|  | 	¡ |¡ | 
¡  d S ©Nr•   r–   ©éú   s   OK)r)   r[   r4   r*   r   r˜   r   r   r-   Únoopr™   ©r   r›   r.   r   r   r   ÚtestNOOP,  s    ÿzDebuggingServerTests.testNOOPc                 C   sB   t jt| jdtjd}|  |j¡ d}|  | 	¡ |¡ | 
¡  d S r    )r)   r[   r4   r*   r   r˜   r   r   r-   Zrsetr™   r¤   r   r   r   ÚtestRSET4  s    ÿzDebuggingServerTests.testRSETc                 C   sB   t jt| jdtjd}|  |j¡ d}|  | 	¡ |¡ | 
¡  d S )Nr•   r–   )r¢   s   
SIZE 33554432
HELP)r)   r[   r4   r*   r   r˜   r   r   r-   Úehlor™   r¤   r   r   r   ÚtestELHO<  s    ÿzDebuggingServerTests.testELHOc                 C   sL   t jt| jdtjd}|  |j¡ d}| d¡ |  	| 
¡ |¡ | ¡  d S )Nr•   r–   )iö  s   EXPN not implementedZEXPN)r)   r[   r4   r*   r   r˜   r   r   Úputcmdr-   Zgetreplyr™   r¤   r   r   r   ÚtestEXPNNotImplementedE  s    ÿ
z+DebuggingServerTests.testEXPNNotImplementedc                 C   st   t jt| jdtjd}|  |j¡ |  t	¡}| 
d¡ W d   ƒ n1 sL0    Y  |  dt|jƒ¡ | ¡  d S )Nr•   r–   zhelo
X-INJECTEDúprohibited newline characters)r)   r[   r4   r*   r   r˜   r   r   rF   rG   r©   ÚassertInÚstrÚ	exceptionr™   )r   r›   Úexcr   r   r   Ú&test_issue43124_putcmd_escapes_newlineO  s    ÿ(z;DebuggingServerTests.test_issue43124_putcmd_escapes_newlinec                 C   sV   t jt| jdtjd}|  |j¡ d}|  | 	d¡|¡ |  | 
d¡|¡ | ¡  d S )Nr•   r–   )éü   s>   Cannot VRFY user, but will accept message and attempt deliveryúnobody@nowhere.com)r)   r[   r4   r*   r   r˜   r   r   r-   ÚvrfyZverifyr™   r¤   r   r   r   ÚtestVRFYY  s    ÿzDebuggingServerTests.testVRFYc                 C   sJ   t jt| jdtjd}|  |j¡ | ¡  d}|  	| ¡ |¡ | 
¡  d S )Nr•   r–   )i÷  s   Duplicate HELO/EHLO)r)   r[   r4   r*   r   r˜   r   r   Zhelor-   r™   r¤   r   r   r   ÚtestSecondHELOc  s    ÿz#DebuggingServerTests.testSecondHELOc                 C   s>   t jt| jdtjd}|  |j¡ |  | 	¡ d¡ | 
¡  d S )Nr•   r–   s@   Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY)r)   r[   r4   r*   r   r˜   r   r   r-   Úhelpr™   rš   r   r   r   ÚtestHELPn  s    ÿzDebuggingServerTests.testHELPc                 C   sˆ   d}t jt| jdtjd}|  |j¡ | dd|¡ t	 
d¡ | ¡  | j ¡  | j ¡  | j ¡  dt|tf }|  | j ¡ |¡ d S )NúA test messager•   r–   ÚJohnÚSallyrh   ú%s%s
%s©r)   r[   r4   r*   r   r˜   r   r   Úsendmailrk   rl   r™   rn   r   rm   r‹   r€   ÚflushÚ	MSG_BEGINÚMSG_ENDr-   rQ   ©r   Úmr›   Úmexpectr   r   r   ÚtestSendv  s    ÿ



zDebuggingServerTests.testSendc                 C   sŽ   d}t jt| jdtjd}|  |j¡ | dd|¡ t	 
d¡ | ¡  | j ¡  | j ¡  | j ¡  dt| d¡tf }|  | j ¡ |¡ d S )	Ns   A test messager•   r–   r¹   rº   rh   r»   Úascii)r)   r[   r4   r*   r   r˜   r   r   r½   rk   rl   r™   rn   r   rm   r‹   r€   r¾   r¿   ÚdecoderÀ   r-   rQ   rÁ   r   r   r   ÚtestSendBinary‰  s    ÿ



z#DebuggingServerTests.testSendBinaryc                 C   sˆ   d}t jt| jdtjd}|  |j¡ | dd|¡ t	 
d¡ | ¡  | j ¡  | j ¡  | j ¡  dt|tf }|  | j ¡ |¡ d S )Nz.A test
.mes.sage.r•   r–   r¹   rº   rh   r»   r¼   rÁ   r   r   r   ÚtestSendNeedingDotQuote™  s    ÿ



z,DebuggingServerTests.testSendNeedingDotQuotec                 C   sœ   d}t jt| jdtjd}|  |j¡ |  t	¡}| 
dd|¡ W d   ƒ n1 sT0    Y  |  dt|jƒ¡ t d¡ | ¡  tj ¡ }|  d|¡ d S )	Núwazzuuup
linetwozhi
X-INJECTEDr–   ú	hi@me.comú
you@me.comz2prohibited newline characters: ehlo hi\nX-INJECTEDrh   z
X-INJECTED)r)   r[   r4   r*   r   r˜   r   r   rF   rG   r½   r¬   r­   r®   rk   rl   r™   rƒ   r„   rQ   ÚassertNotIn)r   rÂ   r›   r¯   Údebugoutr   r   r   Ú$test_issue43124_escape_localhostnameª  s    ÿ,þ

z9DebuggingServerTests.test_issue43124_escape_localhostnamec                 C   sà   d}t jt| jdtjd}|  |j¡ | dd|¡ |  	t
¡ }| dddg¡ W d   ƒ n1 sd0    Y  t|jƒ}|  d|¡ |  d	|¡ t d
¡ | ¡  tj ¡ }|  d|¡ |  d|¡ |  d|¡ |  d|¡ d S )NrÉ   r•   r–   rÊ   rË   zX-OPTION
X-INJECTED-1zX-OPTION2
X-INJECTED-2r«   z.X-OPTION\nX-INJECTED-1 X-OPTION2\nX-INJECTED-2rh   zX-OPTIONz	X-OPTION2zX-INJECTED-1zX-INJECTED-2)r)   r[   r4   r*   r   r˜   r   r   r½   rF   rG   Úmailr­   r®   r¬   rk   rl   r™   rƒ   r„   rQ   rÌ   )r   rÂ   r›   r¯   ÚmsgrÍ   r   r   r   Útest_issue43124_escape_options¾  s&    þ.


z3DebuggingServerTests.test_issue43124_escape_optionsc                 C   s¬   d}t jt| jdtjd}|  |j¡ | dd|¡ t	 
d¡ | ¡  | j ¡  | j ¡  | j ¡  dt|tf }|  | j ¡ |¡ tj ¡ }t dtj¡}|  ||¡ d S )	Nr¸   r•   r–   z<>rº   rh   r»   z^sender: <>$)r)   r[   r4   r*   r   r˜   r   r   r½   rk   rl   r™   rn   r   rm   r‹   r€   r¾   r¿   rÀ   r-   rQ   rƒ   r„   rM   rN   rO   rP   )r   rÂ   r›   rÃ   rÍ   Úsenderr   r   r   ÚtestSendNullSender×  s     ÿ




z'DebuggingServerTests.testSendNullSenderc                 C   s    t jj d¡}tjt| jdtj	d}|  
|j¡ |j|ddd t d¡ | ¡  | j ¡  | j ¡  | j ¡  |  ¡ }|d= d	t| ¡ tf }|  ||¡ d S )
Nr¸   r•   r–   r¹   rº   ©Z	from_addrZto_addrsrh   úX-Peerr»   )ÚemailÚmimeÚtextÚMIMETextr)   r[   r4   r*   r   r˜   r   r   Úsend_messagerk   rl   r™   rn   r   rm   r‹   r€   r¾   r“   r¿   Ú	as_stringrÀ   r-   )r   rÂ   r›   r’   rÃ   r   r   r   ÚtestSendMessageê  s    ÿ



z$DebuggingServerTests.testSendMessagec           	      C   s  t jj d¡}d|d< d|d< d|d< d|d	< tjt| jd
tj	d}|  
|j¡ | |¡ t d¡ | ¡  |  |d	 d¡ | j ¡  | j ¡  | j ¡  |  ¡ }|d= |d	= dt| ¡ tf }|  ||¡ tj ¡ }t dtj ¡}|  !||¡ dD ]$}t d "|¡tj ¡}|  !||¡ qôd S )Nr¸   úfoo@bar.comÚFromr¹   ÚToúSally, FredÚCCú?John Root <root@localhost>, "Dinsdale" <warped@silly.walks.com>ÚBccr•   r–   rh   rÕ   r»   ú^sender: foo@bar.com$)r¹   rº   ZFredzroot@localhostzwarped@silly.walks.comú^recips: .*'{}'.*$)#rÖ   r×   rØ   rÙ   r)   r[   r4   r*   r   r˜   r   r   rÚ   rk   rl   r™   r-   rn   r   rm   r‹   r€   r¾   r“   r¿   rÛ   rÀ   rƒ   r„   rQ   rM   rN   rO   rP   Úformat©	r   rÂ   r›   r’   rÃ   rÍ   rÒ   r    Úto_addrr   r   r   ÚtestSendMessageWithAddresses   s:    ÿ





ÿz1DebuggingServerTests.testSendMessageWithAddressesc           	      C   sø   t jj d¡}d|d< d|d< tjt| jdtj	d}|  
|j¡ | |¡ t d¡ | ¡  | j ¡  | j ¡  | j ¡  |  ¡ }|d	= d
t| ¡ tf }|  ||¡ tj ¡ }t dtj ¡}|  !||¡ dD ]$}t d "|¡tj ¡}|  !||¡ qÎd S )Nr¸   rÝ   rÞ   úJohn, Dinsdalerß   r•   r–   rh   rÕ   r»   rä   ©r¹   ÚDinsdalerå   ©#rÖ   r×   rØ   rÙ   r)   r[   r4   r*   r   r˜   r   r   rÚ   rk   rl   r™   rn   r   rm   r‹   r€   r¾   r“   r¿   rÛ   rÀ   r-   rƒ   r„   rQ   rM   rN   rO   rP   ræ   rç   r   r   r   Ú testSendMessageWithSomeAddresses$  s2    ÿ





ÿz5DebuggingServerTests.testSendMessageWithSomeAddressesc           
      C   s  t jj d¡}d|d< d|d< tjt| jdtj	d}|  
|j¡ |j|dd	d
 t d¡ | ¡  | j ¡  | j ¡  | j ¡  |  ¡ }|d= dt| ¡ tf }|  ||¡ tj ¡ }t dtj ¡}|  !||¡ dD ]$}t d "|¡tj ¡}|  #||¡ qÔt dtj ¡}	|  !||	¡ d S )Nr¸   rÝ   rÞ   rê   rß   r•   r–   zjoe@example.comzfoo@example.netrÔ   rh   rÕ   r»   z^sender: joe@example.com$rë   rå   z^recips: .*'foo@example.net'.*$)$rÖ   r×   rØ   rÙ   r)   r[   r4   r*   r   r˜   r   r   rÚ   rk   rl   r™   rn   r   rm   r‹   r€   r¾   r“   r¿   rÛ   rÀ   r-   rƒ   r„   rQ   rM   rN   rO   rP   ræ   ZassertNotRegex)
r   rÂ   r›   r’   rÃ   rÍ   rÒ   r    rè   Zrecipr   r   r   Ú%testSendMessageWithSpecifiedAddressesA  s6    ÿ




ÿz:DebuggingServerTests.testSendMessageWithSpecifiedAddressesc           	      C   s   t jj d¡}d|d< d|d< d|d< tjt| jdtj	d	}|  
|j¡ | |¡ t d
¡ | ¡  | j ¡  | j ¡  | j ¡  |  ¡ }|d= dt| ¡ tf }|  ||¡ tj ¡ }t dtj ¡}|  !||¡ dD ]$}t d "|¡tj ¡}|  !||¡ qÖd S )Nr¸   zBernard, BiancarÞ   z#the_rescuers@Rescue-Aid-Society.comZSenderrê   rß   r•   r–   rh   rÕ   r»   z-^sender: the_rescuers@Rescue-Aid-Society.com$rë   rå   rí   rç   r   r   r   ÚtestSendMessageWithMultipleFrom`  s4    ÿ





ÿz4DebuggingServerTests.testSendMessageWithMultipleFromc           	      C   s6  t jj d¡}d|d< d|d< d|d< d|d	< d
|d< d|d< d|d< d|d< tjt| jdtj	d}|  
|j¡ | |¡ t d¡ | ¡  | j ¡  | j ¡  | j ¡  |d	= |d= |  ¡ }|d= dt| ¡ tf }|  ||¡ tj ¡ }t dtj ¡}|  !||¡ dD ]&}t d "|¡tj ¡}|  !||¡ q
d S )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–   rh   rÕ   r»   z^sender: holy@grail.net$)zmy_mom@great.cooker.comZJeffr÷   rå   rí   rç   r   r   r   ÚtestSendMessageResent~  sB    ÿ





ÿz*DebuggingServerTests.testSendMessageResentc                 C   sÈ   t jj d¡}d|d< d|d< d|d< d|d	< d
|d< d|d< d|d< d|d< d|d< d|d< d|d< tjt| jdtj	d}|  
|j¡ |  t¡ | |¡ W d   ƒ n1 s²0    Y  | ¡  d S )Nr¸   rÝ   rÞ   r¹   rß   rà   rá   râ   rã   rñ   rò   ró   rô   rõ   rö   r÷   rø   zThu, 2 Jan 1970 17:42:00 +0000r•   r–   )rÖ   r×   rØ   rÙ   r)   r[   r4   r*   r   r˜   r   r   rF   rG   rÚ   ©r   rÂ   r›   r   r   r   Ú#testSendMessageMultipleResentRaises£  s&    ÿ(z8DebuggingServerTests.testSendMessageMultipleResentRaises)rW   rX   rY   ÚmaxDiffr+   r,   r“   rœ   r8   r¥   r¦   r¨   rª   r°   r´   rµ   r·   rÄ   rÇ   rÈ   rÎ   rÑ   rÓ   rÜ   ré   rî   rï   rð   rù   rû   r   r   r   r   rp   â   s6   	


$%rp   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚNonConnectingTestsc                 C   s.   t  ¡ }|  t j|j¡ |  t j|jd¡ d S )Nztest msg)r)   r[   rF   ÚSMTPServerDisconnectedr§   r   rš   r   r   r   ÚtestNotConnected¹  s
    ÿz#NonConnectingTests.testNotConnectedc                 C   s&   |   ttjdd¡ |   ttjd¡ d S )Nr•   Zboguszlocalhost:bogus)rF   rž   r)   r[   r   r   r   r   ÚtestNonnumericPortÃ  s    
ÿ
ÿz%NonConnectingTests.testNonnumericPortc                 C   s8   t  ¡ }|  |j¡ W d   ƒ n1 s*0    Y  d S r   )r)   r[   r=   r@   rš   r   r   r   ÚtestSockAttributeExistsÊ  s    
z*NonConnectingTests.testSockAttributeExistsN)rW   rX   rY   rÿ   r   r  r   r   r   r   rý   ·  s   
rý   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚDefaultArgumentsTestsc                 C   sD   t ƒ | _d| jd< t ¡ | _tdd| j_tƒ tƒ  | j_| j_d S )Nõ   PÃ¡olo <fÅ‘o@bar.com>rÞ   )éÈ   ZOK)Zreturn_value)	r   rÐ   r)   r[   r›   r   r§   Úhas_extnr½   r   r   r   r   r+   Ô  s
    

zDefaultArgumentsTests.setUpc                 C   s`   d}| j  | j¡ | j  | j¡ |  | j jjd d d |¡ |  | j jjd d d |¡ d S )N)ÚSMTPUTF8úBODY=8BITMIMEr   é   r   ©r›   rÚ   rÐ   r-   r½   Zcall_args_list)r   Úexpected_mail_optionsr   r   r   rÜ   Û  s    ÿÿz%DefaultArgumentsTests.testSendMessagec                 C   sN   dg}d}| j  | jd d |¡ |  |dg¡ |  | j jjd d d |¡ d S )NÚSTARTTLS)r  r  r  r   r  r	  )r   Úmail_optionsr
  r   r   r   ÚtestSendMessageWithMailOptionsä  s    ÿz4DefaultArgumentsTests.testSendMessageWithMailOptionsN)rW   rX   rY   r+   rÜ   r  r   r   r   r   r  Ò  s   	r  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚBadHELOServerTestsc                 C   s4   t t_t  d¡ tj| _t ¡ | _	| j	t_d| _
d S )Ns   199 no hello for you!r(   )r   r)   r   r2   r{   r|   r}   r~   r   r€   r*   r   r   r   r   r+   ð  s    

zBadHELOServerTests.setUpc                 C   s   t t_ | jt_d S r   )r   r)   r}   r{   r|   r   r   r   r   r,   ø  s    zBadHELOServerTests.tearDownc                 C   s   |   tjtjt| jdd¡ d S ©Nr•   r  )rF   r)   ZSMTPConnectErrorr[   r4   r*   r   r   r   r   ÚtestFailingHELOü  s    
ÿz"BadHELOServerTests.testFailingHELON)rW   rX   rY   r+   r,   r  r   r   r   r   r  î  s   r  c                   @   s:   e Zd Zddej d  d Zdd„ Zdd„ Zd	d
„ ZdS )ÚTooLongLineTestss   250 OKó   .rU   ó   
c                 C   sš   t ƒ | _tj| _t ¡ | _| jt_t 	¡ | _
t tjtj¡| _| j d¡ t | j¡| _| j
| j| jf}tjt|d| _| j ¡  | j
 ¡  | j
 ¡  d S )Né   ru   )r   rx   r{   r|   r}   r~   r   r€   r   r‚   r   r   ÚAF_INETÚSOCK_STREAMr@   Ú
settimeoutr   Z	bind_portr*   Úrespdatarˆ   r&   r‰   rŠ   r‹   rŒ   )r   Zservargsr   r   r   r+     s    



zTooLongLineTests.setUpc                 C   s6   | j  ¡  | jt_t| jƒ | `|  ¡  t| j	Ž  d S r   )
r   r‹   r}   r{   r|   r
   r‰   rŽ   r	   rx   r   r   r   r   r,     s    

zTooLongLineTests.tearDownc                 C   s   |   tjtjt| jdd¡ d S r  )rF   r)   ÚSMTPResponseExceptionr[   r4   r*   r   r   r   r   ÚtestLineTooLong  s    
ÿz TooLongLineTests.testLineTooLongN)	rW   rX   rY   r)   Z_MAXLINEr  r+   r,   r  r   r   r   r   r    s   r  zJohn AzSally BzRuth C)úMr.A@somewhere.comúMs.B@xn--fo-fka.comúMrs.C@somewhereesle.com)r  Zsomepasswordz<PENCeUxFREJoU0NnbmhNWitOMjNGNndAZWx3b29kLmlubm9zb2Z0LmNvbT4=r  r  r  )zlist-1zlist-2c                   @   s   e Zd ZdS )ÚResponseExceptionN)rW   rX   rY   r   r   r   r   r  .  ó    r  c                       sè   e Zd ZdZdZdZdZdZdZdZ	dZ
dZ‡ fdd„Z‡ fdd„Zdd	„ Zd
d„ Zdd„ Zd(dd„Zd)dd„Zd*dd„Zd+dd„Zdd„ Zdd„ Zdd„ Z‡ fdd„Z‡ fdd„Z‡ fd d!„Z‡ fd"d#„Z‡ fd$d%„Zd&d'„ Z‡  ZS ),ÚSimSMTPChannelNr   éc   c                    s0   d  dd„ |D ƒ¡| _tt| ƒj|i |¤Ž d S )NÚ c                 S   s   g | ]}d   |¡‘qS )z	250-{0}
)ræ   )Ú.0Úxr   r   r   Ú
<listcomp>=  r  z+SimSMTPChannel.__init__.<locals>.<listcomp>)ÚjoinÚ_extrafeaturesra   r   Ú__init__)r   Zextra_featuresrw   Úkwrb   r   r   r(  ;  s    ÿzSimSMTPChannel.__init__c              
      s˜   | j | jkrŠ| j | j¡}tdt|ƒtjd g | _z|  	|¡ W nB t
y„ } z*| j| _ |  d|j|jf ¡ W Y d }~n
d }~0 0 d S tƒ  ¡  d S )NzData:)Úfileú%s %s)Ú
smtp_stateÚAUTHZ_emptystringr&  Zreceived_linesÚprintÚreprrƒ   r„   Úauth_objectr  ÚCOMMANDÚpushÚ	smtp_codeÚ
smtp_errorra   Úfound_terminator)r   Úliner$   rb   r   r   r5  A  s    ,zSimSMTPChannel.found_terminatorc                 C   sä   | j s|  d¡ d S | jr$d| jvr2|  d¡ d S | jd urJ|  d¡ d S | ¡ }t|ƒdvrl|  d¡ d S d|d  ¡  d	d
¡ }zt	| |ƒ| _
W n$ ty¸   |  d |¡¡ Y d S 0 | j| _|  
t|ƒdkrÚ|d nd ¡ d S )Nz503 Error: send EHLO firstr-  z(500 Error: command "AUTH" not recognizedz3503 Bad sequence of commands: already authenticated)r   rU   z/501 Syntax: AUTH <mechanism> [initial-response]z_auth_%sr   ú-Ú_zQ504 Command parameter not implemented: unsupported  authentication mechanism {!r}rU   r   )Úseen_greetingr2  Úextended_smtpr'  Úauthenticated_userÚsplitÚlenÚlowerÚreplaceÚgetattrr0  ÚAttributeErrorræ   r-  r,  )r   Úargrw   Zauth_object_namer   r   r   Ú	smtp_AUTHO  s2    


ÿ
ÿzSimSMTPChannel.smtp_AUTHc                 C   s,   |r|| _ |  d¡ n
|  d¡ | j| _d S )Nz235 Authentication Succeededz&535 Authentication credentials invalid)r;  r2  r1  r,  )r   ÚuserZvalidr   r   r   Ú_authenticatedh  s
    
zSimSMTPChannel._authenticatedc                 C   s   t  | d¡¡ d¡S )NrÅ   úutf-8)Úbase64ZdecodebytesÚencoderÆ   )r   Ústringr   r   r   Ú_decode_base64p  s    zSimSMTPChannel._decode_base64c              
   C   s†   |d u r|   d¡ nn|  |¡}z| d¡^ }}}W n8 tyl } z |   d ||¡¡ W Y d }~d S d }~0 0 |  ||td k¡ d S )Nz334 ú ú=535 Splitting response {!r} into user and password failed: {}r   )r2  rJ  r<  rG   ræ   rE  Úsim_auth)r   rB  Úlogpassr8  rD  Úpasswordr$   r   r   r   Ú_auth_plains  s    
ÿzSimSMTPChannel._auth_plainc                 C   s^   |d u r|   d¡ nFt| dƒs6|  |¡| _|   d¡ n$|  |¡}|  | j|td k¡ | `d S )Nz334 VXNlcm5hbWU6Ú_auth_login_userz334 UGFzc3dvcmQ6r   )r2  re   rJ  rQ  rE  rM  )r   rB  rO  r   r   r   Ú_auth_login€  s    

zSimSMTPChannel._auth_loginc                 C   s   |   d¡ d S )Nz334 QnVHZ1liVWdHeQ==)r2  ©r   rB  r   r   r   Ú_auth_buggy  s    zSimSMTPChannel._auth_buggyc              
   C   sª   |d u r|   d t¡¡ nŒ|  |¡}z| ¡ \}}W n8 tyl } z |   d ||¡¡ W Y d }~dS d }~0 0 t td  	d¡|  t¡ 	d¡d¡ 
¡ }|  |||k¡ d S )Nz334 {}rL  Fr   rÅ   Úmd5)r2  ræ   Úsim_cram_md5_challengerJ  r<  rG   ÚhmacZHMACrM  rH  Ú	hexdigestrE  )r   rB  rN  rD  Zhashed_passr$   Zvalid_hashed_passr   r   r   Ú_auth_cram_md5’  s     
ÿýzSimSMTPChannel._auth_cram_md5c                 C   s,   d}|| j  d }|  |¡ || _d| _d S )NzH250-testhost
250-EXPN
250-SIZE 20000000
250-STARTTLS
250-DELIVERBY
z250 HELPT)r'  r2  r9  r:  )r   rB  Úrespr   r   r   Ú	smtp_EHLO¤  s
    
zSimSMTPChannel.smtp_EHLOc                 C   s8   |t v r&|  dt | t |¡f ¡ n|  d| ¡ d S )Nú	250 %s %sz550 No such user: %s)Ú	sim_usersr2  r)   Ú	quoteaddrrS  r   r   r   Ú	smtp_VRFY¯  s    zSimSMTPChannel.smtp_VRFYc                 C   s‚   |  ¡ }|tv rtt| }t|ƒD ]P\}}t |¡}|t|ƒd k rZ|  dt| |f ¡ q |  dt| |f ¡ q n
|  d¡ d S )Nr   z	250-%s %sr\  z550 No access for you!)r>  Ú	sim_listsÚ	enumerater)   r^  r=  r2  r]  )r   rB  Z	list_nameZ	user_listr!   Z
user_emailZquoted_addrr   r   r   Ú	smtp_EXPN¶  s    
zSimSMTPChannel.smtp_EXPNc                    s4   | j d u rtt| ƒ |¡ n|  | j ¡ |  ¡  d S r   )Úquit_responsera   r   Ú	smtp_QUITr2  Úclose_when_donerS  rb   r   r   rd  Ã  s    
zSimSMTPChannel.smtp_QUITc                    s6   | j d u rtƒ  |¡ n|  | j ¡ | jr2|  ¡  d S r   )Úmail_responsera   Ú	smtp_MAILr2  Ú
disconnectre  rS  rb   r   r   rg  Ê  s
    
zSimSMTPChannel.smtp_MAILc                    sB   | j d u rtƒ  |¡ d S |  jd7  _|  | j | jd  ¡ d S ©Nr   )Úrcpt_responsera   Ú	smtp_RCPTÚ
rcpt_countr2  rS  rb   r   r   rk  Ò  s
    
zSimSMTPChannel.smtp_RCPTc                    s   |  j d7  _ tƒ  |¡ d S ri  )Ú
rset_countra   Ú	smtp_RSETrS  rb   r   r   rn  Ù  s    zSimSMTPChannel.smtp_RSETc                    s(   | j d u rtƒ  |¡ n|  | j ¡ d S r   )Údata_responsera   Ú	smtp_DATAr2  rS  rb   r   r   rp  Ý  s    
zSimSMTPChannel.smtp_DATAc                  C   s   ‚ d S r   r   r   r   r   r   Úhandle_errorã  s    zSimSMTPChannel.handle_error)N)N)N)N)rW   rX   rY   rc  rf  rj  ro  rl  rm  rh  r-  r;  r(  r5  rC  rE  rJ  rP  rR  rT  rY  r[  r_  rb  rd  rg  rk  rn  rp  rq  rf   r   r   rb   r   r   /  s6   



r   c                   @   s8   e Zd ZeZdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Z	dS )ÚSimSMTPServerc                 O   s*   g | _ i | _tjj| g|¢R i |¤Ž d S r   )Ú_extra_featuresÚ
_addressesrƒ   Ú
SMTPServerr(  ©r   rw   r)  r   r   r   r(  ë  s    zSimSMTPServer.__init__c                 C   s   | j | j| ||| jd| _d S )Nrs   )Úchannel_classrs  Ú_decode_dataÚ_SMTPchannel©r   r   r    r   r   r   Úhandle_acceptedð  s    
þzSimSMTPServer.handle_acceptedc                 C   s   || j d< || j d< d S )NÚfromÚtos)rt  )r   ÚpeerÚmailfromÚrcpttosÚdatar   r   r   Úprocess_messageõ  s    
zSimSMTPServer.process_messagec                 C   s   | j  |¡ d S r   )rs  Úappend)r   Zfeaturer   r   r   Úadd_featureù  s    zSimSMTPServer.add_featurec                  C   s   ‚ d S r   r   r   r   r   r   rq  ü  s    zSimSMTPServer.handle_errorN)
rW   rX   rY   r   rw  r(  r{  r‚  r„  rq  r   r   r   r   rr  ç  s   rr  c                   @   sð   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zejddddd„ ƒZejddddd„ ƒZdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6S )7ÚSMTPSimTestsc                 C   s”   t ƒ | _tj| _tjt_t ¡ | _t ¡ | _	t
tdfddd| _| jj ¡ d | _| j| j| j	f}tjt|d| _| j ¡  | j ¡  | j ¡  d S ©Nr   rq   Trs   r   ru   )r   rx   r   ry   rz   r   r   r‚   rm   rn   rr  r4   r   r†   r*   rˆ   ro   r‰   rŠ   r‹   rŒ   r   r   r   r   r+     s    



zSMTPSimTests.setUpc                 C   s@   | j t_| j ¡  | j ¡  t| jƒ | `|  	¡  t
| jŽ  d S r   ©rz   r   ry   rn   r   rm   r‹   r
   r‰   rŽ   r	   rx   r   r   r   r   r,     s    


zSMTPSimTests.tearDownc                 C   s"   t jt| jdtjd}| ¡  d S r”   r—   rš   r   r   r   rœ   !  s    ÿzSMTPSimTests.testBasicc                 C   s€   t jt| jdtjd}|  |ji ¡ ddddddœ}| ¡  |  |j|¡ |D ]}|  	| 
|¡¡ qN|  | 
d¡¡ | ¡  d S )Nr•   r–   r"  Z20000000)ÚexpnÚsizeZstarttlsZ	deliverbyr¶   zunsupported-feature)r)   r[   r4   r*   r   r˜   r-   Úesmtp_featuresr§   Ú
assertTruer  ÚassertFalser™   )r   r›   Zexpected_featuresÚkr   r   r   ÚtestEHLO'  s     ÿüzSMTPSimTests.testEHLOc                 C   sŠ   t jt| jdtjd}t ¡ D ]6\}}dtd|t  	|¡f dƒf}|  
| |¡|¡ qd}dd|  d¡f}|  
| |¡|¡ | ¡  d S )	Nr•   r–   r¢   r+  rÅ   r²   é&  zNo such user: %s)r)   r[   r4   r*   r   r˜   r]  ÚitemsÚbytesr^  r-   r³   rH  r™   )r   r›   Z	addr_specÚnameÚexpected_knownÚuÚexpected_unknownr   r   r   r´   =  s    ÿÿþzSMTPSimTests.testVRFYc           	   	   C   sž   t jt| jdtjd}t ¡ D ]X\}}g }|D ] }| dt	| t  
|¡f ¡ q.dtd |¡dƒf}|  | |¡|¡ qd}d}|  | |¡|¡ | ¡  d S )	Nr•   r–   r+  r¢   Ú
rÅ   zPSU-Members-List)r  s   No access for you!)r)   r[   r4   r*   r   r˜   r`  r  rƒ  r]  r^  r‘  r&  r-   rˆ  r™   )	r   r›   ZlistnameÚmembersZusersrÂ   r“  r”  r•  r   r   r   ÚtestEXPNL  s    ÿzSMTPSimTests.testEXPNc                 C   sN   | j  d¡ tjt| jdtjd}| t	d t	d ¡}|  
|d¡ | ¡  d S )Nú
AUTH PLAINr•   r–   r   r   ©éë   s   Authentication Succeeded©r   r„  r)   r[   r4   r*   r   r˜   ÚloginrM  r-   r   ©r   r›   rZ  r   r   r   ÚtestAUTH_PLAIN\  s    ÿzSMTPSimTests.testAUTH_PLAINc                 C   sN   | j  d¡ tjt| jdtjd}| t	d t	d ¡}|  
|d¡ | ¡  d S )Nú
AUTH LOGINr•   r–   r   r   rš  rœ  rž  r   r   r   ÚtestAUTH_LOGINd  s    ÿzSMTPSimTests.testAUTH_LOGINc                 C   sz   | j  d¡ tjt| jdtjdD}t\|_	|_
| d¡ |jd|jdd}|  |d¡ W d   ƒ n1 sl0    Y  d S )	Nr   r•   r–   Útest_auth_loginÚLOGINT©Zinitial_response_okrš  ©r   r„  r)   r[   r4   r*   r   r˜   rM  rD  rO  r§   ÚauthZ
auth_loginr-   rž  r   r   r   Ú"testAUTH_LOGIN_initial_response_okl  s    ÿ
z/SMTPSimTests.testAUTH_LOGIN_initial_response_okc                 C   sz   | j  d¡ tjt| jdtjdD}t\|_	|_
| d¡ |jd|jdd}|  |d¡ W d   ƒ n1 sl0    Y  d S )	Nr   r•   r–   r¢  r£  Fr¤  rš  r¥  rž  r   r   r   Ú%testAUTH_LOGIN_initial_response_notoku  s    ÿ
z2SMTPSimTests.testAUTH_LOGIN_initial_response_notokc                    s¤   ˆ j  d¡ d‡ fdd„	}tjtˆ jdtjd}zdt\|_	|_
| d¡ d}ˆ  tj|¡ }|jd|d	d
 W d   ƒ n1 s€0    Y  W | ¡  n
| ¡  0 d S )Nz
AUTH BUGGYc                    s   ˆ   d| ¡ dS )Ns
   BuGgYbUgGyrK  )r-   )Z	challenger   r   r   Ú
auth_buggy  s    z/SMTPSimTests.testAUTH_BUGGY.<locals>.auth_buggyr•   r–   Ztest_auth_buggyz&^Server AUTH mechanism infinite loop.*ZBUGGYFr¤  )N)r   r„  r)   r[   r4   r*   r   r˜   rM  rD  rO  r§   ZassertRaisesRegexZSMTPExceptionr¦  r   )r   r©  r›   ÚexpectÚcmr   r   r   ÚtestAUTH_BUGGY~  s    þ
0zSMTPSimTests.testAUTH_BUGGYrU  T)Zopensslc                 C   sN   | j  d¡ tjt| jdtjd}| t	d t	d ¡}|  
|d¡ | ¡  d S )NzAUTH CRAM-MD5r•   r–   r   r   rš  rœ  rž  r   r   r   ÚtestAUTH_CRAM_MD5’  s    ÿzSMTPSimTests.testAUTH_CRAM_MD5c                 C   sN   | j  d¡ tjt| jdtjd}| t	d t	d ¡}|  
|d¡ | ¡  d S )NzAUTH BOGUS PLAIN LOGIN CRAM-MD5r•   r–   r   r   rš  rœ  rž  r   r   r   ÚtestAUTH_multiple›  s    ÿzSMTPSimTests.testAUTH_multiplec              	   C   sø   ddh}zt  ¡  W n ty&   Y n0 | d¡ |D ]}| j d |¡¡ q6|D ] }| j|d€ tj	t
| jdtjd}| d¡ td	 td
  |_|_d| ¡  dd¡ }| |t||ƒ¡}|  |d¡ | ¡  W d   ƒ qR1 sè0    Y  qRd S )NZPLAINr£  zCRAM-MD5zAUTH {})Ú	mechanismr•   r–   Zfoor   r   Zauth_r7  r8  rš  )ÚhashlibrU  rG   Úaddr   r„  ræ   ZsubTestr)   r[   r4   r*   r   r˜   r§   rM  rD  rO  r>  r?  r¦  r@  r-   r   )r   Z	supportedr¯  r›   ÚmethodrZ  r   r   r   Útest_auth_function¥  s(    

þ
zSMTPSimTests.test_auth_functionc                 C   s   t jt| jdtjd}| ¡ \}}|  |d¡ |  d|j	¡ | 
¡  |  d|j	¡ | t| j¡ |  d|j	¡ | ¡  |  d|j	¡ | 
¡  d S )Nr•   r–   r¢   r‰  )r)   r[   r4   r*   r   r˜   r§   r-   r¬   rŠ  r™   rÌ   rL   Zehlo_or_helo_if_needed©r   r›   ÚcodeÚmessager   r   r   Útest_quit_resets_greeting»  s    
þz&SMTPSimTests.test_quit_resets_greetingc                 C   s¤   t  t| j¡(}| ¡ \}}|  |d¡ W d   ƒ n1 s<0    Y  |  t j|jd¡ t  t| j¡}| 	¡  W d   ƒ n1 s„0    Y  |  t j|jd¡ d S )Nr¢   s   foo)
r)   r[   r4   r*   r£   r-   rF   rþ   r   r   r´  r   r   r   Útest_with_statementÊ  s    *&z SMTPSimTests.test_with_statementc              	   C   s   |   tj¡P}t t| j¡"}| ¡  d| jj_	W d   ƒ n1 sD0    Y  W d   ƒ n1 sb0    Y  |  
|jjd¡ |  
|jjd¡ d S )Nz421 QUIT FAILEDé¥  s   QUIT FAILED)rF   r)   r  r[   r4   r*   r£   r   ry  rc  r-   r®   r3  r4  )r   Úerrorr›   r   r   r   Ú test_with_statement_QUIT_failureÓ  s    Fz-SMTPSimTests.test_with_statement_QUIT_failurec                 C   s|   t jt| jdtjd}| ¡  d| jj_	d| jj_
|  t j¡ | ddd¡ W d   ƒ n1 sb0    Y  |  |j¡ d S )Nr•   r–   z451 Requested action abortedTr¹   rº   útest message)r)   r[   r4   r*   r   r˜   r£   r   ry  rf  rh  rF   ÚSMTPSenderRefusedr½   r=   r@   rš   r   r   r   Útest__rest_from_mail_cmdß  s    ÿ

,z%SMTPSimTests.test__rest_from_mail_cmdc                 C   s„   t jt| jdtjd}| ¡  d| jj_	|  
t j¡ | ddd¡ W d   ƒ n1 sX0    Y  |  |j¡ |  | jjjd¡ d S )Nr•   r–   z421 closing connectionr¹   rº   r¼  r   )r)   r[   r4   r*   r   r˜   r£   r   ry  rf  rF   r½  r½   r=   r@   r-   rm  rš   r   r   r   Útest_421_from_mail_cmdê  s    ÿ
,z#SMTPSimTests.test_421_from_mail_cmdc                 C   s¤   t jt| jdtjd}| ¡  ddg| jj_	|  
t j¡"}| dg d¢d¡ W d   ƒ n1 s`0    Y  |  |j¡ |  | jjjd¡ |  |jjd d	d
i¡ d S )Nr•   r–   z250 acceptedú421 closingr¹   )rº   ÚFrankZGeorger¼  r   rÁ  )r¹  s   closing)r)   r[   r4   r*   r   r˜   r£   r   ry  rj  rF   ZSMTPRecipientsRefusedr½   r=   r@   r-   rm  ÚassertDictEqualr®   rw   )r   r›   r"   r   r   r   Útest_421_from_rcpt_cmdô  s    ÿ0z#SMTPSimTests.test_421_from_rcpt_cmdc                 C   s”   G dd„ dt ƒ}|| j_tjt| jdtjd}| 	¡  |  
tj¡  | ddgd¡ W d   ƒ n1 sh0    Y  |  |j¡ |  | jjjd¡ d S )	Nc                       s   e Zd Z‡ fdd„Z‡  ZS )z=SMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannelc                    s&   | j | jkr|  d¡ n
tƒ  ¡  d S )NrÀ  )r,  ZDATAr2  ra   r5  r   rb   r   r   r5    s    zNSMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannel.found_terminator)rW   rX   rY   r5  rf   r   r   rb   r   ÚMySimSMTPChannel   s   rÄ  r•   r–   zJohn@foo.orgzSally@foo.orgr¼  r   )r   r   rw  r)   r[   r4   r*   r   r˜   r£   rF   ZSMTPDataErrorr½   r=   r@   r-   ry  rl  )r   rÄ  r›   r   r   r   Útest_421_from_data_cmdÿ  s    ÿ.z#SMTPSimTests.test_421_from_data_cmdc                 C   s‚   t jt| jdtjd}|  |j¡ | ¡  |  	|j
¡ |  | d¡¡ | jt j|jdddddgd	 | jt j|jdddgd
 d S )Nr•   r–   Úsmtputf8r¹   rº   r"  r  r  ©r  ©Úoptions)r)   r[   r4   r*   r   r˜   r   r   r§   r‹  Ú
does_esmtprŒ  r  rF   ÚSMTPNotSupportedErrorr½   rÏ   rš   r   r   r   Ú4test_smtputf8_NotSupportedError_if_no_server_support  s"    þýþzASMTPSimTests.test_smtputf8_NotSupportedError_if_no_server_supportc                 C   sJ   t jt| jdtjd}|  |j¡ |  t	|j
ddd¡ |  t	|jd¡ d S )Nr•   r–   ZAliceu   BÃ¶br"  u   Ã„lice)r)   r[   r4   r*   r   r˜   r   r   rF   ÚUnicodeEncodeErrorr½   rÏ   rš   r   r   r   Ú"test_send_unicode_without_SMTPUTF8  s    þz/SMTPSimTests.test_send_unicode_without_SMTPUTF8c                 C   sz   t ƒ }d|d< d|d< d|d< tjt| jdtjd}|  |j¡ |  	tj
¡ | |¡ W d   ƒ n1 sl0    Y  d S )	Nr  rÞ   rì   rß   õ   Nudge nudge, wink, wink á½ 9ÚSubjectr•   r–   )r   r)   r[   r4   r*   r   r˜   r   r   rF   rË  rÚ   )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_smtputf8c                 C   sˆ   t jt| jdtjd}|  |j¡ tƒ }t	j
 d¡|d< t	j
 d¡|d< |  | |¡i ¡ |  | jjd d¡ |  | jjd	 d
g¡ d S )Nr•   r–   )u   MichaÃ«lúmichael@example.comrÞ   )u   RenÃ©úrene@example.comrß   r|  rÒ  r}  rÓ  )r)   r[   r4   r*   r   r˜   r   r   r   rÖ   ZutilsZ
formataddrrÂ  rÚ   r-   r   rt  )r   r›   r¶  r   r   r   Ú1test_name_field_not_included_in_envelop_addresses5  s    þz>SMTPSimTests.test_name_field_not_included_in_envelop_addressesN)rW   rX   rY   r+   r,   rœ   rŽ  r´   r˜  rŸ  r¡  r§  r¨  r¬  r   Zrequires_hashdigestr­  r®  r³  r·  r¸  r»  r¾  r¿  rÃ  rÅ  rÌ  rÎ  rÑ  rÔ  r   r   r   r   r…    s6   		

		
r…  c                   @   s&   e Zd Zdd„ Zdd„ Zddd„ZdS )	ÚSimSMTPUTF8Serverc                 O   s(   ddg| _ tjj| g|¢R i |¤Ž d S )Nr  Z8BITMIME)rs  rƒ   ru  r(  rv  r   r   r   r(  G  s    
zSimSMTPUTF8Server.__init__c                 C   s"   | j | j| ||| j| jd| _d S )N©rt   Úenable_SMTPUTF8)rw  rs  rx  r×  ry  rz  r   r   r   r{  N  s
    
ýz!SimSMTPUTF8Server.handle_acceptedNc                 C   s(   || _ || _|| _|| _|| _|| _d S r   )Z	last_peerÚlast_mailfromÚlast_rcpttosÚlast_messageÚlast_mail_optionsÚlast_rcpt_options)r   r~  r  r€  r  r  Zrcpt_optionsr   r   r   r‚  U  s    z!SimSMTPUTF8Server.process_message)NN)rW   rX   rY   r(  r{  r‚  r   r   r   r   rÕ  E  s
     ÿrÕ  c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚSMTPUTF8SimTestsNc                 C   s–   t ƒ | _tj| _tjt_t ¡ | _t ¡ | _	t
tdfdddd| _| jj ¡ d | _| j| j| j	f}tjt|d| _| j ¡  | j ¡  | j ¡  d S )Nr   rq   FTrÖ  r   ru   )r   rx   r   ry   rz   r   r   r‚   rm   rn   rÕ  r4   r   r†   r*   rˆ   ro   r‰   rŠ   r‹   rŒ   r   r   r   r   r+   c  s    


þ

zSMTPUTF8SimTests.setUpc                 C   s@   | j t_| j ¡  | j ¡  t| jƒ | `|  	¡  t
| jŽ  d S r   r‡  r   r   r   r   r,   w  s    


zSMTPUTF8SimTests.tearDownc                 C   sJ   t jt| jdtjd}|  |j¡ | ¡  |  	|j
¡ |  	| d¡¡ d S )Nr•   r–   rÆ  )r)   r[   r4   r*   r   r˜   r   r   r§   r‹  rÊ  r  rš   r   r   r   Ú$test_test_server_supports_extensions‚  s    þz5SMTPUTF8SimTests.test_test_server_supports_extensionsc                 C   s¨   d  d¡}tjt| jdtjd}|  |j¡ |j	dd|ddgd	 |  
| jjd¡ |  
| jjdg¡ |  
| jj|¡ |  d| jj¡ |  d| jj¡ |  
| jjg ¡ d S )
Nõ$   Â¡a test message containing unicode!rF  r•   r–   u   JÅ‘hnu   SÃ¡llyr  r  rÇ  )rH  r)   r[   r4   r*   r   r˜   r   r   r½   r-   r   rØ  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_sendmailc                 C   sØ   d  d¡}tjt| jdtjd}|  |j¡ | 	¡  |  
|jdddgdd	¡ |  
| d
¡d	¡ |  
| |¡d	¡ |  
| jjd¡ |  
| jjd
g¡ |  
| jj|¡ |  d| jj¡ |  d| jj¡ |  
| jjg ¡ d S )Nrß  rF  r•   r–   u   JÅ‘r  r  rÈ  r¡   u   JÃ¡nos)rH  r)   r[   r4   r*   r   r˜   r   r   r§   r-   rÏ   Zrcptr  r   rØ  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_APIc                 C   sÐ   t ƒ }d|d< d|d< d|d< | d¡ t d¡}tjt| jd	tj	d
}|  
|j¡ |  | |¡i ¡ |  | jjd¡ |  | jjdg¡ |  | jj ¡ |¡ |  d| jj¡ |  d| jj¡ |  | jjg ¡ d S )Nr  rÞ   rì   rß   rÏ  rÐ  u1   oh 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.comr  r  )r   Zset_contentÚtextwrapÚdedentr)   r[   r4   r*   r   r˜   r   r   r-   rÚ   r   rØ  rÙ  rÚ  rÆ   r¬   rÛ  rÜ  )r   rÐ   r.   r›   r   r   r   Ú2test_send_message_uses_smtputf8_if_addrs_non_ascii­  s$    


þzCSMTPUTF8SimTests.test_send_message_uses_smtputf8_if_addrs_non_ascii)
rW   rX   rY   rü   r+   r,   rÞ  rà  rá  rä  r   r   r   r   rÝ  _  s   	rÝ  s    psu doesnotexistr"  )Zeolc                   @   s   e Zd Zdd„ ZdS )Ú!SimSMTPAUTHInitialResponseChannelc                 C   sL   |  ¡ }|d  ¡ dkr>t|ƒdkr>|d tkr>|  d¡ d S |  d¡ d S )Nr   ÚplainrU   r   z235 Okz571 Bad authentication)r<  r>  r=  ÚEXPECTED_RESPONSEr2  )r   rB  rw   r   r   r   rC  Ñ  s    
z+SimSMTPAUTHInitialResponseChannel.smtp_AUTHN)rW   rX   rY   rC  r   r   r   r   rå  Ð  s   rå  c                   @   s   e Zd ZeZdS )Ú SimSMTPAUTHInitialResponseServerN)rW   rX   rY   rå  rw  r   r   r   r   rè  ß  s   rè  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚSMTPAUTHInitialResponseSimTestsc                 C   s”   t ƒ | _tj| _tjt_t ¡ | _t ¡ | _	t
tdfddd| _| jj ¡ d | _| j| j| j	f}tjt|d| _| j ¡  | j ¡  | j ¡  d S r†  )r   rx   r   ry   rz   r   r   r‚   rm   rn   rè  r4   r   r†   r*   rˆ   ro   r‰   rŠ   r‹   rŒ   r   r   r   r   r+   ä  s    


ÿ

z%SMTPAUTHInitialResponseSimTests.setUpc                 C   s@   | j t_| j ¡  | j ¡  t| jƒ | `|  	¡  t
| jŽ  d S r   r‡  r   r   r   r   r,   ÷  s    


z(SMTPAUTHInitialResponseSimTests.tearDownc                 C   s:   | j  d¡ tjt| jdtjd}| dd¡ | 	¡  d S )Nr™  r•   r–   ÚpsuÚdoesnotexist)
r   r„  r)   r[   r4   r*   r   r˜   r  r   rš   r   r   r   Ú%testAUTH_PLAIN_initial_response_login  s    ÿzESMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_loginc                 C   sX   | j  d¡ tjt| jdtjd}d|_d|_	| 
d|j¡\}}| ¡  |  |d¡ d S )Nr™  r•   r–   rê  rë  ræ  r›  )r   r„  r)   r[   r4   r*   r   r˜   rD  rO  r¦  Z
auth_plainr   r-   )r   r›   rµ  Úresponser   r   r   Ú$testAUTH_PLAIN_initial_response_auth	  s    ÿzDSMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_authN)rW   rX   rY   r+   r,   rì  rî  r   r   r   r   ré  ã  s   ré  Ú__main__)Fri   rG  Zemail.mime.textrÖ   Zemail.messager   Zemail.base64mimer   Zencode_base64Zemail.utilsr°  rW  r   rƒ   r)   r~   rM   r{   rk   r   rŸ   râ  r   rd   Útestr   r   Ztest.supportr   r   r   r	   r
   Zunittest.mockr   r4   Úplatformr   ZSMTPChannelr&   r'   ZTestCaserZ   r\   ro   r¿   rÀ   rp   rý   r  r  r  r]  rM  rV  r`  Ú	Exceptionr  r   ru  rr  r…  rÕ  rÝ  rç  rå  rè  ré  rW   Úmainr   r   r   r   Ú<module>   s†   c   X þÿ 9  Eo1
