ó
Gh\c           @   sc  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 m Z d e f d „  ƒ  YZ d	 e e f d
 „  ƒ  YZ d d d „ Z d e e f d „  ƒ  YZ d e e f d „  ƒ  YZ  d „  Z! d S(   iÿÿÿÿN(   t   exc_info(   t   sha512t   sha384t   sha256t   sha224t   sha1(   t   OfflineImapError(   t   getglobalui(   t   IMAP4t	   IMAP4_SSLt   InternalDatet   Mon2numt   UsefulIMAPMixInc           B   s;   e  Z d  „  Z d e e d „ Z d d d „ Z d „  Z RS(   c         C   s   |  j  d k r |  j Sd  S(   Nt   SELECTED(   t   statet   mailboxt   None(   t   self(    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyt   __getselectedfolder$   s    t   INBOXc         C   s
  |  j  ƒ  | k r, |  j | k r, | r, d Sy t t |  ƒ j | | ƒ } Wnz |  j k
 rf } ‚  nb |  j k
 rÇ } d |  j | | j d f } t	 j
 j } t j t	 t	 | | ƒ t ƒ  d ƒ n X| d d k rd | | f } t	 j
 j } t	 | | ƒ ‚ n  | S(   s¡   Selects a mailbox on the IMAP server

        :returns: 'OK' on success, nothing if the folder was already
        selected or raises an :exc:`OfflineImapError`.NsD   Server '%s' closed connection, error on SELECT '%s'. Server said: %si    i   t   OKs.   Error SELECTing mailbox '%s', server reply:
%s(   t#   _UsefulIMAPMixIn__getselectedfoldert   is_readonlyt   superR   t   selectt   readonlyt   abortt   hostt   argsR   t   ERRORt   FOLDER_RETRYt   sixt   reraiseR    t   FOLDER(   R   R   R   t   forcet   resultt   et   errstrt   severity(    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyR   )   s*    	c         C   s   t  |  | | | ƒ d  S(   N(   t   new_mesg(   R   t   st   tnt   secs(    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyt   _mesgJ   s    c   
      C   s9  d } x,t  j |  j |  j |  j t  j ƒ D]÷ } | \ } } } } } y |  j  | | | ƒ } Wn t  j k
 rz } q+ n Xy€ xy d D]b }	 y | j | ƒ PWq… t  j k
 ræ } t | j	 ƒ d k  sÝ | j	 d t
 j k rç ‚  qç q… Xq… Wt  j | ƒ ‚ Wn# t  j k
 r } | j ƒ  q+ n XPq+ Wt  j | ƒ ‚ | S(   sJ   open_socket()
        Open socket choosing first address family available.iÿÿÿÿs   could not open socketi    i   i   (   iÿÿÿÿs   could not open socket(   i    i   (   t   sockett   getaddrinfoR   t   portt   aft   SOCK_STREAMt   errort   connectt   lenR   t   errnot   EINTRt   close(
   R   t   msgt   resR/   t   socktypet   protot	   canonnamet   saR(   t   i(    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyt   open_socketN   s,    ++
N(   t   __name__t
   __module__R   t   FalseR   R   R+   R>   (    (    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyR   #   s   	!t   IMAP4_Tunnelc           B   sD   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s°   IMAP4 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         K   s:   d | k r# | d |  _  | d =n  t j |  | |  d  S(   Nt
   use_socket(   R,   R   t   __init__(   R   t	   tunnelcmdt   kwargs(    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyRD   u   s    
c      
   C   s~   | |  _  t j | d t d t d t j d t j ƒ|  _ |  j j |  j j |  _ |  _	 |  j	 j
 ƒ  |  _ |  j |  j ƒ d S(   s   The tunnelcmd comes in on host!t   shellt	   close_fdst   stdint   stdoutN(   R   t
   subprocesst   Popent   Truet   PIPEt   processRI   RJ   t   outfdt   infdt   filenot   read_fdt   set_nonblocking(   R   R   R.   (    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyt   open{   s    	c         C   s=   t  j  | t  j ƒ } | t j @} t  j  | t  j | ƒ d S(   s   Mark fd as nonblockingN(   t   fcntlt   F_GETFLt   ost
   O_NONBLOCKt   F_SETFL(   R   t   fdt   fl(    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyRT   ‡   s    c         C   se   |  j  d k r" t j |  j | ƒ S|  j  j r= |  j  j } n t j |  j d ƒ } |  j  j | | ƒ S(   s@   data = read(size)
        Read at most 'size' bytes from remote.i    N(   t   decompressorR   RX   t   readRS   t   unconsumed_tailt
   decompress(   R   t   sizet   data(    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyR^      s    c         C   sQ   |  j  d  k	 r= |  j  j | ƒ } | |  j  j t j ƒ 7} n  |  j j | ƒ d  S(   N(   t
   compressorR   t   compresst   flusht   zlibt   Z_SYNC_FLUSHRP   t   write(   R   Rb   (    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyt   sendž   s    c         C   s+   |  j  j ƒ  |  j j ƒ  |  j j ƒ  d  S(   N(   RQ   R6   RP   RO   t   wait(   R   (    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyt   shutdown¤   s    (	   R?   R@   t   __doc__RD   RU   RT   R^   Ri   Rk   (    (    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyRB   m   s   						c         C   s†   | d  k r t j ƒ  } n  | d  k r< t j ƒ  j ƒ  } n  t j d t j | ƒ ƒ } t ƒ  j d d | | d d | | f ƒ d  S(   Ns   %M:%St   imaps     %s.%02d %s %sid   (	   R   t   timet	   threadingt   currentThreadt   getNamet   strftimet	   localtimeR   t   debug(   R   R(   R)   R*   t   tm(    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyR'   ª   s    t   WrappedIMAP4_SSLc           B   s&   e  Z d  Z d „  Z d d d „ Z RS(   s:   Improved version of imaplib.IMAP4_SSL overriding select().c         O   s»   d | k r# | d |  _  | d =n  d | k rF | d |  _ | d =n  | j d d  ƒ |  _ t |  j ƒ t g  ƒ k rˆ |  j g |  _ n  d | k rž | d =n  t t |  ƒ j | | Ž  d  S(   NR/   RC   t   fingerprint(	   R/   R,   t   getR   t   _fingerprintt   typeR   Rv   RD   (   R   R   RF   (    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyRD   ¶   s    


c   	      C   s  |  j  r, |  j r, t d t j j ƒ ‚ n  t t |  ƒ j | | ƒ |  j r|  j j	 t
 ƒ } t t t t t f } g  | D] } | | ƒ j ƒ  ^ q| } g  | D] } | |  j k ^ q¡ } t | ƒ st d t g  | D] } | j ^ qØ | ƒ | |  j f t j j ƒ ‚ qn  d  S(   Ns…   No CA certificates and no server fingerprints configured.  You must configure at least something, otherwise having SSL helps nothing.s£   Server SSL fingerprint(s) '%s' for hostname '%s' does not match configured fingerprint(s) %s.  Please verify and set 'cert_fingerprint' accordingly if not set yet.(   t   ca_certsRy   R   R   t   REPOR   Rv   RU   t   sockt   getpeercertRM   R   R   R   R   R   t	   hexdigestt   anyt   zipR?   (	   R   R   R.   t   server_certt   hashest   hasht   server_fingerprintst   server_fingerprintt   matches(    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyRU   Ä   s    	%"/N(   R?   R@   Rl   RD   R   RU   (    (    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyRv   ³   s   	t   WrappedIMAP4c           B   s   e  Z d  Z d „  Z RS(   s6   Improved version of imaplib.IMAP4 overriding select().c         O   s]   d | k r# | d |  _  | d =n  d | k rF | d |  _ | d =n  t j |  | | Ž d  S(   NR/   RC   (   R/   R,   R   RD   (   R   R   RF   (    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyRD   Þ   s    

(   R?   R@   Rl   RD   (    (    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyRˆ   Û   s   c      	   C   s5  d d l  m } t j |  ƒ } | s) d St | j d ƒ } | j d ƒ } t | j d ƒ ƒ } t | j d ƒ ƒ } t | j d ƒ ƒ } t | j d ƒ ƒ } t | j d	 ƒ ƒ }	 t | j d
 ƒ ƒ }
 t | j d ƒ ƒ } |
 d | d } | d k r| } n  | | | | | |	 d d d f	 } | | ƒ | S(   sG   Convert IMAP4 INTERNALDATE to UT.

    Returns seconds since the epoch.iÿÿÿÿ(   t   timegmt   mont   zonent   dayt   yeart   hourt   mint   sect   zoneht   zonemi<   t   -N(   t   calendarR‰   R
   t   matchR   R   t   groupt   int(   t   respR‰   t   moRŠ   R‹   RŒ   R   RŽ   R   R   R‘   R’   t   zonet   tt(    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyt   Internaldate2epochè   s$    
!("   RX   RV   Rn   RK   Ro   R,   R4   Rf   t   sysR    t   hashlibR   R   R   R   R   R   t   offlineimapR   t   offlineimap.uiR   t   offlineimap.virtual_imaplib2R   R	   R
   R   t   objectR   RB   R   R'   Rv   Rˆ   Rœ   (    (    (    s1   /usr/share/offlineimap/offlineimap/imaplibutil.pyt   <module>   s&   ("J=	(