o
     JAfR                     @   s"  	 d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
m
Z
mZmZ ddlmZ zddlZdZW n eyJ   dZY nw g dZdZdZd	Zd
ZdZdZi ddddddddddddddddddddddddddddd dd!dd"di d#dd$dd%dd&dd'dd(dd)dd*dd+dd,dd-dd.dd/dd0dd1dd2dd3dddddddddd4Zed5Zed6Zed7Zed8ejZed9Z ed:Z!ed;Z"ed<ejZ#d8Z$d<Z%G d=d> d>Z&erG d?d@ d@e&Z'e(d@ G dAdB dBe&Z)G dCdD dDZ*dE+dFZ,dGdH e-e,dId D Z.dJdK Z/dLdM Z0dNdO Z1dPdQ Z2e3dRkrddl4Z4ddl5Z5ze44ej6dId dS\Z7Z8W n e4j9y| Z: z
dT\Z7Z8W Y dZ:[:ndZ:[:ww dZ;e7D ]\Z<Z:e<dUkre=e:Zqe<dVkre:Z;e8se;fZ8qe8sdWZ8e8d Z>e5? Z@e55dXe@e>pdYf ZAdZe@d[d\ ZBd]e@eAffd^d_d`dadbddeBffdcdddedfdgdhdidjdkfZCdldmdndodadddeBffdjdpfZDdqdr ZEze;re)e;ZFne&e>ZFeFjGdskreCdId ZCeFHdteFjI  eFHdueFjJf  eCD ]
\ZKZ8eEeKe8 qeEdvdwD ]ZLeMdxeLZNeNr9eNOdIZPneL+ dy ZPeEdzePf q(eDD ]*\ZKZ8eEeKe8ZQeKe8fdnkr[qIeQdy + ZReRsfqIeEd{dd|eRdy  d}f qIeSd~ W dS    eSd eseSdej6d    dS )z2.58    N)datetimetimezone	timedelta)DEFAULT_BUFFER_SIZETF)IMAP4IMAP4_streamInternaldate2tupleInt2AP
ParseFlagsTime2Internaldate   
   i  )Z	IMAP4REV1r   i@B APPEND)AUTHSELECTEDAUTHENTICATE)NONAUTH
CAPABILITY)r   r   r   LOGOUTCHECK)r   CLOSECOPYCREATEDELETE	DELETEACLENABLE)r   EXAMINEEXPUNGEFETCHGETACLGETANNOTATIONGETQUOTAGETQUOTAROOTMYRIGHTSLISTLOGINr   LSUBZMOVE	NAMESPACENOOPPARTIAL	PROXYAUTHRENAMESEARCHSELECTSETACLSETANNOTATIONSETQUOTASORT)STARTTLSSTATUSSTORE	SUBSCRIBETHREADUIDUNSUBSCRIBEUNSELECTs   \+( (?P<data>.*))?s   .*FLAGS \((?P<flags>[^\)]*)\)s   .*INTERNALDATE "(?P<day>[ 0123][0-9])-(?P<mon>[A-Z][a-z][a-z])-(?P<year>[0-9][0-9][0-9][0-9]) (?P<hour>[0-9][0-9]):(?P<min>[0-9][0-9]):(?P<sec>[0-9][0-9]) (?P<zonen>[-+])(?P<zoneh>[0-9][0-9])(?P<zonem>[0-9][0-9])"s   .*{(?P<size>\d+)}$s
   \r\n|\r|\ns%   \[(?P<type>[A-Z-]+)( (?P<data>.*))?\]s$   \* (?P<type>[A-Z-]+)( (?P<data>.*))?s3   \* (?P<data>\d+) (?P<type>[A-Z-]+)( (?P<data2>.*))?c                   @   s  e Zd Z	 G dd deZG dd deZG dd deZded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ed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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'ddKdLZ(dMdN Z)dOdP Z*dQdR Z+dSdT Z,ddUdVZ-dWdX Z.dYdZ Z/d[d\ Z0d]d^ Z1d_d` Z2dadb Z3dcdd Z4ddgdhZ5didj Z6dkdl Z7dmdn Z8dodp Z9ddqdrZ:dsdt Z;dudv Z<dwdx Z=dydz Z>d{d| Z?d}d~ Z@dd ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdddZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdS )r   c                   @      e Zd ZdS )zIMAP4.errorN__name__
__module____qualname__ r?   r?   /usr/lib/python3.10/imaplib.pyerror       rA   c                   @   r:   )zIMAP4.abortNr;   r?   r?   r?   r@   abort   rB   rC   c                   @   r:   )zIMAP4.readonlyNr;   r?   r?   r?   r@   readonly   rB   rD    Nc                 C   s   t | _d| _d | _i | _i | _d| _d| _d| _d| _	| 
  | ||| z|   W d S  tyD   z|   W   tyC   Y  w w )Nr   rE   Fr   )Debugdebugstateliteraltagged_commandsuntagged_responsescontinuation_responseis_readonlytagnum_tls_established_mode_asciiopen_connect	ExceptionshutdownOSErrorselfhostporttimeoutr?   r?   r@   __init__   s,   
zIMAP4.__init__c                 C   s0   d| _ d| _tttj| _tttj| _d S )NFascii)	utf8_enabled	_encodingrecompile_LiteralASCIILiteral_Untagged_statusUntagged_statusrW   r?   r?   r@   rP      s   zIMAP4._mode_asciic                 C   s(   d| _ d| _tt| _tt| _d S )NTutf-8)r]   r^   r_   r`   ra   rc   rd   re   rf   r?   r?   r@   
_mode_utf8   s   zIMAP4._mode_utf8c                 C   s   t tdd| _td| j d tj| _	 |  | _d| jv r%d| _nd| jv r.d| _n| | j|   	 tD ]}|| jvrCq;|| _ d S | d)Ni   i  s   (?P<tag>s"   \d+) (?P<type>[A-Z]+) (?P<data>.*)F
   r      zimaplib version %sznew IMAP4 connection, tag=%sZPREAUTHr   OKr      zCAPABILITIES: %rzserver not IMAP4 compliant)r	   randomrandinttagprer_   r`   rb   tagre_cmd_log_len_cmd_log_idx_cmd_logrG   _mesg__version___get_responseZwelcomerK   rH   rA   _get_capabilitiescapabilitiesAllowedVersionsPROTOCOL_VERSION)rW   versionr?   r?   r@   rR      s.   




zIMAP4._connectc                 C   s"   |t v rt| | S td| )NzUnknown IMAP4 command: '%s')CommandsgetattrlowerAttributeError)rW   attrr?   r?   r@   __getattr__  s   zIMAP4.__getattr__c                 C   s   | S Nr?   rf   r?   r?   r@   	__enter__  s   zIMAP4.__enter__c                 G   s2   | j dkrd S z|   W d S  ty   Y d S w Nr   )rH   logoutrU   )rW   argsr?   r?   r@   __exit__  s   
zIMAP4.__exit__c                 C   s`   |d ur
|s
t d| jsd n| j}td| | j| j || jf}|d ur+t||S t|S )Nz0Non-blocking socket (timeout=0) is not supportedzimaplib.open)
ValueErrorrX   sysauditrY   socketcreate_connection)rW   rZ   rX   addressr?   r?   r@   _create_socket#  s   

zIMAP4._create_socketc                 C   s,   	 || _ || _| || _| jd| _d S )Nrb)rX   rY   r   sockmakefilefilerV   r?   r?   r@   rQ   0  s
   z
IMAP4.openc                 C      	 | j |S r   )r   readrW   sizer?   r?   r@   r   <     z
IMAP4.readc                 C   s0   	 | j td }t|tkr| dt |S )Nrj   zgot more than %d bytes)r   readline_MAXLINElenrA   rW   liner?   r?   r@   r   A  s
   zIMAP4.readlinec                 C   s    	 t d| | | j| d S )Nzimaplib.send)r   r   r   sendallrW   datar?   r?   r@   sendI  s   z
IMAP4.sendc              
   C   s   	 | j   z;z	| jtj W n! ty1 } z|jtjkr't	|dddkr' W Y d }~nd }~ww W | j  d S W | j  d S | j  w )Nwinerrorr   i&'  )
r   closer   rT   r   	SHUT_RDWRrU   errnoZENOTCONNr}   )rW   excr?   r?   r@   rT   O  s   
	 zIMAP4.shutdownc                 C   s   	 | j S r   )r   rf   r?   r?   r@   r   _  s   zIMAP4.socketc                 C   sD   	 d}|  dd g|\}}|d r||fS |  \}}|  |||S )NZRECENTrk   )_untagged_responsenooprW   nametypdatr?   r?   r@   recentk  s   zIMAP4.recentc                 C   s   	 |  |d g| S r   )r   upper)rW   coder?   r?   r@   response|  s   zIMAP4.responsec                 C   sz   	 d}|sd}|r|d |d fdkrd| }nd }|r!t |}nd }tt|}| jr2d| d }|| _| ||||S )	Nr   INBOXr   r   ()(%s)s   UTF8 (   ))r   MapCRLFsubCRLFr]   rI   _simple_command)rW   mailboxflags	date_timemessager   rI   r?   r?   r@   append  s"   
zIMAP4.appendc                 C   sR   	 |  }t|j| _| d|\}}|dkr"| |d ddd| _||fS )Nr   rk   r   rg   replacer   )r   _AuthenticatorprocessrI   r   rA   decoderH   )rW   Z	mechanismZ
authobjectmechr   r   r?   r?   r@   authenticate  s   zIMAP4.authenticatec                 C   "   	 d}|  |\}}| |||S )Nr   r   r   r   r?   r?   r@   
capability  s   zIMAP4.capabilityc                 C   s   	 |  dS )Nr   r   rf   r?   r?   r@   check  s   
zIMAP4.checkc                 C   *   	 z|  d\}}W d| _||fS d| _w )Nr   r   r   rH   rW   r   r   r?   r?   r@   r     s   zIMAP4.closec                 C      	 |  d||S )Nr   r   )rW   message_setZnew_mailboxr?   r?   r@   copy     z
IMAP4.copyc                 C      	 |  d|S )Nr   r   rW   r   r?   r?   r@   create     zIMAP4.createc                 C   r   )Nr   r   r   r?   r?   r@   delete  r   zIMAP4.deletec                 C   r   )Nr   r   )rW   r   whor?   r?   r@   	deleteacl  r   zIMAP4.deleteaclc                 C   sJ   	 d| j vrtd| d|\}}|dkr!d| v r!|   ||fS )Nr   zServer does not support ENABLErk   zUTF8=ACCEPT)rx   r   rA   r   r   rh   )rW   r   r   r   r?   r?   r@   enable  s   

zIMAP4.enablec                 C   r   )Nr   r   r   r?   r?   r@   expunge  s   zIMAP4.expungec                 C   &   	 d}|  |||\}}| |||S )Nr   r   )rW   r   Zmessage_partsr   r   r   r?   r?   r@   fetch  s   	zIMAP4.fetchc                 C       	 |  d|\}}| ||dS )Nr   ZACLr   rW   r   r   r   r?   r?   r@   getacl(     zIMAP4.getaclc                 C   s$   	 |  d|||\}}| ||dS )Nr    
ANNOTATIONr   )rW   r   entryZ	attributer   r   r?   r?   r@   getannotation1  s   zIMAP4.getannotationc                 C   r   )Nr!   QUOTAr   )rW   rootr   r   r?   r?   r@   getquota9  s   zIMAP4.getquotac                 C   sB   	 |  d|\}}| ||d\}}| ||d\}}|||gfS )Nr"   r   Z	QUOTAROOTr   )rW   r   r   r   ZquotaZ	quotarootr?   r?   r@   getquotarootD  s
   zIMAP4.getquotaroot""*c                 C   r   )Nr$   r   rW   Z	directorypatternr   r   r   r?   r?   r@   listO     z
IMAP4.listc                 C   s>   	 |  d|| |\}}|dkr| |d d| _||fS )Nr%   rk   r   r   )r   _quoterA   rH   )rW   userpasswordr   r   r?   r?   r@   login[  s   zIMAP4.loginc                 C   s   	 ||| _ | _| d| jS )NzCRAM-MD5)r   r   r   _CRAM_MD5_AUTH)rW   r   r   r?   r?   r@   login_cram_md5i  s   zIMAP4.login_cram_md5c                 C   sD   	 dd l }t| jtr| jdn| j}| jd |||d  S )Nr   rg    md5)hmac
isinstancer   strencoder   ZHMAC	hexdigest)rW   Z	challenger   pwdr?   r?   r@   r   r  s   zIMAP4._CRAM_MD5_AUTHc                 C   s&   	 d| _ | d\}}|   ||fS r   )rH   r   rT   r   r?   r?   r@   r   z  s
   zIMAP4.logoutc                 C   r   )Nr&   r   r   r?   r?   r@   lsub  r   z
IMAP4.lsubc                 C   s    	 |  d|\}}| ||dS )Nr#   r   r   r?   r?   r@   myrights  r   zIMAP4.myrightsc                 C   r   )Nr'   r   r   r?   r?   r@   	namespace  s   zIMAP4.namespacec                 C   s   	 	 | dS )NFrl   r(   )rG   _dump_urrK   r   rf   r?   r?   r@   r     s   
z
IMAP4.noopc                 C   s*   	 d}|  |||||\}}| ||dS )Nr)   r   r   )rW   Zmessage_numZmessage_partstartlengthr   r   r   r?   r?   r@   partial  s   zIMAP4.partialc                 C   s   	 d}|  d|S )Nr*   r   )rW   r   r   r?   r?   r@   	proxyauth  s   zIMAP4.proxyauthc                 C   r   )Nr+   r   )rW   Z
oldmailboxZ
newmailboxr?   r?   r@   rename  r   zIMAP4.renamec                 G   sZ   	 d}|r| j rtd| j|d|g|R  \}}n| j|g|R  \}}| |||S )Nr,   z'Non-None charset not valid in UTF8 modeCHARSET)r]   r   rA   r   r   )rW   charsetZcriteriar   r   r   r?   r?   r@   search  s   
zIMAP4.searchr   Fc                 C   sz   	 i | _ || _|rd}nd}| ||\}}|dkr!d| _||fS d| _d| j v r3|s3	 | d	| || j d
d gfS )Nr   r-   rk   r   r   	READ-ONLYFrj   z%s is not writableEXISTS)rK   rM   r   rH   rG   r   rD   get)rW   r   rD   r   r   r   r?   r?   r@   select  s"   
zIMAP4.selectc                 C   s   	 |  d|||S )Nr.   r   )rW   r   r   Zwhatr?   r?   r@   setacl  s   zIMAP4.setaclc                 G   s&   	 | j dg|R  \}}| ||dS )Nr/   r   r   )rW   r   r   r   r?   r?   r@   setannotation
  s   zIMAP4.setannotationc                 C   s"   	 |  d||\}}| ||dS )Nr0   r   r   )rW   r   Zlimitsr   r   r?   r?   r@   setquota  s   zIMAP4.setquotac                 G   sJ   	 d}|d |d fdkrd| }| j |||g|R  \}}| |||S )Nr1   r   r   r   r   r   )rW   Zsort_criteriar  search_criteriar   r   r   r?   r?   r@   sort  s   z
IMAP4.sortc                 C   s   d}t s	| d| jr| d|| jvr| d|d u r#t }| |\}}|dkrG|j| j	| j
d| _	| j	d| _d| _|   n| d	| |||S )
Nr2   zSSL support missingzTLS session already establishedzTLS not supported by serverrk   Zserver_hostnamer   TzCouldn't establish TLS session)HAVE_SSLrA   rO   rC   rx   ssl_create_stdlib_contextr   wrap_socketr   rX   r   r   rw   r   )rW   ssl_contextr   r   r   r?   r?   r@   starttls)  s&   





zIMAP4.starttlsc                 C   r   )Nr3   r   )rW   r   namesr   r   r   r?   r?   r@   status@  s   zIMAP4.statusc                 C   s@   	 |d |d fdkrd| }|  d|||\}}| ||dS )Nr   r   r   r   r4   r   r   )rW   r   commandr   r   r   r?   r?   r@   storeL  s
   zIMAP4.storec                 C   r   )Nr5   r   r   r?   r?   r@   	subscribeW  r   zIMAP4.subscribec                 G   s.   	 d}| j |||g|R  \}}| |||S )Nr6   r   )rW   Zthreading_algorithmr  r  r   r   r   r?   r?   r@   thread_  s   zIMAP4.threadc              	   G   s   	 |  }|tvr| d| | jt| vr'| d|| jdt| f d}| j||g|R  \}}|dv r<|}nd}| |||S )NzUnknown IMAP4 UID command: %s9command %s illegal in state %s, only allowed in states %s, r7   )r,   r1   r6   r   )r   r|   rA   rH   joinr   r   )rW   r  r   r   r   r   r?   r?   r@   uidi  s    z	IMAP4.uidc                 C   r   )Nr8   r   r   r?   r?   r@   unsubscribe  r   zIMAP4.unsubscribec                 C   r   )Nr9   r   r   )rW   r   r   r?   r?   r@   unselect  s   zIMAP4.unselectc                 G   s0   	 |  }|tvr| jft|< | j|g|R  S r   )r   r|   rH   r   rW   r   r   r?   r?   r@   xatom  s
   	zIMAP4.xatomc                 C   s<   |d u rd}| j }	 ||v r|| | d S |g||< d S N    )rK   rG   rt   r   r
  r   )rW   r   r   urr?   r?   r@   _append_untagged  s   zIMAP4._append_untaggedc                 C   s,   | j d}|r| |d | jdd S )NBYEr   r   )rK   r
  rC   r   r^   )rW   byer?   r?   r@   
_check_bye  s   zIMAP4._check_byec           
   
   G   s  | j t| vrd | _| d|| j dt| f dD ]}|| jv r'| j|= qd| jv r5| js5| d|  }t	|| j
}|d | }|D ]}|d u rNqGt|trYt	|| j
}|d | }qG| j}|d urd | _t|t| ju rv|}nd }|t	dt| | j
 }	 z	| |t  W n ty }	 z| d|	 d }	~	ww |d u r|S 	 |  r| j| r|S |  s|r|| j}	 z| | | t W n ty }	 z| d|	 d }	~	ww |s	 |S q)Nr  r  rk   NOBADr  z#mailbox status changed to READ-ONLY    z {%s}F   z> %rzsocket error: %s)rH   r|   rI   rA   r   rK   rM   rD   _new_tagbytesr^   r   r   type_commandr   rG   rt   _logr   r   rU   rC   rv   rJ   rL   )
rW   r   r   r   tagr   argrI   Z	literatorvalr?   r?   r@   r5    st   







zIMAP4._commandc              
   C   s   |dk}|s
|    z| j||d\}}W n+ | jy+ } z	| d||f d }~w | jy@ } z	| d||f d }~ww |sG|    |dkrU| d|||f ||fS )Nr   )
expect_byezcommand: %s => %sr/  z%s command error: %s %s)r,  _get_tagged_responserC   rA   )rW   r   r7  r   r   r   r9  r?   r?   r@   _command_complete  s"   zIMAP4._command_completec                 C   sJ   |   \}}|d gkr| dt|d | j}| }t| | _d S )Nz"no CAPABILITY response from serverr   )r   rA   r   r^   r   tuplesplitrx   r   r?   r?   r@   rw   #  s   

zIMAP4._get_capabilitiesc                 C   s  |   }| | j|r8| jd}|| jvr| d| | jd}t|| j}| jd}||gf| j|< n~d }| t	|sM| | j
|rM| jd}| jd u rh| t|ra| jd| _d S | d| | jd}t|| j}| jd}|d u rd}|r|d | }| | j|rt| jd	}	 | |}| |||f |   }| | j|s| || |dv r| t|r| jd}t|| j}| || jd 	 |S )Nr7  zunexpected tagged response: %rr4  r   Zdata2zunexpected response: %rr'  r0  r   Fr1  zread literal size %sr-  )	_get_line_matchrp   mogrouprJ   rC   r   r^   Untagged_responsere   ContinuationrL   rc   intrG   rt   r   r)  Response_code)rW   respr7  r   r   Zdat2r   r   r?   r?   r@   rv   ,  sJ   


zIMAP4._get_responsec              
   C   s|   	 | j | }|d ur| j |= |S |r#d}| j|d }|d ur#||fS |   z|   W n | jy< } z	  d }~ww q)Nrj   r*  )rJ   rK   popr,  rv   rC   rG   	print_log)rW   r7  r:  resultr   r+  r9  r?   r?   r@   r;  |  s&   
zIMAP4._get_tagged_responsec                 C   s@   |   }|s| d|ds| d| |d d }	 |S )Nzsocket error: EOFr   z#socket error: unterminated line: %r)r   rC   endswithrG   rt   r6  r   r?   r?   r@   r?    s   

zIMAP4._get_linec                 C   s   | || _	 | jd uS r   )matchrA  rG   rt   r   groups)rW   Zcresr?   r?   r@   r@    s   
zIMAP4._matchc                 C   s2   | j tt| j| j }| jd | _d | j|< |S )Nrj   )ro   r3  r   rN   r^   rJ   )rW   r7  r?   r?   r@   r2    s   
zIMAP4._new_tagc                 C   s$   | dd}| dd}d| d S )N\z\\"z\")r   )rW   r8  r?   r?   r@   r     s   zIMAP4._quotec                 G   s   |  || j|g|R  S r   )r<  r5  r$  r?   r?   r@   r     s   zIMAP4._simple_commandc                 C   s:   |dkr||fS || j vr|d gfS | j |}	 ||fS )Nr.  )rK   rH  rG   rt   )rW   r   r   r   r   r?   r?   r@   r     s   

zIMAP4._untagged_responsec                 C   sN   |d u rt   }t dt |}tjd||d d |f  tj  d S )Nz%M:%Sz  %s.%02d %s
d   )timestrftime	localtimer   stderrwriteflush)rW   rO  ZsecsZtmr?   r?   r@   rt     s
   zIMAP4._mesgc                 C   s2   |sd S dd |  D }| dd|  d S )Nc                 s   s"    | ]\}}| d |V  qdS )z: Nr?   ).0keyvaluer?   r?   r@   	<genexpr>  s    z!IMAP4._dump_ur.<locals>.<genexpr>zuntagged responses dump:z
		)itemsrt   r   )rW   Zuntagged_resp_dictr]  r?   r?   r@   r     s   zIMAP4._dump_urc                 C   s<   |t   f| j| j< |  jd7  _| j| jkrd| _d S d S )Nrj   r   )rS  rs   rr   rq   r   r?   r?   r@   r6    s
   
z
IMAP4._logc                 C   sn   |  dt| j  | j| j}}|r5z
| j | j|   W n   Y |d7 }|| jkr-d}|d8 }|sd S d S )Nzlast %d IMAP4 interactions:rj   r   )rt   r   rs   rr   rq   )rW   inr?   r?   r@   rI    s   
zIMAP4.print_log)r   r   )r   Fr   )F)Tr<   r=   r>   rS   rA   rC   rD   
IMAP4_PORTr[   rP   rh   rR   r   r   r   r   rQ   r   r   r   rT   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,  r5  r<  rw   rv   r;  r?  r@  r2  r   r   r   rt   r   r6  rI  r?   r?   r?   r@   r      s    /*		
	


 	

M	
P!r   c                   @   s<   e Zd Z	 deddddfddZdd ZdedfddZdS )		IMAP4_SSLrE   Nc                 C   s   |d ur|d urt d|d ur|d urt d|d us |d ur+dd l}|dtd || _|| _|d u r<tj||d}|| _t	
| ||| d S )Nz8ssl_context and keyfile arguments are mutually exclusivez9ssl_context and certfile arguments are mutually exclusiver   zEkeyfile and certfile are deprecated, use a custom ssl_context instead   )certfilekeyfile)r   warningswarnDeprecationWarningrd  rc  r  r  r  r   r[   )rW   rX   rY   rd  rc  r  rZ   re  r?   r?   r@   r[     s"   zIMAP4_SSL.__init__c                 C   s   t | |}| jj|| jdS )Nr  )r   r   r  r  rX   )rW   rZ   r   r?   r?   r@   r   -  s   zIMAP4_SSL._create_socketc                 C   s   	 t | ||| d S r   )r   rQ   rV   r?   r?   r@   rQ   2  s   zIMAP4_SSL.open)r<   r=   r>   IMAP4_SSL_PORTr[   r   rQ   r?   r?   r?   r@   ra    s    
ra  c                   @   s@   e Zd Z	 dd ZdddZdd Zdd	 Zd
d Zdd ZdS )r   c                 C   s   || _ t|  d S r   )r  r   r[   )rW   r  r?   r?   r@   r[   I  s   zIMAP4_stream.__init__Nc                 C   sP   	 d | _ d | _d | _d | _tj| jttjtjddd| _	| j	j
| _| j	j| _d S )NT)bufsizestdinstdoutshell	close_fds)rX   rY   r   r   
subprocessPopenr  r   PIPEr   rj  	writefilerk  readfilerV   r?   r?   r@   rQ   N  s   
zIMAP4_stream.openc                 C   r   r   )rr  r   r   r?   r?   r@   r   ^  r   zIMAP4_stream.readc                 C   s   	 | j  S r   )rr  r   rf   r?   r?   r@   r   c  s   
zIMAP4_stream.readlinec                 C   s   	 | j | | j   d S r   )rq  rW  rX  r   r?   r?   r@   r   h  s   zIMAP4_stream.sendc                 C   s$   	 | j   | j  | j  d S r   )rr  r   rq  r   waitrf   r?   r?   r@   rT   n  s   

zIMAP4_stream.shutdown)NNN)	r<   r=   r>   r[   rQ   r   r   r   rT   r?   r?   r?   r@   r   =  s    

r   c                   @   s.   e Zd Z	 dd Zdd Zdd Zdd Zd	S )
r   c                 C   s
   || _ d S r   )r   )rW   Zmechinstr?   r?   r@   r[   |  s   
z_Authenticator.__init__c                 C   s&   |  | |}|d u rdS | |S )N   *)r   r   r   )rW   r   retr?   r?   r@   r     s   
z_Authenticator.processc                 C   sp   d}t |tr|d}|r6t|dkr!|d d }|dd  }n|}d}t|}|r4||d d  }|s|S )Nr'  rg   0   r   )r   r   r   r   binasciiZ
b2a_base64)rW   inpZoupter?   r?   r@   r     s   	



z_Authenticator.encodec                 C   s   |sdS t |S r&  )rw  Z
a2b_base64)rW   rx  r?   r?   r@   r     s   
z_Authenticator.decodeN)r<   r=   r>   r[   r   r   r   r?   r?   r?   r@   r   v  s    r   z0 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Decr   c                 C   s   i | ]\}}|  |d  qS )rj   )r   )rY  r_  rO  r?   r?   r@   
<dictcomp>  s    r{  rj   c              	   C   s   	 t | }|s
d S t|d }|d}t|d}t|d}t|d}t|d}t|d}t|d}	t|d	}
|	d
 |
 d
 }|dkrV| }||||||dddf	}t|| }t|S )Nmonzonendayyearhourminseczonehzonem<      -r   )	InternalDaterM  Mon2numrB  rE  calendarZtimegmrS  rU  )rG  rA  r|  r}  r~  r  r  r  r  r  r  zonettutcr?   r?   r@   r     s&   


r   c                 C   sD   	 d}d}t t| } | r t| d\} }|||d  | }| s|S )Nr'  s   ABCDEFGHIJKLMNOP   rj   )rE  absdivmod)numr9  ZAPmodr?   r?   r@   r	     s   r	   c                 C   s&   	 t | }|s
dS t|d S )Nr?   r   )FlagsrM  r=  rB  r>  )rG  rA  r?   r?   r@   r
     s
   
r
   c                 C   s  	 t | ttfrt| tj }npt | tr\z| j	}W n, t
yH   tjrB| d }|dkr8tt| d }tjtjf|  }ntj }Y nw t|d}t| d d dt|i}n&t | trm| jd u rjtd| }nt | tr~| d | d fdkr~| S td	d
t|j }||S )N   r   )Zseconds   tzinfozdate_time must be awarer   )rQ  rQ  zdate_time not of a known typez"%d-{}-%Y %H:%M:%S %z")r   rE  floatr   Zfromtimestampr   r  Z
astimezoner=  	tm_gmtoffr   rS  daylightrU  mktimealtzoner   r  r   r   formatMonthsZmonthrT  )r   ZdtZgmtoffdstZdeltafmtr?   r?   r@   r     s<   






r   __main__zd:s:)r?   r?   z-dz-s)rE   zIMAP password for %s on %s: 	localhostzJFrom: %(user)s@localhost%(lf)sSubject: IMAP4 test%(lf)s%(lf)sdata...%(lf)s
)r   Zlfr   )r   )
/tmp/xxx 1)r  )r  z/tmp/yyy)r   
/tmp/yyz 2r   r  )r   )z/tmpzyy*)r  r  )r  )NZSUBJECTtest)r   )1z(FLAGS INTERNALDATE RFC822))r  )r  FLAGSz
(\Deleted))r   r?   )r   r?   )r   r?   )r   r?   )r  r?   )r   )ZUIDVALIDITY)r!  )r,   ZALL)r   )r	  )r   r?   c                 C   sL   t d| |f  tt | | \}}t d| ||f  |dkr$|d |S )Nz%s %sz%s => %s %sr.  r   )Mrt   r}   )cmdr   r   r   r?   r?   r@   runA  s
   r  r   zPROTOCOL_VERSION = %szCAPABILITIES = %rr   )z/tmp/zyy%z.*"([^"]+)"$r   r   r!  z%sz:(FLAGS INTERNALDATE RFC822.SIZE RFC822.HEADER RFC822.TEXT)z
All tests OK.z
Tests failed.z8
If you would like to see debugging output,
try: %s -d5
)Tru   rw  r   rm   r_   r   rn  r   rS  r  r   r   r   ior   r  r  ImportError__all__r   rF   r`  rh  ry   r   r|   r`   rD  r  r  rb   rc   r   rF  rC  re   ra   rd   r   ra  r   r   r   r>  r  	enumerater  r   r	   r
   r   r<   getoptZgetpassargvZoptlistr   rA   r9  Zstream_commandoptrE  rX   ZgetuserZUSERZPASSWDZ	test_mesgZ	test_seq1Z	test_seq2r  r  rH   rt   rz   rx   r  mlrM  rA  rB  pathr   r!  printr?   r?   r?   r@   <module>   s   H		
 !"#$
0



	
         
69
,#
)








