o
    HXîh¢  ã                   @   sÂ  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Zd dl	Z	d dl
Z
e
 ¡  e
 de¡ d dlZd dlZW d  ƒ n1 sEw   Y  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rße  %¡  dS dS )&é    N)ÚsupportÚmock_socket)Úsocket_helper)Úwarnings_helperÚignorec                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚDummyServerc                 O   s:   t jj| g|¢R i |¤Ž g | _| jrd| _d S d| _d S )Nzreturn statuss   return status)ÚsmtpdÚ
SMTPServerÚ__init__ÚmessagesZ_decode_dataÚreturn_status)ÚselfÚargsÚkwargs© r   ú9/opt/python-3.10.19/usr/lib/python3.10/test/test_smtpd.pyr
      s
   

zDummyServer.__init__c                 K   sB   | j  ||||f¡ || jkrdS d|v rd|d v rdS 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                   @   ó   e Zd Zdd„ ZdS )ÚBrokenDummyServerc                 C   s   t ƒ ‚©N)r   )r   Únumr   r   r   Úlisten&   s   zBrokenDummyServer.listenN)r   r   r   r   r   r   r   r   r   %   ó    r   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚSMTPDServerTestc                 C   ó   t  t_t_d S r   ©r   r   ÚsocketÚasyncore©r   r   r   r   ÚsetUp+   ó   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                    ó   ˆ j  | ¡ ˆ  ¡  d S r   ©r$   Ú
queue_recvÚhandle_read©Úline©Úchannelr   r   Ú
write_line4   ó   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Úaddrr5   r   r3   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,   )r>   Ú
ValueErrorr   r	   r   r;   r&   r   r   r   Ú+test_decode_data_and_enable_SMTPUTF8_raises>   s   
úz;SMTPDServerTest.test_decode_data_and_enable_SMTPUTF8_raisesc                 C   ó   t  ¡  t t _t_d S r   ©r%   Ú	close_allr$   r   r&   r   r   r   ÚtearDownG   ó   zSMTPDServerTest.tearDownN)r   r   r   r'   rC   rG   rK   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   r"   r   r#   r&   r   r   r   r'   N   r(   zDebuggingServerTest.setUpFc                    sN   ‡ fdd„}|dƒ |r|dƒ n|dƒ |dƒ |dƒ ||ƒ |dƒ d S )	Nc                    r-   r   r.   r1   r3   r   r   r5   R   r6   z1DebuggingServerTest.send_data.<locals>.write_lineó   EHLO examples-   MAIL From:eggs@example BODY=8BITMIME SMTPUTF8r8   r9   r:   ó   .r   )r   r4   r   rE   r5   r   r3   r   Ú	send_dataQ   s   
zDebuggingServerTest.send_datac                 C   ó†   t jtjdfddd}| ¡ \}}t j|||dd}t ¡ }|  |d¡ W d   ƒ n1 s/w   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   r;   r<   r=   r   Zcaptured_stdoutrP   ÚgetvalueÚassertEqualÚtextwrapÚdedent©r   r@   rA   rB   r4   ÚsÚstdoutr   r   r   Ú*test_process_message_with_decode_data_true_   ó   ÿ
ÿz>DebuggingServerTest.test_process_message_with_decode_data_truec                 C   s~   t  tjdfd¡}| ¡ \}}t  |||¡}t ¡ }|  |d¡ W d   ƒ n1 s+w   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 ------------
             rR   rW   r   r   r   Ú+test_process_message_with_decode_data_falsep   s   
ÿz?DebuggingServerTest.test_process_message_with_decode_data_falsec                 C   rQ   )Nr   r)   T©rE   r\   r]   rR   rW   r   r   r   Ú.test_process_message_with_enable_SMTPUTF8_true€   r[   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 s1w   Y  | 	¡ }|  
|t d¡¡ d S )Nr   r)   Tr_   r\   a               ---------- MESSAGE FOLLOWS ----------
             mail options: ['BODY=8BITMIME', 'SMTPUTF8']
             b'From: test'
             b'X-Peer: peer-address'
             b''
             b'h\xc3\xa9llo\xff'
             ------------ END MESSAGE ------------
             rR   rW   r   r   r   Ú7test_process_SMTPUTF8_message_with_enable_SMTPUTF8_true‘   s   ÿ
ÿÿzKDebuggingServerTest.test_process_SMTPUTF8_message_with_enable_SMTPUTF8_truec                 C   rH   r   rI   r&   r   r   r   rK   ¤   rL   zDebuggingServerTest.tearDownN)F)
r   r   r   r'   rP   rZ   r^   r`   ra   rK   r   r   r   r   rM   L   s    
rM   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   r"   r   r#   r&   r   r   r   r'   ª   r(   zTestFamilyDetection.setUpc                 C   rH   r   rI   r&   r   r   r   rK   ­   rL   zTestFamilyDetection.tearDownúIPv6 not enabledc                 C   ó.   t  tjdftjdf¡}|  |jjtj¡ d S ©Nr   )	r   r	   r   ÚHOSTv6ÚHOSTv4rT   r$   ÚfamilyÚAF_INET6©r   r@   r   r   r   Útest_socket_uses_IPv6±   s   z)TestFamilyDetection.test_socket_uses_IPv6c                 C   rd   re   )	r   r	   r   rg   rf   rT   r$   rh   ÚAF_INETrj   r   r   r   Útest_socket_uses_IPv4¶   s   z)TestFamilyDetection.test_socket_uses_IPv4N)r   r   r   r'   rK   ÚunittestÚ
skipUnlessr   ÚIPV6_ENABLEDrk   rm   r   r   r   r   rb   ©   s    
rb   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   ó(   t  t_t_tj| _t ¡  | _t_d S r   ©	r   r   r$   r%   ÚDEBUGSTREAMÚold_debugstreamÚioÚStringIOÚdebugr&   r   r   r   r'   ¿   ó   zTestRcptOptionParsing.setUpc                 C   ó    t  ¡  t t _t_| jt_d S r   ©r%   rJ   r$   r   rv   ru   r&   r   r   r   rK   Ä   ó   zTestRcptOptionParsing.tearDownc                 C   ó   |j  |¡ | ¡  d S r   r.   ©r   r4   r2   r   r   r   r5   É   r6   z TestRcptOptionParsing.write_linec                 C   sd   t tjdfdƒ}| ¡ \}}t |||¡}|  |d¡ |  |d¡ |  |d¡ |  |jj	| j
¡ d S )Nr   r)   rN   ó$   MAIL from: <foo@example.com> size=20s"   RCPT to: <foo@example.com> foo=bar©r   r   r;   r<   r   r=   r5   rT   r$   ÚlastÚerror_response©r   r@   rA   rB   r4   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)   rN   r€   s   RCPT to: <foo@example.com>ó   250 OK
©
r   r   r;   r<   r   r=   r5   rT   r$   r‚   r„   r   r   r   Útest_nothing_acceptedÖ   s   z+TestRcptOptionParsing.test_nothing_acceptedN)	r   r   r   rƒ   r'   rK   r5   r…   rˆ   r   r   r   r   rq   »   s    	rq   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   rs   r   rt   r&   r   r   r   r'   ä   rz   zTestMailOptionParsing.setUpc                 C   r{   r   r|   r&   r   r   r   rK   é   r}   zTestMailOptionParsing.tearDownc                 C   r~   r   r.   r   r   r   r   r5   î   r6   z TestMailOptionParsing.write_linec                 C   s†   t tjdfddd}| ¡ \}}tj|||dd}|  |d¡ dD ]}|  ||¡ |  |jj	| j
¡ q!|  |d¡ |  |jj	d¡ d S )	Nr   r)   Tr+   rN   )ó-   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=8bitmimer€   r†   r   ©r   r@   rA   rB   r4   r2   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)   rN   )r‹   rŒ   s:   MAIL from: <foo@example.com> size=20 SMTPUTF8 BODY=UNKNOWNs3   501 Error: BODY can only be one of 7BIT, 8BITMIME
r   r†   r   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)   Tr_   rN   s;   MAIL from: <foo@example.com> size=20 body=8bitmime smtputf8r†   r‡   r„   r   r   r   Útest_with_enable_smtputf8_true  s   þz4TestMailOptionParsing.test_with_enable_smtputf8_trueN)
r   r   r   rƒ   r'   rK   r5   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	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   ób   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%   ru   rv   rw   rx   ry   r   r   r;   r@   r<   r=   r4   ©r   rA   rB   r   r   r   r'   #  ó   ÿÿzSMTPDChannelTest.setUpc                 C   r{   r   r|   r&   r   r   r   rK   -  r}   zSMTPDChannelTest.tearDownc                 C   ó   | j j |¡ | j  ¡  d S r   ©r4   r$   r/   r0   ©r   r2   r   r   r   r5   2  ó   zSMTPDChannelTest.write_linec                 C   s   | j tttjdfddd d S r”   )r>   r   r   r   r;   r&   r   r   r   Útest_broken_connect6  s   
þz$SMTPDChannelTest.test_broken_connectc              	   C   s(   | j ttj| j| jj| jjddd d S )NTrD   )r>   rF   r   r=   r@   r4   rA   rB   r&   r   r   r   rG   ;  s
   
ýz<SMTPDChannelTest.test_decode_data_and_enable_SMTPUTF8_raisesc                 C   s   | j  ¡  d S r   )r@   Zhandle_acceptr&   r   r   r   Útest_server_acceptA  s   z#SMTPDChannelTest.test_server_acceptc                 C   ó    |   d¡ |  | jjjd¡ d S )Nó    s   500 Error: bad syntax
©r5   rT   r4   r$   r‚   r&   r   r   r   Útest_missing_dataD  ó   
ÿz"SMTPDChannelTest.test_missing_datac                 C   rž   )NrN   s
   250 HELP
r    r&   r   r   r   Ú	test_EHLOI  ó   
zSMTPDChannelTest.test_EHLOc                 C   rž   )Ns   EHLOs   501 Syntax: EHLO hostname
r    r&   r   r   r   Útest_EHLO_bad_syntaxM  r¢   z%SMTPDChannelTest.test_EHLO_bad_syntaxc                 C   ó*   |   d¡ |   d¡ |  | jjjd¡ d S )NrN   ó   503 Duplicate HELO/EHLO
r    r&   r   r   r   Útest_EHLO_duplicateR  ó
   

ÿz$SMTPDChannelTest.test_EHLO_duplicatec                 C   ó*   |   d¡ |   d¡ |  | jjjd¡ d S )NrN   r7   r§   r    r&   r   r   r   Útest_EHLO_HELO_duplicateX  r©   z)SMTPDChannelTest.test_EHLO_HELO_duplicatec                 C   s6   t j ¡ }|  d¡ |  | jjjd |¡ d¡¡ d S )Nr7   z250 {}
Úascii)	r   r$   Úgetfqdnr5   rT   r4   r‚   ÚformatÚencode)r   Únamer   r   r   Ú	test_HELO^  s
   

ÿzSMTPDChannelTest.test_HELOc                 C   rª   )Nr7   rN   r§   r    r&   r   r   r   Útest_HELO_EHLO_duplicated  r©   z)SMTPDChannelTest.test_HELO_EHLO_duplicatec                 C   rž   )Ns   HELPsF   250 Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY
r    r&   r   r   r   Ú	test_HELPj  r¢   zSMTPDChannelTest.test_HELPc                 C   rž   )Ns	   HELP MAILs"   250 Syntax: MAIL FROM: <address>
r    r&   r   r   r   Útest_HELP_commandp  r¢   z"SMTPDChannelTest.test_HELP_commandc                 C   rž   )Ns	   HELP SPAMsF   501 Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY
r    r&   r   r   r   Útest_HELP_command_unknownu  r¢   z*SMTPDChannelTest.test_HELP_command_unknownc                 C   rž   )Ns   HELOs   501 Syntax: HELO hostname
r    r&   r   r   r   Útest_HELO_bad_syntax{  r¢   z%SMTPDChannelTest.test_HELO_bad_syntaxc                 C   r¦   )Nr7   r§   r    r&   r   r   r   Útest_HELO_duplicate€  r©   z$SMTPDChannelTest.test_HELO_duplicatec                 C   s0   d| _ |  d¡ |  d¡ |  | jjjd¡ d S )NFr7   s%   MAIL from:<foo@example.com> SIZE=1234ó"   501 Syntax: MAIL FROM: <address>
)Zextended_smtpr5   rT   r4   r$   r‚   r&   r   r   r   Ú8test_HELO_parameter_rejected_when_extensions_not_enabled†  s   

ÿzISMTPDChannelTest.test_HELO_parameter_rejected_when_extensions_not_enabledc                 C   rª   )Nr7   s   MAIL from:   <foo@example.com>r†   r    r&   r   r   r   Ú"test_MAIL_allows_space_after_colon  r©   z3SMTPDChannelTest.test_MAIL_allows_space_after_colonc                 C   rª   )NrN   s&   MAIL from:   <foo@example.com> size=20r†   r    r&   r   r   r   Ú+test_extended_MAIL_allows_space_after_colon“  r©   z<SMTPDChannelTest.test_extended_MAIL_allows_space_after_colonc                 C   rž   )Nó   NOOPr†   r    r&   r   r   r   Ú	test_NOOP™  r¤   zSMTPDChannelTest.test_NOOPc                 C   rª   )Nr7   r¼   r†   r    r&   r   r   r   Útest_HELO_NOOP  ó   

zSMTPDChannelTest.test_HELO_NOOPc                 C   rž   )Ns   NOOP his   501 Syntax: NOOP
r    r&   r   r   r   Útest_NOOP_bad_syntax¢  r¢   z%SMTPDChannelTest.test_NOOP_bad_syntaxc                 C   rž   )Nó   QUITó	   221 Bye
r    r&   r   r   r   Ú	test_QUIT§  r¤   zSMTPDChannelTest.test_QUITc                 C   rª   )Nr7   rÁ   rÂ   r    r&   r   r   r   Útest_HELO_QUIT«  r¿   zSMTPDChannelTest.test_HELO_QUITc                 C   rž   )Ns   QUIT bye byerÂ   r    r&   r   r   r   Útest_QUIT_arg_ignored°  r¤   z&SMTPDChannelTest.test_QUIT_arg_ignoredc                 C   s(   d| j _|  d¡ |  | j jjd¡ d S )Nz	BAD STATEr7   s   451 Internal confusion
)r4   Z
smtp_stater5   rT   r$   r‚   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 )Nr7   s   MAIL from: ó   as   @exampleó   500 Error: line too long
)r5   r4   Úcommand_size_limitrT   r$   r‚   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 )	NrN   zMAIL from:<@example>ó   MAIL from:<rÇ   s   @example> SIZE=1234r†   é   rÈ   )r5   r4   rÉ   ÚlenrT   r$   r‚   ©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 )NrN   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é  r7   r8   r9   r:   ó   As   A
.ó   552 Error: Too much mail data
©r4   Zdata_size_limitr5   rT   r$   r‚   r&   r   r   r   Ú-test_data_longer_than_default_data_size_limitÖ  s   



ÿÿz>SMTPDChannelTest.test_data_longer_than_default_data_size_limitc                 C   rª   )NrN   s!   MAIL FROM:<eggs@example> SIZE=512r†   r    r&   r   r   r   Útest_MAIL_size_parameterâ  r©   z)SMTPDChannelTest.test_MAIL_size_parameterc                 C   rª   )NrN   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è  r©   z1SMTPDChannelTest.test_MAIL_invalid_size_parameterc                 C   sP   |   d¡ |   d¡ |  | jjjd¡ |   d¡ |   d¡ |  | jjjd¡ d S )NrN   s"   MAIL FROM:<eggs@example> ham=greenrŠ   s   MAIL FROM:<eggs@example>s    RCPT TO:<eggs@example> ham=greenrr   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Ô   rN   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   rª   )Nr7   s   RCPT to:spam@examples   503 Error: need MAIL command
r    r&   r   r   r   Útest_need_MAIL   r©   zSMTPDChannelTest.test_need_MAILc                 C   rª   )Nr7   ó   MAIL from eggs@exampler¸   r    r&   r   r   r   Útest_MAIL_syntax_HELO  r©   z&SMTPDChannelTest.test_MAIL_syntax_HELOc                 C   rª   )NrN   rß   rÚ   r    r&   r   r   r   Útest_MAIL_syntax_EHLO  r©   z&SMTPDChannelTest.test_MAIL_syntax_EHLOc                 C   rª   )Nr7   s
   MAIL from:r¸   r    r&   r   r   r   Útest_MAIL_missing_address  r©   z*SMTPDChannelTest.test_MAIL_missing_addressc                 C   rª   )Nr7   s   MAIL from:<eggs@example>r†   r    r&   r   r   r   Útest_MAIL_chevrons  r¿   z#SMTPDChannelTest.test_MAIL_chevronsc                 C   rª   )NrN   s   MAIL from:<>r†   r    r&   r   r   r   Útest_MAIL_empty_chevrons  r¿   z)SMTPDChannelTest.test_MAIL_empty_chevronsc                 C   ó:   |   d¡ |   d¡ |  | jjjd¡ |  | jjd¡ d S )NrN   s%   MAIL from: <"Fred Blogs"@example.com>r†   ú"Fred Blogs"@example.com©r5   rT   r4   r$   r‚   r   r&   r   r   r   Útest_MAIL_quoted_localpart"  ó   

z+SMTPDChannelTest.test_MAIL_quoted_localpartc                 C   rå   )NrN   s#   MAIL from: "Fred Blogs"@example.comr†   ræ   rç   r&   r   r   r   Ú$test_MAIL_quoted_localpart_no_angles(  ré   z5SMTPDChannelTest.test_MAIL_quoted_localpart_no_anglesc                 C   rå   )NrN   s/   MAIL from: <"Fred Blogs"@example.com> SIZE=1000r†   ræ   rç   r&   r   r   r   Ú$test_MAIL_quoted_localpart_with_size.  ré   z5SMTPDChannelTest.test_MAIL_quoted_localpart_with_sizec                 C   rå   )NrN   s-   MAIL from: "Fred Blogs"@example.com SIZE=1000r†   ræ   rç   r&   r   r   r   Ú.test_MAIL_quoted_localpart_with_size_no_angles4  ré   z?SMTPDChannelTest.test_MAIL_quoted_localpart_with_size_no_anglesc                 C   ó4   |   d¡ |   d¡ |   d¡ |  | jjjd¡ d S )Nr7   s   MAIL from:eggs@examples   MAIL from:spam@examples    503 Error: nested MAIL command
r    r&   r   r   r   Útest_nested_MAIL:  ó   


ÿz!SMTPDChannelTest.test_nested_MAILc                 C   rž   )Ns   VRFY eggs@examplesD   252 Cannot VRFY user, but will accept message and attempt delivery
r    r&   r   r   r   Ú	test_VRFYA  r¢   zSMTPDChannelTest.test_VRFYc                 C   rž   )Ns   VRFYs   501 Syntax: VRFY <address>
r    r&   r   r   r   Útest_VRFY_syntaxG  r¢   z!SMTPDChannelTest.test_VRFY_syntaxc                 C   rž   )Ns   EXPNs   502 EXPN not implemented
r    r&   r   r   r   Útest_EXPN_not_implementedL  r¢   z*SMTPDChannelTest.test_EXPN_not_implementedc                 C   rž   )Ns   MAIL from:<foo@example.com>ó   503 Error: send HELO first
r    r&   r   r   r   Útest_no_HELO_MAILQ  r¢   z"SMTPDChannelTest.test_no_HELO_MAILc                 C   rí   )Nr7   r8   r:   s   503 Error: need RCPT command
r    r&   r   r   r   Útest_need_RCPTV  rï   zSMTPDChannelTest.test_need_RCPTc                 C   rí   )Nr7   ó   MAIL From: eggs@exampleó   RCPT to eggs@examples    501 Syntax: RCPT TO: <address>
r    r&   r   r   r   Útest_RCPT_syntax_HELO]  rï   z&SMTPDChannelTest.test_RCPT_syntax_HELOc                 C   rí   )NrN   rö   r÷   s7   501 Syntax: RCPT TO: <address> [SP <mail-parameters>]
r    r&   r   r   r   Útest_RCPT_syntax_EHLOd  rï   z&SMTPDChannelTest.test_RCPT_syntax_EHLOc                 C   rí   )Nr7   rö   s   RCPT to: <eggs@example>r†   r    r&   r   r   r   Útest_RCPT_lowercase_to_OKk  s   


z*SMTPDChannelTest.test_RCPT_lowercase_to_OKc                 C   rž   )Nr÷   ró   r    r&   r   r   r   Útest_no_HELO_RCPTq  r¢   z"SMTPDChannelTest.test_no_HELO_RCPTc                 C   óš   |   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 ©Nr7   r8   r†   r9   r:   ó%   354 End data with <CR><LF>.<CR><LF>
s   data
more
.©zpeer-addressz	peer-portúeggs@exampleúspam@examplez	data
more©r5   rT   r4   r$   r‚   r@   r   r&   r   r   r   Útest_data_dialogv  ó$   



ÿ

ýÿz!SMTPDChannelTest.test_data_dialogc                 C   s>   |   d¡ |   d¡ |   d¡ |   d¡ |  | jjjd¡ d S )Nr7   r8   r9   ó	   DATA spams   501 Syntax: DATA
r    r&   r   r   r   Útest_DATA_syntaxˆ  s
   



z!SMTPDChannelTest.test_DATA_syntaxc                 C   rž   )Nr  ró   r    r&   r   r   r   Útest_no_HELO_DATA  r¢   z"SMTPDChannelTest.test_no_HELO_DATAc                 C   sF   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |  | jjd¡ d S )Nr7   r8   r9   r:   s   ..
.
Ú.©r5   rT   r4   Ú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 )Nr7   r8   r9   s   RCPT To:ham@exampler:   ó   data
.rÿ   r   r  zham@exampler   )r5   rT   r@   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 )Nr7   r8   r9   r:   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 )Nr7   r8   r9   ó   RSETr†   s   MAIL From:foo@examples   RCPT To:eggs@exampler:   r  rÿ   zfoo@exampler   r   r  r&   r   r   r   Ú	test_RSET²  s    








ýÿzSMTPDChannelTest.test_RSETc                 C   rª   )Nr7   r  r†   r    r&   r   r   r   Útest_HELO_RSETÂ  r¿   zSMTPDChannelTest.test_HELO_RSETc                 C   rž   )Ns   RSET his   501 Syntax: RSET
r    r&   r   r   r   Útest_RSET_syntaxÇ  r¤   z!SMTPDChannelTest.test_RSET_syntaxc                 C   rž   )Ns   UNKNOWN_CMDs1   500 Error: command "UNKNOWN_CMD" not recognized
r    r&   r   r   r   Útest_unknown_commandË  r¢   z%SMTPDChannelTest.test_unknown_commandc                 C   sÄ  t  dtf¡ | jj}W d   ƒ n1 sw   Y  t  dtf¡ d| j_W d   ƒ n1 s1w   Y  t  dtf¡ | jj}W d   ƒ n1 sLw   Y  t  dtf¡ d| j_W d   ƒ n1 sgw   Y  t  dtf¡ | jj}W d   ƒ n1 s‚w   Y  t  dtf¡ d| j_W d   ƒ n1 sw   Y  t  dtf¡ | jj}W d   ƒ n1 s¸w   Y  t  dtf¡ d| j_W d   ƒ n1 sÓw   Y  t  dtf¡ | jj}W d   ƒ n1 sîw   Y  t  dtf¡ d| j_W d   ƒ n	1 s
w   Y  t  dtf¡ | jj	}W d   ƒ n	1 s&w   Y  t  dtf¡ d| j_	W d   ƒ n	1 sBw   Y  t  dtf¡ | jj
}W d   ƒ n	1 s^w   Y  t  dtf¡ d| j_
W d   ƒ n	1 szw   Y  t  dtf¡ | jj}W d   ƒ n	1 s–w   Y  t  dtf¡ d| j_W d   ƒ n	1 s²w   Y  t  dtf¡ | jj}W d   ƒ n	1 sÎw   Y  t  dtf¡ d| j_W d   ƒ n	1 sêw   Y  t  dtf¡ | jj}W d   ƒ n	1 sw   Y  t  dtf¡ d| j_W d   ƒ n	1 s"w   Y  t  dtf¡ | jj}W d   ƒ n	1 s>w   Y  t  dtf¡ d| j_W d   ƒ d S 1 s[w   Y  d S )NÚ Úspam)r   Zcheck_warningsÚDeprecationWarningr4   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Ñ  s„   
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
$ÿz,SMTPDChannelTest.test_attribute_deprecationsN)Fr   r   r   r'   rK   r5   rœ   rG   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’   rc   c                   @   r   )ÚSMTPDChannelIPv6Testc                 C   r“   r”   )r   r   r$   r%   ru   rv   rw   rx   ry   r   r   rf   r@   r<   r=   r4   r–   r   r   r   r'     r—   zSMTPDChannelIPv6Test.setUpN)r   r   r   r'   r   r   r   r   r  ÿ  s    r  c                   @   ó4   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   r{   r   r|   r&   r   r   r   rK     r}   z*SMTPDChannelWithDataSizeLimitTest.tearDownc                 C   r˜   r   r™   rš   r   r   r   r5     r›   z,SMTPDChannelWithDataSizeLimitTest.write_linec                 C   rü   rý   r  r&   r   r   r   Útest_data_limit_dialog!  r  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 )	Nr7   r8   r†   r9   r:   rþ   s'   This message is longer than 32 bytes
.rÖ   r    r&   r   r   r   Ú$test_data_limit_dialog_too_much_data3  s   



ÿ
ÿzFSMTPDChannelWithDataSizeLimitTest.test_data_limit_dialog_too_much_dataN)r   r   r   r'   rK   r5   r  r  r   r   r   r   r    s    r  c                   @   r  )Ú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'   D  s   z%SMTPDChannelWithDecodeDataFalse.setUpc                 C   r{   r   r|   r&   r   r   r   rK   L  r}   z(SMTPDChannelWithDecodeDataFalse.tearDownc                 C   r˜   r   r™   rš   r   r   r   r5   Q  r›   z*SMTPDChannelWithDecodeDataFalse.write_linec                 C   sP   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |  | jjd¡ d S )Nr7   r8   r9   r:   ó   plain ascii textrO   r	  r&   r   r   r   Útest_ascii_dataU  ó   





z/SMTPDChannelWithDecodeDataFalse.test_ascii_datac                 C   óZ   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |  | jjd¡ d S )	Nr7   r8   r9   r:   ó   utf8 enriched text: Å¼ÅºÄ‡ó   and some plain asciirO   s/   utf8 enriched text: Å¼ÅºÄ‡
and some plain asciir	  r&   r   r   r   Útest_utf8_data^  ó   






þz.SMTPDChannelWithDecodeDataFalse.test_utf8_dataN©r   r   r   r'   rK   r5   r   r%  r   r   r   r   r  B  s    	r  c                   @   r  )ÚSMTPDChannelWithDecodeDataTruec                 C   r“   r”   r•   r–   r   r   r   r'   n  s   ÿÿz$SMTPDChannelWithDecodeDataTrue.setUpc                 C   r{   r   r|   r&   r   r   r   rK   y  r}   z'SMTPDChannelWithDecodeDataTrue.tearDownc                 C   r˜   r   r™   rš   r   r   r   r5   ~  r›   z)SMTPDChannelWithDecodeDataTrue.write_linec                 C   sP   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |  | jjd¡ d S )Nr7   r8   r9   r:   r  rO   zplain ascii textr	  r&   r   r   r   r   ‚  r!  z.SMTPDChannelWithDecodeDataTrue.test_ascii_datac                 C   r"  )	Nr7   r8   r9   r:   r#  r$  rO   u/   utf8 enriched text: Å¼ÅºÄ‡
and some plain asciir	  r&   r   r   r   r%  ‹  r&  z-SMTPDChannelWithDecodeDataTrue.test_utf8_dataNr'  r   r   r   r   r(  l  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   r“   )Nr   r)   Tr_   r•   r–   r   r   r   r'   ™  r—   z,SMTPDChannelTestWithEnableSMTPUTF8True.setUpc                 C   r{   r   r|   r&   r   r   r   rK   £  r}   z/SMTPDChannelTestWithEnableSMTPUTF8True.tearDownc                 C   r˜   r   r™   rš   r   r   r   r5   ¨  r›   z1SMTPDChannelTestWithEnableSMTPUTF8True.write_linec                 C   s0   |   d¡ |   d d¡¡ |  | jjjd¡ d S )NrN   u7   MAIL from: <naiÌˆve@example.com> BODY=8BITMIME SMTPUTF8úutf-8r†   )r5   r¯   rT   r4   r$   r‚   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 ]V}|   d| ¡ |  | jjjdd… d¡ |   d¡ |  | jjjdd… d¡ |   d¡ |  | jjjdd… d	¡ |   d
¡ |dkrT|  | jjjd¡ q|  | jjjd¡ qd S )NrN   )rŸ   s   BODY=8BITMIME SMTPUTF8s   MAIL from: <a@example> r   é   ó   250s   rcpt to:<b@example.com>ó   dataó   354s   c
.rŸ   r†   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 )NrN   u2   MAIL From: naiÌˆve@examplÃ© BODY=8BITMIME SMTPUTF8r*  r   r,  r-  u   RCPT To:spÃ¤m@examplÃ©r:   r/  r#  rO   )r5   r¯   rT   r4   r$   r‚   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È   r†   ©r5   rÍ   rT   r4   r$   r‚   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 ]h}|   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 )Nr1  r2  r3  )rÇ   ó   bó   crË   s
   a@example>r   r,  s   500r4  r-  s   rcpt to:<hans@example.com>r.  r/  s   test
.r5  )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'   rK   r5   r+  r0  r%  r6  r:  r   r   r   r   r)  ˜  s    
r)  c                   @   r   )ÚMiscTestCasec                 C   s   h d£}t j| t|d d S )N>	   ÚNEWLINEZDevnullZOptionsÚusageZ	parseargsZ
COMMASPACEZprogramZDATA_SIZE_DEFAULTru   )Únot_exported)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;  ð  r    r;  Ú__main__)&rn   rU   Útestr   r   Ztest.supportr   r   r$   rw   ÚwarningsÚcatch_warningsÚsimplefilterr  r   r%   r	   r   Ú	Exceptionr   r   ZTestCaser!   rM   rb   rq   r‰   r’   ro   rp   r  r  r  r(  r)  r;  r   Úmainr   r   r   r   Ú<module>   sF    

ý"]%B   `7*,X	ÿ