
\[\/C                 @   s  d  Z  d d d d g Z d d l Z d d l Z d Z d Z d	 Z d
 d d d d d d d d d d d d d d d d d d d d d d d  g Z d! d" d# d$ d% d& d' g Z i d d( 6d d) 6d d* 6d d+ 6d, d- 6d. d/ 6d0 d1 6d, d2 6d3 d4 6d0 d5 6d6 d7 6d3 d8 6d9 d: 6d6 d; 6Z	 d< d   Z
 d= d>   Z d? d   Z d@ d   Z dA d   Z GdB dC   dC  Z GdD dE   dE e  Z d S)FzcEmail address parsing code.

Lifted directly from rfc822.py.  This should eventually be rewritten.
	mktime_tz	parsedateparsedate_tzquote    N  z, ZjanZfebZmarZaprZmayZjunZjulZaugsepoctZnovZdecZjanuaryZfebruaryZmarchZaprilZjuneZjulyZaugustZ	septemberZoctoberZnovemberZdecemberZmonZtueZwedZthuZfriZsatZsunZUTZUTCZGMTZi  ZASTi,  ZADTi  ZESTZEDTiX  ZCSTZCDTi  ZMSTZMDTi   ZPSTZPDTc             C   s=   t  |   } | s d S| d d k r3 d | d <n  t |  S)zQConvert a date string to a time tuple.

    Accounts for military timezones.
    N	   r   )_parsedate_tztuple)dataZres r   &/usr/lib/python3.4/email/_parseaddr.pyr   -   s    c             C   s  |  s
 d S|  j    }  |  d j d  s? |  d j   t k rI |  d =n> |  d j d  } | d k r |  d | d d  |  d <n  t |   d k r |  d j  d  } t |  d k r | |  d d  }  q n  t |   d k rj|  d } | j d  } | d k r!| j d  } n  | d k rZ| d |  | | d  g |  d d  <qj|  j d	  n  t |   d
 k  rd S|  d d
  }  |  \ } } } } } | j   } | t k r| | j   } } | t k rd Sn  t j	 |  d } | d k r| d 8} n  | d d k r2| d d  } n  | j d  } | d k r]| | } } n  | d d k r| d d  } n  | d j
   s| | } } n  | d d k r| d d  } n  | j  d  } t |  d k r| \ }	 }
 d } n t |  d k r| \ }	 }
 } n t |  d k rd | d k r| d j  d  } t |  d k ry| \ }	 }
 d } qt |  d k r| \ }	 }
 } qn d Sy@ t |  } t |  } t |	  }	 t |
  }
 t |  } Wn t k
 rd SYn X| d k  r/| d k r"| d 7} q/| d 7} n  d } | j   } | t k rZt | } nI y t |  } Wn t k
 r~Yn X| d k r| j d  rd } n  | r| d k  rd } | } n d } | | d d | d d } n  | | | |	 |
 | d d d | g
 S)a  Convert date to extended time tuple.

    The last (additional) element is the time zone offset in seconds, except if
    the timezone was specified as -0000.  In that case the last element is
    None.  This indicates a UTC timestamp that explicitly declaims knowledge of
    the source timezone, as opposed to a +0000 timestamp that indicates the
    source timezone really was UTC.

    Nr   ,      -   +r         :   0.d   D   il  i  i  <   r    r    r    r    r    r    r    r    )splitendswithlower	_daynamesrfindlenfindappend_monthnamesindexisdigitint
ValueErrorupper
_timezones
startswith)r   iZstuffsZddZmmZyyZtmZtzZthhZtmmZtssZtzoffsetZtzsignr   r   r   r   9   s    
)

-	"			
!r   c             C   s1   t  |   } t | t  r) | d d  S| Sd S)z&Convert a time string to a time tuple.Nr   )r   
isinstancer   )r   tr   r   r   r      s    c             C   sJ   |  d d k r+ t  j |  d d  d  St j |   } | |  d Sd S)zETurn a 10-tuple as returned by parsedate_tz() into a POSIX timestamp.r   N   r   r    )r    )timeZmktimecalendarZtimegm)r   r4   r   r   r   r      s    c             C   s   |  j  d d  j  d d  S)zPrepare string to be used in a quoted string.

    Turns backslash and double quote characters into quoted pairs.  These
    are the only characters that need to be quoted inside a quoted string.
    Does not add the surrounding double quotes.
    \z\\"z\")replace)strr   r   r   r      s    c               @   s   e  Z d  Z 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 d  Z d d   Z d d   Z d d   Z d d d  Z d d   Z d S)AddrlistClassa  Address parser class by Ben Escoto.

    To understand what this class does, it helps to have a copy of RFC 2822 in
    front of you.

    Note: this class interface is deprecated and may be removed in the future.
    Use email.utils.AddressList instead.
    c             C   s   d |  _  d |  _ d |  _ d |  _ |  j |  j |  _ |  j  |  j |  j |  _ |  j j d d  |  _ | |  _ g  |  _	 d S)zInitialize a new instance.

        `field' is an unparsed address header field, containing
        one or more addresses.
        z()<>@,:;."[]r   z 	z
r   r   N)
specialsposLWSZCRFWSatomendsr:   
phraseendsfieldcommentlist)selfrC   r   r   r   __init__   s    					zAddrlistClass.__init__c             C   s   g  } x |  j  t |  j  k  r |  j |  j  |  j d k r |  j |  j  d k rn | j |  j |  j   n  |  j  d 7_  q	 |  j |  j  d k r |  j j |  j    q	 Pq	 Wt j |  S)z&Skip white space and extract comments.z
r   ()	r>   r&   rC   r?   r(   rD   
getcommentEMPTYSTRINGjoin)rE   Zwslistr   r   r   gotonext   s    zAddrlistClass.gotonextc             C   sU   g  } xH |  j  t |  j  k  rP |  j   } | r@ | | 7} q	 | j d  q	 W| S)zVParse all addresses.

        Returns a list containing all of the addresses.
        r   )r   r   )r>   r&   rC   
getaddressr(   )rE   resultZadr   r   r   getaddrlist   s    zAddrlistClass.getaddrlistc             C   s  g  |  _  |  j   |  j } |  j  } |  j   } |  j   g  } |  j t |  j  k r | rPt j |  j   | d f g } qPn|  j |  j d k r | |  _ | |  _  |  j   } t j |  j   | f g } nz|  j |  j d k rg  } t |  j  } |  j d 7_ x=|  j t |  j  k  r|  j   |  j | k  rm|  j |  j d k rm|  j d 7_ Pn  | |  j	   } qWn |  j |  j d k r|  j
   } |  j  rt j |  d d j |  j   d	 | f g } qPt j |  | f g } nS | r%t j |  j   | d f g } n+ |  j |  j |  j k rP|  j d 7_ n  |  j   |  j t |  j  k  r|  j |  j d
 k r|  j d 7_ n  | S)zParse the next address.r   z.@r   r   ;<z (r   )r   )rD   rK   r>   getphraselistr&   rC   SPACErJ   getaddrspecrL   getrouteaddrr=   )rE   ZoldposZoldclplistZ
returnlistZaddrspecZfieldlenZ	routeaddrr   r   r   rL     sL    	
		
%		
%	3"
.zAddrlistClass.getaddressc             C   s   |  j  |  j d k r d Sd } |  j d 7_ |  j   d } x |  j t |  j   k  r| rs |  j   d } n |  j  |  j d k r |  j d 7_ Pnr |  j  |  j d k r |  j d 7_ d } nD |  j  |  j d	 k r |  j d 7_ n |  j   } |  j d 7_ P|  j   qB W| S)
zParse a route address (Return-path value).

        This method just skips all the route stuff and returns the addrspec.
        rP   NFr   r   >@Tr   )rC   r>   rK   r&   	getdomainrT   )rE   ZexpectrouteZadlistr   r   r   rU   ?  s.    

		zAddrlistClass.getrouteaddrc             C   s  g  } |  j    x3|  j t |  j  k  rEd } |  j |  j d k r | rk | d j   rk | j   n  | j d  |  j d 7_ d } n |  j |  j d k r | j d t |  j     nT |  j |  j |  j	 k r| r| d	 j   r| j   n  Pn | j |  j
    |  j    } | r | r | j |  q q W|  j t |  j  k st|  j |  j d k rt j |  S| j d  |  j d 7_ |  j    t j |  |  j   S)
zParse an RFC 2822 addr-spec.Tr   r   Fr9   z"%s"rX   r    r    )rK   r>   r&   rC   strippopr(   r   getquoterA   getatomrI   rJ   rY   )rE   ZaslistZpreserve_wsZwsr   r   r   rT   _  s4    
	 .
zAddrlistClass.getaddrspecc             C   s  g  } x|  j  t |  j  k  r|  j |  j  |  j k rL |  j  d 7_  q	 |  j |  j  d k r{ |  j j |  j    q	 |  j |  j  d k r | j |  j    q	 |  j |  j  d k r |  j  d 7_  | j d  q	 |  j |  j  |  j k r Pq	 | j |  j	    q	 Wt
 j |  S)z-Get the complete domain name from an address.r   rG   [r   )r>   r&   rC   r?   rD   r(   rH   getdomainliteralrA   r]   rI   rJ   )rE   Zsdlistr   r   r   rY     s    zAddrlistClass.getdomainTc             C   s-  |  j  |  j | k r d Sd g } d } |  j d 7_ x |  j t |  j   k  r| ry | j |  j  |  j  d } n |  j  |  j | k r |  j d 7_ Pnk | r |  j  |  j d k r | j |  j    q; n6 |  j  |  j d k r d } n | j |  j  |  j  |  j d 7_ q; Wt j |  S)a  Parse a header fragment delimited by special characters.

        `beginchar' is the start character for the fragment.
        If self is not looking at an instance of `beginchar' then
        getdelimited returns the empty string.

        `endchars' is a sequence of allowable end-delimiting characters.
        Parsing stops when one of these is encountered.

        If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed
        within the parsed fragment.
        r   Fr   rG   r8   T)rC   r>   r&   r(   rH   rI   rJ   )rE   Z	begincharZendcharsZallowcommentsZslistr   r   r   r   getdelimited  s(    			zAddrlistClass.getdelimitedc             C   s   |  j  d d d  S)z1Get a quote-delimited fragment from self's field.r9   z"F)r`   )rE   r   r   r   r\     s    zAddrlistClass.getquotec             C   s   |  j  d d d  S)z7Get a parenthesis-delimited fragment from self's field.rG   z)T)r`   )rE   r   r   r   rH     s    zAddrlistClass.getcommentc             C   s   d |  j  d d d  S)z!Parse an RFC 2822 domain-literal.z[%s]r^   z]F)r`   )rE   r   r   r   r_     s    zAddrlistClass.getdomainliteralNc             C   s   d g } | d k r! |  j  } n  x\ |  j t |  j  k  r |  j |  j | k rV Pn | j |  j |  j  |  j d 7_ q$ Wt j |  S)a  Parse an RFC 2822 atom.

        Optional atomends specifies a different set of end token delimiters
        (the default is to use self.atomends).  This is used e.g. in
        getphraselist() since phrase endings must not include the `.' (which
        is legal in phrases).r   Nr   )rA   r>   r&   rC   r(   rI   rJ   )rE   rA   Zatomlistr   r   r   r]     s    	zAddrlistClass.getatomc             C   s   g  } x |  j  t |  j  k  r |  j |  j  |  j k rL |  j  d 7_  q	 |  j |  j  d k rx | j |  j    q	 |  j |  j  d k r |  j j |  j    q	 |  j |  j  |  j k r Pq	 | j |  j	 |  j   q	 W| S)zParse a sequence of RFC 2822 phrases.

        A phrase is a sequence of words, which are in turn either RFC 2822
        atoms or quoted-strings.  Phrases are canonicalized by squeezing all
        runs of continuous whitespace into one space.
        r   r9   rG   )
r>   r&   rC   r@   r(   r\   rD   rH   rB   r]   )rE   rV   r   r   r   rR     s    zAddrlistClass.getphraselist)__name__
__module____qualname____doc__rF   rK   rN   rL   rU   rT   rY   r`   r\   rH   r_   r]   rR   r   r   r   r   r<      s   ; !%r<   c               @   sj   e  Z d  Z 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)AddressListz@An AddressList encapsulates a list of parsed RFC 2822 addresses.c             C   s5   t  j |  |  | r( |  j   |  _ n	 g  |  _ d  S)N)r<   rF   rN   addresslist)rE   rC   r   r   r   rF     s    zAddressList.__init__c             C   s   t  |  j  S)N)r&   rf   )rE   r   r   r   __len__  s    zAddressList.__len__c             C   s\   t  d   } |  j d  d   | _ x3 | j D]( } | |  j k r, | j j |  q, q, W| S)N)re   rf   r(   )rE   othernewaddrxr   r   r   __add__  s    zAddressList.__add__c             C   s:   x3 | j  D]( } | |  j  k r
 |  j  j |  q
 q
 W|  S)N)rf   r(   )rE   rh   rj   r   r   r   __iadd__  s    zAddressList.__iadd__c             C   sF   t  d   } x3 |  j D]( } | | j k r | j j |  q q W| S)N)re   rf   r(   )rE   rh   ri   rj   r   r   r   __sub__  s
    zAddressList.__sub__c             C   s:   x3 | j  D]( } | |  j  k r
 |  j  j |  q
 q
 W|  S)N)rf   remove)rE   rh   rj   r   r   r   __isub__  s    zAddressList.__isub__c             C   s   |  j  | S)N)rf   )rE   r*   r   r   r   __getitem__  s    zAddressList.__getitem__N)ra   rb   rc   rd   rF   rg   rk   rl   rm   ro   rp   r   r   r   r   re     s   	re   )rd   __all__r6   r7   rS   rI   Z
COMMASPACEr)   r$   r/   r   r   r   r   r   r<   re   r   r   r   r   <module>   s6   	u	

 %