o
    g                     @   s  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 d dlmZ d dl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yq   dZY nw ejejep}ej dZ!ejejepej dZ"G dd dej#Z$erG 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0dd e1d!G d"d# d#ej#Z2e,ede,e0dd e1d!G d$d% d%e2Z3e,ede1d!G d&d' d'e2Z4e5d(krAe6  dS dS ))    )support)socket_helper)contextmanagerN)verboserun_with_tzrun_with_localecpython_only)hashlib_helper)threading_helper)warnings_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t0Ztt r   G/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/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    eA)	        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   
timevalues3   s   zTestImaplib.timevaluesLC_ALLZde_DEZ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_Time2Internaldate;   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_resultF   s   z8TestImaplib.test_that_Time2Internaldate_returns_a_resultc              	   C   s   t   "}z|dtjf | d W n
 t jy   Y nw W d    n1 s)w   Y  t }| t	}t
  W d    n1 sFw   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_valueM   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                   @      e Zd Zdd ZdS )SecureTCPServerc                 C   s:   | j  \}}ttj}|t |j|dd}||fS )NT)Zserver_side)r/   acceptssl
SSLContextZPROTOCOL_TLS_SERVERload_cert_chainCERTFILEZwrap_socket)r   Z	newsocketZfromaddrcontextZ
connstreamr   r   r   get_requesta   s
   
zSecureTCPServer.get_requestN)r;   r<   r=   rF   r   r   r   r   r?   _       r?   c                   @      e Zd ZdS )r?   Nr;   r<   r=   r   r   r   r   r?   l       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 )SimpleIMAPHandlerNr.   c                    s   t    d| j_d | j_d S NF)supersetupserveris_selectedloggedr   	__class__r   r   rN   w   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   _send|   s   zSimpleIMAPHandler._sendc                 C   s   |  |d  d S )N   
)rZ   rX   r   r   r   
_send_line      zSimpleIMAPHandler._send_linec                 C   s   |  |d d S )NASCII)r\   encoderX   r   r   r   _send_textline   s   z SimpleIMAPHandler._send_textlinec                 C   s   |  d|||f d S )N )r`   join)r   tagcoderY   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y&   Y d S w |dr-q.q	tr8td|   | jrQz| j	| W n t
yO   d | _Y nw q|d }|d }|d }|dd  }t| d	| rt| d	| ||}|r|| _t| n	| |d
|d  q)Nz* OK IMAP4rev1r       r[   zGOT: %rr^   r      Zcmd_BADz unknown)r`   Zrfilereadr3   endswithr   rT   rU   continuationsendStopIterationdecodesplithasattrgetattrnextre   )r   linepartZ	splitlinerc   cmdargsrk   r   r   r   handle   sH   


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`   re   )r   rc   rv   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 outrx   zLOGOUT completed)rO   rQ   r`   re   r   rc   rv   r   r   r   
cmd_LOGOUT      
zSimpleIMAPHandler.cmd_LOGOUTc                 C   s   |d | j _| |dd d S )Nr   rx   zLOGIN completed)rO   rQ   re   r|   r   r   r   	cmd_LOGIN   s   zSimpleIMAPHandler.cmd_LOGINc                 C   s$   d| j _| d | |dd d S )NT
   * 2 EXISTSrx   [READ-WRITE] SELECT completed.)rO   rP   r\   re   r|   r   r   r   
cmd_SELECT   r~   zSimpleIMAPHandler.cmd_SELECTc                 C   s4   | j jrd| j _| |dd d S | |dd d S )NFrx   z*Returned to authenticated state. (Success)rh   zNo mailbox selected)rO   rP   re   r|   r   r   r   cmd_UNSELECT   s   zSimpleIMAPHandler.cmd_UNSELECT)r;   r<   r=   r   LOOPBACK_TIMEOUTtimeoutrk   rz   rN   rZ   r\   r`   re   rw   r{   r}   r   r   r   __classcell__r   r   rR   r   rK   r   s    *rK   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ddd Zedd d! Zd"d# Zed$d%d&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Z d8d9 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
  |r<| 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                   @   r>   )z/NewIMAPTestsMixin._setup.<locals>.TestTCPServerc                 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       r   r   z-serverpoll_interval{Gz?nametargetkwargsTN)server_classZ
addCleanup_cleanupr   HOSTrO   	threadingThreadZ_testMethodNameserve_foreverthreaddaemonstart
imap_classserver_addressclient)r   Zimap_handlerr0   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shutdownrO   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                   @   r>   )zONewIMAPTestsMixin.test_EOF_without_complete_welcome_message.<locals>.EOFHandlerc                 S      | j d d S Ns   * OKrV   rW   r   r   r   r   rw     s   zVNewIMAPTestsMixin.test_EOF_without_complete_welcome_message.<locals>.EOFHandler.handleNr;   r<   r=   rw   r   r   r   r   
EOFHandler  r   r   Fr0   )	socketserverStreamRequestHandlerr   r2   r   r4   abortr   r   )r   r   _rO   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                   @   r>   )zBNewIMAPTestsMixin.test_line_termination.<locals>.BadNewlineHandlerc                 S      |  d | |dd d S Ns   * CAPABILITY IMAP4rev1 AUTH
rx   ry   rZ   re   r|   r   r   r   r{        
zQNewIMAPTestsMixin.test_line_termination.<locals>.BadNewlineHandler.cmd_CAPABILITYNr;   r<   r=   r{   r   r   r   r   BadNewlineHandler  r   r   Fr   )rK   r   r2   r   r4   r   r   r   )r   r   r   rO   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 s-w   Y  | |j d S )Nc                   @      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=   rz   r   r   r   r   EnableHandler      r   zENABLE.*NONAUTHfoo)	rK   r   assertFalseutf8_enabledassertRaisesRegexr   r4   r1   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   sN   |  t\}}| tjjd |d W d    d S 1 s w   Y  d S )Ndoes not support ENABLEr   )r   rK   r   r   r4   r1   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   sj   |  t\}}|dd\}}| |d | tjjd |d W d    d S 1 s.w   Y  d S )Nuserpassrx   r   UTF8=ACCEPT)	r   rK   loginr   r   r   r4   r1   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      |  |dd d S Nrx   zENABLE successfulre   r|   r   r   r   
cmd_ENABLE1  r]   zSNewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.UTF8AppendServer.cmd_ENABLEc                 s   (    |  d d V | j_| |dd d S N+rx   zFAKEAUTH successfulr`   rO   responsere   r|   r   r   r   cmd_AUTHENTICATE3     

zYNewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.UTF8AppendServer.cmd_AUTHENTICATEc                 s   r   Nr   rx   Zokayr   r|   r   r   r   
cmd_APPEND7  r   zSNewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.UTF8AppendServer.cmd_APPENDN)r;   r<   r=   rz   r   r   r   r   r   r   r   UTF8AppendServer/  s
    r   asciiMYAUTHc                 S      dS Ns   faker   xr   r   r   <lambda>=      z@NewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.<lambda>rx   
   ZmFrZQ==
r   utf-8   Subject: üñí©öðéUTF8 (%s)
)	rK   r   r   	_encodingauthenticater   r   appendr_   )	r   r   r   rO   rd   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    d S 1 sLw   Y  d S )Nc                   @       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   r   r   r   r|   r   r   r   r   L  r]   z[NewIMAPTestsMixin.test_search_disallows_charset_in_utf8_mode.<locals>.UTF8Server.cmd_ENABLEc                 s   r   r   r   r|   r   r   r   r   N  r   zaNewIMAPTestsMixin.test_search_disallows_charset_in_utf8_mode.<locals>.UTF8Server.cmd_AUTHENTICATENr;   r<   r=   rz   r   r   r   r   r   r   
UTF8ServerJ  s    r   r   c                 S   r   r   r   r   r   r   r   r   S  r   zNNewIMAPTestsMixin.test_search_disallows_charset_in_utf8_mode.<locals>.<lambda>rx   r   zcharset.*UTF8r   bar)rK   r   r   r   r   
assertTruer   r   r   r4   r1   search)r   r   r   r   r   r   r   r   *test_search_disallows_charset_in_utf8_modeI  s   "z<NewIMAPTestsMixin.test_search_disallows_charset_in_utf8_modec                 C   d   G dd dt }| |\}}| tjjd |ddd  W d    d S 1 s+w   Y  d S )Nc                   @   r>   )z6NewIMAPTestsMixin.test_bad_auth_name.<locals>.MyServerc                 S      |  |dd|d  d S NNOz#unrecognized authentication type {}r   re   formatr|   r   r   r   r   ]  s   zGNewIMAPTestsMixin.test_bad_auth_name.<locals>.MyServer.cmd_AUTHENTICATENr;   r<   r=   r   r   r   r   r   MyServer\  r   r   z'unrecognized authentication type METHODMETHODc                   S   r   Nr   r   r   r   r   r   r   c  r   z6NewIMAPTestsMixin.test_bad_auth_name.<locals>.<lambda>rK   r   r   r   r4   r1   r   r   r   r   r   r   r   r   test_bad_auth_name[  s   
"z$NewIMAPTestsMixin.test_bad_auth_namec                 C   r   )Nc                   @   r>   )z?NewIMAPTestsMixin.test_invalid_authentication.<locals>.MyServerc                 s   &    |  d d V | _| |dd d S Nr   r   z[AUTHENTICATIONFAILED] invalidr`   r   re   r|   r   r   r   r   g     
zPNewIMAPTestsMixin.test_invalid_authentication.<locals>.MyServer.cmd_AUTHENTICATENr   r   r   r   r   r   f  r   r   z \[AUTHENTICATIONFAILED\] invalidr   c                 S   r   r   r   r   r   r   r   r   n  r   z?NewIMAPTestsMixin.test_invalid_authentication.<locals>.<lambda>r   r   r   r   r   test_invalid_authenticatione  s   
"z-NewIMAPTestsMixin.test_invalid_authenticationc                 C   P   G dd dt }| |\}}|ddd \}}| |d | |jd d S )Nc                   @   r>   )zCNewIMAPTestsMixin.test_valid_authentication_bytes.<locals>.MyServerc                 s   r   r   r   r|   r   r   r   r   r  r   zTNewIMAPTestsMixin.test_valid_authentication_bytes.<locals>.MyServer.cmd_AUTHENTICATENr   r   r   r   r   r   q  r   r   r   c                 S   r   r   r   r   r   r   r   r   w  r   zCNewIMAPTestsMixin.test_valid_authentication_bytes.<locals>.<lambda>rx   r   rK   r   r   r   r   r   r   r   rO   rd   r   r   r   r   test_valid_authentication_bytesp  
   z1NewIMAPTestsMixin.test_valid_authentication_bytesc                 C   r  )Nc                   @   r>   )zHNewIMAPTestsMixin.test_valid_authentication_plain_text.<locals>.MyServerc                 s   r   r   r   r|   r   r   r   r   }  r   zYNewIMAPTestsMixin.test_valid_authentication_plain_text.<locals>.MyServer.cmd_AUTHENTICATENr   r   r   r   r   r   |  r   r   r   c                 S   r   NZfaker   r   r   r   r   r     r   zHNewIMAPTestsMixin.test_valid_authentication_plain_text.<locals>.<lambda>rx   r   r  r  r   r   r   $test_valid_authentication_plain_text{  r
  z6NewIMAPTestsMixin.test_valid_authentication_plain_textmd5c                 C   N   G dd dt }| |\}}| d|jv  |dd\}}| |d d S )Nc                   @      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   >    |  d d V }|dkr| |dd d S | |dd d S Nz:+ PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ=s2   dGltIGYxY2E2YmU0NjRiOWVmYTFjY2E2ZmZkNmNmMmQ5ZjMy
rx   zCRAM-MD5 successfulr   z	No accessr`   re   r   rc   rv   rr   r   r   r        
zQNewIMAPTestsMixin.test_login_cram_md5_bytes.<locals>.AuthHandler.cmd_AUTHENTICATENr;   r<   r=   rz   r   r   r   r   r   AuthHandler      r  AUTH=CRAM-MD5tim   tanstaaftanstaafrx   rK   r   r   rz   login_cram_md5r   r   r  r   r   retr   r   r   test_login_cram_md5_bytes  
   z+NewIMAPTestsMixin.test_login_cram_md5_bytesc                 C   r  )Nc                   @   r  )zENewIMAPTestsMixin.test_login_cram_md5_plain_text.<locals>.AuthHandlerr  c                 s   r  r  r  r  r   r   r   r     r  zVNewIMAPTestsMixin.test_login_cram_md5_plain_text.<locals>.AuthHandler.cmd_AUTHENTICATENr  r   r   r   r   r    r  r  r  r  tanstaaftanstaafrx   r  r  r   r   r   test_login_cram_md5_plain_text  r"  z0NewIMAPTestsMixin.test_login_cram_md5_plain_textc                 C   r   )Nc                   @   r>   )z?NewIMAPTestsMixin.test_aborted_authentication.<locals>.MyServerc                 s   B    |  d d V | _| jdkr| |dd d S | |dd d S Nr   s   *
r   z[AUTHENTICATIONFAILED] abortedrx   zMYAUTH successfulr  r|   r   r   r   r     s   

zPNewIMAPTestsMixin.test_aborted_authentication.<locals>.MyServer.cmd_AUTHENTICATENr   r   r   r   r   r     r   r   z \[AUTHENTICATIONFAILED\] abortedr   c                 S      d S r,   r   r   r   r   r   r     r   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   sd   G dd dt }| j|dd\}}| tjjd | j|j  W d    d S 1 s+w   Y  d S )Nc                   @   r>   )z:NewIMAPTestsMixin.test_linetoolong.<locals>.TooLongHandlerc                 S   r   )Ns   * OK xxxxxxxxxxx
r   r   r   r   r   rw        zANewIMAPTestsMixin.test_linetoolong.<locals>.TooLongHandler.handleNr   r   r   r   r   TooLongHandler  r   r+  Fr   zgot more than 10 bytes)rK   r   r   r   r4   r1   r   r   )r   r+  r   rO   r   r   r   test_linetoolong  s   
"z"NewIMAPTestsMixin.test_linetoolongc                 C   sD   | j tdd\}}| j|j 	 W d    d S 1 sw   Y  d S )NFr   )r   rK   r   r   )r   r   rO   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    d S 1 sOw   Y  d S )Nr   	localhostr   r   )r   rK   r   r   r   sockr   r   r   r   r2   
ValueError)r   r   rO   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d|dd}W d    d S 1 s-w   Y  d S )Nc                   @   r>   )zQNewIMAPTestsMixin.test_imaplib_timeout_functionality_test.<locals>.TimeoutHandlerc                 S   s   t d t|  d S r   )r   sleeprK   rw   r   r   r   r   rw        
zXNewIMAPTestsMixin.test_imaplib_timeout_functionality_test.<locals>.TimeoutHandler.handleNr   r   r   r   r   TimeoutHandler  r   r6  r   r.  gMbP?r/  )rK   r   r   r2   TimeoutErrorr   )r   r6  r   rO   r2  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 s'w   Y  | |j d S NFr   r   r   )r   rK   r   r   r   r   rQ   assertIsNoner   r   rO   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 s1w   Y  | |j d S r9  )	r   rK   r   r   r   r   rQ   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   rx   r      LOGIN completedAUTH)r   rK   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   rx   r   r@  BYEs   IMAP4ref1 Server logging outr   )r   rK   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                   @   r>   )z,NewIMAPTestsMixin.test_lsub.<locals>.LsubCmdc                 S   s   |  d | |ddS )Nz* LSUB () "." directoryArx   zLSUB completedr  r|   r   r   r   cmd_LSUB  r5  z5NewIMAPTestsMixin.test_lsub.<locals>.LsubCmd.cmd_LSUBN)r;   r<   r=   rE  r   r   r   r   LsubCmd  r   rF  r   r   rx   r   s   () "." directoryA)rK   r   r   Zlsubr   )r   rF  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   rx   r      2s*   Returned to authenticated state. (Success)rA  )r   rK   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-  r3  r8  r=  r?  rB  rD  rG  rJ  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   r4   r   r   	TCPServerr   r   r   r   r   rM    s    
rM  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 | t\}}| j|jd|i}|  W d    d S 1 sAw   Y  d S )NT=IP address mismatch, certificate is not valid for '127.0.0.1'ssl_context)rA   rB   PROTOCOL_TLS_CLIENTr   verify_modeZCERT_REQUIREDcheck_hostnameload_verify_locationsCAFILEr   CertificateErrorr   rK   r   r   r   r   rQ  r   rO   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   rQ  )
rA   rB   rR  rU  rV  r   rK   r   r   r   rX  r   r   r   test_ssl_verified6  s   
z!NewIMAPSSLTests.test_ssl_verifiedc              
   C   s   t dtfI tj| jd( tj| jd | jddtd W d    n1 s,w   Y  W d    n1 s;w   Y  W d    d S W d    d S 1 sSw   Y  d S )Nr.   openZ_connectr.     )certfile)r   Zcheck_warningsDeprecationWarningr   rL  objectr   rD   r   r   r   r   test_certfile_arg_warnA  s   "z&NewIMAPSSLTests.test_certfile_arg_warnN)r;   r<   r=   	IMAP4_SSLr   r?   r   rY  r[  r   ra  r   r   r   r   rO  #  s    rO  c                   @   sb  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jd	d
 Zejdd Zejdd Zejdd ZG dd deZejdd Zejdd Zejdd Zejdd Zejdd Zejdd Zejdd  Zejd!d" Zejed#d$d% Z ejd&d' Z!d(d) Z"ejd*d+ Z#ejd,d- Z$ejd.d/ Z%eje&d0d1 Z'd2S )3ThreadedNetworkedTestsc                 C   s   G dd d| j }trtd |||}| |j|j  tr5td td| td| j  td|j tj	d| j  |j
d	d
id}d|_|  trPtd ||fS )Nc                   @   r>   )z4ThreadedNetworkedTests.make_server.<locals>.MyServerc                 S   r   r,   r   r   r   r   r   r   O  s   
zAThreadedNetworkedTests.make_server.<locals>.MyServer.handle_errorNr   r   r   r   r   r   N  r   r   zcreating serverzserver createdzADDR =zCLASS =zHDLR =z
%s servingr   r   r   Tzserver running)r   r   rT   r   r   r/   getsocknameZRequestHandlerClassr   r   r   r   r   )r   r2  hdlrr   rO   r*   r   r   r   make_serverL  s(   

z"ThreadedNetworkedTests.make_serverc                 C   s8   t rtd |  |  |  t rtd d S d S )Nzwaiting for serverdone)r   rT   r   r   rb   )r   rO   r   r   r   r   reap_serverl  s   z"ThreadedNetworkedTests.reap_serverc              
   c   s@    |  tjdf|\}}z|V  W | || d S | || w )Nr   )rf  r   r   rh  )r   re  rO   r   r   r   r   reaped_serveru  s
   z$ThreadedNetworkedTests.reaped_serverc              	   c   s`    |  | }| j|j }z||fV  W |  n|  w W d    d S 1 s)w   Y  d S r,   )ri  r   r   r>  )r   re  rO   r   r   r   r   reaped_pair}  s   "z"ThreadedNetworkedTests.reaped_pairc                 C   sD   |  t}| j|j }|  W d    d S 1 sw   Y  d S r,   )ri  rK   r   r   r   r   rO   r   r   r   r   test_connect  s   
"z#ThreadedNetworkedTests.test_connectc                 C   s   G dd dt }| |J\}}|ddd \}}| |d | |jd |d |d	d
d\}\}| d| |d |d\}\}| d| W d    d S 1 sZw   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)flagsrM   rw   r   rR   r   r   rw     r5  zLThreadedNetworkedTests.test_bracket_flags.<locals>.BracketFlagHandler.handlec                 s   r   r   r   r|   r   r   r   r     r   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.rx   r   )rb   rm  r\   r_   re   )r   rc   rv   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 )Nrg   ()z(FLAGS (%s))rn  z* %s FETCH %sr   r   rx   zSTORE completed.)rU   ro   rm  extendrb   r\   r_   re   )r   rc   rv   Z	new_flagsZ	flags_msgro  r   r   r   	cmd_STORE  s   zOThreadedNetworkedTests.test_bracket_flags.<locals>.BracketFlagHandler.cmd_STORE)r;   r<   r=   rw   r   r   rs  r   r   r   rR   r   BracketFlagHandler  s
    
rt  r   c                 S   r   r   r   r   r   r   r   r     r   z;ThreadedNetworkedTests.test_bracket_flags.<locals>.<lambda>rx   r   test   1z+FLAGSz[test]s   [test]ZPERMANENTFLAGS)rK   rj  r   r   r   rI  Zstorer5   )r   rt  rO   r   rd   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    d S 1 s(w   Y  d S )Nc                   @   r>   )z9ThreadedNetworkedTests.test_issue5949.<locals>.EOFHandlerc                 S   r   r   r   r   r   r   r   rw     r*  z@ThreadedNetworkedTests.test_issue5949.<locals>.EOFHandler.handleNr   r   r   r   r   r     r   r   )	r   r   ri  r2   r   r4   r   r   r   )r   r   rO   r   r   r   test_issue5949  s   

"z%ThreadedNetworkedTests.test_issue5949c                 C   \   G dd dt }| |}| jtjj| jg|jR   W d    d S 1 s'w   Y  d S )Nc                   @   r>   )zGThreadedNetworkedTests.test_line_termination.<locals>.BadNewlineHandlerc                 S   r   r   r   r|   r   r   r   r{     r   zVThreadedNetworkedTests.test_line_termination.<locals>.BadNewlineHandler.cmd_CAPABILITYNr   r   r   r   r   r     rG   r   )rK   ri  r2   r   r4   r   r   r   )r   r   rO   r   r   r   r     s   

"z,ThreadedNetworkedTests.test_line_terminationc                   @   r   )z!ThreadedNetworkedTests.UTF8Serverr   c                 C   r   r   r   r|   r   r   r   r     r]   z,ThreadedNetworkedTests.UTF8Server.cmd_ENABLEc                 c   r   r   r   r|   r   r   r   r     r   z2ThreadedNetworkedTests.UTF8Server.cmd_AUTHENTICATENr   r   r   r   r   r     s    r   c                 C   sb   |  | j!\}}| |j | tjj|jd | |j W d    d S 1 s*w   Y  d S )Nr   )	rj  r   r   r   r2   r   r4   r1   r   rk  r   r   r   r     s
   "z;ThreadedNetworkedTests.test_enable_raises_error_if_not_AUTHc                 C   sZ   G dd d| j }| |\}}| tjj|jd W d    d S 1 s&w   Y  d S )Nc                   @   r   )zXThreadedNetworkedTests.test_enable_raises_error_if_no_capability.<locals>.NoEnableServerrA  Nr   r   r   r   r   NoEnableServer  r   rz  r   )r   rj  r2   r   r4   r1   r   )r   rz  rO   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 W d    n1 s5w   Y  W d    d S W d    d S 1 sMw   Y  d S )Nc                   @   rH   )z\ThreadedNetworkedTests.test_enable_UTF8_raises_error_if_not_supported.<locals>.NonUTF8ServerNrI   r   r   r   r   NonUTF8Server  rJ   r{  r   r   rx   r   )	rK   r2   r   r4   r1   rj  r   r   r   )r   r{  rO   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    d S 1 sow   Y  d S )Nc                   @   r>   )zMThreadedNetworkedTests.test_enable_UTF8_True_append.<locals>.UTF8AppendServerc                 s   r   r   r   r|   r   r   r   r      r   zXThreadedNetworkedTests.test_enable_UTF8_True_append.<locals>.UTF8AppendServer.cmd_APPENDN)r;   r<   r=   r   r   r   r   r   r     r   r   r   r   c                 S   r   r   r   r   r   r   r   r     r   zEThreadedNetworkedTests.test_enable_UTF8_True_append.<locals>.<lambda>rx   r   r   r   r   r   )	r   rj  r   r   r   r   r   r   r_   )	r   r   rO   r   rd   r   r   r   r   r   r   r   r     s*   "z3ThreadedNetworkedTests.test_enable_UTF8_True_appendc                 C   s   |  | j9\}}|ddd \}}| |d |d\}}| |d | |j | tj	j
|jdd W d    d S 1 sBw   Y  d S )Nr   c                 S   r   r   r   r   r   r   r   r     r   zSThreadedNetworkedTests.test_search_disallows_charset_in_utf8_mode.<locals>.<lambda>rx   r   r   r   )rj  r   r   r   r   r   r   r2   r   r4   r1   r   )r   rO   r   r   r   r   r   r   r     s   "zAThreadedNetworkedTests.test_search_disallows_charset_in_utf8_modec              	   C   s   G dd dt }| |2\}}| tjj |ddd  W d    n1 s*w   Y  W d    d S W d    d S 1 sBw   Y  d S )Nc                   @   r>   )z;ThreadedNetworkedTests.test_bad_auth_name.<locals>.MyServerc                 S   r   r   r   r|   r   r   r   r   )  s   

zLThreadedNetworkedTests.test_bad_auth_name.<locals>.MyServer.cmd_AUTHENTICATENr   r   r   r   r   r   '  rG   r   r   c                   S   r   r   r   r   r   r   r   r   /  r   z;ThreadedNetworkedTests.test_bad_auth_name.<locals>.<lambda>rK   rj  r2   r   r4   r1   r   )r   r   rO   r   r   r   r   r   $  s   "z)ThreadedNetworkedTests.test_bad_auth_namec              	   C      G dd dt }| |4\}}| tjj |ddd \}}W d    n1 s,w   Y  W d    d S W d    d S 1 sDw   Y  d S )Nc                   @   r>   )zDThreadedNetworkedTests.test_invalid_authentication.<locals>.MyServerc                 s   r  r  r  r|   r   r   r   r   6  r  zUThreadedNetworkedTests.test_invalid_authentication.<locals>.MyServer.cmd_AUTHENTICATENr   r   r   r   r   r   4  rG   r   r   c                 S   r   r   r   r   r   r   r   r   =  r   zDThreadedNetworkedTests.test_invalid_authentication.<locals>.<lambda>r|  r   r   rO   r   rd   r   r   r   r   r  1  s   "z2ThreadedNetworkedTests.test_invalid_authenticationc                 C   s   G dd dt }| |!\}}|ddd \}}| |d | |jd W d    n1 s1w   Y  | |"\}}|ddd \}}| |d | |jd W d    d S 1 s`w   Y  d S )	Nc                   @   r>   )zBThreadedNetworkedTests.test_valid_authentication.<locals>.MyServerc                 s   r   r   r   r|   r   r   r   r   D  r   zSThreadedNetworkedTests.test_valid_authentication.<locals>.MyServer.cmd_AUTHENTICATENr   r   r   r   r   r   B  rG   r   r   c                 S   r   r   r   r   r   r   r   r   J  r   zBThreadedNetworkedTests.test_valid_authentication.<locals>.<lambda>rx   r   c                 S   r   r  r   r   r   r   r   r   P  r   )rK   rj  r   r   r   r~  r   r   r   test_valid_authentication?  s   "z0ThreadedNetworkedTests.test_valid_authenticationr  c                 C   s   G dd dt }| | \}}| d|jv  |dd\}}| |d W d    n1 s0w   Y  | |!\}}| d|jv  |dd\}}| |d W d    d S 1 s^w   Y  d S )Nc                   @   r  )z?ThreadedNetworkedTests.test_login_cram_md5.<locals>.AuthHandlerr  c                 s   r  r  r  r  r   r   r   r   ]  r  zPThreadedNetworkedTests.test_login_cram_md5.<locals>.AuthHandler.cmd_AUTHENTICATENr  r   r   r   r   r  Y  s    r  r  r  r#  rx   r  )rK   rj  r   rz   r  r   )r   r  rO   r   r   r   r   r   r   test_login_cram_md5U  s   "z*ThreadedNetworkedTests.test_login_cram_md5c              	   C   r}  )Nc                   @   r>   )zDThreadedNetworkedTests.test_aborted_authentication.<locals>.MyServerc                 s   r%  r&  r  r|   r   r   r   r   w  s   

zUThreadedNetworkedTests.test_aborted_authentication.<locals>.MyServer.cmd_AUTHENTICATENr   r   r   r   r   r   u  rG   r   r   c                 S   r'  r,   r   r   r   r   r   r     r   zDThreadedNetworkedTests.test_aborted_authentication.<locals>.<lambda>r|  r~  r   r   r   r(  r  s   "z2ThreadedNetworkedTests.test_aborted_authenticationc                 C   ry  )Nc                   @   r>   )z?ThreadedNetworkedTests.test_linetoolong.<locals>.TooLongHandlerc                 S   s   | j dtjd  d  d S )Ns   * OK    xr[   )rV   rW   r   Z_MAXLINEr   r   r   r   rw     s   zFThreadedNetworkedTests.test_linetoolong.<locals>.TooLongHandler.handleNr   r   r   r   r   r+    r   r+  )rK   ri  r2   r   r4   r1   r   r   )r   r+  rO   r   r   r   r,    s   

"z'ThreadedNetworkedTests.test_linetoolongc              	   C   sl   |  t'}| j|j  W d    n1 sw   Y  W d    d S W d    d S 1 s/w   Y  d S r,   )ri  rK   r   r   )r   rO   r   r   r   r-    s   "z1ThreadedNetworkedTests.test_simple_with_statementc              	   C   s   |  t2}| j|j }|dd | |jd W d    n1 s$w   Y  | |j W d    d S 1 s:w   Y  d S Nr   r   )ri  rK   r   r   r   r   rQ   r:  r   rO   r<  r   r   r   r=    s   "z*ThreadedNetworkedTests.test_with_statementc              	   C   s   |  t<}| j|j }|dd | |jd |  | |j W d    n1 s.w   Y  | |j W d    d S 1 sDw   Y  d S r  )	ri  rK   r   r   r   r   rQ   r>  r:  r  r   r   r   r?    s   "z1ThreadedNetworkedTests.test_with_statement_logoutc              
   C   s   ddgi}|  tH}| j|j )}tj|d}|| |d W d    n1 s.w   Y  W d    n1 s=w   Y  W d    d S W d    d S 1 sUw   Y  d S )Nz
READ-WRITErf   Z_mesgz)untagged responses dump:READ-WRITE: [b''])	ri  rK   r   r   r   rL  r`  Z_dump_urZassert_called_with)r   Zuntagged_resp_dictrO   r<  Z	mock_mesgr   r   r   test_dump_ur  s   

"z#ThreadedNetworkedTests.test_dump_urN)(r;   r<   r=   r   rN  r   r   r4   r   rf  rh  r   ri  rj  r
   reap_threadsrl  rw  rx  r   rK   r   r   r   r   r   r   r   r  r  r	   rK  r  r(  r,  r-  r=  r?  r   r  r   r   r   r   rc  H  sb     	



0







	








rc  c                   @   s"   e Zd ZeZeZejdd Z	dS )ThreadedNetworkedTestsSSLc              	   C   s   t t j}|t | t jd* | t}| j	|j
d|i}|  W d    n1 s0w   Y  W d    n1 s?w   Y  | t}| j	d|j
d |d}|  W d    d S 1 sdw   Y  d S )NrP  rQ  r.  r   rZ  )rA   rB   rR  rU  rV  r   rW  ri  rK   r   r   r   )r   rQ  rO   r   r   r   r   r[    s(   


	
"z+ThreadedNetworkedTestsSSL.test_ssl_verifiedN)
r;   r<   r=   r?   r   rb  r   r
   r  r[  r   r   r   r   r    s
    r  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   sD   t | j | | j| j| _W d    d S 1 sw   Y  d S r,   )r   transient_internethostr   portrO   r   r   r   r   setUp  s   "zRemoteIMAPTest.setUpc                 C   sJ   | j d ur#t| j | j   W d    d S 1 sw   Y  d S d S r,   )rO   r   r  r  r>  r   r   r   r   tearDown  s
   
"zRemoteIMAPTest.tearDownc                 C   s   t | j7 | jjD ]}| |t q| d| jj | d| jj | j| j	| j
}| |d d W d    d S 1 s@w   Y  d S )NLOGINDISABLEDzAUTH=ANONYMOUSr   rx   )r   r  r  rO   rz   assertIsInstancestrr5   r   usernamepasswordr   )r   caprsr   r   r   test_logincapa  s   "zRemoteIMAPTest.test_logincapac                 C   sT   t | j | j }d | _| |d d| W d    d S 1 s#w   Y  d S Nr   rC  )r   r  r  rO   r>  r   r   r  r   r   r   rD    s
   
"zRemoteIMAPTest.test_logoutN)r;   r<   r=   r  r  r  r  r   r4   r   r  r  r  rD  r   r   r   r   r    s    	r  c                       s$   e Zd Z fddZdd Z  ZS )RemoteIMAP_STARTTLSTestc                    sV   t    t| j | j }| |d d W d    d S 1 s$w   Y  d S )Nr   rx   )rM   r  r   r  r  rO   Zstarttlsr   r  rR   r   r   r    s
   

"zRemoteIMAP_STARTTLSTest.setUpc                 C   s.   | j jD ]}| |t q| d| j j d S )Nr  )rO   rz   r  r  assertNotIn)r   r  r   r   r   r     s   z&RemoteIMAP_STARTTLSTest.test_logincapa)r;   r<   r=   r  r  r   r   r   rR   r   r    s    r  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   r'  r,   r   r   r   r   r   r       zRemoteIMAP_SSLTest.setUpc                 C   r'  r,   r   r   r   r   r   r    r  zRemoteIMAP_SSLTest.tearDownc                 C   s(   t t j}d|_t j|_|t |S rL   )rA   rB   rR  rT  Z	CERT_NONErS  rC   rD   )r   rQ  r   r   r   create_ssl_context  s
   
z%RemoteIMAP_SSLTest.create_ssl_contextc                 C   sn   z1|j D ]}| |t q| d|j  | d|j  || j| j}| |d d W |	  d S |	  w )Nr  z
AUTH=PLAINr   rx   )
rz   r  r  r  r5   r   r  r  r   r>  )r   rO   r  r  r   r   r   check_logincapa  s   
z"RemoteIMAP_SSLTest.check_logincapac                 C   sL   t | j | | j| j}| | W d    d S 1 sw   Y  d S r,   )r   r  r  r   r  r  )r   _serverr   r   r   r  $  s   "z!RemoteIMAP_SSLTest.test_logincapac                 C   s\   t | j | | j| j}| }| |d d| W d    d S 1 s'w   Y  d S r  )r   r  r  r   r  r>  r   )r   r  r  r   r   r   rD  )  s
   "zRemoteIMAP_SSLTest.test_logoutc              	   C   R   t | j | jt| j| j| jt|  d W d    d S 1 s"w   Y  d S )N)r^  rQ  	r   r  r  r2   r1  r   r  rD   r  r   r   r   r   #test_ssl_context_certfile_exclusive/     "z6RemoteIMAP_SSLTest.test_ssl_context_certfile_exclusivec              	   C   r  )N)ZkeyfilerQ  r  r   r   r   r   "test_ssl_context_keyfile_exclusive5  r  z5RemoteIMAP_SSLTest.test_ssl_context_keyfile_exclusiveN)r;   r<   r=   r  rb  r   r  r  r  r  r  rD  r  r  r   r   r   r   r    s    r  __main__)7ru  r   Ztest.supportr   
contextlibr   r   Zos.pathosr   r   r   r   r/   r   r   r   r   r	   r
   r   Zunittestr   r   r   r   rA   ImportErrorpathrb   dirname__file__curdirrD   rV  ZTestCaser   rN  r?   rb  r   rK   r   rM  Z
skipUnlessrO  rc  r  Zis_resource_enabledskipr  r  r  r;   mainr   r   r   r   <module>   sv    @	_  O
$  
r

 


4