a
    äzeK¡  ã                   @   sx  d dl Z d dlZd dlmZmZ d dlmZ d dlZd dlZd dl	Z	d dl
Z
G dd„ de	jƒZG dd„ deƒZG dd	„ d	eƒZG d
d„ de jƒZG dd„ de jƒZG dd„ de jƒZG dd„ de jƒZG dd„ de jƒZG dd„ de jƒZe  ejd¡G dd„ deƒƒZG dd„ de jƒZG dd„ de jƒZG dd„ de jƒZG dd „ d e jƒZG d!d"„ d"e jƒZed#krte   ¡  dS )$é    N)ÚsupportÚmock_socket)Úsocket_helperc                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚDummyServerc                 O   s8   t jj| g|¢R i |¤Ž g | _| jr.d| _nd| _d S )Nzreturn statuss   return status)ÚsmtpdÚ
SMTPServerÚ__init__ÚmessagesZ_decode_dataÚreturn_status)ÚselfÚargsÚkwargs© r   ú%/usr/lib/python3.9/test/test_smtpd.pyr      s
    zDummyServer.__init__c                 K   s>   | j  ||||f¡ || jkr"dS d|v r:d|d v r:dS d S )Nz	250 OkishZmail_optionsZSMTPUTF8z250 SMTPUTF8 message okish)r	   Úappendr
   )r   ZpeerÚmailfromZrcpttosÚdataÚkwr   r   r   Úprocess_message   s
    
zDummyServer.process_messageN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s   r   c                   @   s   e Zd ZdS )ÚDummyDispatcherBrokenN)r   r   r   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd„ ZdS )ÚBrokenDummyServerc                 C   s
   t ƒ ‚d S ©N)r   )r   Únumr   r   r   Úlisten!   s    zBrokenDummyServer.listenN)r   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d„ Zd	S )
ÚSMTPDServerTestc                 C   s   t  t_t_d S r   ©r   r   ÚsocketÚasyncore©r   r   r   r   ÚsetUp&   s    zSMTPDServerTest.setUpc                    sr   t jtjdfddd}| ¡ \}}t j|||dd‰ ‡ fdd„}|dƒ |dƒ |d	ƒ |d
ƒ |  t|d¡ d S )Nr   ©Úbr   T©Údecode_datac                    s   ˆ j  | ¡ ˆ  ¡  d S r   ©r   Ú
queue_recvÚhandle_read©Úline©Úchannelr   r   Ú
write_line/   s    zFSMTPDServerTest.test_process_message_unimplemented.<locals>.write_lineó   HELO exampleó   MAIL From:eggs@exampleó   RCPT To:spam@exampleó   DATAs	   spam
.
)r   r   r   ÚHOSTÚacceptÚSMTPChannelÚassertRaisesÚNotImplementedError)r   ÚserverÚconnÚaddrr.   r   r,   r   Ú"test_process_message_unimplemented)   s    ÿz2SMTPDServerTest.test_process_message_unimplementedc                 C   s"   | j ttjtjdfdddd d S )Nr   r#   T©Úenable_SMTPUTF8r&   )r6   Ú
ValueErrorr   r   r   r3   r!   r   r   r   Ú+test_decode_data_and_enable_SMTPUTF8_raises9   s    úz;SMTPDServerTest.test_decode_data_and_enable_SMTPUTF8_raisesc                 C   s   t  ¡  t t _t_d S r   ©r    Ú	close_allr   r   r!   r   r   r   ÚtearDownB   s    zSMTPDServerTest.tearDownN)r   r   r   r"   r;   r?   rB   r   r   r   r   r   %   s   	r   c                   @   sF   e Zd Zdd„ Zddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dS )ÚDebuggingServerTestc                 C   s   t  t_t_d S r   r   r!   r   r   r   r"   I   s    zDebuggingServerTest.setUpFc                    sN   ‡ fdd„}|dƒ |r"|dƒ n|dƒ |dƒ |dƒ ||ƒ |dƒ d S )	Nc                    s   ˆ j  | ¡ ˆ  ¡  d S r   r'   r*   r,   r   r   r.   M   s    z1DebuggingServerTest.send_data.<locals>.write_lineó   EHLO examples-   MAIL From:eggs@example BODY=8BITMIME SMTPUTF8r0   r1   r2   ó   .r   )r   r-   r   r=   r.   r   r,   r   Ú	send_dataL   s    
zDebuggingServerTest.send_datac                 C   s†   t jtjdfddd}| ¡ \}}t j|||dd}t ¡ }|  |d¡ W d   ƒ n1 s^0    Y  | 	¡ }|  
|t d¡¡ d S )Nr   r#   Tr%   s   From: test

hello
zÁ             ---------- MESSAGE FOLLOWS ----------
             From: test
             X-Peer: peer-address

             hello
             ------------ END MESSAGE ------------
             ©r   ZDebuggingServerr   r3   r4   r5   r   Zcaptured_stdoutrF   ÚgetvalueÚassertEqualÚtextwrapÚdedent©r   r8   r9   r:   r-   ÚsÚstdoutr   r   r   Ú*test_process_message_with_decode_data_trueZ   s    ÿ
*z>DebuggingServerTest.test_process_message_with_decode_data_truec                 C   s~   t  tjdfd¡}| ¡ \}}t  |||¡}t ¡ }|  |d¡ W d   ƒ n1 sV0    Y  | 	¡ }|  
|t d¡¡ d S )Nr   r#   ó   From: test

hÃ©lloÿ
úå             ---------- MESSAGE FOLLOWS ----------
             b'From: test'
             b'X-Peer: peer-address'
             b''
             b'h\xc3\xa9llo\xff'
             ------------ END MESSAGE ------------
             rG   rL   r   r   r   Ú+test_process_message_with_decode_data_falsek   s    
*z?DebuggingServerTest.test_process_message_with_decode_data_falsec                 C   s†   t jtjdfddd}| ¡ \}}t j|||dd}t ¡ }|  |d¡ W d   ƒ n1 s^0    Y  | 	¡ }|  
|t d¡¡ d S )Nr   r#   T©r=   rP   rQ   rG   rL   r   r   r   Ú.test_process_message_with_enable_SMTPUTF8_true{   s    ÿ
*zBDebuggingServerTest.test_process_message_with_enable_SMTPUTF8_truec                 C   sŠ   t jtjdfddd}| ¡ \}}t j|||dd}t ¡  }| j|ddd W d   ƒ n1 sb0    Y  | 	¡ }|  
|t d¡¡ d S )Nr   r#   TrS   rP   a               ---------- MESSAGE FOLLOWS ----------
             mail options: ['BODY=8BITMIME', 'SMTPUTF8']
             b'From: test'
             b'X-Peer: peer-address'
             b''
             b'h\xc3\xa9llo\xff'
             ------------ END MESSAGE ------------
             rG   rL   r   r   r   Ú7test_process_SMTPUTF8_message_with_enable_SMTPUTF8_trueŒ   s    ÿ
ÿ$zKDebuggingServerTest.test_process_SMTPUTF8_message_with_enable_SMTPUTF8_truec                 C   s   t  ¡  t t _t_d S r   r@   r!   r   r   r   rB   Ÿ   s    zDebuggingServerTest.tearDownN)F)
r   r   r   r"   rF   rO   rR   rT   rU   rB   r   r   r   r   rC   G   s   
rC   c                   @   s:   e Zd Zdd„ Zdd„ Ze ejd¡dd„ ƒZ	dd	„ Z
d
S )ÚTestFamilyDetectionc                 C   s   t  t_t_d S r   r   r!   r   r   r   r"   ¥   s    zTestFamilyDetection.setUpc                 C   s   t  ¡  t t _t_d S r   r@   r!   r   r   r   rB   ¨   s    zTestFamilyDetection.tearDownúIPv6 not enabledc                 C   s.   t  tjdftjdf¡}|  |jjtj¡ d S ©Nr   )	r   r   r   ÚHOSTv6ÚHOSTv4rI   r   ÚfamilyÚAF_INET6©r   r8   r   r   r   Útest_socket_uses_IPv6¬   s    z)TestFamilyDetection.test_socket_uses_IPv6c                 C   s.   t  tjdftjdf¡}|  |jjtj¡ d S rX   )	r   r   r   rZ   rY   rI   r   r[   ÚAF_INETr]   r   r   r   Útest_socket_uses_IPv4±   s    z)TestFamilyDetection.test_socket_uses_IPv4N)r   r   r   r"   rB   ÚunittestÚ
skipUnlessr   ÚIPV6_ENABLEDr^   r`   r   r   r   r   rV   ¤   s
   
rV   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚTestRcptOptionParsingó:   555 RCPT TO parameters not recognized or not implemented
c                 C   s(   t  t_t_tj| _t ¡  | _t_d S r   ©	r   r   r   r    ÚDEBUGSTREAMÚold_debugstreamÚioÚStringIOÚdebugr!   r   r   r   r"   º   s    zTestRcptOptionParsing.setUpc                 C   s    t  ¡  t t _t_| jt_d S r   ©r    rA   r   r   rh   rg   r!   r   r   r   rB   ¿   s    zTestRcptOptionParsing.tearDownc                 C   s   |j  |¡ | ¡  d S r   r'   ©r   r-   r+   r   r   r   r.   Ä   s    z TestRcptOptionParsing.write_linec                 C   sd   t tjdfdƒ}| ¡ \}}t |||¡}|  |d¡ |  |d¡ |  |d¡ |  |jj	| j
¡ d S )Nr   r#   rD   ó$   MAIL from: <foo@example.com> size=20s"   RCPT to: <foo@example.com> foo=bar©r   r   r3   r4   r   r5   r.   rI   r   ÚlastÚerror_response©r   r8   r9   r:   r-   r   r   r   Útest_params_rejectedÈ   s    z*TestRcptOptionParsing.test_params_rejectedc                 C   sb   t tjdfdƒ}| ¡ \}}t |||¡}|  |d¡ |  |d¡ |  |d¡ |  |jj	d¡ d S )Nr   r#   rD   rn   s   RCPT to: <foo@example.com>ó   250 OK
©
r   r   r3   r4   r   r5   r.   rI   r   rp   rr   r   r   r   Útest_nothing_acceptedÑ   s    z+TestRcptOptionParsing.test_nothing_acceptedN)	r   r   r   rq   r"   rB   r.   rs   rv   r   r   r   r   rd   ¶   s   	rd   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 )ÚTestMailOptionParsingó<   555 MAIL FROM parameters not recognized or not implemented
c                 C   s(   t  t_t_tj| _t ¡  | _t_d S r   rf   r!   r   r   r   r"   ß   s    zTestMailOptionParsing.setUpc                 C   s    t  ¡  t t _t_| jt_d S r   rl   r!   r   r   r   rB   ä   s    zTestMailOptionParsing.tearDownc                 C   s   |j  |¡ | ¡  d S r   r'   rm   r   r   r   r.   é   s    z TestMailOptionParsing.write_linec                 C   s†   t tjdfddd}| ¡ \}}tj|||dd}|  |d¡ dD ]"}|  ||¡ |  |jj	| j
¡ qB|  |d¡ |  |jj	d¡ d S )	Nr   r#   Tr%   rD   )ó-   MAIL from: <foo@example.com> size=20 SMTPUTF8ó;   MAIL from: <foo@example.com> size=20 SMTPUTF8 BODY=8BITMIMEs1   MAIL from: <foo@example.com> size=20 BODY=UNKNOWNó2   MAIL from: <foo@example.com> size=20 body=8bitmimern   rt   ro   ©r   r8   r9   r:   r-   r+   r   r   r   Útest_with_decode_data_trueí   s    z0TestMailOptionParsing.test_with_decode_data_truec                 C   sš   t tjdfdƒ}| ¡ \}}t |||¡}|  |d¡ dD ]"}|  ||¡ |  |jj	| j
¡ q:|  |d¡ |  |jj	d¡ |  |d¡ |  |jj	d¡ d S )	Nr   r#   rD   )ry   rz   s:   MAIL from: <foo@example.com> size=20 SMTPUTF8 BODY=UNKNOWNs3   501 Error: BODY can only be one of 7BIT, 8BITMIME
r{   rt   ro   r|   r   r   r   Útest_with_decode_data_falseý   s&    þþÿz1TestMailOptionParsing.test_with_decode_data_falsec                 C   s^   t tjdfddd}| ¡ \}}tj|||dd}|  |d¡ |  |d¡ |  |jj	d¡ d S )Nr   r#   TrS   rD   s;   MAIL from: <foo@example.com> size=20 body=8bitmime smtputf8rt   ru   rr   r   r   r   Útest_with_enable_smtputf8_true  s    þz4TestMailOptionParsing.test_with_enable_smtputf8_trueN)
r   r   r   rq   r"   rB   r.   r}   r~   r   r   r   r   r   rw   Û   s   rw   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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/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dOdP„ Z*dQdR„ Z+dSdT„ Z,dUdV„ Z-dWdX„ Z.dYdZ„ Z/d[d\„ Z0d]d^„ Z1d_d`„ Z2dadb„ Z3dcdd„ Z4dedf„ Z5dgdh„ Z6didj„ Z7dkdl„ Z8dmdn„ Z9dodp„ Z:dqdr„ Z;dsdt„ Z<dudv„ Z=dwdx„ Z>dydz„ Z?d{d|„ Z@d}d~„ ZAdd€„ ZBdd‚„ ZCdƒd„„ ZDd…d†„ ZEd‡S )ˆÚSMTPDChannelTestc                 C   sb   t  t_t_tj| _t ¡  | _t_t	t
jdfddd| _| j ¡ \}}tj| j||dd| _d S ©Nr   r#   Tr%   ©r   r   r   r    rg   rh   ri   rj   rk   r   r   r3   r8   r4   r5   r-   ©r   r9   r:   r   r   r   r"     s    ÿÿzSMTPDChannelTest.setUpc                 C   s    t  ¡  t t _t_| jt_d S r   rl   r!   r   r   r   rB   (  s    zSMTPDChannelTest.tearDownc                 C   s   | j j |¡ | j  ¡  d S r   ©r-   r   r(   r)   ©r   r+   r   r   r   r.   -  s    zSMTPDChannelTest.write_linec                 C   s   | j tttjdfddd d S r   )r6   r   r   r   r3   r!   r   r   r   Útest_broken_connect1  s    þz$SMTPDChannelTest.test_broken_connectc              	   C   s(   | j ttj| j| jj| jjddd d S )NTr<   )r6   r>   r   r5   r8   r-   r9   r:   r!   r   r   r   r?   6  s
    ýz<SMTPDChannelTest.test_decode_data_and_enable_SMTPUTF8_raisesc                 C   s   | j  ¡  d S r   )r8   Zhandle_acceptr!   r   r   r   Útest_server_accept<  s    z#SMTPDChannelTest.test_server_acceptc                 C   s    |   d¡ |  | jjjd¡ d S )Nó    s   500 Error: bad syntax
©r.   rI   r-   r   rp   r!   r   r   r   Útest_missing_data?  s    
ÿz"SMTPDChannelTest.test_missing_datac                 C   s    |   d¡ |  | jjjd¡ d S )NrD   s
   250 HELP
r‰   r!   r   r   r   Ú	test_EHLOD  s    
zSMTPDChannelTest.test_EHLOc                 C   s    |   d¡ |  | jjjd¡ d S )Ns   EHLOs   501 Syntax: EHLO hostname
r‰   r!   r   r   r   Útest_EHLO_bad_syntaxH  s    
ÿz%SMTPDChannelTest.test_EHLO_bad_syntaxc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )NrD   ó   503 Duplicate HELO/EHLO
r‰   r!   r   r   r   Útest_EHLO_duplicateM  s
    

ÿz$SMTPDChannelTest.test_EHLO_duplicatec                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )NrD   r/   r   r‰   r!   r   r   r   Útest_EHLO_HELO_duplicateS  s
    

ÿz)SMTPDChannelTest.test_EHLO_HELO_duplicatec                 C   s6   t j ¡ }|  d¡ |  | jjjd |¡ d¡¡ d S )Nr/   z250 {}
Úascii)	r   r   Úgetfqdnr.   rI   r-   rp   ÚformatÚencode)r   Únamer   r   r   Ú	test_HELOY  s
    

ÿzSMTPDChannelTest.test_HELOc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   rD   r   r‰   r!   r   r   r   Útest_HELO_EHLO_duplicate_  s
    

ÿz)SMTPDChannelTest.test_HELO_EHLO_duplicatec                 C   s    |   d¡ |  | jjjd¡ d S )Ns   HELPsF   250 Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY
r‰   r!   r   r   r   Ú	test_HELPe  s    
ÿzSMTPDChannelTest.test_HELPc                 C   s    |   d¡ |  | jjjd¡ d S )Ns	   HELP MAILs"   250 Syntax: MAIL FROM: <address>
r‰   r!   r   r   r   Útest_HELP_commandk  s    
ÿz"SMTPDChannelTest.test_HELP_commandc                 C   s    |   d¡ |  | jjjd¡ d S )Ns	   HELP SPAMsF   501 Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY
r‰   r!   r   r   r   Útest_HELP_command_unknownp  s    
ÿz*SMTPDChannelTest.test_HELP_command_unknownc                 C   s    |   d¡ |  | jjjd¡ d S )Ns   HELOs   501 Syntax: HELO hostname
r‰   r!   r   r   r   Útest_HELO_bad_syntaxv  s    
ÿz%SMTPDChannelTest.test_HELO_bad_syntaxc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   r   r‰   r!   r   r   r   Útest_HELO_duplicate{  s
    

ÿz$SMTPDChannelTest.test_HELO_duplicatec                 C   s0   d| _ |  d¡ |  d¡ |  | jjjd¡ d S )NFr/   s%   MAIL from:<foo@example.com> SIZE=1234ó"   501 Syntax: MAIL FROM: <address>
)Zextended_smtpr.   rI   r-   r   rp   r!   r   r   r   Ú8test_HELO_parameter_rejected_when_extensions_not_enabled  s    

ÿzISMTPDChannelTest.test_HELO_parameter_rejected_when_extensions_not_enabledc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   s   MAIL from:   <foo@example.com>rt   r‰   r!   r   r   r   Ú"test_MAIL_allows_space_after_colonˆ  s
    

ÿz3SMTPDChannelTest.test_MAIL_allows_space_after_colonc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )NrD   s&   MAIL from:   <foo@example.com> size=20rt   r‰   r!   r   r   r   Ú+test_extended_MAIL_allows_space_after_colonŽ  s
    

ÿz<SMTPDChannelTest.test_extended_MAIL_allows_space_after_colonc                 C   s    |   d¡ |  | jjjd¡ d S )Nó   NOOPrt   r‰   r!   r   r   r   Ú	test_NOOP”  s    
zSMTPDChannelTest.test_NOOPc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   r    rt   r‰   r!   r   r   r   Útest_HELO_NOOP˜  s    

zSMTPDChannelTest.test_HELO_NOOPc                 C   s    |   d¡ |  | jjjd¡ d S )Ns   NOOP his   501 Syntax: NOOP
r‰   r!   r   r   r   Útest_NOOP_bad_syntax  s    
ÿz%SMTPDChannelTest.test_NOOP_bad_syntaxc                 C   s    |   d¡ |  | jjjd¡ d S )Nó   QUITó	   221 Bye
r‰   r!   r   r   r   Ú	test_QUIT¢  s    
zSMTPDChannelTest.test_QUITc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   r¤   r¥   r‰   r!   r   r   r   Útest_HELO_QUIT¦  s    

zSMTPDChannelTest.test_HELO_QUITc                 C   s    |   d¡ |  | jjjd¡ d S )Ns   QUIT bye byer¥   r‰   r!   r   r   r   Útest_QUIT_arg_ignored«  s    
z&SMTPDChannelTest.test_QUIT_arg_ignoredc                 C   s(   d| j _|  d¡ |  | j jjd¡ d S )Nz	BAD STATEr/   s   451 Internal confusion
)r-   Z
smtp_stater.   rI   r   rp   r!   r   r   r   Útest_bad_state¯  s
    
ÿzSMTPDChannelTest.test_bad_statec                 C   s:   |   d¡ |   dd| jj  d ¡ |  | jjjd¡ d S )Nr/   s   MAIL from: ó   as   @exampleó   500 Error: line too long
)r.   r-   Úcommand_size_limitrI   r   rp   r!   r   r   r   Útest_command_too_longµ  s    

ÿþÿz&SMTPDChannelTest.test_command_too_longc                 C   sr   |   d¡ | jjtdƒ }|   dd|  d ¡ |  | jjjd¡ |   dd|d   d ¡ |  | jjjd¡ d S )	NrD   zMAIL from:<@example>ó   MAIL from:<rª   s   @example> SIZE=1234rt   é   r«   )r.   r-   r¬   ÚlenrI   r   rp   ©r   Úfill_lenr   r   r   Ú*test_MAIL_command_limit_extended_with_SIZE½  s     
ÿþ
ÿþÿz;SMTPDChannelTest.test_MAIL_command_limit_extended_with_SIZEc                 C   s2   |   d¡ |   d¡ |  | jjjdd… d¡ d S )NrD   s5   MAIL from: <naive@example.com> BODY=8BITMIME SMTPUTF8r   é   ó   5r‰   r!   r   r   r   Ú-test_MAIL_command_rejects_SMTPUTF8_by_defaultË  s
    
ÿz>SMTPDChannelTest.test_MAIL_command_rejects_SMTPUTF8_by_defaultc                 C   s\   d| j _|  d¡ |  d¡ |  d¡ |  d¡ |  d| j j d ¡ |  | j jjd¡ d S )	Né  r/   r0   r1   r2   ó   As   A
.ó   552 Error: Too much mail data
©r-   Zdata_size_limitr.   rI   r   rp   r!   r   r   r   Ú-test_data_longer_than_default_data_size_limitÑ  s    



ÿÿz>SMTPDChannelTest.test_data_longer_than_default_data_size_limitc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )NrD   s!   MAIL FROM:<eggs@example> SIZE=512rt   r‰   r!   r   r   r   Útest_MAIL_size_parameterÝ  s
    

ÿz)SMTPDChannelTest.test_MAIL_size_parameterc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )NrD   s%   MAIL FROM:<eggs@example> SIZE=invalidó9   501 Syntax: MAIL FROM: <address> [SP <mail-parameters>]
r‰   r!   r   r   r   Ú test_MAIL_invalid_size_parameterã  s
    

ÿz1SMTPDChannelTest.test_MAIL_invalid_size_parameterc                 C   sP   |   d¡ |   d¡ |  | jjjd¡ |   d¡ |   d¡ |  | jjjd¡ d S )NrD   s"   MAIL FROM:<eggs@example> ham=greenrx   s   MAIL FROM:<eggs@example>s    RCPT TO:<eggs@example> ham=greenre   r‰   r!   r   r   r   Ú!test_MAIL_RCPT_unknown_parametersé  s    

ÿ

ÿz2SMTPDChannelTest.test_MAIL_RCPT_unknown_parametersc                 C   s2   d| j _|  d¡ |  d¡ |  | j jjd¡ d S )Nr·   rD   s"   MAIL FROM:<eggs@example> SIZE=2096s<   552 Error: message size exceeds fixed maximum message size
rº   r!   r   r   r   Ú<test_MAIL_size_parameter_larger_than_default_data_size_limitô  s    

ÿzMSMTPDChannelTest.test_MAIL_size_parameter_larger_than_default_data_size_limitc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   s   RCPT to:spam@examples   503 Error: need MAIL command
r‰   r!   r   r   r   Útest_need_MAILû  s
    

ÿzSMTPDChannelTest.test_need_MAILc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   ó   MAIL from eggs@examplerœ   r‰   r!   r   r   r   Útest_MAIL_syntax_HELO  s
    

ÿz&SMTPDChannelTest.test_MAIL_syntax_HELOc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )NrD   rÂ   r½   r‰   r!   r   r   r   Útest_MAIL_syntax_EHLO  s
    

ÿz&SMTPDChannelTest.test_MAIL_syntax_EHLOc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   s
   MAIL from:rœ   r‰   r!   r   r   r   Útest_MAIL_missing_address  s
    

ÿz*SMTPDChannelTest.test_MAIL_missing_addressc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   s   MAIL from:<eggs@example>rt   r‰   r!   r   r   r   Útest_MAIL_chevrons  s    

z#SMTPDChannelTest.test_MAIL_chevronsc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )NrD   s   MAIL from:<>rt   r‰   r!   r   r   r   Útest_MAIL_empty_chevrons  s    

z)SMTPDChannelTest.test_MAIL_empty_chevronsc                 C   s:   |   d¡ |   d¡ |  | jjjd¡ |  | jjd¡ d S )NrD   s%   MAIL from: <"Fred Blogs"@example.com>rt   ú"Fred Blogs"@example.com©r.   rI   r-   r   rp   r   r!   r   r   r   Útest_MAIL_quoted_localpart  s    

z+SMTPDChannelTest.test_MAIL_quoted_localpartc                 C   s:   |   d¡ |   d¡ |  | jjjd¡ |  | jjd¡ d S )NrD   s#   MAIL from: "Fred Blogs"@example.comrt   rÈ   rÉ   r!   r   r   r   Ú$test_MAIL_quoted_localpart_no_angles#  s    

z5SMTPDChannelTest.test_MAIL_quoted_localpart_no_anglesc                 C   s:   |   d¡ |   d¡ |  | jjjd¡ |  | jjd¡ d S )NrD   s/   MAIL from: <"Fred Blogs"@example.com> SIZE=1000rt   rÈ   rÉ   r!   r   r   r   Ú$test_MAIL_quoted_localpart_with_size)  s    

z5SMTPDChannelTest.test_MAIL_quoted_localpart_with_sizec                 C   s:   |   d¡ |   d¡ |  | jjjd¡ |  | jjd¡ d S )NrD   s-   MAIL from: "Fred Blogs"@example.com SIZE=1000rt   rÈ   rÉ   r!   r   r   r   Ú.test_MAIL_quoted_localpart_with_size_no_angles/  s    

z?SMTPDChannelTest.test_MAIL_quoted_localpart_with_size_no_anglesc                 C   s4   |   d¡ |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   s   MAIL from:eggs@examples   MAIL from:spam@examples    503 Error: nested MAIL command
r‰   r!   r   r   r   Útest_nested_MAIL5  s    


ÿz!SMTPDChannelTest.test_nested_MAILc                 C   s    |   d¡ |  | jjjd¡ d S )Ns   VRFY eggs@examplesD   252 Cannot VRFY user, but will accept message and attempt delivery
r‰   r!   r   r   r   Ú	test_VRFY<  s    
ÿzSMTPDChannelTest.test_VRFYc                 C   s    |   d¡ |  | jjjd¡ d S )Ns   VRFYs   501 Syntax: VRFY <address>
r‰   r!   r   r   r   Útest_VRFY_syntaxB  s    
ÿz!SMTPDChannelTest.test_VRFY_syntaxc                 C   s    |   d¡ |  | jjjd¡ d S )Ns   EXPNs   502 EXPN not implemented
r‰   r!   r   r   r   Útest_EXPN_not_implementedG  s    
ÿz*SMTPDChannelTest.test_EXPN_not_implementedc                 C   s    |   d¡ |  | jjjd¡ d S )Ns   MAIL from:<foo@example.com>ó   503 Error: send HELO first
r‰   r!   r   r   r   Útest_no_HELO_MAILL  s    
ÿz"SMTPDChannelTest.test_no_HELO_MAILc                 C   s4   |   d¡ |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   r0   r2   s   503 Error: need RCPT command
r‰   r!   r   r   r   Útest_need_RCPTQ  s    


ÿzSMTPDChannelTest.test_need_RCPTc                 C   s4   |   d¡ |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   ó   MAIL From: eggs@exampleó   RCPT to eggs@examples    501 Syntax: RCPT TO: <address>
r‰   r!   r   r   r   Útest_RCPT_syntax_HELOX  s    


ÿz&SMTPDChannelTest.test_RCPT_syntax_HELOc                 C   s4   |   d¡ |   d¡ |   d¡ |  | jjjd¡ d S )NrD   rÕ   rÖ   s7   501 Syntax: RCPT TO: <address> [SP <mail-parameters>]
r‰   r!   r   r   r   Útest_RCPT_syntax_EHLO_  s    


ÿz&SMTPDChannelTest.test_RCPT_syntax_EHLOc                 C   s4   |   d¡ |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   rÕ   s   RCPT to: <eggs@example>rt   r‰   r!   r   r   r   Útest_RCPT_lowercase_to_OKf  s    


z*SMTPDChannelTest.test_RCPT_lowercase_to_OKc                 C   s    |   d¡ |  | jjjd¡ d S )NrÖ   rÒ   r‰   r!   r   r   r   Útest_no_HELO_RCPTl  s    
ÿz"SMTPDChannelTest.test_no_HELO_RCPTc                 C   sš   |   d¡ |   d¡ |  | jjjd¡ |   d¡ |  | jjjd¡ |   d¡ |  | jjjd¡ |   d¡ |  | jjjd¡ |  | jjdd	d
gdfg¡ d S ©Nr/   r0   rt   r1   r2   ó%   354 End data with <CR><LF>.<CR><LF>
s   data
more
.©zpeer-addressz	peer-portúeggs@exampleúspam@examplez	data
more©r.   rI   r-   r   rp   r8   r	   r!   r   r   r   Útest_data_dialogq  s$    



ÿ

ýÿz!SMTPDChannelTest.test_data_dialogc                 C   s>   |   d¡ |   d¡ |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   r0   r1   ó	   DATA spams   501 Syntax: DATA
r‰   r!   r   r   r   Útest_DATA_syntaxƒ  s
    



z!SMTPDChannelTest.test_DATA_syntaxc                 C   s    |   d¡ |  | jjjd¡ d S )Nrâ   rÒ   r‰   r!   r   r   r   Útest_no_HELO_DATAŠ  s    
ÿz"SMTPDChannelTest.test_no_HELO_DATAc                 C   sF   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |  | jjd¡ d S )Nr/   r0   r1   r2   s   ..
.
Ú.©r.   rI   r-   Úreceived_datar!   r   r   r   Ú$test_data_transparency_section_4_5_2  s    




z5SMTPDChannelTest.test_data_transparency_section_4_5_2c                 C   s^   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |  | jjddd	d
gdfg¡ d S )Nr/   r0   r1   s   RCPT To:ham@exampler2   ó   data
.rÝ   rÞ   rß   zham@exampler   )r.   rI   r8   r	   r!   r   r   r   Útest_multiple_RCPT—  s    






ýÿz#SMTPDChannelTest.test_multiple_RCPTc                 C   sH   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   r0   r1   r2   s   return status
.s   250 Okish
r‰   r!   r   r   r   Útest_manual_status¤  s    




z#SMTPDChannelTest.test_manual_statusc                 C   s‚   |   d¡ |   d¡ |   d¡ |   d¡ |  | jjjd¡ |   d¡ |   d¡ |   d¡ |   d	¡ |  | jjd
ddgdfg¡ d S )Nr/   r0   r1   ó   RSETrt   s   MAIL From:foo@examples   RCPT To:eggs@exampler2   ré   rÝ   zfoo@examplerÞ   r   rà   r!   r   r   r   Ú	test_RSET­  s     








ýÿzSMTPDChannelTest.test_RSETc                 C   s*   |   d¡ |   d¡ |  | jjjd¡ d S )Nr/   rì   rt   r‰   r!   r   r   r   Útest_HELO_RSET½  s    

zSMTPDChannelTest.test_HELO_RSETc                 C   s    |   d¡ |  | jjjd¡ d S )Ns   RSET his   501 Syntax: RSET
r‰   r!   r   r   r   Útest_RSET_syntaxÂ  s    
z!SMTPDChannelTest.test_RSET_syntaxc                 C   s    |   d¡ |  | jjjd¡ d S )Ns   UNKNOWN_CMDs1   500 Error: command "UNKNOWN_CMD" not recognized
r‰   r!   r   r   r   Útest_unknown_commandÆ  s    
ÿz%SMTPDChannelTest.test_unknown_commandc                 C   sÌ  t  dtf¡ | jj}W d   ƒ n1 s,0    Y  t  dtf¡ d| j_W d   ƒ n1 sb0    Y  t  dtf¡ | jj}W d   ƒ n1 s˜0    Y  t  dtf¡ d| j_W d   ƒ n1 sÎ0    Y  t  dtf¡ | jj}W d   ƒ n1 s0    Y  t  dtf¡ d| j_W d   ƒ n1 s>0    Y  t  dtf¡ | jj}W d   ƒ n1 sv0    Y  t  dtf¡ d| j_W d   ƒ n1 s®0    Y  t  dtf¡ | jj}W d   ƒ n1 sæ0    Y  t  dtf¡ d| j_W d   ƒ n1 s0    Y  t  dtf¡ | jj	}W d   ƒ n1 sV0    Y  t  dtf¡ d| j_	W d   ƒ n1 sŽ0    Y  t  dtf¡ | jj
}W d   ƒ n1 sÆ0    Y  t  dtf¡ d| j_
W d   ƒ n1 sþ0    Y  t  dtf¡ | jj}W d   ƒ n1 s60    Y  t  dtf¡ d| j_W d   ƒ n1 sn0    Y  t  dtf¡ | jj}W d   ƒ n1 s¦0    Y  t  dtf¡ d| j_W d   ƒ n1 sÞ0    Y  t  dtf¡ | jj}W d   ƒ n1 s0    Y  t  dtf¡ d| j_W d   ƒ n1 sN0    Y  t  dtf¡ | jj}W d   ƒ n1 s†0    Y  t  dtf¡ d| j_W d   ƒ n1 s¾0    Y  d S )NÚ Úspam)r   Zcheck_warningsÚDeprecationWarningr-   Z_SMTPChannel__serverZ_SMTPChannel__lineZ_SMTPChannel__stateZ_SMTPChannel__greetingZ_SMTPChannel__mailfromZ_SMTPChannel__rcpttosZ_SMTPChannel__dataZ_SMTPChannel__fqdnZ_SMTPChannel__peerZ_SMTPChannel__connZ_SMTPChannel__addr)r   rò   r   r   r   Útest_attribute_deprecationsÌ  sX    &&&&(((((((((((((((((z,SMTPDChannelTest.test_attribute_deprecationsN)Fr   r   r   r"   rB   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¨   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Ô   r×   rØ   rÙ   rÚ   rá   rã   rä   rè   rê   rë   rí   rî   rï   rð   rô   r   r   r   r   r€     s†   
	r€   rW   c                   @   s   e Zd Zdd„ ZdS )ÚSMTPDChannelIPv6Testc                 C   sb   t  t_t_tj| _t ¡  | _t_t	t
jdfddd| _| j ¡ \}}tj| j||dd| _d S r   )r   r   r   r    rg   rh   ri   rj   rk   r   r   rY   r8   r4   r5   r-   rƒ   r   r   r   r"   ü  s    ÿÿzSMTPDChannelIPv6Test.setUpN)r   r   r   r"   r   r   r   r   rõ   ú  s   rõ   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )Ú!SMTPDChannelWithDataSizeLimitTestc                 C   sd   t  t_t_tj| _t ¡  | _t_t	t
jdfddd| _| j ¡ \}}tj| j||ddd| _d S )Nr   r#   Tr%   é    r‚   rƒ   r   r   r   r"     s    ÿÿz'SMTPDChannelWithDataSizeLimitTest.setUpc                 C   s    t  ¡  t t _t_| jt_d S r   rl   r!   r   r   r   rB     s    z*SMTPDChannelWithDataSizeLimitTest.tearDownc                 C   s   | j j |¡ | j  ¡  d S r   r„   r…   r   r   r   r.     s    z,SMTPDChannelWithDataSizeLimitTest.write_linec                 C   sš   |   d¡ |   d¡ |  | jjjd¡ |   d¡ |  | jjjd¡ |   d¡ |  | jjjd¡ |   d¡ |  | jjjd¡ |  | jjdd	d
gdfg¡ d S rÛ   rà   r!   r   r   r   Útest_data_limit_dialog  s$    



ÿ

ýÿz8SMTPDChannelWithDataSizeLimitTest.test_data_limit_dialogc                 C   s~   |   d¡ |   d¡ |  | jjjd¡ |   d¡ |  | jjjd¡ |   d¡ |  | jjjd¡ |   d¡ |  | jjjd¡ d S )	Nr/   r0   rt   r1   r2   rÜ   s'   This message is longer than 32 bytes
.r¹   r‰   r!   r   r   r   Ú$test_data_limit_dialog_too_much_data.  s    



ÿ
ÿzFSMTPDChannelWithDataSizeLimitTest.test_data_limit_dialog_too_much_dataN)r   r   r   r"   rB   r.   rø   rù   r   r   r   r   rö     s
   rö   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚSMTPDChannelWithDecodeDataFalsec                 C   sZ   t  t_t_tj| _t ¡  | _t_t	t
jdfdƒ| _| j ¡ \}}t | j||¡| _d S )Nr   r#   r‚   rƒ   r   r   r   r"   ?  s    z%SMTPDChannelWithDecodeDataFalse.setUpc                 C   s    t  ¡  t t _t_| jt_d S r   rl   r!   r   r   r   rB   G  s    z(SMTPDChannelWithDecodeDataFalse.tearDownc                 C   s   | j j |¡ | j  ¡  d S r   r„   r…   r   r   r   r.   L  s    z*SMTPDChannelWithDecodeDataFalse.write_linec                 C   sP   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |  | jjd¡ d S )Nr/   r0   r1   r2   ó   plain ascii textrE   ræ   r!   r   r   r   Útest_ascii_dataP  s    





z/SMTPDChannelWithDecodeDataFalse.test_ascii_datac                 C   sZ   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |  | jjd¡ d S )	Nr/   r0   r1   r2   ó   utf8 enriched text: Å¼ÅºÄ‡ó   and some plain asciirE   s/   utf8 enriched text: Å¼ÅºÄ‡
and some plain asciiræ   r!   r   r   r   Útest_utf8_dataY  s    






þz.SMTPDChannelWithDecodeDataFalse.test_utf8_dataN©r   r   r   r"   rB   r.   rü   rÿ   r   r   r   r   rú   =  s
   	rú   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚSMTPDChannelWithDecodeDataTruec                 C   sb   t  t_t_tj| _t ¡  | _t_t	t
jdfddd| _| j ¡ \}}tj| j||dd| _d S r   r‚   rƒ   r   r   r   r"   i  s    ÿÿz$SMTPDChannelWithDecodeDataTrue.setUpc                 C   s    t  ¡  t t _t_| jt_d S r   rl   r!   r   r   r   rB   t  s    z'SMTPDChannelWithDecodeDataTrue.tearDownc                 C   s   | j j |¡ | j  ¡  d S r   r„   r…   r   r   r   r.   y  s    z)SMTPDChannelWithDecodeDataTrue.write_linec                 C   sP   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |  | jjd¡ d S )Nr/   r0   r1   r2   rû   rE   zplain ascii textræ   r!   r   r   r   rü   }  s    





z.SMTPDChannelWithDecodeDataTrue.test_ascii_datac                 C   sZ   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |  | jjd¡ d S )	Nr/   r0   r1   r2   rý   rþ   rE   u/   utf8 enriched text: Å¼ÅºÄ‡
and some plain asciiræ   r!   r   r   r   rÿ   †  s    






þz-SMTPDChannelWithDecodeDataTrue.test_utf8_dataNr   r   r   r   r   r  g  s
   	r  c                   @   sL   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S )Ú&SMTPDChannelTestWithEnableSMTPUTF8Truec                 C   sb   t  t_t_tj| _t ¡  | _t_t	t
jdfddd| _| j ¡ \}}tj| j||dd| _d S )Nr   r#   TrS   r‚   rƒ   r   r   r   r"   ”  s    ÿÿz,SMTPDChannelTestWithEnableSMTPUTF8True.setUpc                 C   s    t  ¡  t t _t_| jt_d S r   rl   r!   r   r   r   rB   ž  s    z/SMTPDChannelTestWithEnableSMTPUTF8True.tearDownc                 C   s   | j j |¡ | j  ¡  d S r   r„   r…   r   r   r   r.   £  s    z1SMTPDChannelTestWithEnableSMTPUTF8True.write_linec                 C   s0   |   d¡ |   d d¡¡ |  | jjjd¡ d S )NrD   u7   MAIL from: <naiÌˆve@example.com> BODY=8BITMIME SMTPUTF8úutf-8rt   )r.   r“   rI   r-   r   rp   r!   r   r   r   Ú1test_MAIL_command_accepts_SMTPUTF8_when_announced§  s    
ÿÿzXSMTPDChannelTestWithEnableSMTPUTF8True.test_MAIL_command_accepts_SMTPUTF8_when_announcedc                 C   sÀ   |   d¡ dD ]¬}|   d| ¡ |  | jjjdd… d¡ |   d¡ |  | jjjdd… d¡ |   d¡ |  | jjjdd… d	¡ |   d
¡ |dkr¨|  | jjjd¡ q|  | jjjd¡ qd S )NrD   )rˆ   s   BODY=8BITMIME SMTPUTF8s   MAIL from: <a@example> r   é   ó   250s   rcpt to:<b@example.com>ó   dataó   354s   c
.rˆ   rt   s   250 SMTPUTF8 message okish
r‰   )r   Zmail_parametersr   r   r   Útest_process_smtputf8_message¯  s    



ÿzDSMTPDChannelTestWithEnableSMTPUTF8True.test_process_smtputf8_messagec                 C   sª   |   d¡ |   d d¡¡ |  | jjjdd… d¡ |   d d¡¡ |  | jjjdd… d¡ |   d¡ |  | jjjdd… d	¡ |   d
¡ |   d¡ |  | jjd
¡ d S )NrD   u2   MAIL From: naiÌˆve@examplÃ© BODY=8BITMIME SMTPUTF8r  r   r  r  u   RCPT To:spÃ¤m@examplÃ©r2   r  rý   rE   )r.   r“   rI   r-   r   rp   rç   r!   r   r   r   rÿ   ¿  s    
ÿ


þz5SMTPDChannelTestWithEnableSMTPUTF8True.test_utf8_datac                 C   sn   |   d¡ dtdƒ }|   dd|d   d ¡ |  | jjjd¡ |   dd|  d ¡ |  | jjjd	¡ d S )
Nó   ehlo exampleé$  úmail from:<@example>r®   rª   r´   ó	   @example>r«   rt   ©r.   r°   rI   r-   r   rp   r±   r   r   r   Ú7test_MAIL_command_limit_extended_with_SIZE_and_SMTPUTF8Î  s     

ÿþÿÿþz^SMTPDChannelTestWithEnableSMTPUTF8True.test_MAIL_command_limit_extended_with_SIZE_and_SMTPUTF8c                 C   sð   |   d¡ dtdƒ }dD ]Ð}|   d||  d ¡ |  | jjjdd… d	¡ |   d||  d
 ¡ |  | jjjdd… d¡ |   d¡ |  | jjjdd… d¡ |   d¡ |  | jjjdd… d¡ |   d¡ |  | jjjdd… d¡ qd S )Nr
  r  r  )rª   ó   bó   cr®   s
   a@example>r   r  s   500r  r  s   rcpt to:<hans@example.com>r  r  s   test
.r  )r   r²   Úcharr   r   r   Ú1test_multiple_emails_with_extended_command_lengthÛ  s    



zXSMTPDChannelTestWithEnableSMTPUTF8True.test_multiple_emails_with_extended_command_lengthN)r   r   r   r"   rB   r.   r  r	  rÿ   r  r  r   r   r   r   r  “  s   
r  c                   @   s   e Zd Zdd„ ZdS )ÚMiscTestCasec                 C   s   h d£}t j| t|d d S )N>	   ZOptionsZprogramZDevnullÚusageZ	parseargsZ
COMMASPACErg   ZDATA_SIZE_DEFAULTÚNEWLINE)Ú	blacklist)r   Zcheck__all__r   )r   r  r   r   r   Útest__all__ì  s    zMiscTestCase.test__all__N)r   r   r   r  r   r   r   r   r  ë  s   r  Ú__main__)!ra   rJ   Útestr   r   Ztest.supportr   r   ri   r   r    r   r   Ú	Exceptionr   r   ZTestCaser   rC   rV   rd   rw   r€   rb   rc   rõ   rö   rú   r  r  r  r   Úmainr   r   r   r   Ú<module>   s8   "]%B   `7*,X

