a XC?h @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\")strreplacevaluer?/opt/alt/python39/lib64/python3.9/email/_header_value_parser.pymake_quoted_pairscsrcCst|}d|dS)Nr)r)rZescapedrrr 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*rrrr0s 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*rrrr1szTokenList.all_defectscCs |dSNr)startswith_fwsr*rrrr4szTokenList.startswith_fwscCstdd|DS)Ncss|] }|jVqdSr) as_ew_allowed)r$partrrrr&r'z*TokenList.as_ew_allowed..)allr*rrrr5szTokenList.as_ew_allowedcCsg}|D]}||jq|Sr)extendcomments)rr9tokenrrrr9szTokenList.commentscCs t||dS)Npolicy)_refold_parse_treerr<rrrfoldszTokenList.foldr!cCst|j|ddS)Nindent)printppstrrrArrrpprintszTokenList.pprintcCsd|j|dS)Nr r@)r)_pprDrrrrCszTokenList.ppstrccszd||jj|jV|D]4}t|ds:|d|Vq||dEdHq|jrdd|j}nd}d||VdS)Nz{}{}/{}(rFz* !! invalid element in token list: {!r}z z Defects: {}r!z{}){})r.r r/ token_typehasattrrFr)rrAr:ZextrarrrrFs  z TokenList._pp)r!)r!)r!)r/ __module__ __qualname__rGsyntactic_breakew_combine_allowedrr+r0propertyrr1r4r5r9r?rErCrF __classcell__rrrrr}s&        rc@s$eZdZeddZeddZdS)WhiteSpaceTokenListcCsdSN rr*rrrrszWhiteSpaceTokenList.valuecCsdd|DS)NcSsg|]}|jdkr|jqS)comment)rGcontentr#rrr r'z0WhiteSpaceTokenList.comments..rr*rrrr9szWhiteSpaceTokenList.commentsN)r/rIrJrMrr9rrrrrOs rOc@seZdZdZdS)UnstructuredTokenList unstructuredNr/rIrJrGrrrrrUsrUc@seZdZdZdS)PhrasephraseNrWrrrrrXsrXc@seZdZdZdS)WordZwordNrWrrrrrZsrZc@seZdZdZdS)CFWSListcfwsNrWrrrrr[sr[c@seZdZdZdS)AtomatomNrWrrrrr]sr]c@seZdZdZdZdS)Tokenr:FN)r/rIrJrGZ encode_as_ewrrrrr_sr_c@seZdZdZdZdZdZdS) EncodedWord encoded-wordN)r/rIrJrGctecharsetlangrrrrr`sr`c@s4eZdZdZeddZeddZeddZdS) QuotedString quoted-stringcCs"|D]}|jdkr|jSqdSNbare-quoted-stringrGrrr%rrrrSs zQuotedString.contentcCs>g}|D]*}|jdkr&|t|q||jqd|S)Nrhr!)rGappendrrr))rresr%rrr quoted_values  zQuotedString.quoted_valuecCs"|D]}|jdkr|jSqdSrgrirr:rrrstripped_values zQuotedString.stripped_valueN)r/rIrJrGrMrSrmrorrrrres  rec@s$eZdZdZddZeddZdS)BareQuotedStringrhcCstddd|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)r/rIrJrGr+rMrrrrrrpsrpc@s8eZdZdZddZddZeddZedd Zd S) CommentrRcs(dtdgfddDdgggS)Nr!rcsg|]}|qSr)quoter#r*rrrTr'z#Comment.__str__..))r)r2r*rr*rr+szComment.__str__cCs2|jdkrt|St|ddddddS)NrRr r rz\(rsz\))rGrr)rrrrrrrs z Comment.quotecCsddd|DS)Nr!css|]}t|VqdSrr"r#rrrr&%r'z"Comment.content..r(r*rrrrS#szComment.contentcCs|jgSr)rSr*rrrr9'szComment.commentsN) r/rIrJrGr+rrrMrSr9rrrrrqs rqc@s4eZdZdZeddZeddZeddZdS) AddressListz address-listcCsdd|DS)NcSsg|]}|jdkr|qS)addressrGr#rrrrT1r'z)AddressList.addresses..rr*rrr addresses/szAddressList.addressescCstdd|DgS)Ncss|]}|jdkr|jVqdSruNrG mailboxesr#rrrr&5s z(AddressList.mailboxes..r2r*rrrrz3s zAddressList.mailboxescCstdd|DgS)Ncss|]}|jdkr|jVqdSrxrG all_mailboxesr#rrrr&:s z,AddressList.all_mailboxes..r{r*rrrr}8s zAddressList.all_mailboxesN)r/rIrJrGrMrwrzr}rrrrrt+s  rtc@s4eZdZdZeddZeddZeddZdS) AddressrucCs|djdkr|djSdS)NrgrouprG display_namer*rrrrBszAddress.display_namecCs4|djdkr|dgS|djdkr*gS|djSNrmailboxinvalid-mailboxryr*rrrrzGs  zAddress.mailboxescCs:|djdkr|dgS|djdkr0|dgS|djSrr|r*rrrr}Os   zAddress.all_mailboxesN)r/rIrJrGrMrrzr}rrrrr~>s  r~c@s(eZdZdZeddZeddZdS) MailboxList mailbox-listcCsdd|DS)NcSsg|]}|jdkr|qS)rrvr#rrrrT]r'z)MailboxList.mailboxes..rr*rrrrz[szMailboxList.mailboxescCsdd|DS)NcSsg|]}|jdvr|qS))rrrvr#rrrrTas z-MailboxList.all_mailboxes..rr*rrrr}_szMailboxList.all_mailboxesNr/rIrJrGrMrzr}rrrrrWs  rc@s(eZdZdZeddZeddZdS) GroupList group-listcCs |r|djdkrgS|djSNrrryr*rrrrziszGroupList.mailboxescCs |r|djdkrgS|djSrr|r*rrrr}oszGroupList.all_mailboxesNrrrrrres  rc@s4eZdZdZeddZeddZeddZdS) GrouprcCs|djdkrgS|djSNrryr*rrrrzzszGroup.mailboxescCs|djdkrgS|djSrr|r*rrrr}szGroup.all_mailboxescCs |djSr3)rr*rrrrszGroup.display_nameN)r/rIrJrGrMrzr}rrrrrrvs  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 r/rIrJrGrMrrrrrrrrrrs    rc@s@eZdZdZeddZeddZeddZedd Zd S) AngleAddrz angle-addrcCs"|D]}|jdkr|jSqdSN addr-spec)rGrrjrrrrs zAngleAddr.local_partcCs"|D]}|jdkr|jSqdSrrGrrjrrrrs zAngleAddr.domaincCs"|D]}|jdkr|jSqdS)N obs-route)rGdomainsrjrrrrs zAngleAddr.routecCs<|D]2}|jdkr|jr"|jSt|j|jSqdS)Nrz<>)rGrrrrjrrrrs   zAngleAddr.addr_specN) r/rIrJrGrMrrrrrrrrrs   rc@seZdZdZeddZdS)ObsRoutercCsdd|DS)NcSsg|]}|jdkr|jqSrrr#rrrrTr'z$ObsRoute.domains..rr*rrrrszObsRoute.domainsN)r/rIrJrGrMrrrrrrsrc@sLeZdZdZeddZeddZeddZedd Zed d Z d S) MailboxrcCs|djdkr|djSdSNrrrr*rrrrszMailbox.display_namecCs |djSr3rr*rrrrszMailbox.local_partcCs |djSr3rr*rrrrszMailbox.domaincCs|djdkr|djSdSr)rGrr*rrrrsz Mailbox.routecCs |djSr3rr*rrrrszMailbox.addr_specNrrrrrrs    rc@s,eZdZdZeddZeZZZZ dS)InvalidMailboxrcCsdSrrr*rrrrszInvalidMailbox.display_nameNrrrrrrs rcs(eZdZdZdZefddZZS)DomainrFcsdtjSNr!r)rrsplitr*rrrrsz Domain.domain)r/rIrJrGr5rMrrNrrrrrsrc@seZdZdZdS)DotAtomdot-atomNrWrrrrrsrc@seZdZdZdZdS) DotAtomTextz dot-atom-textTNr/rIrJrGr5rrrrrsrc@seZdZdZdZdS) NoFoldLiteralzno-fold-literalFNrrrrrr src@sDeZdZdZdZeddZeddZeddZed d Z d S) AddrSpecrFcCs |djSr3rr*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) r/rIrJrGr5rMrrrrrrrrrs   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)rrrrGpop)rrlrrrr;s   zDisplayName.display_namecsd}|jrd}n|D]}|jdkrd}qt|dkr|rd}}|djdks`|ddjdkrdd}|djdks|ddjdkrd}|t|j|StjSdS) NFTrfrr!r\rQr)rrGrrrrr)rrrr%ZpreZpostrrrrLs   zDisplayName.value) r/rIrJrGrLrMrrrNrrrrr6s  rc@s,eZdZdZdZeddZeddZdS) LocalPartz local-partFcCs&|djdkr|djS|djSdS)Nrrf)rGrmrr*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)DOTrGr isinstancerkr)rrlZlastZ last_is_tltokZis_tlrrrrls(     zLocalPart.local_partN)r/rIrJrGr5rMrrrrrrr`s  rcs4eZdZdZdZefddZeddZZS) DomainLiteralzdomain-literalFcsdtjSrrr*rrrrszDomainLiteral.domaincCs"|D]}|jdkr|jSqdS)Nptextrirjrrrips zDomainLiteral.ip) r/rIrJrGr5rMrrrNrrrrrs rc@seZdZdZdZdZdS) MIMEVersionz mime-versionN)r/rIrJrGmajorminorrrrrrsrc@s4eZdZdZdZdZdZeddZeddZ dS) Parameter parameterFus-asciicCs|jr|djSdSr) sectionednumberr*rrrsection_numberszParameter.section_numbercCsf|D]\}|jdkr|jS|jdkr|D]4}|jdkr*|D] }|jdkr<|jSqrrrr?[sz MsgID.foldN)r/rIrJrGr5r?rrrrrWsrc@seZdZdZdS) MessageIDz message-idNrWrrrrr`src@seZdZdZdS)InvalidMessageIDzinvalid-message-idNrWrrrrrdsrc@seZdZdZdS)HeaderheaderNrWrrrrrhsrcsreZdZdZdZdZfddZfddZddZe dd Z dfd d Z d dZ e ddZ ddZZS)TerminalTcst||}||_g|_|Sr)r__new__rGr)clsrrGrrrrrvszTerminal.__new__csd|jjtSr,r-r*rrrr0|szTerminal.__repr__cCst|jjd|jdS)N/)rBr r/rGr*rrrrEszTerminal.pprintcCs t|jSr)listrr*rrrr1szTerminal.all_defectsr!c s2d||jj|jt|js"dn d|jgS)Nz {}{}/{}({}){}r!z {})r.r r/rGrr0rrDrrrrFsz Terminal._ppcCsdSrrr*rrrpop_trailing_wsszTerminal.pop_trailing_wscCsgSrrr*rrrr9szTerminal.commentscCst||jfSr)rrGr*rrr__getnewargs__szTerminal.__getnewargs__)r!)r/rIrJr5rLrKrr0rErMr1rFrr9rrNrrrrrps     rc@s eZdZeddZddZdS)WhiteSpaceTerminalcCsdSrPrr*rrrrszWhiteSpaceTerminal.valuecCsdS)NTrr*rrrr4sz!WhiteSpaceTerminal.startswith_fwsNr/rIrJrMrr4rrrrrs rc@s eZdZeddZddZdS) ValueTerminalcCs|Srrr*rrrrszValueTerminal.valuecCsdS)NFrr*rrrr4szValueTerminal.startswith_fwsNrrrrrrs rc@s eZdZeddZddZdS)EWWhiteSpaceTerminalcCsdSrrr*rrrrszEWWhiteSpaceTerminal.valuecCsdSrrr*rrrr+szEWWhiteSpaceTerminal.__str__N)r/rIrJrMrr+rrrrrs rc@s eZdZdS)_InvalidEwErrorN)r/rIrJrrrrrsrr,list-separatorrzroute-component-markerz([{}]+)r!z[^{}]+z[\x00-\x20\x7F]cCs>t|}|r|jt|t|r:|jtddS)Nz*Non-ASCII characters found in header token)_non_printable_finderrrkrZNonPrintableDefectrrr)xtextZnon_printablesrrr_validate_xtexts  r cCst|d^}}g}d}d}tt|D]L}||dkrJ|rDd}d}nd}q&|rTd}n|||vrdq||||q&|d}d|d||dg||fS)NrFr Tr!) _wsp_splitterrangerrkr))rendcharsZfragment remainderZvcharsescapehad_qpposrrr_get_ptext_to_endcharss$   rcCs.|}t|dt|t|d}||fS)Nfws)rrr)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)r` startswithrHeaderParseErrorr.rr)rrcountrrkrrb_ewr ValueErrorKeyErrorrrcrdr8WSPrrrr )rZ terminal_typeZewrrZremstrrestrrcrdrr: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) NrTrZutextFrrz&missing whitespace before encoded wordrrar!)rUr!rrkrr$rrrrrGrrrrrfc2047_matchersearch partitionrr r))rrVr:valid_ewZhave_wsrrrrrrget_unstructuredIsH           r*cCs*t|d\}}}t|d}t|||fS)Nz()r)rrr rr_rrr get_qp_ctexts  r-cCs*t|d\}}}t|d}t|||fS)Nrr)rrr r+rrr get_qcontents  r.cCsNt|}|std||}|t|d}t|d}t|||fS)Nzexpected atext but found '{}'atext)_non_atom_end_matcherrrr.rrrr )rmr/rrr get_atexts r2cCsp|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 '{}'rrrFz!encoded word inside quoted stringTrrr%raz"end of header inside quoted string)rrr.rpr.rkr!rr$rrrrGr)rZbare_quoted_stringr:r)rrrget_bare_quoted_stringsJ            r3cCs|r |ddkr td|t}|dd}|r|ddkr|dtvr\t|\}}n&|ddkrvt|\}}n t|\}}||q2|s|j t d||fS||ddfS)Nrrzexpected '(' but found '{}'rrszend of header inside comment) rrr.rqr!r get_commentr-rkrr)rrRr:rrrr4s&      r4cCsPt}|rH|dtvrH|dtvr0t|\}}n t|\}}||q||fSr3)r[ CFWS_LEADERr!rr4rk)rr\r:rrrget_cfwss   r6cCspt}|r,|dtvr,t|\}}||t|\}}|||rh|dtvrht|\}}||||fSr3)rer5r6rkr3)rZ quoted_stringr:rrrget_quoted_string s      r7cCst}|r,|dtvr,t|\}}|||rL|dtvrLtd||drzt |\}}Wqtjyt |\}}Yq0n t |\}}|||r|dtvrt|\}}||||fS)Nrzexpected atom but found '{}'r) r]r5r6rk ATOM_ENDSrrr.rr$r2)rr^r:rrrget_atoms&       r9cCst}|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 '{}')rr8rrr.r2rkr)rZ dot_atom_textr:rrrget_dot_atom_text:s     r:cCst}|dtvr(t|\}}|||drfzt|\}}Wqrtjybt|\}}Yqr0n t|\}}|||r|dtvrt|\}}||||fS)Nrr) rr5r6rkrr$rrr:)rZdot_atomr:rrr get_dot_atomMs        r;cCs|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 '{}')r5r6rrr7SPECIALSr.r9)rleaderr:rrrget_wordfs"    r>cCst}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) rXr>rkrrrr PHRASE_ENDSrObsoleteHeaderDefectr5r6)rrYr:rrr get_phrases4           rAc 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-partzr?rrkget_obs_local_partrrGrrr@rencoderZNonASCIILocalPartDefect)rrr=r:obs_local_partrrrget_local_partsJ         rGcCst}d}|r&|ddks*|dtvr&|ddkrj|rL|jtd|td}|dd}q nD|ddkr|t|dd|dd}|jtd d}q |r|d jd kr|jtd zt |\}}d}Wn2tj y|dt vrt |\}}Yn0||q |djd ksV|djd krh|djd krh|jtd|d jd ks|d jd kr|djd kr|jtd|jrd|_||fS)NFrr rzinvalid repeated '.'Trmisplaced-specialz/'\' character outside of quoted-string/ccontentrrzmissing '.' between wordsr\z!Invalid leading '.' in local partr%z"Invalid trailing '.' in local partrB) rr?rrkrrrrrGr>rr5r6)rrFZlast_non_ws_was_dotr:rrrrDsj                  rDcCs@t|d\}}}t|d}|r0|jtdt|||fS)Nz[]rz(quoted printable found in domain-literal)rrrrkrr@r )rrrrrr get_dtexts   rIcCs,|rdS|td|tdddS)NFz"end of input inside domain-literal]domain-literal-endT)rkrrr)rdomain_literalrrr_check_for_early_dl_endsrMcCsjt}|dtvr(t|\}}|||s6td|ddkrRtd||dd}t||rp||fS|tdd|dt vrt |\}}||t |\}}||t||r||fS|dt vrt |\}}||t||r||fS|ddkrtd||tdd |dd}|rb|dtvrbt|\}}||||fS) Nrzexpected domain-literal[z6expected '[' at start of domain-literal but found '{}'rzdomain-literal-startrJz4expected ']' at end of domain-literal but found '{}'rK) rr5r6rkrrr.rMrr!rrI)rrLr:rrrget_domain_literal sH                    rOcCspt}d}|dtvr"t|\}}|s6td||ddkrvt|\}}|durd|g|dd<||||fSzt|\}}Wn tjyt |\}}Yn0|r|ddkrtd|dur|g|dd<|||rh|ddkrh|j t d|dj dkr(|d|dd<|rh|ddkrh|t t |d d\}}||q(||fS) Nrzexpected domain but found '{}'rNrzInvalid Domainrz(domain is not a dot-atom (contains CFWS)rr)rr5r6rrr.rOrkr;r9rr@rGr)rrr=r:rrr get_domainGsD         rPcCs|t}t|\}}|||r,|ddkrF|jtd||fS|tddt|dd\}}||||fS)Nrrz#addr-spec local part with no domainaddress-at-symbolr)rrGrkrrrrrP)rrr:rrr get_addr_specms    rRcCst}|rj|ddks"|dtvrj|dtvrFt|\}}||q|ddkr|t|dd}q|rz|ddkrtd||tt |dd\}}|||r>|ddkr>|t|dd}|sq>|dtvrt|\}}|||ddkr|tt |dd\}}||q|sNtd|ddkrltd||t dd ||ddfS) Nrr rrz(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) rr5r6rk ListSeparatorrrr.RouteComponentMarkerrPr)rZ obs_router:rrr get_obs_route}sF               rVc 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) rr5r6rkrrr.rrrrRrVr@)rZ angle_addrr:rrrget_angle_addrsT                rYcCs<t}t|\}}||dd|jdd|_||fSr)rrAr8r)rrr:rrrget_display_names  rZcCst}d}|dtvr6t|\}}|s6td||ddkr|dtvr^td|t|\}}|s~td||dur|g|ddd<d}||t |\}}|dur|g|dd<||||fS)Nrz!expected name-addr but found '{}'rW) rr5r6rrr.r?rZrkrY)rZ name_addrr=r:rrr get_name_addrs6        r[c Cst}zt|\}}WnJtjy`zt|\}}Wn$tjyZtd|Yn0Yn0tdd|jDr|d|_| |||fS)Nzexpected mailbox but found '{}'css|]}t|tjVqdSr)rrrr#rrrr&szget_mailbox..r) rr[rrrRr.anyr1rGrk)rrr:rrr get_mailboxs  r]cCsdt}|r\|d|vr\|dtvrD|t|dd|dd}qt|\}}||q||fS)NrrHr)rr?rkrrA)rrZinvalid_mailboxr:rrrget_invalid_mailboxs    r^cCst}|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-listr rrr)rr]rkrrr5r6rr@r^rrGr8rT)rZ mailbox_listr:r=rrrrget_mailbox_list(sX                 r`cCst}|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-listr_zgroup-list with empty entries) rrrkrrr5r6r`rr}r8r@)rZ group_listr=r:rrrget_group_listas>           racCs t}t|\}}|r"|ddkr2td||||tdd|dd}|r|ddkr|tdd||ddfSt|\}}|||s|jt dn|ddkrtd ||tdd|dd}|r|dt vrt |\}}||||fS) NrrSz8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorrr_zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {}) rrZrrr.rkrrarrr5r6)rrr:rrr get_groups8          rbc Cstt}zt|\}}WnJtjy`zt|\}}Wn$tjyZtd|Yn0Yn0||||fS)Nzexpected address but found '{}')r~rbrrr]r.rk)rrur:rrr get_addresss rcc 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) Nrr z"address-list entry with no contentzinvalid address in address-listzempty element in address-listrrr r)rtrcrkrrr5r6rr@r^r~rrGr8r)rZ address_listr:errr=rrrrget_address_listsX              recCst}|std||ddkr6td||tdd|dd}t|\}}|||rx|ddkrtd||tdd ||ddfS) Nz'expected no-fold-literal but found '{}'rrNz;expected '[' at the start of no-fold-literal but found '{}'zno-fold-literal-startrrJz9expected ']' at the end of no-fold-literal but found '{}'zno-fold-literal-end)rrrr.rkrrI)rZno_fold_literalr:rrrget_no_fold_literals.    rfcCst}|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)NrrWzexpected 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-rightrXz msg-id-endrQzobsolete id-right in msg-idzFexpected dot-atom-text, no-fold-literal or obs-id-right but found '{}'zmissing trailing '>' on msg-id)rr5r6rkrrr.rr:rDrr@rrfrP)rZmsg_idr:errr get_msg_ids~             &    rhc Cst}zt|\}}||WnNtjyn}z4t|}t|}|jtd |WYd}~n&d}~00|r|jtd ||S)NzInvalid msg-id: {!r}zUnexpected {!r}) rrhrkrrr*rrrr.)rZ message_idr:Zexrrrparse_message_idSs  ricCst}|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}r digitsz0Incomplete MIME version; found only major numberzversion-separatorz1Expected MIME minor version number but found {!r}z'Excess non-CFWS text after MIME version)rrrkrHeaderMissingRequiredValuer5r6isdigitrr.rintrr)rZ mime_versionr:rjrrrparse_mime_versionos                        rncCsdt}|r\|ddkr\|dtvrD|t|dd|dd}qt|\}}||q||fS)Nrr_rHr)rr?rkrrA)rZinvalid_parameterr:rrrget_invalid_parameters    rocCsNt|}|std||}|t|d}t|d}t|||fS)Nzexpected ttext but found '{}'ttext)_non_token_end_matcherrrr.rrrr )rr1rprrr get_ttexts  rrcCst}|r,|dtvr,t|\}}|||rL|dtvrLtd|t|\}}|||r|dtvrt|\}}||||fSNrzexpected token but found '{}') r_r5r6rk TOKEN_ENDSrrr.rr)rZmtokenr:rrr get_tokens       rucCsNt|}|std||}|t|d}t|d}t|||fS)Nz expected attrtext but found {!r}r)_non_attribute_end_matcherrrr.rrrr rr1rrrr get_attrtexts  rxcCst}|r,|dtvr,t|\}}|||rL|dtvrLtd|t|\}}|||r|dtvrt|\}}||||fSrs) rr5r6rkATTRIBUTE_ENDSrrr.rxrrr:rrr get_attribute s       r{cCsNt|}|std||}|t|d}t|d}t|||fS)Nz)expected extended attrtext but found {!r}extended-attrtext)#_non_extended_attribute_end_matcherrrr.rrrr rwrrrget_extended_attrtext s r~cCst}|r,|dtvr,t|\}}|||rL|dtvrLtd|t|\}}|||r|dtvrt|\}}||||fSrs) rr5r6rkEXTENDED_ATTRIBUTE_ENDSrrr.r~rzrrrget_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 0rj) rrrr.rkrrlrZInvalidHeaderErrorrmr)rrrjrrr 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) rrrr5r6r.r7rrk)rvr=r: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)Nrr_z)Parameter contains name ({}) but no valuerTzIncomplete parameterzextended-parameter-markerr=zParameter not followed by '='parameter-separatorrF'z5Quoted string value for extended parameter is invalidrhzZParameter 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 delimitersr|rz=Expected RFC2231 char/lang encoding delimiter, but found {!r}zRFC2231-delimiterz;Expected RFC2231 char/lang encoding delimiter, but found {}ZDQUOTE)rr{rkrrrr.rrrrrr5r6r7rorrxr~rGrrrcrdrr!rr.) rrr:r=rZappendtoZqstringZ 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) Nrr_zparameter entry with no contentzinvalid parameter {!r}rrz)parameter with invalid trailing text {!r}rr)rrrkrrr5r6rrror.rGr8r)rZmime_parametersr:rdr=rrrrparse_mime_parameters sJ              rcCs|rV|ddkrV|dtvr>|t|dd|dd}qt|\}}||q|s^dS|tdd|t|dddS)Nrr_rHrr)r?rkrrAr)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}r_zt| } |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;rrErhrrcSsg|]}tt|dqS)r)rr)r$prrrrT1 sz&_refold_parse_tree..)Zmax_line_lengthsysmaxsizeutf8rrrrrG SPECIALSNL isdisjointNLSETrErr\r1_fold_mime_parametersr5rKr?rrrrkrH _fold_as_ewrLr4rinsertr))Z parse_treer<maxlenrrlast_ewrZ want_encodingZend_ew_not_allowedrr6tstrrcZ encoded_partnewlineZnewpartsrrrr= s                    r=cCs|dur<|rrArGrDrIrMrOrPrRrVrYrZr[r]r^r`rarbrcrerfrhrirnrorrrurxr{r~rrrrrrrrrrr=rrrrrrFs2           C  "   !*$ V +         1C+ "&'/'&).9%7ED49/tA