; & ?c@sdZdkZdklZyeefWnej odZdZnXdZdZdZ dd d d d d ddddddddddd dddddddgZ dd d!d"d#d$d%gZ hd&d<d'd<d(d<d)d<d*d+<d,d-<d.d/<d0d+<d1d2<d3d/<d4d5<d6d2<d7d8<d9d5fd?YZd@efdAYZdS(BscEmail address parsing code. Lifted directly from rfc822.py. This should eventually be rewritten. N(s TupleTypeiis ss, sjansfebsmarsaprsmaysjunsjulsaugssepsoctsnovsdecsjanuarysfebruarysmarchsaprilsjunesjulysaugusts septembersoctobersnovembersdecembersmonstueswedsthusfrissatssunsUTsUTCsGMTsZsASTipsADTisESTi sEDTsCSTisCDTsMSTiDsMDTsPSTisPDTc Cs)|i}|didp|ditjo |d=n;|did} | djo|d| d|d@,:;."[]is s s.sN( sselfsspecialsspossLWSsCRsatomendssreplaces phraseendssfields commentlist(sselfsfield((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys__init__s     cCsx|it|ijog|i|i|idjo|id7_q|i|idjo|ii|iqPqWdS(s*Parse up to the start of the next address.s is(N(sselfsposslensfieldsLWSs commentlistsappends getcomment(sself((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pysgotonextscCscg}xR|it|ijo8|i}|o||7}q |iddfq W|SdS(sVParse all addresses. Returns a list containing all of the addresses. sN(sresultsselfsposslensfields getaddresssadsappend(sselfsresultsad((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys getaddrlists cCsg|_|i|i}|i}|i}|ig}|it |i jo.|o#t i |i|dfg}qen|i |idjo=||_||_|i }t i |i|fg}n|i |idjog}t |i }|id7_xK|it |i joY|i|i|jo|i |idjo|id7_Pn||i}qWn|i |idjof|i}|io4t i |ddi |id |fg}qet i ||fg}nX|o#t i |i|dfg}n.|i |i|ijo|id7_n|i|it |i jo|i |id jo|id7_n|Sd S( sParse the next address.is.@s:is;ss@s:( sselfsfieldspossFalses expectroutesgotonextsadlistslens getdomainsTrues getaddrspec(sselfsadlists expectroute((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys getrouteaddr s2     cCsXg}|ix|it|ijo|i|idjo |id|id7_ne|i|idjo|id|in3|i|i|ijoPn|i|i |iqW|it|ijp|i|idjot i |Sn|id|id7_|it i ||i SdS(sParse an RFC 2822 addr-spec.s.is"s"%s"s@N( saslistsselfsgotonextsposslensfieldsappendsgetquotesatomendssgetatoms EMPTYSTRINGsjoins getdomain(sselfsaslist((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys getaddrspec)s(  0  cCs-g}x|it|ijo|i|i|ijo|id7_q |i|idjo|ii|iq |i|idjo|i|i q |i|idjo |id7_|idq |i|i|i joPq |i|i q Wt i |SdS(s-Get the complete domain name from an address.is(s[s.N(ssdlistsselfsposslensfieldsLWSs commentlistsappends getcommentsgetdomainliteralsatomendssgetatoms EMPTYSTRINGsjoin(sselfssdlist((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys getdomainBs"cCs>|i|i|jodSndg}t}|id7_x|it|ijo|o!|i|i|it}n|i|i|jo|id7_Pnn|o|i|idjo|i|i n9|i|idjo t }n|i|i|i|id7_q@Wt i|SdS(sParse 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. sis(s\N(sselfsfieldsposs begincharsslistsFalsesquoteslensappendsendcharss allowcommentss getcommentsTrues EMPTYSTRINGsjoin(sselfs begincharsendcharss allowcommentssslistsquote((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys getdelimitedUs*    cCs|iddtSdS(s1Get a quote-delimited fragment from self's field.s"s" N(sselfs getdelimitedsFalse(sself((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pysgetquoteyscCs|iddtSdS(s7Get a parenthesis-delimited fragment from self's field.s(s) N(sselfs getdelimitedsTrue(sself((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys getcomment}scCsd|iddtSdS(s!Parse an RFC 2822 domain-literal.s[%s]s[s] N(sselfs getdelimitedsFalse(sself((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pysgetdomainliteralscCsdg}|tjo |i}nx`|it|ijoF|i|i|joPn|i|i|i|id7_q&Wti |SdS(sParse 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).siN( satomlistsatomendssNonesselfsposslensfieldsappends EMPTYSTRINGsjoin(sselfsatomendssatomlist((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pysgetatoms   cCsg}x|it|ijo|i|i|ijo|id7_q |i|idjo|i|iq |i|idjo|ii|i q |i|i|i joPq |i|i |i q W|SdS(sParse 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. is"s(N( splistsselfsposslensfieldsLWSsappendsgetquotes commentlists getcomments phraseendssgetatom(sselfsplist((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys getphraselists(s__name__s __module__s__doc__s__init__sgotonexts getaddrlists getaddresss getrouteaddrs getaddrspecs getdomainsTrues getdelimitedsgetquotes getcommentsgetdomainliteralsNonesgetatoms getphraselist(((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys AddrlistClasss    ;   $    s AddressListcBsMtZdZdZdZdZdZdZdZdZ RS(s@An AddressList encapsulates a list of parsed RFC 2822 addresses.cCs7ti|||o|i|_n g|_dS(N(s AddrlistClasss__init__sselfsfields getaddrlists addresslist(sselfsfield((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys__init__scCst|iSdS(N(slensselfs addresslist(sself((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys__len__scCsZtt}|i|_x6|iD]+}||ij o|ii|q#q#W|SdS(N(s AddressListsNonesnewaddrsselfs addresslistsothersxsappend(sselfsothersnewaddrsx((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys__add__s   cCsAx6|iD]+}||ij o|ii|q q W|SdS(N(sothers addresslistsxsselfsappend(sselfsothersx((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys__iadd__s  cCsMtt}x6|iD]+}||ij o|ii|qqW|SdS(N(s AddressListsNonesnewaddrsselfs addresslistsxsothersappend(sselfsothersnewaddrsx((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys__sub__s   cCs@x5|iD]*}||ijo|ii|q q W|SdS(N(sothers addresslistsxsselfsremove(sselfsothersx((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys__isub__s  cCs|i|SdS(N(sselfs addresslistsindex(sselfsindex((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 AddressLists      (s__doc__stimestypess TupleTypesTruesFalses NameErrorsSPACEs EMPTYSTRINGs COMMASPACEs _monthnamess _daynamess _timezoness parsedate_tzs parsedates mktime_tzsquotes AddrlistClasss AddressList(s parsedates AddressLists AddrlistClasssFalsesSPACEsquotes _daynamess EMPTYSTRINGs _timezoness _monthnamesstimes TupleTypesTrues mktime_tzs parsedate_tzs COMMASPACE((s2/usr/pkg/lib/mailman/pythonlib/email/_parseaddr.pys?s(   N V