a i @sddlZddlZddlZddlmZddlmZddlmZ ddlm Z ddlm Z e dZ e e dBZe d Zee BZee d Zee d Zee d Be d Zee BZee d BZee BZee dZddhZeeBZddZddZedejejBZGddde Z!Gddde!Z"Gddde!Z#Gddde!Z$Gddde!Z%Gd d!d!e"Z&Gd"d#d#e!Z'Gd$d%d%e!Z(Gd&d'd'e!Z)Gd(d)d)e!Z*Gd*d+d+e*Z+Gd,d-d-e"Z,Gd.d/d/e!Z-Gd0d1d1e!Z.Gd2d3d3e!Z/Gd4d5d5e!Z0Gd6d7d7e!Z1Gd8d9d9e!Z2Gd:d;d;e!Z3Gdd?d?e!Z5Gd@dAdAe!Z6GdBdCdCe!Z7GdDdEdEe!Z8GdFdGdGe!Z9GdHdIdIe!Z:GdJdKdKe!Z;GdLdMdMe!ZGdRdSdSe!Z?GdTdUdUe!Z@GdVdWdWe!ZAGdXdYdYeAZBGdZd[d[e!ZCGd\d]d]e!ZDGd^d_d_e!ZEGd`dadae!ZFGdbdcdce!ZGGdddedeeGZHGdfdgdgeGZIGdhdidie!ZJGdjdkdke!ZKGdldmdme!ZLGdndodoeLZMGdpdqdqeMZNGdrdsdse!ZOGdtduduePZQGdvdwdweQZRGdxdydyeQZSGdzd{d{eRZTGd|d}d}e jUZVeSd d~ZWeSddZXeSddZYedZd[e j\Z]edZe^d[ej_Z`edjaZbedZe^d[ej_ZcedZe^d[ej_ZdedZe^d[ej_ZeddZfddZgddZhdddZiddZjddZkddZlddZmddZnddZoddZpddZqddZrddZsddZtddZuddZvddZwddZxddZyddZzddZ{ddZ|ddZ}ddZ~ddZddZddZddZddÄZddńZddDŽZddɄZdd˄Zdd̈́ZddτZddфZddӄZddՄZddׄZddلZddۄZdd݄Zdd߄ZddZddZddZddZddZddZddZddZddZddZddZddZddZddZdS)N) hexdigits) itemgetter)_encoded_words)errors)utilsz (z ()<>@,:;.\"[].z."(z/?=z*'%%  cCst|ddddS)N\\\"z\")strreplacevaluer2/usr/lib64/python3.9/email/_header_value_parser.pymake_quoted_pairscsrcCst|}d|dS)Nr)r)rescapedrrr quote_stringhsrz =\? # literal =? [^?]* # charset \? # literal ? [qQbB] # literal 'q' or 'b', case insensitive \? # literal ? .*? # encoded word \?= # literal ?= cseZdZdZdZdZfddZddZfddZe d d Z e d d Z d dZ e ddZ e ddZddZdddZdddZdddZZS) TokenListNTcstj|i|g|_dSN)super__init__defects)selfargskw __class__rrrszTokenList.__init__cCsddd|DS)Ncss|]}t|VqdSrr.0xrrr z$TokenList.__str__..joinrrrr__str__szTokenList.__str__csd|jjtSNz{}({})formatr!__name__r__repr__r+r rrr1s zTokenList.__repr__cCsddd|DS)Nr"css|]}|jr|jVqdSrrr$rrrr'r(z"TokenList.value..r)r+rrrrszTokenList.valuecCstdd|D|jS)Ncss|] }|jVqdSr) all_defectsr$rrrr'r(z(TokenList.all_defects..)sumrr+rrrr2szTokenList.all_defectscCs |dSNr)startswith_fwsr+rrrr5szTokenList.startswith_fwscCstdd|DS)Ncss|] }|jVqdSr) as_ew_allowed)r%partrrrr'r(z*TokenList.as_ew_allowed..)allr+rrrr6szTokenList.as_ew_allowedcCsg}|D]}||jq|Sr)extendcomments)rr:tokenrrrr:szTokenList.commentscCs t||dS)Npolicy)_refold_parse_treerr=rrrfoldszTokenList.foldr"cCst|j|ddS)Nindent)printppstrrrBrrrpprintszTokenList.pprintcCsd|j|dS)Nr rA)r*_pprErrrrDszTokenList.ppstrccszd||jj|jV|D]4}t|ds:|d|Vq||dEdHq|jrdd|j}nd}d||VdS)Nz{}{}/{}(rGz* !! invalid element in token list: {!r}z z Defects: {}r"z{}){})r/r!r0 token_typehasattrrGr)rrBr;extrarrrrGs  z TokenList._pp)r")r")r")r0 __module__ __qualname__rHsyntactic_breakew_combine_allowedrr,r1propertyrr2r5r6r:r@rFrDrG __classcell__rrr rr}s&        rc@s$eZdZeddZeddZdS)WhiteSpaceTokenListcCsdSN rr+rrrrszWhiteSpaceTokenList.valuecCsdd|DS)NcSsg|]}|jdkr|jqS)comment)rHcontentr$rrr r(z0WhiteSpaceTokenList.comments..rr+rrrr:szWhiteSpaceTokenList.commentsN)r0rKrLrOrr:rrrrrQs rQc@seZdZdZdS)UnstructuredTokenList unstructuredNr0rKrLrHrrrrrWsrWc@seZdZdZdS)PhrasephraseNrYrrrrrZsrZc@seZdZdZdS)WordZwordNrYrrrrr\sr\c@seZdZdZdS)CFWSListcfwsNrYrrrrr]sr]c@seZdZdZdS)AtomatomNrYrrrrr_sr_c@seZdZdZdZdS)Tokenr;FN)r0rKrLrHZ encode_as_ewrrrrrasrac@seZdZdZdZdZdZdS) EncodedWord encoded-wordN)r0rKrLrHctecharsetlangrrrrrbsrbc@s4eZdZdZeddZeddZeddZdS) QuotedString quoted-stringcCs"|D]}|jdkr|jSqdSNbare-quoted-stringrHrrr&rrrrUs zQuotedString.contentcCs>g}|D]*}|jdkr&|t|q||jqd|S)Nrjr")rHappendrrr*)rresr&rrr quoted_values  zQuotedString.quoted_valuecCs"|D]}|jdkr|jSqdSrirkrr;rrrstripped_values zQuotedString.stripped_valueN)r0rKrLrHrOrUrorqrrrrrgs  rgc@s$eZdZdZddZeddZdS)BareQuotedStringrjcCstddd|DS)Nr"css|]}t|VqdSrr#r$rrrr' r(z+BareQuotedString.__str__..)rr*r+rrrr, szBareQuotedString.__str__cCsddd|DS)Nr"css|]}t|VqdSrr#r$rrrr'r(z)BareQuotedString.value..r)r+rrrr szBareQuotedString.valueN)r0rKrLrHr,rOrrrrrrrsrrc@s8eZdZdZddZddZeddZedd Zd S) CommentrTcs(dtdgfddDdgggS)Nr"rcsg|]}|qSr)quoter$r+rrrVr(z#Comment.__str__..))r*r3r+rr+rr,szComment.__str__cCs2|jdkrt|St|ddddddS)NrTr r rz\(ruz\))rHrr)rrrrrrts z Comment.quotecCsddd|DS)Nr"css|]}t|VqdSrr#r$rrrr'%r(z"Comment.content..r)r+rrrrU#szComment.contentcCs|jgSr)rUr+rrrr:'szComment.commentsN) r0rKrLrHr,rtrOrUr:rrrrrss rsc@s4eZdZdZeddZeddZeddZdS) AddressListz address-listcCsdd|DS)NcSsg|]}|jdkr|qS)addressrHr$rrrrV1r(z)AddressList.addresses..rr+rrr addresses/szAddressList.addressescCstdd|DgS)Ncss|]}|jdkr|jVqdSrwNrH mailboxesr$rrrr'5s z(AddressList.mailboxes..r3r+rrrr|3s zAddressList.mailboxescCstdd|DgS)Ncss|]}|jdkr|jVqdSrzrH all_mailboxesr$rrrr':s z,AddressList.all_mailboxes..r}r+rrrr8s zAddressList.all_mailboxesN)r0rKrLrHrOryr|rrrrrrv+s  rvc@s4eZdZdZeddZeddZeddZdS) AddressrwcCs|djdkr|djSdS)NrgrouprH display_namer+rrrrBszAddress.display_namecCs4|djdkr|dgS|djdkr*gS|djSNrmailboxinvalid-mailboxr{r+rrrr|Gs  zAddress.mailboxescCs:|djdkr|dgS|djdkr0|dgS|djSrr~r+rrrrOs   zAddress.all_mailboxesN)r0rKrLrHrOrr|rrrrrr>s  rc@s(eZdZdZeddZeddZdS) MailboxList mailbox-listcCsdd|DS)NcSsg|]}|jdkr|qS)rrxr$rrrrV]r(z)MailboxList.mailboxes..rr+rrrr|[szMailboxList.mailboxescCsdd|DS)NcSsg|]}|jdvr|qS))rrrxr$rrrrVas z-MailboxList.all_mailboxes..rr+rrrr_szMailboxList.all_mailboxesNr0rKrLrHrOr|rrrrrrWs  rc@s(eZdZdZeddZeddZdS) GroupList group-listcCs |r|djdkrgS|djSNrrr{r+rrrr|iszGroupList.mailboxescCs |r|djdkrgS|djSrr~r+rrrroszGroupList.all_mailboxesNrrrrrres  rc@s4eZdZdZeddZeddZeddZdS) GrouprcCs|djdkrgS|djSNrr{r+rrrr|zszGroup.mailboxescCs|djdkrgS|djSrr~r+rrrrszGroup.all_mailboxescCs |djSr4)rr+rrrrszGroup.display_nameN)r0rKrLrHrOr|rrrrrrrvs  rc@sLeZdZdZeddZeddZeddZedd Zed d Z d S) NameAddr name-addrcCst|dkrdS|djSNr)lenrr+rrrrs zNameAddr.display_namecCs |djSN local_partr+rrrrszNameAddr.local_partcCs |djSrdomainr+rrrrszNameAddr.domaincCs |djSr)router+rrrrszNameAddr.routecCs |djSr addr_specr+rrrrszNameAddr.addr_specN r0rKrLrHrOrrrrrrrrrrs    rc@s@eZdZdZeddZeddZeddZedd Zd S) AngleAddrz angle-addrcCs"|D]}|jdkr|jSqdSN addr-spec)rHrrlrrrrs zAngleAddr.local_partcCs"|D]}|jdkr|jSqdSrrHrrlrrrrs zAngleAddr.domaincCs"|D]}|jdkr|jSqdS)N obs-route)rHdomainsrlrrrrs zAngleAddr.routecCs<|D]2}|jdkr|jr"|jSt|j|jSqdS)Nrz<>)rHrrrrlrrrrs   zAngleAddr.addr_specN) r0rKrLrHrOrrrrrrrrrs   rc@seZdZdZeddZdS)ObsRoutercCsdd|DS)NcSsg|]}|jdkr|jqSrrr$rrrrVr(z$ObsRoute.domains..rr+rrrrszObsRoute.domainsN)r0rKrLrHrOrrrrrrsrc@sLeZdZdZeddZeddZeddZedd Zed d Z d S) MailboxrcCs|djdkr|djSdSNrrrr+rrrrszMailbox.display_namecCs |djSr4rr+rrrrszMailbox.local_partcCs |djSr4rr+rrrrszMailbox.domaincCs|djdkr|djSdSr)rHrr+rrrrsz Mailbox.routecCs |djSr4rr+rrrrszMailbox.addr_specNrrrrrrs    rc@s,eZdZdZeddZeZZZZ dS)InvalidMailboxrcCsdSrrr+rrrrszInvalidMailbox.display_nameNrrrrrrs rcs(eZdZdZdZefddZZS)DomainrFcsdtjSNr"r*rrsplitr+r rrrsz Domain.domain)r0rKrLrHr6rOrrPrrr rrsrc@seZdZdZdS)DotAtomdot-atomNrYrrrrrsrc@seZdZdZdZdS) DotAtomTextz dot-atom-textTNr0rKrLrHr6rrrrrsrc@seZdZdZdZdS) NoFoldLiteralzno-fold-literalFNrrrrrr src@sDeZdZdZdZeddZeddZeddZed d Z d S) AddrSpecrFcCs |djSr4rr+rrrrszAddrSpec.local_partcCst|dkrdS|djS)Nr)rrr+rrrrs zAddrSpec.domaincCs<t|dkr|djS|dj|dj|djS)Nrrrr)rrrstriplstripr+rrrrs  zAddrSpec.valuecCsLt|j}t|t|tkr*t|j}n|j}|jdurH|d|jS|S)N@)setrr DOT_ATOM_ENDSrr)rZnamesetZlprrrr$s   zAddrSpec.addr_specN) r0rKrLrHr6rOrrrrrrrrrs   rc@seZdZdZdZdS) ObsLocalPartzobs-local-partFNrrrrrr0srcs4eZdZdZdZeddZefddZZS) DisplayNamez display-nameFcCst|}t|dkr|jS|djdkr4|dn*|ddjdkr^t|ddd|d<|djdkrv|n*|ddjdkrt|ddd|d<|jS)Nrr^rr)rrrrHpop)rrnrrrr;s   zDisplayName.display_namecsd}|jrd}n|D]}|jdkrd}qt|dkr|rd}}|djdks`|ddjdkrdd}|djdks|ddjdkrd}|t|j|StjSdS) NFTrhrr"r^rSr)rrHrrrrr)rrtr&preZpostr rrrLs   zDisplayName.value) r0rKrLrHrNrOrrrPrrr rr6s  rc@s,eZdZdZdZeddZeddZdS) LocalPartz local-partFcCs&|djdkr|djS|djSdS)Nrrh)rHrorr+rrrres zLocalPart.valuecCstg}t}d}|dtgD]}|jdkr,q|r\|jdkr\|djdkr\t|dd|d<t|t}|r|jdkr|djdkr|t|ddn |||d}|}qt|dd}|jS)NFrr^dotrr)DOTrHr isinstancermr)rrnlastZ last_is_tltokZis_tlrrrrls(     zLocalPart.local_partN)r0rKrLrHr6rOrrrrrrr`s  rcs4eZdZdZdZefddZeddZZS) DomainLiteralzdomain-literalFcsdtjSrrr+r rrrszDomainLiteral.domaincCs"|D]}|jdkr|jSqdS)Nptextrkrlrrrips zDomainLiteral.ip) r0rKrLrHr6rOrrrPrrr rrs rc@seZdZdZdZdZdS) MIMEVersionz mime-versionN)r0rKrLrHmajorminorrrrrrsrc@s4eZdZdZdZdZdZeddZeddZ dS) Parameter parameterFus-asciicCs|jr|djSdSr) sectionednumberr+rrrsection_numberszParameter.section_numbercCsf|D]\}|jdkr|jS|jdkr|D]4}|jdkr*|D] }|jdkr<|jSqt|}|r|jt|t|r:|jtddS)Nz*Non-ASCII characters found in header token)_non_printable_finderrrmrZNonPrintableDefectrrr)xtextZnon_printablesrrr_validate_xtexts  rcCst|d^}}g}d}d}tt|D]L}||dkrJ|rDd}d}nd}q&|rTd}n|||vrdq||||q&|d}d|d||dg||fS)NrFr Tr") _wsp_splitterrangerrmr*)rendcharsfragment remainderZvcharsescapehad_qpposrrr_get_ptext_to_endcharss$   rcCs.|}t|dt|t|d}||fS)Nfws)rr r)rZnewvaluerrrrget_fws srvtextc Cst}|ds td||dddd^}}||ddkrXtd|d|}t|dkr|dtvr|dtvr| ddkr|dd^}}|d|}t|dkr|j t d ||_ d|}ztd|d\}}} } Wn(ttfy(td |j Yn0||_| |_|j | |r|dtvrpt|\} }| | qBt|d^} }t| |} t| | | d|}qB|r|dtvr|j t d ||fS) N=?z"expected encoded word but found {}rz?=rr"r?zwhitespace inside encoded wordz!encoded word format invalid: '{}'z.missing trailing whitespace after encoded-word)rb startswithrHeaderParseErrorr/rr*rrcountrrmrrd_ewr ValueErrorKeyErrorrrerfr9WSPrrr r)rZ terminal_typeZewrrZremstrrestrrerfrr;charsrrrrget_encoded_wordsd                r+cCsDt}|r@|dtvr0t|\}}||qd}|drzt|d\}}Wn(tyfd}YntjyxYnr0d}t |dkr|dj dkr|j t dd}|rt |d kr|d j d krt |dd|d<||qt|d ^}}|rt|r|d^}}t|d}t|||d |}q|S) NrTr ZutextFrrz&missing whitespace before encoded wordrrcr")rWr(rrmr"r+rrr#rrHrrr rrfc2047_matchersearch partitionr rr*)rrXr;valid_ewZhave_wsrrrrrrget_unstructuredIsH           r1cCs*t|d\}}}t|d}t|||fS)Nz()r)rr rrr_rrr get_qp_ctexts  r4cCs*t|d\}}}t|d}t|||fS)Nrr)rr rr2rrr get_qcontents  r5cCsNt|}|std||}|t|d}t|d}t|||fS)Nzexpected atext but found '{}'atext)_non_atom_end_matcherrr#r/rrr r)rmr6rrr get_atexts r9cCsp|ddkrtd|t}|dd}|rT|ddkrTt|\}}|||r@|ddkr@|dtvrt|\}}n|dddkr(d}z&t|\}}|j t dd }Wn tjyt|\}}Yn0|r4t |dkr4|d j d kr4|d j d kr4t |d d |d <n t|\}}||qT|s`|j t d||fS||ddfS)Nrrzexpected '"' but found '{}'rrr Fz!encoded word inside quoted stringTrrr,rcz"end of header inside quoted string)rr#r/rrr5rmr(rr+rrrrHr )rZbare_quoted_stringr;r0rrrget_bare_quoted_stringsJ            r:cCs|r |ddkr td|t}|dd}|r|ddkr|dtvr\t|\}}n&|ddkrvt|\}}n t|\}}||q2|s|j t d||fS||ddfS)Nrrzexpected '(' but found '{}'rruzend of header inside comment) rr#r/rsr(r get_commentr4rmrr)rrTr;rrrr;s&      r;cCsPt}|rH|dtvrH|dtvr0t|\}}n t|\}}||q||fSr4)r] CFWS_LEADERr(rr;rm)rr^r;rrrget_cfwss   r=cCspt}|r,|dtvr,t|\}}||t|\}}|||rh|dtvrht|\}}||||fSr4)rgr<r=rmr:)rZ quoted_stringr;rrrget_quoted_string s      r>cCst}|r,|dtvr,t|\}}|||rL|dtvrLtd||drzt |\}}Wqtjyt |\}}Yq0n t |\}}|||r|dtvrt|\}}||||fS)Nrzexpected atom but found '{}'r ) r_r<r=rm ATOM_ENDSrr#r/r"r+r9)rr`r;rrrget_atoms&       r@cCst}|r|dtvr&td||rt|dtvrtt|\}}|||r&|ddkr&|t|dd}q&|dturtdd|||fS)Nrz8expected atom at a start of dot-atom-text but found '{}'rrrz4expected atom at end of dot-atom-text but found '{}')rr?rr#r/r9rmr)rZ dot_atom_textr;rrrget_dot_atom_text:s     rAcCst}|dtvr(t|\}}|||drfzt|\}}Wqrtjybt|\}}Yqr0n t|\}}|||r|dtvrt|\}}||||fS)Nrr ) rr<r=rmr"r+rr#rA)rZdot_atomr;rrr get_dot_atomMs        rBcCs|dtvrt|\}}nd}|s,td|ddkrFt|\}}n*|dtvrdtd|n t|\}}|dur|g|dd<||fS)Nrz5Expected 'atom' or 'quoted-string' but found nothing.rz1Expected 'atom' or 'quoted-string' but found '{}')r<r=rr#r>SPECIALSr/r@)rleaderr;rrrget_wordfs"    rEcCst}zt|\}}||Wn&tjyF|jtdYn0|r|dtvr|ddkr|t|jt d|dd}qHzt|\}}WnBtjy|dt vrt |\}}|jt dnYn0||qH||fS)Nzphrase does not start with wordrrzperiod in 'phrase'rzcomment found without atom) rZrErmrr#rr PHRASE_ENDSrObsoleteHeaderDefectr<r=)rr[r;rrr get_phrases4           rHc Cspt}d}|dtvr"t|\}}|s6td|zt|\}}WnZtjyzt|\}}Wn4tjy|ddkr|dtvrt }Yn0Yn0|dur|g|dd<| ||r0|ddks|dtvr0t t ||\}}|j dkr|j tdn|j td||d<z|jdWn&tyf|j tdYn0||fS) Nrz"expected local-part but found '{}'r invalid-obs-local-partz|ddkr>|t|dd}|sq>|dtvrt|\}}|||ddkr|tt |dd\}}||q|sNtd|ddkrltd||t dd ||ddfS) Nrrrrz(expected obs-route domain but found '{}'z%end of header while parsing obs-route:z4expected ':' marking end of obs-route but found '{}'zend-of-obs-route-marker) rr<r=rm ListSeparatorrr#r/RouteComponentMarkerrWr )rZ obs_router;rrr get_obs_route}sF               r]c Cst}|dtvr(t|\}}|||r8|ddkrHtd||tdd|dd}|ddkr|tdd|jt d|dd}||fSzt |\}}Wnvtjy,z"t |\}}|jt d Wn&tjytd |Yn0||t |\}}Yn0|||rZ|ddkrZ|dd}n|jt d |tdd|r|dtvrt|\}}||||fS) Nrzangle-addr-endznull addr-spec in angle-addrz*obsolete route specification in angle-addrz.expected addr-spec or obs-route but found '{}'z"missing trailing '>' on angle-addr) rr<r=rmrr#r/r rrrYr]rG)rZ angle_addrr;rrrget_angle_addrsT                r`cCs<t}t|\}}||dd|jdd|_||fSr)rrHr9r)rrr;rrrget_display_names  racCst}d}|dtvr6t|\}}|s6td||ddkr|dtvr^td|t|\}}|s~td||dur|g|ddd<d}||t |\}}|dur|g|dd<||||fS)Nrz!expected name-addr but found '{}'r^) rr<r=rr#r/rFrarmr`)rZ name_addrrDr;rrr get_name_addrs6        rbc Cst}zt|\}}WnJtjy`zt|\}}Wn$tjyZtd|Yn0Yn0tdd|jDr|d|_| |||fS)Nzexpected mailbox but found '{}'css|]}t|tjVqdSr)rrrr$rrrr'szget_mailbox..r) rrbrr#rYr/anyr2rHrm)rrr;rrr get_mailboxs  rdcCsdt}|r\|d|vr\|dtvrD|t|dd|dd}qt|\}}||q||fS)NrrOr)rrFrmr rH)rrZinvalid_mailboxr;rrrget_invalid_mailboxs    recCst}|r|ddkrzt|\}}||Wntjy:d}|dtvrt|\}}|rt|ddvr|||jtdn@t |d\}}|dur|g|dd<|||jt dnb|ddkr|jtdnBt |d\}}|dur|g|dd<|||jt dYn0|r|ddvr|d}d|_ t |d\}}| ||jt d|r|ddkr|t |d d}q||fS) Nr;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listrrrr)rrdrmrr#r<r=rrGrerrHr9r[)rZ mailbox_listr;rDrrrrget_mailbox_list(sX                 rgcCst}|s$|jtd||fSd}|r|dtvrt|\}}|sl|jtd||||fS|ddkr||||fSt|\}}t|j dkr|dur||| ||jt d||fS|dur|g|dd<||||fS)Nzend of header before group-listrzend of header in group-listrfzgroup-list with empty entries) rrrmrrr<r=rgrrr9rG)rZ group_listrDr;rrrget_group_listas>           rhcCs t}t|\}}|r"|ddkr2td||||tdd|dd}|r|ddkr|tdd||ddfSt|\}}|||s|jt dn|ddkrtd ||tdd|dd}|r|dt vrt |\}}||||fS) NrrZz8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorrrfzgroup-terminatorzend of header in groupz)expected ';' at end of group but found {}) rrarr#r/rmr rhrrr<r=)rrr;rrr get_groups8          ric Cstt}zt|\}}WnJtjy`zt|\}}Wn$tjyZtd|Yn0Yn0||||fS)Nzexpected address but found '{}')rrirr#rdr/rm)rrwr;rrr get_addresss rjc Cst}|rzt|\}}||Wn$tjyL}zd}|dtvrt|\}}|rj|ddkr|||jtdnFt |d\}}|dur|g|dd<|t |g|jt dnh|ddkr|jtdnHt |d\}}|dur|g|dd<|t |g|jt dWYd}~n d}~00|r|ddkr|dd}d|_ t |d\}}| ||jt d|r|tdd|d d}q||fS) Nrrz"address-list entry with no contentzinvalid address in address-listzempty element in address-listrrrr)rvrjrmrr#r<r=rrGrerrrHr9r )rZ address_listr;errrDrrrrget_address_listsX              rlcCst}|std||ddkr6td||tdd|dd}t|\}}|||rx|ddkrtd||tdd ||ddfS) Nz'expected no-fold-literal but found '{}'rrUz;expected '[' at the start of no-fold-literal but found '{}'zno-fold-literal-startrrQz9expected ']' at the end of no-fold-literal but found '{}'zno-fold-literal-end)rrr#r/rmr rP)rZno_fold_literalr;rrrget_no_fold_literals.    rmcCst}|r,|dtvr,t|\}}|||r<|ddkrLtd||tdd|dd}zt|\}}Wn\tjyz"t |\}}|j t dWn$tjytd|Yn0Yn0|||r|ddkr<|j t d |r4|dd kr4|td d |dd}||fS|tdd |dd}zt|\}}Wntjyzt |\}}Wnrtjy}zVz"t|\}}|j t d Wn&tjytd|Yn0WYd}~n d}~00Yn0|||r0|dd kr0|dd}n|j t d|td d |r||dtvr|t|\}}||||fS)Nrr^zexpected msg-id but found '{}'z msg-id-startrzobsolete id-left in msg-idz4expected dot-atom-text or obs-id-left but found '{}'rzmsg-id with no id-rightr_z msg-id-endrXzobsolete id-right in msg-idzFexpected dot-atom-text, no-fold-literal or obs-id-right but found '{}'zmissing trailing '>' on msg-id)rr<r=rmrr#r/r rArKrrGrrmrW)rZmsg_idr;errr get_msg_ids~             &    roc Cst}zt|\}}||WnNtjyn}z4t|}t|}|jtd |WYd}~n&d}~00|r|jtd ||S)NzInvalid msg-id: {!r}zUnexpected {!r}) rrormrr#r1rrrr/)rZ message_idr;exrrrparse_message_idSs  rqcCst}|s |jtd|S|dtvrXt|\}}|||sX|jtdd}|r|ddkr|dtvr||d7}|dd}q\|s|jtd ||t |dnt ||_ |t |d |r|dtvrt|\}}|||r|ddkrT|j dur:|jtd |rP|t |d|S|t dd |dd}|r|dtvrt|\}}|||s|j dur|jtd |Sd}|r|dtvr||d7}|dd}q|s*|jtd ||t |dnt ||_ |t |d |rn|dtvrnt|\}}|||r|jtd |t |d|S)Nz%Missing MIME version number (eg: 1.0)rz0Expected MIME version number but found only CFWSr"rrz1Expected MIME major version number but found {!r}rdigitsz0Incomplete MIME version; found only major numberzversion-separatorz1Expected MIME minor version number but found {!r}z'Excess non-CFWS text after MIME version)rrrmrHeaderMissingRequiredValuer<r=isdigitrr/r intrr)rZ mime_versionr;rrrrrparse_mime_versionos                        rvcCsdt}|r\|ddkr\|dtvrD|t|dd|dd}qt|\}}||q||fS)NrrfrOr)rrFrmr rH)rZinvalid_parameterr;rrrget_invalid_parameters    rwcCsNt|}|std||}|t|d}t|d}t|||fS)Nzexpected ttext but found '{}'ttext)_non_token_end_matcherrr#r/rrr r)rr8rxrrr get_ttexts  rzcCst}|r,|dtvr,t|\}}|||rL|dtvrLtd|t|\}}|||r|dtvrt|\}}||||fSNrzexpected token but found '{}') rar<r=rm TOKEN_ENDSrr#r/rz)rZmtokenr;rrr get_tokens       r}cCsNt|}|std||}|t|d}t|d}t|||fS)Nz expected attrtext but found {!r}r)_non_attribute_end_matcherrr#r/rrr rrr8rrrr get_attrtexts  rcCst}|r,|dtvr,t|\}}|||rL|dtvrLtd|t|\}}|||r|dtvrt|\}}||||fSr{) rr<r=rmATTRIBUTE_ENDSrr#r/rrrr;rrr get_attribute s       rcCsNt|}|std||}|t|d}t|d}t|||fS)Nz)expected extended attrtext but found {!r}extended-attrtext)#_non_extended_attribute_end_matcherrr#r/rrr rrrrrget_extended_attrtext s rcCst}|r,|dtvr,t|\}}|||rL|dtvrLtd|t|\}}|||r|dtvrt|\}}||||fSr{) rr<r=rmEXTENDED_ATTRIBUTE_ENDSrr#r/rrrrrget_extended_attribute+ s      rcCst}|r|ddkr&td||tdd|dd}|rR|dsbtd|d}|r|dr||d7}|dd}qf|ddkr|dkr|jtd t ||_ |t|d ||fS) Nr*zExpected section but found {}zsection-markerrz$Expected section number but found {}r"0z'section number has an invalid leading 0rr) rrr#r/rmr rtrZInvalidHeaderErrorrur)rrrrrrr get_sectionA s,     rcCst}|stdd}|dtvr0t|\}}|sDtd||ddkr^t|\}}n t|\}}|dur|g|dd<||||fS)Nz&Expected value but found end of stringrz Expected value but found only {}r) rrr#r<r=r/r>rrm)rvrDr;rrr get_value_ s"      rc Cst}t|\}}|||r,|ddkrL|jtd|||fS|ddkrz t|\}}d|_||Wntj yYn0|st d|ddkr|t dd|dd}d|_ |dd krt d |t d d |dd}d}|r*|dt vr*t |\}}||d}|}|j rD|rD|dd krDt|\}}|j}d }|jdkr|r|ddkrd}n$t|\}} | r| ddkrd}n(zt|\}} Wn Yn 0| sd}|r.|jtd|||D](} | jdkrg| dd<| }q(q|}nd}|jtd|r^|ddkr^d}n t|\}}|j r~|jdkr|r|ddkr|||dur|}||fS|jtd|s|jtd|||dur||fSn|dur>|D]} | jdkrq"q| jdk|| | j|_|ddkr\t d||t dd|dd}|r|ddkrt|\}}|||j|_|r|ddkrt d||t dd|dd}|durbt} |r\|dtvrt|\}}n2|dd krBt d d}|dd}n t|\}}| |q| }n t|\}}|||dur|}||fS)Nrrfz)Parameter contains name ({}) but no valuerTzIncomplete parameterzextended-parameter-markerr=zParameter not followed by '='parameter-separatorrF'z5Quoted string value for extended parameter is invalidrjzZParameter marked as extended but appears to have a quoted string value that is non-encodedzcApparent initial-extended-value but attribute was not marked as extended or was not initial sectionz(Missing required charset/lang delimitersrrz=Expected RFC2231 char/lang encoding delimiter, but found {!r}zRFC2231-delimiterz;Expected RFC2231 char/lang encoding delimiter, but found {}ZDQUOTE)rrrmrrrr/rrr#r rr<r=r>rqrrrrHrrrerfrr(rr5) rrr;rDrZappendtoZqstringZ inner_valueZ semi_validr)trrrr get_parameteru s                                             rc Cspt}|rlzt|\}}||Wntjy}zd}|dtvrTt|\}}|sr|||WYd}~S|ddkr|dur|||jtdn@t |\}}|r|g|dd<|||jtd |WYd}~n d}~00|rJ|ddkrJ|d}d|_ t |\}}| ||jtd ||r|t dd|d d}q|S) Nrrfzparameter entry with no contentzinvalid parameter {!r}rrz)parameter with invalid trailing text {!r}rr)rrrmrr#r<r=rrrwr/rHr9r )rZmime_parametersr;rkrDrrrrparse_mime_parameters sJ              rcCs|rV|ddkrV|dtvr>|t|dd|dd}qt|\}}||q|s^dS|tdd|t|dddS)NrrfrOrr)rFrmr rHr)Z tokenlistrr;rrr_find_mime_parameters7 s   rc Cst}d}|s$|jtd|Szt|\}}Wn:tjyn|jtd|t |||YS0|||r|ddkr|jtd|rt |||S|j |_ |tdd|dd}zt|\}}Wn<tjy&|jtd |t |||YS0|||j |_|sL|S|dd kr|jtd ||` |`t |||S|td d |t|dd|S) NFz"Missing content type specificationz(Expected content maintype but found {!r}rrzInvalid content typezcontent-type-separatorrz'Expected content subtype but found {!r}rfzt| } |s| jdvrt |  }n t |  }z| ||} Wn4t ytd d | jDrd } nd} d }Yn0| jd krt| |||q>|r|s| js|d}d}| jr|| j|ddt|j } |j| vr|t| |t|dkrjt|}|||d| 7<q>t| dst| | } nt| |||| j| }d}q>t| |t|dkr|d| 7<q>| jr"t| d|kr"t|}|s| r"||| d}q>t| dst| }| jdkrhtddgdd|Dtddg}| js|d7}|||| } q>| jr|s| d| d }q>t|}|s| r||| q>|d| 7<q>|j||jS)Nutf-8rr"rFwrap_as_ew_blockedr)rrcss|]}t|tjVqdSr)rrrr$rrrr' sz%_refold_parse_tree.. unknown-8bitTrr<rrLrjrrcSsg|]}tt|dqS)r)r r)r%prrrrV1 sz&_refold_parse_tree..)Zmax_line_lengthsysmaxsizeutf8rrrrrH SPECIALSNL isdisjointNLSETrLrrcr2_fold_mime_parametersr6rMr@rrrrmrI _fold_as_ewrNr5r insertr*)Z parse_treer=maxlenrrlast_ewrZ want_encodingZend_ew_not_allowedrr7tstrreZ encoded_partnewlineZnewpartsrrrr> s                    r>cCs|dur<|rr@rArBrErHrNrKrPrTrVrWrYr]r`rarbrdrergrhrirjrlrmrorqrvrwrzr}rrrrrrrrrrrrrr>rrrrrrFs2           C  "   !*$ V +         1C+ "&'/'&).9%7ED49/tA