a
    äzed¤  ã                   @   sr  d dl m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mZmZmZmZmZ d dlmZ d dlZd dlmZ d dlmZmZmZ zd dlZW n eyÎ   dZY n0 ej ej e¡pæejd	¡Z ej ej e¡pejd
¡Z!G dd„ dej"ƒZ#er<G dd„ de	j$ƒZ%ej&Z&nG dd„ dƒZ%dZ&G dd„ de	j'ƒZ(G dd„ dƒZ)G dd„ de)ej"ƒZ*e +ed¡G dd„ de)ej"ƒƒZ,G dd„ dej"ƒZ-e +ed¡G dd„ de-ƒƒZ.e +e /d¡d¡e 0d¡G d d!„ d!ej"ƒƒƒZ1e +ed¡e +e /d¡d¡e 0d¡G d"d#„ d#e1ƒƒƒƒZ2e +ed¡e 0d¡G d$d%„ d%e1ƒƒƒZ3e4d&krne 5¡  dS )'é    )Úsupport)Úsocket_helper)ÚcontextmanagerN)Úreap_threadsÚverboseÚrun_with_tzÚrun_with_localeÚcpython_only)Úhashlib_helper)Úmock)ÚdatetimeÚtimezoneÚ	timedeltazkeycert3.pemzpycacert.pemc                   @   sX   e Zd Zdd„ Zedƒdd„ ƒZdd„ Zedd	d
ƒedƒdd„ ƒƒZdd„ Z	dd„ Z
dS )ÚTestImaplibc                 C   sb   t  d¡}t d¡}|  t |¡|¡ t d¡}|  t |¡|¡ t d¡}|  t |¡|¡ d S )N)	iÐ  é   r   r   r   r   éÿÿÿÿr   r   s.   25 (INTERNALDATE "01-Jan-2000 00:00:00 +0000")s.   25 (INTERNALDATE "01-Jan-2000 11:30:00 +1130")s.   25 (INTERNALDATE "31-Dec-1999 12:30:00 -1130"))ÚcalendarZtimegmÚimaplibÚInternaldate2tupleÚassertEqualÚtimeÚmktime)ÚselfÚt0Útt© r   ú'/usr/lib/python3.9/test/test_imaplib.pyÚtest_Internaldate2tuple   s    
ÿÿÿz#TestImaplib.test_Internaldate2tuplezMST+07MDT,M4.1.0,M10.5.0c                 C   s   |   t d¡t d¡¡ d S )Ns.   25 (INTERNALDATE "02-Apr-2000 02:30:00 +0000")s.   25 (INTERNALDATE "02-Apr-2000 03:30:00 +0000"))ZassertNotEqualr   r   ©r   r   r   r   Ú"test_Internaldate2tuple_issue10941*   s    ÿÿþz.TestImaplib.test_Internaldate2tuple_issue10941c                 C   s*   ddt  d¡ddt dttddƒƒ¡dgS )Ni ”5wg    eÍÝA)	éñ  é   é   r!   é!   é   r   r   r   )	r    r!   r"   r!   r#   r$   r   r   r   r   i   ú"18-May-2033 05:33:20 +0200")r   Ú	localtimer   Zfromtimestampr   r   r   r   r   r   Ú
timevalues1   s    ÿûzTestImaplib.timevaluesÚLC_ALLÚde_DEÚfr_FRzSTD-1DST,M3.2.0,M11.1.0c                 C   s,   d}|   ¡ D ]}t |¡}|  ||¡ qd S )Nr%   )r'   r   ÚTime2Internaldater   )r   ZexpectedÚtZinternalr   r   r   Útest_Time2Internaldate9   s    
z"TestImaplib.test_Time2Internaldatec                 C   s   |   ¡ D ]}t |¡ qd S ©N)r'   r   r+   )r   r,   r   r   r   Ú,test_that_Time2Internaldate_returns_a_resultD   s    z8TestImaplib.test_that_Time2Internaldate_returns_a_resultc              	   C   sª   t   ¡ D}z| dtjf¡ |  d¡ W n t jy<   Y n0 W d   ƒ n1 sR0    Y  t ¡ }|  t	¡}t 
¡  W d   ƒ n1 sŒ0    Y  |  |jj|¡ d S )NÚ z3Cannot run the test with local IMAP server running.)ÚsocketÚconnectr   Z
IMAP4_PORTZskipTestÚerrorr   Zget_socket_conn_refused_errsÚassertRaisesÚOSErrorÚIMAP4ÚassertInÚ	exceptionÚerrno)r   ÚsZexpected_errnosÚcmr   r   r   Útest_imap4_host_default_valueK   s    
ÿ$&z)TestImaplib.test_imap4_host_default_valueN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r'   r   r-   r/   r<   r   r   r   r   r      s   

r   c                   @   s   e Zd Zdd„ ZdS )ÚSecureTCPServerc                 C   s6   | j  ¡ \}}t ¡ }| t¡ |j|dd}||fS )NT)Zserver_side)r1   ÚacceptÚsslÚ
SSLContextÚload_cert_chainÚCERTFILEZwrap_socket)r   Z	newsocketZfromaddrÚcontextZ
connstreamr   r   r   Úget_request_   s
    
zSecureTCPServer.get_requestN)r=   r>   r?   rG   r   r   r   r   r@   ]   s   r@   c                   @   s   e Zd ZdS )r@   N©r=   r>   r?   r   r   r   r   r@   j   s   c                       sz   e Zd ZejZdZdZ‡ f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‡  ZS )ÚSimpleIMAPHandlerNr0   c                    s   t ƒ  ¡  d| j_d | j_d S ©NF)ÚsuperÚsetupÚserverÚis_selectedÚloggedr   ©Ú	__class__r   r   rL   u   s    
zSimpleIMAPHandler.setupc                 C   s$   t rtd| ¡  ƒ | j |¡ d S )NzSENT: %r)r   ÚprintÚstripÚwfileÚwrite©r   Úmessager   r   r   Ú_sendz   s    zSimpleIMAPHandler._sendc                 C   s   |   |d ¡ d S )Nó   
)rX   rV   r   r   r   Ú
_send_line   s    zSimpleIMAPHandler._send_linec                 C   s   |   | d¡¡ d S )NÚASCII)rZ   ÚencoderV   r   r   r   Ú_send_textline‚   s    z SimpleIMAPHandler._send_textlinec                 C   s   |   d |||f¡¡ d S )Nú )r]   Újoin)r   ÚtagÚcoderW   r   r   r   Ú_send_tagged…   s    zSimpleIMAPHandler._send_taggedc                 C   s  |   d¡ d}z&| j d¡}|dkr*W d S ||7 }W n tyH   Y d S 0 | d¡rqXqtrltd| ¡  ƒ | jržz| j 	|¡ W q
 t
yš   d | _Y q
0 q
| d¡ ¡ }|d }|d }|dd … }t| d	| ƒrt| d	| ƒ||ƒ}|r|| _t|ƒ q
|  |d
|d ¡ q
d S )Nz* OK IMAP4rev1ó    r   rY   zGOT: %rr[   r   é   Zcmd_ÚBADz unknown)r]   ZrfileÚreadr5   Úendswithr   rR   rS   ÚcontinuationÚsendÚStopIterationÚdecodeÚsplitÚhasattrÚgetattrÚnextrb   )r   ÚlineÚpartZ	splitliner`   ÚcmdÚargsrh   r   r   r   Úhandleˆ   s:    


zSimpleIMAPHandler.handlec                 C   s4   | j rd| j  nd}|  d| ¡ |  |dd¡ d S )Nz
IMAP4rev1 Z	IMAP4rev1z* CAPABILITY ÚOKúCAPABILITY completed)Úcapabilitiesr]   rb   )r   r`   rs   Zcapsr   r   r   Úcmd_CAPABILITY²   s    ÿþz SimpleIMAPHandler.cmd_CAPABILITYc                 C   s$   d | j _|  d¡ |  |dd¡ d S )Nz"* BYE IMAP4ref1 Server logging outru   zLOGOUT completed)rM   rO   r]   rb   ©r   r`   rs   r   r   r   Ú
cmd_LOGOUT¹   s    
zSimpleIMAPHandler.cmd_LOGOUTc                 C   s   |d | j _|  |dd¡ d S )Nr   ru   zLOGIN completed)rM   rO   rb   ry   r   r   r   Ú	cmd_LOGIN¾   s    zSimpleIMAPHandler.cmd_LOGINc                 C   s$   d| j _|  d¡ |  |dd¡ d S )NTó
   * 2 EXISTSru   ú[READ-WRITE] SELECT completed.)rM   rN   rZ   rb   ry   r   r   r   Ú
cmd_SELECTÂ   s    
zSimpleIMAPHandler.cmd_SELECTc                 C   s2   | j jr d| j _|  |dd¡ n|  |dd¡ d S )NFru   z*Returned to authenticated state. (Success)re   zNo mailbox selected)rM   rN   rb   ry   r   r   r   Úcmd_UNSELECTÇ   s    zSimpleIMAPHandler.cmd_UNSELECT)r=   r>   r?   r   ÚLOOPBACK_TIMEOUTÚtimeoutrh   rw   rL   rX   rZ   r]   rb   rt   rx   rz   r{   r~   r   Ú__classcell__r   r   rP   r   rI   p   s   *rI   c                   @   s
  e Zd ZdZ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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e d%d&¡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S )<ÚNewIMAPTestsMixinNTc                 C   s„   G dd„ d| j ƒ}|  | j¡ |   tjdf|¡| _tj| jd | jj	ddid| _
d| j
_| j
 ¡  |rx| j| jjŽ | _| j| jfS )	a  
        Sets up imap_handler for tests. imap_handler should inherit from either:
        - SimpleIMAPHandler - for testing IMAP commands,
        - socketserver.StreamRequestHandler - if raw access to stream is needed.
        Returns (client, server).
        c                   @   s   e Zd Zdd„ ZdS )z/NewIMAPTestsMixin._setup.<locals>.TestTCPServerc                 S   s   |   |¡ |  ¡  ‚ dS )zP
                End request and raise the error if one occurs.
                N©Zclose_requestÚserver_close©r   ZrequestZclient_addressr   r   r   Úhandle_errorÚ   s    
z<NewIMAPTestsMixin._setup.<locals>.TestTCPServer.handle_errorN©r=   r>   r?   r‡   r   r   r   r   ÚTestTCPServerÙ   s   r‰   r   z-serverÚpoll_intervalç{®Gáz„?©ÚnameÚtargetÚkwargsT)Úserver_classZ
addCleanupÚ_cleanupr   ÚHOSTrM   Ú	threadingÚThreadZ_testMethodNameÚserve_foreverÚthreadÚdaemonÚstartÚ
imap_classÚserver_addressÚclient)r   Zimap_handlerr2   r‰   r   r   r   Ú_setupÒ   s    	ú
zNewIMAPTestsMixin._setupc                 C   sJ   | j dur | j jdkr | j  ¡  | j ¡  | j ¡  t | j¡ d| _dS )zž
        Cleans up the test server. This method should not be called manually,
        it is added to the cleanup queue in the _setup method already.
        NÚLOGOUT)r›   ÚstateÚshutdownrM   r…   r   Újoin_threadr–   r   r   r   r   r‘   ó   s    


zNewIMAPTestsMixin._cleanupc                 C   sD   G dd„ dt jƒ}| j|dd\}}| jtjj| jg|j¢R Ž  d S )Nc                   @   s   e Zd Zdd„ ZdS )zONewIMAPTestsMixin.test_EOF_without_complete_welcome_message.<locals>.EOFHandlerc                 S   s   | j  d¡ d S ©Ns   * OK©rT   rU   r   r   r   r   rt     s    zVNewIMAPTestsMixin.test_EOF_without_complete_welcome_message.<locals>.EOFHandler.handleN©r=   r>   r?   rt   r   r   r   r   Ú
EOFHandler  s   r¤   F©r2   )	ÚsocketserverÚStreamRequestHandlerrœ   r4   r   r6   Úabortr™   rš   )r   r¤   Ú_rM   r   r   r   Ú)test_EOF_without_complete_welcome_message  s
    ÿz;NewIMAPTestsMixin.test_EOF_without_complete_welcome_messagec                 C   sB   G dd„ dt ƒ}| j|dd\}}| jtjj| jg|j¢R Ž  d S )Nc                   @   s   e Zd Zdd„ ZdS )zBNewIMAPTestsMixin.test_line_termination.<locals>.BadNewlineHandlerc                 S   s   |   d¡ |  |dd¡ d S ©Ns   * CAPABILITY IMAP4rev1 AUTH
ru   rv   ©rX   rb   ry   r   r   r   rx     s    
zQNewIMAPTestsMixin.test_line_termination.<locals>.BadNewlineHandler.cmd_CAPABILITYN©r=   r>   r?   rx   r   r   r   r   ÚBadNewlineHandler  s   r®   Fr¥   )rI   rœ   r4   r   r6   r¨   r™   rš   )r   r®   r©   rM   r   r   r   Útest_line_termination  s
    ÿz'NewIMAPTestsMixin.test_line_terminationc                 C   st   G dd„ dt ƒ}|  |¡\}}|  |j¡ |  tjjd¡ | d¡ W d   ƒ n1 sZ0    Y  |  |j¡ d S )Nc                   @   s   e Zd ZdZdS )zMNewIMAPTestsMixin.test_enable_raises_error_if_not_AUTH.<locals>.EnableHandlerúAUTH ENABLE UTF8=ACCEPTN©r=   r>   r?   rw   r   r   r   r   ÚEnableHandler  s   r²   zENABLE.*NONAUTHÚfoo)	rI   rœ   ÚassertFalseÚutf8_enabledÚassertRaisesRegexr   r6   r3   Úenable)r   r²   r›   r©   r   r   r   Ú$test_enable_raises_error_if_not_AUTH  s    (z6NewIMAPTestsMixin.test_enable_raises_error_if_not_AUTHc                 C   sL   |   t¡\}}|  tjjd¡ | d¡ W d   ƒ n1 s>0    Y  d S )Núdoes not support ENABLEr³   )rœ   rI   r¶   r   r6   r3   r·   )r   r›   r©   r   r   r   Ú)test_enable_raises_error_if_no_capability  s
    
ÿz;NewIMAPTestsMixin.test_enable_raises_error_if_no_capabilityc                 C   sh   |   t¡\}}| dd¡\}}|  |d¡ |  tjjd¡ | d¡ W d   ƒ n1 sZ0    Y  d S )NÚuserÚpassru   r¹   úUTF8=ACCEPT)	rœ   rI   Úloginr   r¶   r   r6   r3   r·   ©r   r›   r©   ÚtypÚdatar   r   r   Ú.test_enable_UTF8_raises_error_if_not_supported$  s    
ÿz@NewIMAPTestsMixin.test_enable_UTF8_raises_error_if_not_supportedc           	      C   sÈ   G dd„ dt ƒ}|  |¡\}}|  |jd¡ | ddd„ ¡\}}|  |d¡ |  |jd¡ | d	¡\}}|  |d¡ |  |jd
¡ d}| d d d | d
¡¡\}}|  |d¡ |  |jd|  d
¡¡ d S )Nc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	zHNewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.UTF8AppendServerzENABLE UTF8=ACCEPTc                 S   s   |   |dd¡ d S ©Nru   zENABLE successful©rb   ry   r   r   r   Ú
cmd_ENABLE/  s    zSNewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.UTF8AppendServer.cmd_ENABLEc                 s   s&   |   d¡ d V | j_|  |dd¡ d S ©Nú+ru   zFAKEAUTH successful©r]   rM   Úresponserb   ry   r   r   r   Úcmd_AUTHENTICATE1  s    

zYNewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.UTF8AppendServer.cmd_AUTHENTICATEc                 s   s&   |   d¡ d V | j_|  |dd¡ d S ©NrÇ   ru   ZokayrÈ   ry   r   r   r   Ú
cmd_APPEND5  s    

zSNewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.UTF8AppendServer.cmd_APPENDN)r=   r>   r?   rw   rÅ   rÊ   rÌ   r   r   r   r   ÚUTF8AppendServer-  s   rÍ   ÚasciiÚMYAUTHc                 S   s   dS ©Ns   faker   ©Úxr   r   r   Ú<lambda>;  rc   z@NewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.<lambda>ru   ó
   ZmFrZQ==
r½   úutf-8õ   Subject: Ã¼Ã±Ã­Â©Ã¶Ã°Ã©úUTF8 (%s)
)	rI   rœ   r   Ú	_encodingÚauthenticaterÉ   r·   Úappendr\   )	r   rÍ   r›   rM   ra   r©   Ú
msg_stringrÀ   rÁ   r   r   r   Útest_enable_UTF8_True_append,  s    ÿz.NewIMAPTestsMixin.test_enable_UTF8_True_appendc                 C   s¤   G dd„ dt ƒ}|  |¡\}}| ddd„ ¡\}}|  |d¡ | d¡\}}|  |d¡ |  |j¡ |  tj	j
d¡ | d	d
¡ W d   ƒ n1 s–0    Y  d S )Nc                   @   s    e Zd ZdZdd„ Zdd„ ZdS )zPNewIMAPTestsMixin.test_search_disallows_charset_in_utf8_mode.<locals>.UTF8Serverr°   c                 S   s   |   |dd¡ d S rÃ   rÄ   ry   r   r   r   rÅ   J  s    z[NewIMAPTestsMixin.test_search_disallows_charset_in_utf8_mode.<locals>.UTF8Server.cmd_ENABLEc                 s   s&   |   d¡ d V | j_|  |dd¡ d S rÆ   rÈ   ry   r   r   r   rÊ   L  s    

zaNewIMAPTestsMixin.test_search_disallows_charset_in_utf8_mode.<locals>.UTF8Server.cmd_AUTHENTICATEN©r=   r>   r?   rw   rÅ   rÊ   r   r   r   r   Ú
UTF8ServerH  s   rÞ   rÏ   c                 S   s   dS rÐ   r   rÑ   r   r   r   rÓ   Q  rc   zNNewIMAPTestsMixin.test_search_disallows_charset_in_utf8_mode.<locals>.<lambda>ru   r½   zcharset.*UTF8r³   Úbar)rI   rœ   rÙ   r   r·   Ú
assertTruerµ   r¶   r   r6   r3   Úsearch)r   rÞ   r›   r©   rÀ   r   r   r   Ú*test_search_disallows_charset_in_utf8_modeG  s    z<NewIMAPTestsMixin.test_search_disallows_charset_in_utf8_modec                 C   sb   G dd„ dt ƒ}|  |¡\}}|  tjjd¡  | ddd„ ¡ W d   ƒ n1 sT0    Y  d S )Nc                   @   s   e Zd Zdd„ ZdS )z6NewIMAPTestsMixin.test_bad_auth_name.<locals>.MyServerc                 S   s   |   |dd |d ¡¡ d S ©NÚNOz#unrecognized authentication type {}r   ©rb   Úformatry   r   r   r   rÊ   [  s    ÿzGNewIMAPTestsMixin.test_bad_auth_name.<locals>.MyServer.cmd_AUTHENTICATEN©r=   r>   r?   rÊ   r   r   r   r   ÚMyServerZ  s   rè   z'unrecognized authentication type METHODÚMETHODc                   S   s   dS ©Nr   r   r   r   r   r   rÓ   a  rc   z6NewIMAPTestsMixin.test_bad_auth_name.<locals>.<lambda>©rI   rœ   r¶   r   r6   r3   rÙ   ©r   rè   r›   r©   r   r   r   Útest_bad_auth_nameY  s    
ÿz$NewIMAPTestsMixin.test_bad_auth_namec                 C   sb   G dd„ dt ƒ}|  |¡\}}|  tjjd¡  | ddd„ ¡ W d   ƒ n1 sT0    Y  d S )Nc                   @   s   e Zd Zdd„ ZdS )z?NewIMAPTestsMixin.test_invalid_authentication.<locals>.MyServerc                 s   s$   |   d¡ d V | _|  |dd¡ d S ©NrÇ   rä   z[AUTHENTICATIONFAILED] invalid©r]   rÉ   rb   ry   r   r   r   rÊ   e  s    
zPNewIMAPTestsMixin.test_invalid_authentication.<locals>.MyServer.cmd_AUTHENTICATENrç   r   r   r   r   rè   d  s   rè   z \[AUTHENTICATIONFAILED\] invalidrÏ   c                 S   s   dS rÐ   r   rÑ   r   r   r   rÓ   l  rc   z?NewIMAPTestsMixin.test_invalid_authentication.<locals>.<lambda>rë   rì   r   r   r   Útest_invalid_authenticationc  s    
ÿz-NewIMAPTestsMixin.test_invalid_authenticationc                 C   sP   G dd„ dt ƒ}|  |¡\}}| ddd„ ¡\}}|  |d¡ |  |jd¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )zCNewIMAPTestsMixin.test_valid_authentication_bytes.<locals>.MyServerc                 s   s&   |   d¡ d V | j_|  |dd¡ d S rÆ   rÈ   ry   r   r   r   rÊ   p  s    

zTNewIMAPTestsMixin.test_valid_authentication_bytes.<locals>.MyServer.cmd_AUTHENTICATENrç   r   r   r   r   rè   o  s   rè   rÏ   c                 S   s   dS rÐ   r   rÑ   r   r   r   rÓ   u  rc   zCNewIMAPTestsMixin.test_valid_authentication_bytes.<locals>.<lambda>ru   rÔ   ©rI   rœ   rÙ   r   rÉ   ©r   rè   r›   rM   ra   r©   r   r   r   Útest_valid_authentication_bytesn  s
    z1NewIMAPTestsMixin.test_valid_authentication_bytesc                 C   sP   G dd„ dt ƒ}|  |¡\}}| ddd„ ¡\}}|  |d¡ |  |jd¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )zHNewIMAPTestsMixin.test_valid_authentication_plain_text.<locals>.MyServerc                 s   s&   |   d¡ d V | j_|  |dd¡ d S rÆ   rÈ   ry   r   r   r   rÊ   {  s    

zYNewIMAPTestsMixin.test_valid_authentication_plain_text.<locals>.MyServer.cmd_AUTHENTICATENrç   r   r   r   r   rè   z  s   rè   rÏ   c                 S   s   dS ©NZfaker   rÑ   r   r   r   rÓ   €  rc   zHNewIMAPTestsMixin.test_valid_authentication_plain_text.<locals>.<lambda>ru   rÔ   rñ   rò   r   r   r   Ú$test_valid_authentication_plain_texty  s
    z6NewIMAPTestsMixin.test_valid_authentication_plain_textÚmd5©Zopensslc                 C   sN   G dd„ dt ƒ}|  |¡\}}|  d|jv ¡ | dd¡\}}|  |d¡ d S )Nc                   @   s   e Zd ZdZdd„ ZdS )z@NewIMAPTestsMixin.test_login_cram_md5_bytes.<locals>.AuthHandlerúLOGINDISABLED AUTH=CRAM-MD5c                 s   s:   |   d¡ d V }|dkr(|  |dd¡ n|  |dd¡ d S ©Nz:+ PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ=s2   dGltIGYxY2E2YmU0NjRiOWVmYTFjY2E2ZmZkNmNmMmQ5ZjMy
ru   zCRAM-MD5 successfulrä   z	No access©r]   rb   ©r   r`   rs   Úrr   r   r   rÊ   ˆ  s
    
zQNewIMAPTestsMixin.test_login_cram_md5_bytes.<locals>.AuthHandler.cmd_AUTHENTICATEN©r=   r>   r?   rw   rÊ   r   r   r   r   ÚAuthHandler†  s   rþ   úAUTH=CRAM-MD5Útimó   tanstaaftanstaafru   ©rI   rœ   rà   rw   Úlogin_cram_md5r   ©r   rþ   r›   r©   Úretr   r   r   Útest_login_cram_md5_bytes„  s
    z+NewIMAPTestsMixin.test_login_cram_md5_bytesc                 C   sN   G dd„ dt ƒ}|  |¡\}}|  d|jv ¡ | dd¡\}}|  |d¡ d S )Nc                   @   s   e Zd ZdZdd„ ZdS )zENewIMAPTestsMixin.test_login_cram_md5_plain_text.<locals>.AuthHandlerrø   c                 s   s:   |   d¡ d V }|dkr(|  |dd¡ n|  |dd¡ d S rù   rú   rû   r   r   r   rÊ   š  s
    
zVNewIMAPTestsMixin.test_login_cram_md5_plain_text.<locals>.AuthHandler.cmd_AUTHENTICATENrý   r   r   r   r   rþ   ˜  s   rþ   rÿ   r   Útanstaaftanstaafru   r  r  r   r   r   Útest_login_cram_md5_plain_text–  s
    z0NewIMAPTestsMixin.test_login_cram_md5_plain_textc                 C   sb   G dd„ dt ƒ}|  |¡\}}|  tjjd¡  | ddd„ ¡ W d   ƒ n1 sT0    Y  d S )Nc                   @   s   e Zd Zdd„ ZdS )z?NewIMAPTestsMixin.test_aborted_authentication.<locals>.MyServerc                 s   s>   |   d¡ d V | _| jdkr,|  |dd¡ n|  |dd¡ d S ©NrÇ   s   *
rä   z[AUTHENTICATIONFAILED] abortedru   zMYAUTH successfulrï   ry   r   r   r   rÊ   ª  s    

ýzPNewIMAPTestsMixin.test_aborted_authentication.<locals>.MyServer.cmd_AUTHENTICATENrç   r   r   r   r   rè   ©  s   rè   z \[AUTHENTICATIONFAILED\] abortedrÏ   c                 S   s   d S r.   r   rÑ   r   r   r   rÓ   ·  rc   z?NewIMAPTestsMixin.test_aborted_authentication.<locals>.<lambda>rë   rì   r   r   r   Útest_aborted_authentication¨  s    
ÿz-NewIMAPTestsMixin.test_aborted_authenticationzimaplib._MAXLINEé
   c                 C   sb   G dd„ dt ƒ}| j|dd\}}|  tjjd¡ | j|jŽ  W d   ƒ n1 sT0    Y  d S )Nc                   @   s   e Zd Zdd„ ZdS )z:NewIMAPTestsMixin.test_linetoolong.<locals>.TooLongHandlerc                 S   s   | j  d¡ d S )Ns   * OK xxxxxxxxxxx
r¢   r   r   r   r   rt   ¼  s    zANewIMAPTestsMixin.test_linetoolong.<locals>.TooLongHandler.handleNr£   r   r   r   r   ÚTooLongHandler»  s   r  Fr¥   zgot more than 10 bytes)rI   rœ   r¶   r   r6   r3   r™   rš   )r   r  r©   rM   r   r   r   Útest_linetoolong¹  s    
ÿz"NewIMAPTestsMixin.test_linetoolongc                 C   sB   | j tdd\}}| j|jŽ  W d   ƒ n1 s40    Y  d S )NFr¥   )rœ   rI   r™   rš   )r   r©   rM   r   r   r   Útest_simple_with_statementÄ  s    z,NewIMAPTestsMixin.test_simple_with_statementc                 C   sª   |   t¡\}}|jd }| jd|d d}|  |jjd ¡ | ¡  | jd|tj	d}|  |jjtj	¡ | ¡  |  
t¡  | jd|dd}W d   ƒ n1 sœ0    Y  d S )Nr   Ú	localhost©r   r   )rœ   rI   rš   r™   r   Úsockr   rŸ   r   r€   r4   Ú
ValueError)r   r©   rM   Úaddrr›   r   r   r   Útest_imaplib_timeout_testÉ  s    
z+NewIMAPTestsMixin.test_imaplib_timeout_testc                 C   sh   G dd„ dt ƒ}|  |¡\}}|jd }|  tj¡  | jd|dd}W d   ƒ n1 sZ0    Y  d S )Nc                   @   s   e Zd Zdd„ ZdS )zQNewIMAPTestsMixin.test_imaplib_timeout_functionality_test.<locals>.TimeoutHandlerc                 S   s   t  d¡ t | ¡ d S rê   )r   ÚsleeprI   rt   r   r   r   r   rt   ×  s    
zXNewIMAPTestsMixin.test_imaplib_timeout_functionality_test.<locals>.TimeoutHandler.handleNr£   r   r   r   r   ÚTimeoutHandlerÖ  s   r  r   r  gü©ñÒMbP?r  )rI   rœ   rš   r4   r1   r   r™   )r   r  r©   rM   r  r›   r   r   r   Ú'test_imaplib_timeout_functionality_testÕ  s
    
z9NewIMAPTestsMixin.test_imaplib_timeout_functionality_testc                 C   sh   | j tdd\}}| j|jŽ *}| dd¡ |  |jd¡ W d   ƒ n1 sN0    Y  |  |j¡ d S ©NFr¥   r»   r¼   )rœ   rI   r™   rš   r¾   r   rO   ÚassertIsNone©r   r©   rM   Úimapr   r   r   Útest_with_statementà  s
    ,z%NewIMAPTestsMixin.test_with_statementc                 C   s|   | j tdd\}}| j|jŽ >}| dd¡ |  |jd¡ | ¡  |  |j¡ W d   ƒ n1 sb0    Y  |  |j¡ d S r  )	rœ   rI   r™   rš   r¾   r   rO   Úlogoutr  r  r   r   r   Útest_with_statement_logoutç  s    *z,NewIMAPTestsMixin.test_with_statement_logoutc                 C   sL   |   t¡\}}| dd¡\}}|  |d¡ |  |d d¡ |  |jd¡ d S )Nr»   r¼   ru   r   ó   LOGIN completedÚAUTH)rœ   rI   r¾   r   rž   r¿   r   r   r   Ú
test_loginó  s
    zNewIMAPTestsMixin.test_loginc                 C   s€   |   t¡\}}| dd¡\}}|  |d¡ |  |d d¡ | ¡ \}}|  |d||f¡ |  |d d||f¡ |  |jd¡ d S )	Nr»   r¼   ru   r   r  ÚBYEs   IMAP4ref1 Server logging outr   )rœ   rI   r¾   r   r  rž   r¿   r   r   r   Útest_logoutú  s    zNewIMAPTestsMixin.test_logoutc                 C   sV   G dd„ dt ƒ}|  |¡\}}| dd¡ | ¡ \}}|  |d¡ |  |d d¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )z,NewIMAPTestsMixin.test_lsub.<locals>.LsubCmdc                 S   s   |   d¡ |  |dd¡S )Nz* LSUB () "." directoryAru   zLSUB completedrú   ry   r   r   r   Úcmd_LSUB  s    
z5NewIMAPTestsMixin.test_lsub.<locals>.LsubCmd.cmd_LSUBN)r=   r>   r?   r$  r   r   r   r   ÚLsubCmd  s   r%  r»   r¼   ru   r   s   () "." directoryA)rI   rœ   r¾   Zlsubr   )r   r%  r›   r©   rÀ   rÁ   r   r   r   Ú	test_lsub  s    zNewIMAPTestsMixin.test_lsubc                 C   s|   |   t¡\}}| dd¡ | ¡ \}}|  |d¡ |  |d d¡ | ¡ \}}|  |d¡ |  |d d¡ |  |jd¡ d S )Nr»   r¼   ru   r   ó   2s*   Returned to authenticated state. (Success)r   )rœ   rI   r¾   Úselectr   Zunselectrž   r¿   r   r   r   Útest_unselect  s    zNewIMAPTestsMixin.test_unselect)T)"r=   r>   r?   r›   rœ   r‘   rª   r¯   r¸   rº   rÂ   rÜ   râ   rí   rð   ró   rõ   r
   Úrequires_hashdigestr  r  r
  r   Úpatchr  r  r  r  r  r  r!  r#  r&  r)  r   r   r   r   rƒ   Ï   s<   
!			






rƒ   c                   @   s   e Zd ZejZejZdS )ÚNewIMAPTestsN)	r=   r>   r?   r   r6   r™   r¦   Ú	TCPServerr   r   r   r   r   r,    s   r,  zSSL not availablec                   @   s0   e Zd ZeZeZdd„ Zdd„ Ze	dd„ ƒZ
dS )ÚNewIMAPSSLTestsc                 C   sŽ   t  t j¡}|  |jt j¡ |  |jd¡ | t¡ |  	t j
d¡8 |  t¡\}}| j|jd|iŽ}| ¡  W d   ƒ n1 s€0    Y  d S )NTú=IP address mismatch, certificate is not valid for '127.0.0.1'Ússl_context)rB   rC   ÚPROTOCOL_TLS_CLIENTr   Úverify_modeZCERT_REQUIREDÚcheck_hostnameÚload_verify_locationsÚCAFILEr¶   ÚCertificateErrorrœ   rI   r™   rš   rŸ   ©r   r0  r©   rM   r›   r   r   r   Útest_ssl_raises&  s    
ÿ
ÿzNewIMAPSSLTests.test_ssl_raisesc                 C   sF   t  t j¡}| t¡ |  t¡\}}| jd|jd |d}| 	¡  d S )Nr  r   ©r0  )
rB   rC   r1  r4  r5  rœ   rI   r™   rš   rŸ   r7  r   r   r   Útest_ssl_verified4  s    
ÿz!NewIMAPSSLTests.test_ssl_verifiedc              
   C   s¢   t  dtf¡€ tj | jd¡P tj | jd¡  | jddtd W d   ƒ n1 sX0    Y  W d   ƒ n1 sv0    Y  W d   ƒ n1 s”0    Y  d S )Nr0   ÚopenZ_connectr  é   )Úcertfile)r   Zcheck_warningsÚDeprecationWarningr   r+  Úobjectr™   rE   r   r   r   r   Útest_certfile_arg_warn?  s    z&NewIMAPSSLTests.test_certfile_arg_warnN)r=   r>   r?   Ú	IMAP4_SSLr™   r@   r   r8  r:  r	   r@  r   r   r   r   r.  !  s   r.  c                   @   s2  e Zd ZejZejZdd„ Z	dd„ Z
edd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZG dd„ deƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd „ ƒZed!d"„ ƒZeejd#d$d%d&d'„ ƒƒZed(d)„ ƒZ d*d+„ Z!ed,d-„ ƒZ"ed.d/„ ƒZ#ed0d1„ ƒZ$d2S )3ÚThreadedNetworkedTestsc                 C   s¨   G dd„ d| j ƒ}trtdƒ |||ƒ}|  |j|j ¡ ¡ trjtdƒ td|ƒ td| j ƒ td|jƒ tj	d| j  |j
d	d
id}d|_| ¡  tr tdƒ ||fS )Nc                   @   s   e Zd Zdd„ ZdS )z4ThreadedNetworkedTests.make_server.<locals>.MyServerc                 S   s   |   |¡ |  ¡  ‚ d S r.   r„   r†   r   r   r   r‡   M  s    
zAThreadedNetworkedTests.make_server.<locals>.MyServer.handle_errorNrˆ   r   r   r   r   rè   L  s   rè   zcreating serverzserver createdzADDR =zCLASS =zHDLR =z
%s servingrŠ   r‹   rŒ   Tzserver running)r   r   rR   r   rš   r1   ÚgetsocknameZRequestHandlerClassr“   r”   r•   r—   r˜   )r   r  Úhdlrrè   rM   r,   r   r   r   Úmake_serverJ  s(    

úz"ThreadedNetworkedTests.make_serverc                 C   s4   t rtdƒ | ¡  | ¡  | ¡  t r0tdƒ d S )Nzwaiting for serverÚdone)r   rR   rŸ   r…   r_   )r   rM   r–   r   r   r   Úreap_serverj  s    z"ThreadedNetworkedTests.reap_serverc              
   c   s@   |   tjdf|¡\}}z|V  W |  ||¡ n|  ||¡ 0 d S )Nr   )rE  r   r’   rG  )r   rD  rM   r–   r   r   r   Úreaped_servers  s    z$ThreadedNetworkedTests.reaped_serverc              	   c   s\   |   |¡>}| j|jŽ }z||fV  W | ¡  n
| ¡  0 W d   ƒ n1 sN0    Y  d S r.   )rH  r™   rš   r  )r   rD  rM   r›   r   r   r   Úreaped_pair{  s
    z"ThreadedNetworkedTests.reaped_pairc                 C   sB   |   t¡$}| j|jŽ }| ¡  W d   ƒ n1 s40    Y  d S r.   )rH  rI   r™   rš   rŸ   ©r   rM   r›   r   r   r   Útest_connect„  s    z#ThreadedNetworkedTests.test_connectc                 C   sÀ   G dd„ dt ƒ}|  |¡’\}}| ddd„ ¡\}}|  |d¡ |  |jd¡ | d¡ | d	d
d¡\}\}|  d|¡ | d¡ | d¡\}\}|  d|¡ W d   ƒ n1 s²0    Y  d S )Nc                       s4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	zEThreadedNetworkedTests.test_bracket_flags.<locals>.BracketFlagHandlerc                    s   g d¢| _ tƒ  ¡  d S )N)ZAnsweredZFlaggedZDeletedZSeenZDraft)ÚflagsrK   rt   r   rP   r   r   rt   •  s    
zLThreadedNetworkedTests.test_bracket_flags.<locals>.BracketFlagHandler.handlec                 s   s&   |   d¡ d V | j_|  |dd¡ d S rÆ   rÈ   ry   r   r   r   rÊ   ™  s    

zVThreadedNetworkedTests.test_bracket_flags.<locals>.BracketFlagHandler.cmd_AUTHENTICATEc                 S   s^   d  | j¡}|  d|  d¡¡ |  d¡ |  d¡ d| }|  | d¡¡ |  |dd¡ d S )	Nú \z* FLAGS (%s)rÎ   r|   s
   * 0 RECENTz-* OK [PERMANENTFLAGS %s \*)] Flags permitted.ru   r}   )r_   rL  rZ   r\   rb   )r   r`   rs   Zflag_msgÚmsgr   r   r   r~   ž  s    

ÿzPThreadedNetworkedTests.test_bracket_flags.<locals>.BracketFlagHandler.cmd_SELECTc                 S   sf   |d   d¡  d¡ ¡ }| j |¡ dd | j¡ }d|d |f }|  | d¡¡ |  |d	d
¡ d S )Nrd   ú(ú)z(FLAGS (%s))rM  z* %s FETCH %sr   rÎ   ru   zSTORE completed.)rS   rl   rL  Úextendr_   rZ   r\   rb   )r   r`   rs   Z	new_flagsZ	flags_msgrN  r   r   r   Ú	cmd_STORE¨  s    zOThreadedNetworkedTests.test_bracket_flags.<locals>.BracketFlagHandler.cmd_STORE)r=   r>   r?   rt   rÊ   r~   rR  r‚   r   r   rP   r   ÚBracketFlagHandler“  s   
rS  rÏ   c                 S   s   dS rÐ   r   rÑ   r   r   r   rÓ   ±  rc   z;ThreadedNetworkedTests.test_bracket_flags.<locals>.<lambda>ru   rÔ   Útestó   1z+FLAGSz[test]s   [test]ZPERMANENTFLAGS)rI   rI  rÙ   r   rÉ   r(  Ústorer7   )r   rS  rM   r›   ra   rÁ   rÀ   r   r   r   Útest_bracket_flagsŠ  s    	

z)ThreadedNetworkedTests.test_bracket_flagsc                 C   s\   G dd„ dt jƒ}|  |¡,}| jtjj| jg|j¢R Ž  W d   ƒ n1 sN0    Y  d S )Nc                   @   s   e Zd Zdd„ ZdS )z9ThreadedNetworkedTests.test_issue5949.<locals>.EOFHandlerc                 S   s   | j  d¡ d S r¡   r¢   r   r   r   r   rt   ¿  s    z@ThreadedNetworkedTests.test_issue5949.<locals>.EOFHandler.handleNr£   r   r   r   r   r¤   ¾  s   r¤   )	r¦   r§   rH  r4   r   r6   r¨   r™   rš   )r   r¤   rM   r   r   r   Útest_issue5949»  s    
ÿÿz%ThreadedNetworkedTests.test_issue5949c                 C   sZ   G dd„ dt ƒ}|  |¡,}| jtjj| jg|j¢R Ž  W d   ƒ n1 sL0    Y  d S )Nc                   @   s   e Zd Zdd„ ZdS )zGThreadedNetworkedTests.test_line_termination.<locals>.BadNewlineHandlerc                 S   s   |   d¡ |  |dd¡ d S r«   r¬   ry   r   r   r   rx   Ì  s    
zVThreadedNetworkedTests.test_line_termination.<locals>.BadNewlineHandler.cmd_CAPABILITYNr­   r   r   r   r   r®   Ê  s   r®   )rI   rH  r4   r   r6   r¨   r™   rš   )r   r®   rM   r   r   r   r¯   Ç  s    
ÿÿz,ThreadedNetworkedTests.test_line_terminationc                   @   s    e Zd ZdZdd„ Zdd„ ZdS )z!ThreadedNetworkedTests.UTF8Serverr°   c                 C   s   |   |dd¡ d S rÃ   rÄ   ry   r   r   r   rÅ   ×  s    z,ThreadedNetworkedTests.UTF8Server.cmd_ENABLEc                 c   s&   |   d¡ d V | j_|  |dd¡ d S rÆ   rÈ   ry   r   r   r   rÊ   Ú  s    

z2ThreadedNetworkedTests.UTF8Server.cmd_AUTHENTICATENrÝ   r   r   r   r   rÞ   Ô  s   rÞ   c                 C   s`   |   | j¡@\}}|  |j¡ |  tjj|jd¡ |  |j¡ W d   ƒ n1 sR0    Y  d S )Nr³   )	rI  rÞ   r´   rµ   r4   r   r6   r3   r·   rJ  r   r   r   r¸   ß  s    z;ThreadedNetworkedTests.test_enable_raises_error_if_not_AUTHc                 C   sX   G dd„ d| j ƒ}|  |¡(\}}|  tjj|jd¡ W d   ƒ n1 sJ0    Y  d S )Nc                   @   s   e Zd ZdZdS )zXThreadedNetworkedTests.test_enable_raises_error_if_no_capability.<locals>.NoEnableServerr   Nr±   r   r   r   r   ÚNoEnableServerê  s   rY  r³   )rÞ   rI  r4   r   r6   r3   r·   )r   rY  rM   r›   r   r   r   rº   è  s    z@ThreadedNetworkedTests.test_enable_raises_error_if_no_capabilityc              	   C   s–   G dd„ dt ƒ}|  tjj¡d |  |¡:\}}| dd¡\}}|  |d¡ | d¡ W d   ƒ n1 sj0    Y  W d   ƒ n1 sˆ0    Y  d S )Nc                   @   s   e Zd ZdS )z\ThreadedNetworkedTests.test_enable_UTF8_raises_error_if_not_supported.<locals>.NonUTF8ServerNrH   r   r   r   r   ÚNonUTF8Serverñ  s   rZ  r»   r¼   ru   r½   )	rI   r4   r   r6   r3   rI  r¾   r   r·   )r   rZ  rM   r›   rÀ   rÁ   r   r   r   rÂ   ï  s    
zEThreadedNetworkedTests.test_enable_UTF8_raises_error_if_not_supportedc           	   	   C   sê   G dd„ d| j ƒ}|  |¡º\}}|  |jd¡ | ddd„ ¡\}}|  |d¡ |  |jd¡ | d	¡\}}|  |d¡ |  |jd
¡ d}| d d d | d
¡¡\}}|  |d¡ |  |jd|  d
¡¡ W d   ƒ n1 sÜ0    Y  d S )Nc                   @   s   e Zd Zdd„ ZdS )zMThreadedNetworkedTests.test_enable_UTF8_True_append.<locals>.UTF8AppendServerc                 s   s&   |   d¡ d V | j_|  |dd¡ d S rË   rÈ   ry   r   r   r   rÌ   þ  s    

zXThreadedNetworkedTests.test_enable_UTF8_True_append.<locals>.UTF8AppendServer.cmd_APPENDN)r=   r>   r?   rÌ   r   r   r   r   rÍ   ý  s   rÍ   rÎ   rÏ   c                 S   s   dS rÐ   r   rÑ   r   r   r   rÓ     rc   zEThreadedNetworkedTests.test_enable_UTF8_True_append.<locals>.<lambda>ru   rÔ   r½   rÕ   rÖ   r×   )	rÞ   rI  r   rØ   rÙ   rÉ   r·   rÚ   r\   )	r   rÍ   rM   r›   ra   r©   rÛ   rÀ   rÁ   r   r   r   rÜ   ú  s(    ÿÿþz3ThreadedNetworkedTests.test_enable_UTF8_True_appendc                 C   s   |   | j¡p\}}| ddd„ ¡\}}|  |d¡ | d¡\}}|  |d¡ |  |j¡ |  tj	j
|jdd¡ W d   ƒ n1 s‚0    Y  d S )NrÏ   c                 S   s   dS rÐ   r   rÑ   r   r   r   rÓ     rc   zSThreadedNetworkedTests.test_search_disallows_charset_in_utf8_mode.<locals>.<lambda>ru   r½   r³   rß   )rI  rÞ   rÙ   r   r·   rà   rµ   r4   r   r6   r3   rá   )r   rM   r›   rÀ   r©   r   r   r   râ     s    zAThreadedNetworkedTests.test_search_disallows_charset_in_utf8_modec              	   C   s€   G dd„ dt ƒ}|  |¡R\}}|  tjj¡  | ddd„ ¡ W d   ƒ n1 sT0    Y  W d   ƒ n1 sr0    Y  d S )Nc                   @   s   e Zd Zdd„ ZdS )z;ThreadedNetworkedTests.test_bad_auth_name.<locals>.MyServerc                 S   s   |   |dd |d ¡¡ d S rã   rå   ry   r   r   r   rÊ   '  s    ÿzLThreadedNetworkedTests.test_bad_auth_name.<locals>.MyServer.cmd_AUTHENTICATENrç   r   r   r   r   rè   %  s   rè   ré   c                   S   s   dS rê   r   r   r   r   r   rÓ   -  rc   z;ThreadedNetworkedTests.test_bad_auth_name.<locals>.<lambda>©rI   rI  r4   r   r6   r3   rÙ   )r   rè   rM   r›   r   r   r   rí   "  s    z)ThreadedNetworkedTests.test_bad_auth_namec              	   C   s„   G dd„ dt ƒ}|  |¡V\}}|  tjj¡$ | ddd„ ¡\}}W d   ƒ n1 sX0    Y  W d   ƒ n1 sv0    Y  d S )Nc                   @   s   e Zd Zdd„ ZdS )zDThreadedNetworkedTests.test_invalid_authentication.<locals>.MyServerc                 s   s$   |   d¡ d V | _|  |dd¡ d S rî   rï   ry   r   r   r   rÊ   4  s    
zUThreadedNetworkedTests.test_invalid_authentication.<locals>.MyServer.cmd_AUTHENTICATENrç   r   r   r   r   rè   2  s   rè   rÏ   c                 S   s   dS rÐ   r   rÑ   r   r   r   rÓ   ;  rc   zDThreadedNetworkedTests.test_invalid_authentication.<locals>.<lambda>r[  ©r   rè   rM   r›   ra   rÁ   r   r   r   rð   /  s    z2ThreadedNetworkedTests.test_invalid_authenticationc                 C   sÌ   G dd„ dt ƒ}|  |¡B\}}| ddd„ ¡\}}|  |d¡ |  |jd¡ W d   ƒ n1 sb0    Y  |  |¡B\}}| ddd„ ¡\}}|  |d¡ |  |jd¡ W d   ƒ n1 s¾0    Y  d S )	Nc                   @   s   e Zd Zdd„ ZdS )zBThreadedNetworkedTests.test_valid_authentication.<locals>.MyServerc                 s   s&   |   d¡ d V | j_|  |dd¡ d S rÆ   rÈ   ry   r   r   r   rÊ   B  s    

zSThreadedNetworkedTests.test_valid_authentication.<locals>.MyServer.cmd_AUTHENTICATENrç   r   r   r   r   rè   @  s   rè   rÏ   c                 S   s   dS rÐ   r   rÑ   r   r   r   rÓ   H  rc   zBThreadedNetworkedTests.test_valid_authentication.<locals>.<lambda>ru   rÔ   c                 S   s   dS rô   r   rÑ   r   r   r   rÓ   N  rc   )rI   rI  rÙ   r   rÉ   r\  r   r   r   Útest_valid_authentication=  s    ÿ"ÿz0ThreadedNetworkedTests.test_valid_authenticationrö   Tr÷   c                 C   sÈ   G dd„ dt ƒ}|  |¡@\}}|  d|jv ¡ | dd¡\}}|  |d¡ W d   ƒ n1 s`0    Y  |  |¡@\}}|  d|jv ¡ | dd¡\}}|  |d¡ W d   ƒ n1 sº0    Y  d S )Nc                   @   s   e Zd ZdZdd„ ZdS )z?ThreadedNetworkedTests.test_login_cram_md5.<locals>.AuthHandlerrø   c                 s   s:   |   d¡ d V }|dkr(|  |dd¡ n|  |dd¡ d S rù   rú   rû   r   r   r   rÊ   [  s
    
zPThreadedNetworkedTests.test_login_cram_md5.<locals>.AuthHandler.cmd_AUTHENTICATENrý   r   r   r   r   rþ   W  s   rþ   rÿ   r   r  ru   r  )rI   rI  rà   rw   r  r   )r   rþ   rM   r›   r  rÁ   r   r   r   Útest_login_cram_md5S  s    *z*ThreadedNetworkedTests.test_login_cram_md5c              	   C   s„   G dd„ dt ƒ}|  |¡V\}}|  tjj¡$ | ddd„ ¡\}}W d   ƒ n1 sX0    Y  W d   ƒ n1 sv0    Y  d S )Nc                   @   s   e Zd Zdd„ ZdS )zDThreadedNetworkedTests.test_aborted_authentication.<locals>.MyServerc                 s   s>   |   d¡ d V | _| jdkr,|  |dd¡ n|  |dd¡ d S r	  rï   ry   r   r   r   rÊ   u  s
    

zUThreadedNetworkedTests.test_aborted_authentication.<locals>.MyServer.cmd_AUTHENTICATENrç   r   r   r   r   rè   s  s   rè   rÏ   c                 S   s   d S r.   r   rÑ   r   r   r   rÓ   €  rc   zDThreadedNetworkedTests.test_aborted_authentication.<locals>.<lambda>r[  r\  r   r   r   r
  p  s    z2ThreadedNetworkedTests.test_aborted_authenticationc                 C   sZ   G dd„ dt ƒ}|  |¡,}| jtjj| jg|j¢R Ž  W d   ƒ n1 sL0    Y  d S )Nc                   @   s   e Zd Zdd„ ZdS )z?ThreadedNetworkedTests.test_linetoolong.<locals>.TooLongHandlerc                 S   s   | j  dtjd  d ¡ d S )Ns   * OK ó   xrY   )rT   rU   r   Z_MAXLINEr   r   r   r   rt   …  s    zFThreadedNetworkedTests.test_linetoolong.<locals>.TooLongHandler.handleNr£   r   r   r   r   r  „  s   r  )rI   rH  r4   r   r6   r3   r™   rš   )r   r  rM   r   r   r   r  ƒ  s    
ÿÿz'ThreadedNetworkedTests.test_linetoolongc              	   C   sZ   |   t¡<}| j|jŽ  W d   ƒ n1 s.0    Y  W d   ƒ n1 sL0    Y  d S r.   )rH  rI   r™   rš   )r   rM   r   r   r   r    s    z1ThreadedNetworkedTests.test_simple_with_statementc              	   C   s€   |   t¡b}| j|jŽ *}| dd¡ |  |jd¡ W d   ƒ n1 sH0    Y  |  |j¡ W d   ƒ n1 sr0    Y  d S ©Nr»   r¼   )rH  rI   r™   rš   r¾   r   rO   r  ©r   rM   r  r   r   r   r  ”  s
    ,z*ThreadedNetworkedTests.test_with_statementc              	   C   s”   |   t¡v}| j|jŽ >}| dd¡ |  |jd¡ | ¡  |  |j¡ W d   ƒ n1 s\0    Y  |  |j¡ W d   ƒ n1 s†0    Y  d S r`  )	rH  rI   r™   rš   r¾   r   rO   r  r  ra  r   r   r   r  œ  s    *z1ThreadedNetworkedTests.test_with_statement_logoutN)%r=   r>   r?   r¦   r-  r   r   r6   r™   rE  rG  r   rH  rI  r   rK  rW  rX  r¯   rI   rÞ   r¸   rº   rÂ   rÜ   râ   rí   rð   r]  r
   r*  r^  r
  r  r  r  r  r   r   r   r   rB  F  sZ    	



0







	






rB  c                   @   s    e Zd ZeZeZedd„ ƒZdS )ÚThreadedNetworkedTestsSSLc              	   C   sÔ   t  t j¡}| t¡ |  t jd¡T |  t¡*}| j	|j
d|iŽ}| ¡  W d   ƒ n1 s`0    Y  W d   ƒ n1 s~0    Y  |  t¡.}| j	d|j
d |d}| ¡  W d   ƒ n1 sÆ0    Y  d S )Nr/  r0  r  r   r9  )rB   rC   r1  r4  r5  r¶   r6  rH  rI   r™   rš   rŸ   )r   r0  rM   r›   r   r   r   r:  ­  s     
þ
ÿDÿz+ThreadedNetworkedTestsSSL.test_ssl_verifiedN)	r=   r>   r?   r@   r   rA  r™   r   r:  r   r   r   r   rb  ¨  s   rb  Znetworkznetwork resource disabledz'cyrus.andrew.cmu.edu blocks connectionsc                   @   sB   e Zd ZdZdZdZdZejZ	dd„ Z
dd„ Zd	d
„ Zdd„ ZdS )ÚRemoteIMAPTestzcyrus.andrew.cmu.edur<  Z	anonymousr¼   c                 C   sB   t  | j¡" |  | j| j¡| _W d   ƒ n1 s40    Y  d S r.   )r   Útransient_internetÚhostr™   ÚportrM   r   r   r   r   ÚsetUpË  s    zRemoteIMAPTest.setUpc                 C   sD   | j d ur@t | j¡ | j  ¡  W d   ƒ n1 s60    Y  d S r.   )rM   r   rd  re  r  r   r   r   r   ÚtearDownÏ  s    
zRemoteIMAPTest.tearDownc                 C   sŒ   t  | j¡l | jjD ]}|  |t¡ q|  d| jj¡ |  d| jj¡ | j | j	| j
¡}|  |d d¡ W d   ƒ n1 s~0    Y  d S )NÚLOGINDISABLEDzAUTH=ANONYMOUSr   ru   )r   rd  re  rM   rw   ÚassertIsInstanceÚstrr7   r¾   ÚusernameÚpasswordr   )r   ÚcapÚrsr   r   r   Útest_logincapaÔ  s    zRemoteIMAPTest.test_logincapac                 C   sR   t  | j¡2 | j ¡ }d | _|  |d d|¡ W d   ƒ n1 sD0    Y  d S ©Nr   r"  )r   rd  re  rM   r  r   ©r   ro  r   r   r   r#  Ý  s    
zRemoteIMAPTest.test_logoutN)r=   r>   r?   re  rf  rl  rm  r   r6   r™   rg  rh  rp  r#  r   r   r   r   rc  Á  s   	rc  c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚRemoteIMAP_STARTTLSTestc                    sT   t ƒ  ¡  t | j¡* | j ¡ }|  |d d¡ W d   ƒ n1 sF0    Y  d S )Nr   ru   )rK   rg  r   rd  re  rM   Zstarttlsr   rr  rP   r   r   rg  ê  s    

zRemoteIMAP_STARTTLSTest.setUpc                 C   s.   | j jD ]}|  |t¡ q|  d| j j¡ d S )Nri  )rM   rw   rj  rk  ÚassertNotIn)r   rn  r   r   r   rp  ð  s    z&RemoteIMAP_STARTTLSTest.test_logincapa)r=   r>   r?   rg  rp  r‚   r   r   rP   r   rs  ä  s   rs  c                   @   sT   e Zd ZdZe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 )ÚRemoteIMAP_SSLTestiá  c                 C   s   d S r.   r   r   r   r   r   rg  ü  s    zRemoteIMAP_SSLTest.setUpc                 C   s   d S r.   r   r   r   r   r   rh  ÿ  s    zRemoteIMAP_SSLTest.tearDownc                 C   s(   t  t j¡}d|_t j|_| t¡ |S rJ   )rB   rC   r1  r3  Z	CERT_NONEr2  rD   rE   )r   r0  r   r   r   Úcreate_ssl_context  s
    
z%RemoteIMAP_SSLTest.create_ssl_contextc                 C   sp   z`|j D ]}|  |t¡ q|  d|j ¡ |  d|j ¡ | | j| j¡}|  |d d¡ W | 	¡  n
| 	¡  0 d S )Nri  z
AUTH=PLAINr   ru   )
rw   rj  rk  rt  r7   r¾   rl  rm  r   r  )r   rM   rn  ro  r   r   r   Úcheck_logincapa	  s    
z"RemoteIMAP_SSLTest.check_logincapac                 C   sJ   t  | j¡* |  | j| j¡}|  |¡ W d   ƒ n1 s<0    Y  d S r.   )r   rd  re  r™   rf  rw  )r   Ú_serverr   r   r   rp    s    z!RemoteIMAP_SSLTest.test_logincapac                 C   sZ   t  | j¡: |  | j| j¡}| ¡ }|  |d d|¡ W d   ƒ n1 sL0    Y  d S rq  )r   rd  re  r™   rf  r  r   )r   rx  ro  r   r   r   r#    s    zRemoteIMAP_SSLTest.test_logoutc              	   C   sP   t  | j¡0 | jt| j| j| jt|  ¡ d W d   ƒ n1 sB0    Y  d S )N)r=  r0  ©	r   rd  re  r4   r  r™   rf  rE   rv  r   r   r   r   Ú#test_ssl_context_certfile_exclusive  s
    þz6RemoteIMAP_SSLTest.test_ssl_context_certfile_exclusivec              	   C   sP   t  | j¡0 | jt| j| j| jt|  ¡ d W d   ƒ n1 sB0    Y  d S )N)Zkeyfiler0  ry  r   r   r   r   Ú"test_ssl_context_keyfile_exclusive%  s
    þz5RemoteIMAP_SSLTest.test_ssl_context_keyfile_exclusiveN)r=   r>   r?   rf  rA  r™   rg  rh  rv  rw  rp  r#  rz  r{  r   r   r   r   ru  ö  s   ru  Ú__main__)6rT  r   Ztest.supportr   Ú
contextlibr   r   Zos.pathÚosr¦   r   r   r“   r1   r   r   r   r   r	   r
   Zunittestr   r   r   r   rB   ÚImportErrorÚpathr_   ÚdirnameÚ__file__ÚcurdirrE   r5  ZTestCaser   r-  r@   rA  r§   rI   rƒ   r,  Z
skipUnlessr.  rB  rb  Zis_resource_enabledÚskiprc  rs  ru  r=   Úmainr   r   r   r   Ú<module>   sl   
@	_  O
$  d

ÿ 

ÿ
4
