;
&
?c           @   s  d  Z  d k Z d k l Z y e e f Wn e j
 o d Z d Z n Xd 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 h  d& d <d' d <d( d <d) d <d* d+ <d, d- <d. d/ <d0 d+ <d1 d2 <d3 d/ <d4 d5 <d6 d2 <d7 d8 <d9 d5 <Z d:   Z d;   Z d<   Z d=   Z d> f  d?     YZ d@ e f dA     YZ d S(B   sc   Email address parsing code.

Lifted directly from rfc822.py.  This should eventually be rewritten.
N(   s	   TupleTypei   i    s    s    s   , s   jans   febs   mars   aprs   mays   juns   juls   augs   seps   octs   novs   decs   januarys   februarys   marchs   aprils   junes   julys   augusts	   septembers   octobers   novembers   decembers   mons   tues   weds   thus   fris   sats   suns   UTs   UTCs   GMTs   Zs   ASTips   ADTis   ESTis   EDTs   CSTis   CDTs   MSTiDs   MDTs   PSTis   PDTc      
   C   s)  |  i   }  |  d i d  p |  d i   t j o |  d =n; |  d i d  }
 |
 d j o |  d |
 d |  d <n t |   d j o< |  d i d  } t |  d j o | |  d }  q n t |   d j oW |  d } | i
 d  }
 |
 d j o  | |
  | |
 d g |  d )q5|  i d  n t |   d	 j  o t Sn |  d	  }  |  \ } } } } } | i   } | t j o1 | | i   f \ } } | t j o t Sqn t i |  d } | d
 j o | d
 8} n | d d j o | d  } n | i
 d  }
 |
 d j o | | f \ } } n | d d j o | d  } n | d i   o | | f \ } } n | d d j o | d  } n | i d  } t |  d j o | \ } } d } n+ t |  d j o | \ } } } n t Sy@ t |  } t |  } t |  } t |  } t |  } Wn t j
 o t Sn Xt } | i   } t i |  o t | } n' y t |  } Wn t j
 o n X| oF | d j  o d }	 | } n d }	 |	 | d d | d d } n | | | | | | d d d | f
 } | Sd S(   sQ   Convert a date string to a time tuple.

    Accounts for military timezones.
    i    s   ,i   i   s   -i   s   +s    i   i   is   :i   s   0id   i  i<   N(    s   datas   splits   endswiths   lowers	   _daynamess   rfinds   is   lens   stuffs   ss   finds   appends   Nones   dds   mms   yys   tms   tzs   _monthnamess   indexs   isdigits   thhs   tmms   tsss   ints
   ValueErrors   tzoffsets   uppers
   _timezoness   has_keys   tzsigns   tuple(   s   datas   tmms   tzs   tms   tsss   tuples   dds   yys   tzoffsets   tzsigns   is   mms   ss   stuffs   thh(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   parsedate_tz,   s     +
 

	"$c         C   s0   t  |   } t | t  o | d  Sn | Sd S(   s&   Convert a time string to a time tuple.i	   N(   s   parsedate_tzs   datas   ts
   isinstances	   TupleType(   s   datas   t(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys	   parsedate   s
     c         C   s^   |  d t j o t i |  d  d f  Sn. t i |  d  d f  } | |  d t i Sd S(   sC   Turn a 10-tuple as returned by parsedate_tz() into a UTC timestamp.i	   i   ii    N(   s   datas   Nones   times   mktimes   ts   timezone(   s   datas   t(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys	   mktime_tz   s
     c         C   s    |  i d d  i d d  Sd S(   s   Add quotes around a string.s   \s   \\s   "s   \"N(   s   strs   replace(   s   str(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   quote   s     s   AddrlistClassc           B   s   t  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 e
 d  Z d	   Z d
   Z d   Z e d  Z d   Z RS(   s   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 rfc822.AddressList instead.
    c         C   sl   d |  _ d |  _ d |  _ d |  _ |  i |  i |  i |  _ |  i i d d  |  _ | |  _ g  |  _	 d S(   s   Initialize a new instance.

        `field' is an unparsed address header field, containing
        one or more addresses.
        s   ()<>@,:;."[]i    s    	s   
s   .s    N(
   s   selfs   specialss   poss   LWSs   CRs   atomendss   replaces
   phraseendss   fields   commentlist(   s   selfs   field(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   __init__   s     					c         C   s   x |  i t |  i  j  og |  i |  i |  i d j o |  i d 7_ q |  i |  i d j o |  i i |  i    q Pq Wd S(   s*   Parse up to the start of the next address.s   
i   s   (N(   s   selfs   poss   lens   fields   LWSs   commentlists   appends
   getcomment(   s   self(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   gotonext   s      c         C   sc   g  } xR |  i t |  i  j  o8 |  i   } | o | | 7} q	 | i d d f  q	 W| Sd S(   sV   Parse all addresses.

        Returns a list containing all of the addresses.
        s    N(   s   results   selfs   poss   lens   fields
   getaddresss   ads   append(   s   selfs   results   ad(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   getaddrlist   s      c         C   s  g  |  _ |  i   |  i } |  i } |  i   } |  i   g  } |  i t	 |  i
  j o. | o# t i |  i  | d f g } qen|  i
 |  i d j o= | |  _ | |  _ |  i   } t i |  i  | f g } n|  i
 |  i d j o g  } t	 |  i
  } |  i d 7_ xK|  i t	 |  i
  j  oY |  i   |  i | j  o |  i
 |  i d j o |  i d 7_ Pn | |  i   } qWn |  i
 |  i d j of |  i   } |  i o4 t i |  d d i |  i  d	 | f g } qet i |  | f g } nX | o# t i |  i  | d f g } n. |  i
 |  i |  i j o |  i d 7_ n |  i   |  i t	 |  i
  j  o |  i
 |  i d
 j o |  i d 7_ n | Sd S(   s   Parse the next address.i    s   .@s   :i   s   ;s   <s    (s    s   )s   ,N(   s   selfs   commentlists   gotonexts   poss   oldposs   oldcls   getphraselists   plists
   returnlists   lens   fields   SPACEs   joins   getaddrspecs   addrspecs   fieldlens
   getaddresss   getrouteaddrs	   routeaddrs   specials(   s   selfs   addrspecs   oldcls   oldposs	   routeaddrs   fieldlens
   returnlists   plist(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys
   getaddress   sP     	
		
'		 
'
4#
0c         C   s3  |  i |  i d j o d Sn t } |  i d 7_ |  i   d } x |  i t |  i  j  o | o |  i   t } n |  i |  i d j o |  i d 7_ Pnw |  i |  i d j o |  i d 7_ t	 } nG |  i |  i d j o |  i d 7_ n |  i
   } |  i d 7_ P|  i   qG W| Sd S(   s   Parse a route address (Return-path value).

        This method just skips all the route stuff and returns the addrspec.
        s   <Ni   s    s   >s   @s   :(   s   selfs   fields   poss   Falses   expectroutes   gotonexts   adlists   lens	   getdomains   Trues   getaddrspec(   s   selfs   adlists   expectroute(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   getrouteaddr	  s2     
 


c         C   sX  g  } |  i   x |  i t |  i  j  o |  i |  i d j o  | i d  |  i d 7_ ne |  i |  i d j o | i d |  i    n3 |  i |  i |  i j o Pn | i |  i	    |  i   q W|  i t |  i  j p |  i |  i d j o t
 i |  Sn | i d  |  i d 7_ |  i   t
 i |  |  i   Sd S(   s   Parse an RFC 2822 addr-spec.s   .i   s   "s   "%s"s   @N(   s   aslists   selfs   gotonexts   poss   lens   fields   appends   getquotes   atomendss   getatoms   EMPTYSTRINGs   joins	   getdomain(   s   selfs   aslist(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   getaddrspec)  s(     
 0
c         C   s-  g  } x|  i t |  i  j  o |  i |  i |  i j o |  i d 7_ q	 |  i |  i d j o |  i i |  i    q	 |  i |  i d j o | i |  i	    q	 |  i |  i d j o  |  i d 7_ | i d  q	 |  i |  i |  i
 j o Pq	 | i |  i    q	 Wt i |  Sd S(   s-   Get the complete domain name from an address.i   s   (s   [s   .N(   s   sdlists   selfs   poss   lens   fields   LWSs   commentlists   appends
   getcomments   getdomainliterals   atomendss   getatoms   EMPTYSTRINGs   join(   s   selfs   sdlist(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys	   getdomainB  s"      c         C   s>  |  i |  i | j o d Sn d g } t } |  i d 7_ x |  i t |  i  j  o | o! | i |  i |  i  t } n |  i |  i | j o |  i d 7_ Pnn | o |  i |  i d j o | i |  i    n9 |  i |  i d j o
 t } n | i |  i |  i  |  i d 7_ q@ Wt i |  Sd S(   s  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.
        s    i   s   (s   \N(   s   selfs   fields   poss	   beginchars   slists   Falses   quotes   lens   appends   endcharss   allowcommentss
   getcomments   Trues   EMPTYSTRINGs   join(   s   selfs	   beginchars   endcharss   allowcommentss   slists   quote(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   getdelimitedU  s*     	 

c         C   s   |  i d d t  Sd S(   s1   Get a quote-delimited fragment from self's field.s   "s   "N(   s   selfs   getdelimiteds   False(   s   self(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   getquotey  s     c         C   s   |  i d d t  Sd S(   s7   Get a parenthesis-delimited fragment from self's field.s   (s   )N(   s   selfs   getdelimiteds   True(   s   self(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys
   getcomment}  s     c         C   s   d |  i d d t  Sd S(   s!   Parse an RFC 2822 domain-literal.s   [%s]s   [s   ]N(   s   selfs   getdelimiteds   False(   s   self(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   getdomainliteral  s     c         C   s   d g } | t j o |  i } n x` |  i t |  i  j  oF |  i |  i | j o Pn | i |  i |  i  |  i d 7_ q& Wt i	 |  Sd S(   s  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).s    i   N(
   s   atomlists   atomendss   Nones   selfs   poss   lens   fields   appends   EMPTYSTRINGs   join(   s   selfs   atomendss   atomlist(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   getatom  s     	 c         C   s   g  } x |  i t |  i  j  o |  i |  i |  i j o |  i d 7_ q	 |  i |  i d j o | i |  i    q	 |  i |  i d j o |  i i |  i	    q	 |  i |  i |  i
 j o Pq	 | i |  i |  i
   q	 W| Sd S(   s   Parse 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.
        i   s   "s   (N(   s   plists   selfs   poss   lens   fields   LWSs   appends   getquotes   commentlists
   getcomments
   phraseendss   getatom(   s   selfs   plist(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   getphraselist  s      (   s   __name__s
   __module__s   __doc__s   __init__s   gotonexts   getaddrlists
   getaddresss   getrouteaddrs   getaddrspecs	   getdomains   Trues   getdelimiteds   getquotes
   getcomments   getdomainliterals   Nones   getatoms   getphraselist(    (    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   AddrlistClass   s    		
		;	 		$			s   AddressListc           B   sM   t  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 RS(   s@   An AddressList encapsulates a list of parsed RFC 2822 addresses.c         C   s7   t  i |  |  | o |  i   |  _ n
 g  |  _ d  S(   N(   s   AddrlistClasss   __init__s   selfs   fields   getaddrlists   addresslist(   s   selfs   field(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   __init__  s    c         C   s   t  |  i  Sd  S(   N(   s   lens   selfs   addresslist(   s   self(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   __len__  s    c         C   sZ   t  t  } |  i | _ x6 | i D]+ } | |  i j o | i i |  q# q# W| Sd  S(   N(   s   AddressLists   Nones   newaddrs   selfs   addresslists   others   xs   append(   s   selfs   others   newaddrs   x(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   __add__  s    
 c         C   sA   x6 | i D]+ } | |  i j o |  i i |  q
 q
 W|  Sd  S(   N(   s   others   addresslists   xs   selfs   append(   s   selfs   others   x(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   __iadd__  s
    
 c         C   sM   t  t  } x6 |  i D]+ } | | i j o | i i |  q q W| Sd  S(   N(   s   AddressLists   Nones   newaddrs   selfs   addresslists   xs   others   append(   s   selfs   others   newaddrs   x(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   __sub__  s    
 c         C   s@   x5 | i D]* } | |  i j o |  i i |  q
 q
 W|  Sd  S(   N(   s   others   addresslists   xs   selfs   remove(   s   selfs   others   x(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   __isub__  s
    
 c         C   s   |  i | Sd  S(   N(   s   selfs   addresslists   index(   s   selfs   index(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   __getitem__  s    (
   s   __name__s
   __module__s   __doc__s   __init__s   __len__s   __add__s   __iadd__s   __sub__s   __isub__s   __getitem__(    (    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   AddressList  s    							(   s   __doc__s   times   typess	   TupleTypes   Trues   Falses	   NameErrors   SPACEs   EMPTYSTRINGs
   COMMASPACEs   _monthnamess	   _daynamess
   _timezoness   parsedate_tzs	   parsedates	   mktime_tzs   quotes   AddrlistClasss   AddressList(   s	   parsedates   AddressLists   AddrlistClasss   Falses   SPACEs   quotes	   _daynamess   EMPTYSTRINGs
   _timezoness   _monthnamess   times	   TupleTypes   Trues	   mktime_tzs   parsedate_tzs
   COMMASPACE(    (    s2   /usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys   ?   s(   	N		V			
	 