
    e,'                     "   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	 d dl
mZmZmZmZmZ d dlZd dlmZ d dlmZ d dlmZmZmZ 	 d dlZ G d d      Z G d	 d
ee      ZddZ G d dee      Z G d dee      Zd Zy#  Y :xY w)    N)exc_info)sha512sha384sha256sha224sha1)OfflineImapError)getglobalui)IMAP4	IMAP4_SSLInternalDatec                   :     e Zd Zd Zd fd	ZddZd Zd Z xZS )UsefulIMAPMixInc                 :    | j                   dk(  r| j                  S y )NSELECTED)statemailboxselfs    2/usr/share/offlineimap3/offlineimap/imaplibutil.py__getselectedfolderz#UsefulIMAPMixIn.__getselectedfolder&   s    ::#<<    c                    | j                         |k(  r| j                  |k(  r|sy	 t        t        |   ||      }|d   dk7  r.d|d	|}t        j                  j                  }t        ||      |S # | j
                  $ r} d}~w| j                  $ rY}d| j                  d|d|j                  d   }t        j                  j                  }t        ||t               d         d}~ww xY w)
zSelects a mailbox on the IMAP server

        :returns: 'OK' on success, nothing if the folder was already
        selected or raises an :exc:`OfflineImapError`.NzServer 'z&' closed connection, error on SELECT 'z'. Server said: r      OKzError SELECTing mailbox 'z', server reply:
)#_UsefulIMAPMixIn__getselectedfolderis_readonlysuperr   selectreadonlyaborthostargsr	   ERRORFOLDER_RETRYr   FOLDER)	r   r   r    forceresulteerrstrseverity	__class__s	           r   r   zUsefulIMAPMixIn.select+   s     ##%0  H,
	D?D8(KF !9 v'F'--44H"6844! }} 	zz 	D (,yy'166!9FF'--::H"68XZ]CC	Ds$   A4 4C/BC/AC**C/c                      t        | |||       y N)new_mesg)r   stnsecss       r   _mesgzUsefulIMAPMixIn._mesgK   s    q"d#r   c                     | j                   t        j                  k(  r+t        j                  | j
                  | j                  f      S | j                  | j                         S )zJopen_socket()
        Open socket choosing first address family available.)afsocket	AF_UNSPECrfc6555create_connectionr"   port_open_socket_for_afr   s    r   open_socketzUsefulIMAPMixIn.open_socketO   sI     77f&&&,,dii-CDD++DGG44r   c                    t        j                  | j                  | j                  |t         j                        D ]S  }|\  }}}}}	 | j                  |||      }	 dD ]  }	 |j                  |        n d}	t        j
                  |	      	  |S  d}	t        j
                  |	      # t         j
                  $ r Y w xY w# t         j
                  $ rC}	t        |	j                        dk  s |	j                  d   t        j                  k7  r Y d }	~	d }	~	ww xY w# t         j
                  $ r |j                          Y w xY w)N)r      r   r   )zcould not open socket)r6   getaddrinfor"   r:   SOCK_STREAMerrorconnectlenr#   errnoEINTRclose)
r   r5   ressocktypeproto	canonnamesar0   _msgs
             r   r;   z#UsefulIMAPMixIn._open_socket_for_afX   s4   %%diiB@R@RS 	$C14.B%BKKHe4 	,A"		"	, 8C ,,s++  
 5	$. 0C,,s##' <<  "<< "sxx=1,u{{0J! 1K" << 	sN   B(D!C2D(B>=B>D9DDDD#E E)INBOXFFNN)	__name__
__module____qualname__r   r   r3   r<   r;   __classcell__r,   s   @r   r   r   %   s    
@$5r   r   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	IMAP4_TunnelzIMAP4 client class over a tunnel

    Instantiate with: IMAP4_Tunnel(tunnelcmd)

    tunnelcmd -- shell command to generate the tunnel.
    The result will be in PREAUTH stage.c                 T    d|v r|d   | _         |d= t        j                  | |fi | y )N
use_socket)r6   r   __init__)r   	tunnelcmdkwargss      r   rZ   zIMAP4_Tunnel.__init__~   s1    6! .DK|$tY1&1r   c                 j   || _         t        j                  |ddt        j                  t        j                        | _        | j                  j
                  | j                  j                  c| _        | _        | j                  j                         | _
        | j                  | j                         y)zThe tunnelcmd comes in on host!T)shell	close_fdsstdinstdoutN)r"   
subprocessPopenPIPEprocessr`   ra   outfdinfdfilenoread_fdset_nonblocking)r   r"   r:   s      r   openzIMAP4_Tunnel.open   s{     	!''DD.8oojooW#'<<#5#5t||7J7JTYyy'')T\\*r   c                     	 t        j                   |t         j                        }|t        j                   z  }t        j                   |t         j                  |       y# t
        $ r Y yw xY w)zMark fd as nonblockingN)fcntlF_GETFLos
O_NONBLOCKF_SETFL	NameError)r   fdfls      r   rj   zIMAP4_Tunnel.set_nonblocking   sQ    	R/Br}}n$BKKEMM2. 		s   AA   	A,+A,c                 ,   | j                    t        j                  | j                  |      S | j                   j                  r| j                   j                  }n t        j                  | j                  d      }| j                   j                  ||      S )z@data = read(size)
        Read at most 'size' bytes from remote.i    )decompressorro   readri   unconsumed_tail
decompress)r   sizedatas      r   rw   zIMAP4_Tunnel.read   sr     $774<<..,,$$44D774<<.D  ++D$77r   c                    | j                   G| j                   j                  |      }|| j                   j                  t        j                        z  }| j
                  j                  |       | j
                  j                          y r.   )
compressorcompressflushzlibZ_SYNC_FLUSHrf   write)r   r{   s     r   sendzIMAP4_Tunnel.send   sa    ??&??++D1DDOO))$*;*;<<D



r   c                     | j                   j                          | j                  j                          | j                  j	                          y r.   )rg   rG   rf   re   waitr   s    r   shutdownzIMAP4_Tunnel.shutdown   s0    		

r   N)
rQ   rR   rS   __doc__rZ   rk   rj   rw   r   r    r   r   rW   rW   v   s%    ,2
+
8r   rW   c                    |t        j                          }|"t        j                         j                         }t        j                  dt        j
                  |            }t               j                  dd||dz  dz  ||fz         y )Nz%M:%Simapz  %s.%02d %s %sd   )time	threadingcurrentThreadgetNamestrftime	localtimer
   debug)r   r0   r1   r2   tms        r   r/   r/      sr    |yy{	z$$&..0	wt 4	5BM 1R$*9KRQR4S STr   c                   .     e Zd ZdZ fdZd fd	Z xZS )WrappedIMAP4_SSLz:Improved version of imaplib.IMAP4_SSL overriding select().c                    d|v r|d   | _         |d= d|v r|d   | _        |d= |j                  dd       | _        t	        | j                        t	        g       k7  r| j                  g| _        d|v r|d= t        t        |   |i | y )Nr5   rY   fingerprint)r5   r6   get_fingerprinttyper   r   rZ   )r   r#   r\   r,   s      r   rZ   zWrappedIMAP4_SSL.__init__   s    6>TlDGt6! .DK|$"JJ}d;!!"d2h.!%!2!2 3DF"}%.??r   c                    | j                   s0| j                  s$t        dt        j                  j                        t
        t        |   ||       | j                  r| j                  j                  d      }t        t        t        t        t        f}|D cg c]  } ||      j                          }}|D cg c]  }|| j                  v  }}t!        |      sct        dt#        t%        |D cg c]  }|j&                   c}|            d|d| j                  dt        j                  j                        y y c c}w c c}w c c}w )NzNo CA certificates and no server fingerprints configured.  You must configure at least something, otherwise having SSL helps nothing.TzServer SSL fingerprint(s) 'z' for hostname 'z+' does not match configured fingerprint(s) zG.  Please verify and set 'cert_fingerprint' accordingly if not set yet.)ca_certsr   r	   r$   REPOr   r   rk   sockgetpeercertr   r   r   r   r   	hexdigestanylistziprQ   )
r   r"   r:   server_certhashesmy_hashserver_fingerprintsserver_fingerprintmatchesr,   s
            r   rk   zWrappedIMAP4_SSL.open   s1   }}T%6%6" $? AQ@V@V@[@[] ] 	*46))//5KVVVT9FSY"Z7;#7#A#A#C"Z"Z[noEW*d.?.??oGow<&
 )-SRX1Yw'2B2B1Y[n-o(prv(,(9(9(; (8'='='B'BD D    #[o 2Zs   E;E1ErP   )rQ   rR   rS   r   rZ   rk   rT   rU   s   @r   r   r      s    D@D Dr   r   c                       e Zd ZdZd Zy)WrappedIMAP4z6Improved version of imaplib.IMAP4 overriding select().c                 z    d|v r|d   | _         |d= d|v r|d   | _        |d= t        j                  | g|i | y )Nr5   rY   )r5   r6   r   rZ   )r   r#   r\   s      r   rZ   zWrappedIMAP4.__init__   sM    6>TlDGt6! .DK|$t-d-f-r   N)rQ   rR   rS   r   rZ   r   r   r   r   r      s
    @.r   r   c           	         ddl m} t        j                  |       }|syt        j                  j                  |j                  d      j                  d      d      }|j                  }|j                  d      }t        |j                  d            }t        |j                  d	            }t        |j                  d
            }t        |j                  d            }	t        |j                  d            }
t        |j                  d            }t        |j                  d            }|dz  |z   dz  }|dk(  r| }|||||	|
dddf	} ||      |z
  S )zGConvert IMAP4 INTERNALDATE to UT.

    Returns seconds since the epoch.r   )timegmNmonzutf-8z%bzonendayyearhourminseczonehzonem<   -r?   )
calendarr   r   matchdatetimestrptimegroupdecodemonthint)respr   modatetime_objectr   r   r   r   r   minur   r   r   zonetts                  r   Internaldate2epochr      s0   
  			D	!B ''00%1G1G1PRVWO


CHHWE
bhhuo
Crxx Drxx DrxxD
bhhuo
C!"E!"E BJ"$D|u
S$c2r2	6B":r   rP   ) r   ro   r   rb   r   r6   rE   r   sysr   hashlibr   r   r   r   r   r8   offlineimapr	   offlineimap.uir
   imaplib2r   r   r   rm   r   rW   r/   r   r   r   r   r   r   <module>r      s      	        8 8  ( & 3 3	
N Nb>?E >BU&D	 &DR
.?E 
.!k	s   B
 
B