B ZqßHHô#ã@sÞdZddddgZddlZddlZdZdZd Zd d d d dddddddddddddddddddd gZd!d"d#d$d%d&d'gZddddd(d)d*d(d+d*d,d+d-d,d.œZ d/d„Z d0d1„Z d2d„Z d3d„Z d4d„ZGd5d6„d6ƒZGd7d8„d8eƒZdS)9zcEmail address parsing code. Lifted directly from rfc822.py. This should eventually be rewritten. Ú mktime_tzÚ parsedateÚ parsedate_tzÚquoteéNú Úz, ZjanZfebZmarZaprZmayZjunZjulZaugÚsepÚoctZnovZdecZjanuaryZfebruaryZmarchZaprilZjuneZjulyZaugustZ septemberZoctoberZnovemberZdecemberZmonZtueZwedZthuZfriZsatZsunipþÿÿiÔþÿÿi þÿÿi¨ýÿÿiDýÿÿiàüÿÿ)ZUTZUTCZGMTÚZZASTZADTZESTZEDTZCSTZCDTZMSTZMDTZPSTZPDTcCs,t|ƒ}|sdS|ddkr$d|d<t|ƒS)zQConvert a date string to a time tuple. Accounts for military timezones. Né r)Ú _parsedate_tzÚtuple)ÚdataZres©rú3/opt/alt/python37/lib/python3.7/email/_parseaddr.pyr-s  c CsÆ|sdS| ¡}|sdS|d d¡s6|d ¡tkr>|d=n.|d d¡}|dkrl|d|dd…|d<t|ƒdkr¢|d d¡}t|ƒdkr¢||dd…}t|ƒdkr|d}| d¡}|d krÔ| d¡}|dkrþ|d|…||d…g|dd…<n | d ¡t|ƒd krdS|dd …}|\}}}}}| ¡}|tkrb|| ¡}}|tkrbdSt  |¡d}|d kr‚|d 8}|d dkrœ|dd …}| d ¡}|dkrº||}}|d dkrÔ|dd …}|d  ¡sì||}}|d dkr|dd …}| d ¡}t|ƒdkr,|\} } d} n~t|ƒdkrF|\} } } ndt|ƒdkr¦d|dkr¦|d d¡}t|ƒdkrŒ|\} } d} nt|ƒdkrª|\} } } ndSy,t |ƒ}t |ƒ}t | ƒ} t | ƒ} t | ƒ} Wnt k rìdSX|dkr|dkr |d7}n|d7}d} |  ¡}|tkr4t|} n>y t |ƒ} Wnt k rVYnX| dkrr| d¡rrd} | r®| dkrŽd } | } nd} | | dd| dd} |||| | | ddd | 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éDiliÐié<)ÚsplitÚendswithÚlowerÚ _daynamesÚrfindÚlenÚfindÚappendÚ _monthnamesÚindexÚisdigitÚintÚ ValueErrorÚupperÚ _timezonesÚ startswith)rÚiZstuffÚsZddZmmZyyZtmZtzZthhZtmmZtssZtzoffsetZtzsignrrrr 9s°     "                       r cCs&t|ƒ}t|tƒr|dd…S|SdS)z&Convert a time string to a time tuple.Nr )rÚ isinstancer )rÚtrrrr°s  cCs<|ddkr"t |dd…d¡St |¡}||dSdS)zETurn a 10-tuple as returned by parsedate_tz() into a POSIX timestamp.r Né)r)ÚtimeZmktimeÚcalendarZtimegm)rr4rrrr¹s  cCs| dd¡ dd¡S)zøPrepare 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)ÚstrrrrrÃsc@s|eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z ddd„Z dd„Z dd„Z dd„Zddd„Zdd„ZdS) Ú AddrlistClassaAddress 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. cCsZd|_d|_d|_d|_|j|j|_|j|j|j|_|j dd¡|_||_g|_ dS)zƒInitialize a new instance. `field' is an unparsed address header field, containing one or more addresses. z ()<>@,:;."[]rz z rrN) ÚspecialsÚposÚLWSZCRÚFWSÚatomendsr:Ú phraseendsÚfieldÚ commentlist)ÚselfrCrrrÚ__init__×szAddrlistClass.__init__cCsg}x€|jt|jƒkr„|j|j|jdkr^|j|jdkrN| |j|j¡|jd7_q|j|jdkr€|j | ¡¡qPqWt |¡S)z&Skip white space and extract comments.z rú() r>r&rCr?r(rDÚ getcommentÚ EMPTYSTRINGÚjoin)rEZwslistrrrÚgotonextêszAddrlistClass.gotonextcCs>g}x4|jt|jƒkr8| ¡}|r,||7}q| d¡qW|S)zVParse all addresses. Returns a list containing all of the addresses. )rr)r>r&rCÚ getaddressr()rEÚresultZadrrrÚ getaddrlistøs zAddrlistClass.getaddrlistcCsøg|_| ¡|j}|j}| ¡}| ¡g}|jt|jƒkr\|rXt |j¡|dfg}n^|j|jdkr–||_||_| ¡}t |j¡|fg}n$|j|jdkr g}t|jƒ}|jd7_xô|jt|jƒkr| ¡|j|kr|j|jdkr|jd7_P||  ¡}qÆWnš|j|jdkrz|  ¡}|jrht |¡dd |j¡d |fg}nt |¡|fg}n@|r˜t |j¡|dfg}n"|j|j|j krº|jd7_| ¡|jt|jƒkrô|j|jd krô|jd7_|S) zParse the next address.rz.@rrú;úÚ getphraselistr&rCÚSPACErJÚ getaddrspecrLÚ getrouteaddrr=)rEZoldposZoldclÚplistZ returnlistZaddrspecZfieldlenZ routeaddrrrrrLsL &$zAddrlistClass.getaddresscCsä|j|jdkrdSd}|jd7_| ¡d}x¬|jt|jƒkrÞ|rV| ¡d}n~|j|jdkrx|jd7_Pn\|j|jdkrœ|jd7_d}n8|j|jd kr¼|jd7_n| ¡}|jd7_P| ¡q4W|S) zParse a route address (Return-path value). This method just skips all the route stuff and returns the addrspec. rPNFrrú>ú@Tr)rCr>rKr&Ú getdomainrT)rEZ expectrouteZadlistrrrrUAs. zAddrlistClass.getrouteaddrcCsXg}| ¡xÜ|jt|jƒkrèd}|j|jdkrh|rJ|d ¡sJ| ¡| d¡|jd7_d}nd|j|jdkr| dt| ¡ƒ¡n<|j|j|j kr¾|rº|d ¡sº| ¡Pn| |  ¡¡| ¡}|r|r| |¡qW|jt|jƒks|j|jdkrt   |¡S| d¡|jd7_| ¡|  ¡}|sJt St   |¡|S) zParse an RFC 2822 addr-spec.TrrrFr9z"%s"rX)rKr>r&rCÚstripÚpopr(rÚgetquoterAÚgetatomrIrJrY)rEZaslistZ preserve_wsZwsZdomainrrrrTas: $  zAddrlistClass.getaddrspeccCsêg}xÚ|jt|jƒkrÞ|j|j|jkr8|jd7_q|j|jdkrZ|j | ¡¡q|j|jdkrz| | ¡¡q|j|jdkr¤|jd7_| d¡q|j|jdkr¸tS|j|j|j krÎPq| |  ¡¡qWt  |¡S)z-Get the complete domain name from an address.rrGú[rrX) r>r&rCr?rDr(rHÚgetdomainliteralrIrAr]rJ)rEZsdlistrrrrY‡s" zAddrlistClass.getdomainTcCsæ|j|j|krdSdg}d}|jd7_x®|jt|jƒkrÚ|rZ| |j|j¡d}np|j|j|kr||jd7_PnN|r¢|j|jdkr¢| | ¡¡q.n(|j|jdkr¸d}n| |j|j¡|jd7_q.Wt |¡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. rFrrGr8T)rCr>r&r(rHrIrJ)rEZ begincharZendcharsZ allowcommentsZslistrrrrÚ getdelimitedžs( zAddrlistClass.getdelimitedcCs| ddd¡S)z1Get a quote-delimited fragment from self's field.r9z" F)r`)rErrrr\ÃszAddrlistClass.getquotecCs| ddd¡S)z7Get a parenthesis-delimited fragment from self's field.rGz) T)r`)rErrrrHÇszAddrlistClass.getcommentcCsd| ddd¡S)z!Parse an RFC 2822 domain-literal.z[%s]r^z] F)r`)rErrrr_ËszAddrlistClass.getdomainliteralNcCshdg}|dkr|j}xH|jt|jƒkr\|j|j|kr:Pn| |j|j¡|jd7_qWt |¡S)aParse 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).rNr)rAr>r&rCr(rIrJ)rErAZatomlistrrrr]ÏszAddrlistClass.getatomcCsªg}x |jt|jƒkr¤|j|j|jkr8|jd7_q|j|jdkrX| | ¡¡q|j|jdkrz|j | ¡¡q|j|j|jkrPq| |  |j¡¡qW|S)zý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. rr9rG) r>r&rCr@r(r\rDrHrBr])rErVrrrrRãszAddrlistClass.getphraselist)T)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__rFrKrNrLrUrTrYr`r\rHr_r]rRrrrrr<Ís; & % r<c@sHeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dS)Ú AddressListz@An AddressList encapsulates a list of parsed RFC 2822 addresses.cCs&t ||¡|r| ¡|_ng|_dS)N)r<rFrNÚ addresslist)rErCrrrrFüs  zAddressList.__init__cCs t|jƒS)N)r&rf)rErrrÚ__len__szAddressList.__len__cCsBtdƒ}|jdd…|_x$|jD]}||jkr |j |¡q W|S)N)rerfr()rEÚotherÚnewaddrÚxrrrÚ__add__s   zAddressList.__add__cCs*x$|jD]}||jkr|j |¡qW|S)N)rfr()rErhrjrrrÚ__iadd__s  zAddressList.__iadd__cCs2tdƒ}x$|jD]}||jkr|j |¡qW|S)N)rerfr()rErhrirjrrrÚ__sub__s   zAddressList.__sub__cCs*x$|jD]}||jkr|j |¡qW|S)N)rfÚremove)rErhrjrrrÚ__isub__s  zAddressList.__isub__cCs |j|S)N)rf)rEr*rrrÚ __getitem__%szAddressList.__getitem__N) rarbrcrdrFrgrkrlrmrorprrrrreús re)rdÚ__all__r6r7rSrIZ COMMASPACEr)r$r/rr rrrr<rerrrrÚs8   w   /