B Dv @slddlZddlZddlZddlmZddlmZddlmZddl m Z ddl m Z ddl m Z edZeed BZed ZeeBZeed Zeed Zeed Bed ZeeBZeedBZeeBZeedZddZedejejBZGdddeZ Gddde Z!Gddde Z"Gddde Z#Gddde Z$Gddde!Z%Gdd 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-Gd/d0d0e Z.Gd1d2d2e Z/Gd3d4d4e Z0Gd5d6d6e Z1Gd7d8d8e Z2Gd9d:d:e Z3Gd;d<dd>e Z5Gd?d@d@e Z6GdAdBdBe Z7GdCdDdDe Z8GdEdFdFe Z9GdGdHdHe Z:GdIdJdJe#Z;GdKdLdLe ZGdQdRdRe Z?GdSdTdTe?Z@GdUdVdVe ZAGdWdXdXe ZBGdYdZdZe ZCGd[d\d\e ZDGd]d^d^e ZEGd_d`d`eEZFGdadbdbeEZGGdcdddde ZHGdedfdfe ZIGdgdhdhe ZJGdidjdjeKZLGdkdldleLZMGdmdndneLZNGdodpdpeMZOGdqdrdre jPZQeNd dsZReNdtduZSeNdvdwZTedxUdyVejWZXedzUeYdyVejZZ[ed{j\Z]edzUeYdyVejZZ^edzUeYdyVejZZ_edzUeYdyVejZZ`d|d}Zad~dZbddZcddZdddZeddZfddZgddZhddZiddZjddZkddZlddZmddZnddZoddZpddZqddZrddZsddZtddZuddZvddZwddZxddZyddZzddZ{ddZ|ddZ}ddZ~ddZddZddZddZddZddÄZddńZddDŽZddɄZdd˄Zdd̈́ZddτZddфZddӄZddՄZddׄZddلZddۄZdd݄Zdd߄ZddZddZddZddZddZdS)N) hexdigits) OrderedDict) itemgetter)_encoded_words)errors)utilsz (z ()<>@,:;.\"[].z."(z/?=z*'%%cCs dt|dddddS)N"\z\\z\")strreplace)valuer?/opt/alt/python37/lib64/python3.7/email/_header_value_parser.py quote_stringasrz =\? # 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||g|_dS)N)super__init__defects)selfargskw) __class__rrrzszTokenList.__init__cCsddd|DS)Ncss|]}t|VqdS)N)r ).0xrrr sz$TokenList.__str__..)join)rrrr__str__~szTokenList.__str__csd|jjtS)Nz{}({}))formatr__name__r__repr__)r)rrrr#s zTokenList.__repr__cCsddd|DS)Nrcss|]}|jr|jVqdS)N)r)rrrrrrsz"TokenList.value..)r)rrrrrszTokenList.valuecCstdd|D|jS)Ncss|] }|jVqdS)N) all_defects)rrrrrrsz(TokenList.all_defects..)sumr)rrrrr$szTokenList.all_defectscCs |dS)Nr)startswith_fws)rrrrr&szTokenList.startswith_fwscCstdd|DS)Ncss|] }|jVqdS)N) as_ew_allowed)rpartrrrrsz*TokenList.as_ew_allowed..)all)rrrrr'szTokenList.as_ew_allowedcCs"g}x|D]}||jq W|S)N)extendcomments)rr+tokenrrrr+s zTokenList.commentscCs t||dS)N)policy)_refold_parse_tree)rr-rrrfoldszTokenList.foldrcCst|j|ddS)N)indent)printppstr)rr0rrrpprintszTokenList.pprintcCsd|j|dS)N )r0)r_pp)rr0rrrr2szTokenList.ppstrccs~d||jj|jVx<|D]4}t|ds<|d|Vq||dEdHqW|jrhd|j}nd}d||VdS)Nz{}{}/{}(r5z* !! invalid element in token list: {!r}z z Defects: {}rz{}){})r!rr" token_typehasattrr5r)rr0r,Zextrarrrr5s    z TokenList._pp)r)r)r)r" __module__ __qualname__r6syntactic_breakew_combine_allowedrr r#propertyrr$r&r'r+r/r3r2r5 __classcell__rr)rrrts        rc@s$eZdZeddZeddZdS)WhiteSpaceTokenListcCsdS)N r)rrrrrszWhiteSpaceTokenList.valuecCsdd|DS)NcSsg|]}|jdkr|jqS)comment)r6content)rrrrr sz0WhiteSpaceTokenList.comments..r)rrrrr+szWhiteSpaceTokenList.commentsN)r"r8r9r<rr+rrrrr>s r>c@seZdZdZdS)UnstructuredTokenList unstructuredN)r"r8r9r6rrrrrCsrCc@seZdZdZdS)PhrasephraseN)r"r8r9r6rrrrrEsrEc@seZdZdZdS)WordZwordN)r"r8r9r6rrrrrGsrGc@seZdZdZdS)CFWSListcfwsN)r"r8r9r6rrrrrHsrHc@seZdZdZdS)AtomatomN)r"r8r9r6rrrrrJsrJc@seZdZdZdZdS)Tokenr,FN)r"r8r9r6Z encode_as_ewrrrrrLsrLc@seZdZdZdZdZdZdS) EncodedWordz encoded-wordN)r"r8r9r6ctecharsetlangrrrrrMsrMc@s4eZdZdZeddZeddZeddZdS) QuotedStringz quoted-stringcCs"x|D]}|jdkr|jSqWdS)Nzbare-quoted-string)r6r)rrrrrrAs  zQuotedString.contentcCsBg}x2|D]*}|jdkr(|t|q ||jq Wd|S)Nzbare-quoted-stringr)r6appendr rr)rresrrrr quoted_values   zQuotedString.quoted_valuecCs"x|D]}|jdkr|jSqWdS)Nzbare-quoted-string)r6r)rr,rrrstripped_values  zQuotedString.stripped_valueN)r"r8r9r6r<rArTrUrrrrrQs  rQc@s$eZdZdZddZeddZdS)BareQuotedStringzbare-quoted-stringcCstddd|DS)Nrcss|]}t|VqdS)N)r )rrrrrrsz+BareQuotedString.__str__..)rr)rrrrr szBareQuotedString.__str__cCsddd|DS)Nrcss|]}t|VqdS)N)r )rrrrrr sz)BareQuotedString.value..)r)rrrrr szBareQuotedString.valueN)r"r8r9r6r r<rrrrrrVsrVc@s8eZdZdZddZddZeddZedd Zd S) Commentr@cs(dtdgfddDdgggS)Nrrcsg|]}|qSr)quote)rr)rrrrBsz#Comment.__str__..))rr%)rr)rrr s zComment.__str__cCs2|jdkrt|St|ddddddS)Nr@r z\\rz\(rYz\))r6r r)rrrrrrXs  z Comment.quotecCsddd|DS)Nrcss|]}t|VqdS)N)r )rrrrrr#sz"Comment.content..)r)rrrrrA!szComment.contentcCs|jgS)N)rA)rrrrr+%szComment.commentsN) r"r8r9r6r rXr<rAr+rrrrrWs  rWc@s4eZdZdZeddZeddZeddZdS) AddressListz address-listcCsdd|DS)NcSsg|]}|jdkr|qS)address)r6)rrrrrrB/sz)AddressList.addresses..r)rrrr addresses-szAddressList.addressescCstdd|DgS)Ncss|]}|jdkr|jVqdS)r[N)r6 mailboxes)rrrrrr3sz(AddressList.mailboxes..)r%)rrrrr]1szAddressList.mailboxescCstdd|DgS)Ncss|]}|jdkr|jVqdS)r[N)r6 all_mailboxes)rrrrrr8sz,AddressList.all_mailboxes..)r%)rrrrr^6szAddressList.all_mailboxesN)r"r8r9r6r<r\r]r^rrrrrZ)s  rZc@s4eZdZdZeddZeddZeddZdS) Addressr[cCs|djdkr|djSdS)Nrgroup)r6 display_name)rrrrra@szAddress.display_namecCs4|djdkr|dgS|djdkr*gS|djS)Nrmailboxzinvalid-mailbox)r6r])rrrrr]Es  zAddress.mailboxescCs:|djdkr|dgS|djdkr0|dgS|djS)Nrrbzinvalid-mailbox)r6r^)rrrrr^Ms   zAddress.all_mailboxesN)r"r8r9r6r<rar]r^rrrrr_<s  r_c@s(eZdZdZeddZeddZdS) MailboxListz mailbox-listcCsdd|DS)NcSsg|]}|jdkr|qS)rb)r6)rrrrrrB[sz)MailboxList.mailboxes..r)rrrrr]YszMailboxList.mailboxescCsdd|DS)NcSsg|]}|jdkr|qS))rbzinvalid-mailbox)r6)rrrrrrB_sz-MailboxList.all_mailboxes..r)rrrrr^]szMailboxList.all_mailboxesN)r"r8r9r6r<r]r^rrrrrcUs rcc@s(eZdZdZeddZeddZdS) GroupListz group-listcCs |r|djdkrgS|djS)Nrz mailbox-list)r6r])rrrrr]gszGroupList.mailboxescCs |r|djdkrgS|djS)Nrz mailbox-list)r6r^)rrrrr^mszGroupList.all_mailboxesN)r"r8r9r6r<r]r^rrrrrdcs rdc@s4eZdZdZeddZeddZeddZdS) Groupr`cCs|djdkrgS|djS)Nz group-list)r6r])rrrrr]xszGroup.mailboxescCs|djdkrgS|djS)Nrfz group-list)r6r^)rrrrr^~szGroup.all_mailboxescCs |djS)Nr)ra)rrrrraszGroup.display_nameN)r"r8r9r6r<r]r^rarrrrrets  rec@sLeZdZdZeddZeddZeddZedd Zed d Z d S) NameAddrz name-addrcCst|dkrdS|djS)Nr)lenra)rrrrras zNameAddr.display_namecCs |djS)N) local_part)rrrrrkszNameAddr.local_partcCs |djS)Nrj)domain)rrrrrlszNameAddr.domaincCs |djS)Nrj)route)rrrrrmszNameAddr.routecCs |djS)Nrj) addr_spec)rrrrrnszNameAddr.addr_specN) r"r8r9r6r<rarkrlrmrnrrrrrgs     rgc@s@eZdZdZeddZeddZeddZedd Zd S) AngleAddrz angle-addrcCs"x|D]}|jdkr|jSqWdS)Nz addr-spec)r6rk)rrrrrrks  zAngleAddr.local_partcCs"x|D]}|jdkr|jSqWdS)Nz addr-spec)r6rl)rrrrrrls  zAngleAddr.domaincCs"x|D]}|jdkr|jSqWdS)Nz obs-route)r6domains)rrrrrrms  zAngleAddr.routecCs<x6|D]*}|jdkr|jr |jSt|j|jSqWdSdS)Nz addr-specz<>)r6rkrnr)rrrrrrns   zAngleAddr.addr_specN) r"r8r9r6r<rkrlrmrnrrrrros    roc@seZdZdZeddZdS)ObsRoutez obs-routecCsdd|DS)NcSsg|]}|jdkr|jqS)rl)r6rl)rrrrrrBsz$ObsRoute.domains..r)rrrrrpszObsRoute.domainsN)r"r8r9r6r<rprrrrrqsrqc@sLeZdZdZeddZeddZeddZedd Zed d Z d S) MailboxrbcCs|djdkr|djSdS)Nrz name-addr)r6ra)rrrrraszMailbox.display_namecCs |djS)Nr)rk)rrrrrkszMailbox.local_partcCs |djS)Nr)rl)rrrrrlszMailbox.domaincCs|djdkr|djSdS)Nrz name-addr)r6rm)rrrrrmsz Mailbox.routecCs |djS)Nr)rn)rrrrrnszMailbox.addr_specN) r"r8r9r6r<rarkrlrmrnrrrrrrs     rrc@s,eZdZdZeddZeZZZZ dS)InvalidMailboxzinvalid-mailboxcCsdS)Nr)rrrrraszInvalidMailbox.display_nameN) r"r8r9r6r<rarkrlrmrnrrrrrss rscs(eZdZdZdZefddZZS)DomainrlFcsdtjS)Nr)rrrsplit)r)rrrrlsz Domain.domain)r"r8r9r6r'r<rlr=rr)rrrtsrtc@seZdZdZdS)DotAtomzdot-atomN)r"r8r9r6rrrrrvsrvc@seZdZdZdZdS) DotAtomTextz dot-atom-textTN)r"r8r9r6r'rrrrrwsrwc@sDeZdZdZdZeddZeddZeddZed d Z d S) AddrSpecz addr-specFcCs |djS)Nr)rk)rrrrrkszAddrSpec.local_partcCst|dkrdS|djS)Nrj)rirl)rrrrrls zAddrSpec.domaincCs<t|dkr|djS|dj|dj|djS)Nryrrhrf)rirrstriplstrip)rrrrrs  zAddrSpec.valuecCsLt|j}t|t|tkr*t|j}n|j}|jdk rH|d|jS|S)N@)setrkri DOT_ATOM_ENDSrrl)rZnamesetZlprrrrns   zAddrSpec.addr_specN) r"r8r9r6r'r<rkrlrrnrrrrrx s    rxc@seZdZdZdZdS) ObsLocalPartzobs-local-partFN)r"r8r9r6r'rrrrr+srcs4eZdZdZdZeddZefddZZS) DisplayNamez display-nameFcCst|}t|dkr|jS|djdkr4|dn*|ddjdkr^t|ddd|d<|djdkrv|n*|ddjdkrt|ddd|d<|jS)NrrIrhrj)rrirr6pop)rrSrrrra6s   zDisplayName.display_namecsd}|jrd}nx|D]}|jdkrd}qWt|dkr|rd}}|djdksd|ddjdkrhd}|djdks|ddjdkrd}|t|j|StjSdS) NFTz quoted-stringrrrIr?rj)rr6rirrarr)rrXrZpreZpost)rrrrGs    zDisplayName.value) r"r8r9r6r;r<rarr=rr)rrr1s rc@s,eZdZdZdZeddZeddZdS) LocalPartz local-partFcCs&|djdkr|djS|djSdS)Nrz quoted-string)r6rTr)rrrrr`s zLocalPart.valuecCstg}t}d}x|dtgD]}|jdkr.q|r^|jdkr^|djdkr^t|dd|d<t|t}|r|jdkr|djdkr|t|ddn |||d}|}qWt|dd}|jS)NFrrIdotrjrh)DOTr6r isinstancerRr)rrSZlastZ last_is_tltokZis_tlrrrrkgs$   zLocalPart.local_partN)r"r8r9r6r'r<rrkrrrrr[s rcs4eZdZdZdZefddZeddZZS) DomainLiteralzdomain-literalFcsdtjS)Nr)rrrru)r)rrrrlszDomainLiteral.domaincCs"x|D]}|jdkr|jSqWdS)Nptext)r6r)rrrrrips  zDomainLiteral.ip) r"r8r9r6r'r<rlrr=rr)rrrsrc@seZdZdZdZdZdS) MIMEVersionz mime-versionN)r"r8r9r6majorminorrrrrrsrc@s4eZdZdZdZdZdZeddZeddZ dS) Parameter parameterFzus-asciicCs|jr|djSdS)Nrhr) sectionednumber)rrrrsection_numberszParameter.section_numbercCsbx\|D]T}|jdkr|jS|jdkrx4|D],}|jdkr*x|D]}|jdkr>|jSq>Wq*WqWdS)Nrz quoted-stringzbare-quoted-stringr)r6rU)rr,rrr param_values       zParameter.param_valueN) r"r8r9r6rextendedrOr<rrrrrrrs  rc@seZdZdZdS)InvalidParameterzinvalid-parameterN)r"r8r9r6rrrrrsrc@seZdZdZeddZdS) Attribute attributecCs$x|D]}|jdr|jSqWdS)Nattrtext)r6endswithr)rr,rrrrUs  zAttribute.stripped_valueN)r"r8r9r6r<rUrrrrrsrc@seZdZdZdZdS)SectionsectionN)r"r8r9r6rrrrrrsrc@seZdZdZeddZdS)ValuercCs2|d}|jdkr|d}|jdr,|jS|jS)NrrIrh)z quoted-stringrzextended-attribute)r6rrUr)rr,rrrrUs zValue.stripped_valueN)r"r8r9r6r<rUrrrrrsrc@s(eZdZdZdZeddZddZdS)MimeParameterszmime-parametersFc cst}x\|D]T}|jdsq |djdkr.q |dj}||krLg||<|||j|fq Wx|D]\}}t|t dd}|dd}|j }|j st |dkr|dddkr|ddj td|dd}g}d}x|D]\} } | |kr4| j s"| j tdqn| j td|d7}| j} | j rytj| } Wn&tk rtjj| d d } YnRXy| |d } Wn"tk r| d d } YnXt| r| j t|| qWd |} || fVqpWdS)Nrrr)keyrhz.duplicate parameter name; duplicate(s) ignoredz+duplicate parameter name; duplicate ignoredz(inconsistent RFC2231 parameter numberingzlatin-1)encodingsurrogateescapezus-asciir)rr6rrstriprRritemssortedrrOrrirrInvalidHeaderDefectrurllibparseZunquote_to_bytesUnicodeEncodeErrorZunquotedecode LookupErrorr_has_surrogatesUndecodableBytesDefectr) rparamsr,namepartsZ first_paramrOZ value_partsirparamrrrrrsZ         zMimeParameters.paramscCsXg}x8|jD].\}}|r0|d|t|q ||q Wd|}|rTd|SdS)Nz{}={}z; r?r)rrRr!rr)rrrrrrrr !s zMimeParameters.__str__N)r"r8r9r6r:r<rr rrrrrs Frc@seZdZdZeddZdS)ParameterizedHeaderValueFcCs&x t|D]}|jdkr |jSq WiS)Nzmime-parameters)reversedr6r)rr,rrrr2s  zParameterizedHeaderValue.paramsN)r"r8r9r:r<rrrrrr,src@seZdZdZdZdZdZdS) ContentTypez content-typeFtextZplainN)r"r8r9r6r'maintypesubtyperrrrr:src@seZdZdZdZdZdS)ContentDispositionzcontent-dispositionFN)r"r8r9r6r'content_dispositionrrrrrBsrc@seZdZdZdZdZdS)ContentTransferEncodingzcontent-transfer-encodingFZ7bitN)r"r8r9r6r'rNrrrrrIsrc@seZdZdZdZdS) HeaderLabelz header-labelFN)r"r8r9r6r'rrrrrPsrc@seZdZdZdS)HeaderheaderN)r"r8r9r6rrrrrVsrcsreZdZdZdZdZfddZfddZddZe dd Z dfd d Z d dZ e ddZ ddZZS)TerminalTcst||}||_g|_|S)N)r__new__r6r)clsrr6r)rrrreszTerminal.__new__csd|jjtS)Nz{}({}))r!rr"rr#)r)rrrr#kszTerminal.__repr__cCst|jjd|jdS)N/)r1rr"r6)rrrrr3nszTerminal.pprintcCs t|jS)N)listr)rrrrr$qszTerminal.all_defectsrc s2d||jj|jt|js"dn d|jgS)Nz {}{}/{}({}){}rz {})r!rr"r6rr#r)rr0)rrrr5us z Terminal._ppcCsdS)Nr)rrrrpop_trailing_ws~szTerminal.pop_trailing_wscCsgS)Nr)rrrrr+szTerminal.commentscCst||jfS)N)r r6)rrrr__getnewargs__szTerminal.__getnewargs__)r)r"r8r9r'r;r:rr#r3r<r$r5rr+rr=rr)rrr_s     rc@s eZdZeddZddZdS)WhiteSpaceTerminalcCsdS)Nr?r)rrrrrszWhiteSpaceTerminal.valuecCsdS)NTr)rrrrr&sz!WhiteSpaceTerminal.startswith_fwsN)r"r8r9r<rr&rrrrrs rc@s eZdZeddZddZdS) ValueTerminalcCs|S)Nr)rrrrrszValueTerminal.valuecCsdS)NFr)rrrrr&szValueTerminal.startswith_fwsN)r"r8r9r<rr&rrrrrs rc@s eZdZeddZddZdS)EWWhiteSpaceTerminalcCsdS)Nrr)rrrrrszEWWhiteSpaceTerminal.valuecCsdS)Nrr)rrrrr szEWWhiteSpaceTerminal.__str__N)r"r8r9r<rr rrrrrs rc@s eZdZdS)_InvalidEwErrorN)r"r8r9rrrrrsrr,zlist-separatorr|zroute-component-markerz([{}]+)rz[^{}]+z[\x00-\x20\x7F]cCs>t|}|r|jt|t|r:|jtddS)Nz*Non-ASCII characters found in header token)_non_printable_finderrrRrZNonPrintableDefectrrr)xtextZnon_printablesrrr_validate_xtexts   rcCst|d^}}g}d}d}xbtt|D]J}||dkrL|rFd}d}nd}q(|rVd}n|||krdP|||q(W|d}d|d||dg||fS)NrhFr Tr) _wsp_splitterrangerirRr)rendcharsZfragment remainderZvcharsescapehad_qpposrrr_get_ptext_to_endcharss$   rcCs.|}t|dt|t|d}||fS)Nfws)r{rri)rZnewvaluerrrrget_fwssrc Cst}|ds td||dddd^}}||ddkrXtd|d|}t|dkr|dtkr|dtkr| ddkr|dd^}}|d|}t|dkr|j t d ||_ d|}ytd|d\}}}} Wn*ttfk r*td |j YnX||_||_|j | xh|r|dtkrtt|\} }| | qFt|d^} }t| d } t| | | d|}qFW|r|dtkr|j t d ||fS) Nz=?z"expected encoded word but found {}rfz?=rhrr?zwhitespace inside encoded wordz!encoded word format invalid: '{}'vtextz.missing trailing whitespace after encoded-word)rM startswithrHeaderParseErrorr!rurrircountrrRrrN_ewr ValueErrorKeyErrorrrOrPr*WSPrrrr) rZewrrZremstrrestrrOrPrr,charsrrrrget_encoded_wordsT                rcCsLt}x>|rF|dtkr4t|\}}||q d}|dryt|\}}Wn,tk rjd}Yntjk r~YnrXd}t |dkr|dj dkr|j t dd}|rt |dkr|d j d krt |dd|d<||q t|d^}}|rt|r|d^}}t|d }t|||d |}q W|S) NrTz=?Frjrz&missing whitespace before encoded wordrhz encoded-wordrr)rCrrrRrrrrrrir6rrrrrfc2047_matchersearch partitionrrr)rrDr,valid_ewZhave_wsrrrrrrget_unstructured8sD          rcCs*t|d\}}}t|d}t|||fS)Nz()r)rrr)rr_rrr get_qp_ctext{s  rcCs*t|d\}}}t|d}t|||fS)Nr r)rrr)rrrrrr get_qcontents  rcCsNt|}|std||}|t|d}t|d}t|||fS)Nzexpected atext but found '{}'atext)_non_atom_end_matcherrrr!r`rirr)rmrrrr get_atexts  rcCsv|ddkrtd|t}|dd}|rT|ddkrTt|\}}||x|rD|ddkrD|dtkrt|\}}n|dddkr,d}y&t|\}}|j t dd }Wn"tjk rt|\}}YnX|r8t |dkr8|d j d kr8|d j d kr8t |d d |d <n t|\}}||qVW|sf|j t d||fS||ddfS)Nrr zexpected '"' but found '{}'rhrfz=?Fz!encoded word inside quoted stringTrjrrz encoded-wordz"end of header inside quoted string)rrr!rVrrRrrrrrrir6r)rZbare_quoted_stringr,rrrrget_bare_quoted_strings@          rcCs|r |ddkr td|t}|dd}x^|r|ddkr|dtkr^t|\}}n&|ddkrxt|\}}n t|\}}||q4W|s|j t d||fS||ddfS)Nrrzexpected '(' but found '{}'rhrYzend of header inside comment) rrr!rWrr get_commentrrRrr)rr@r,rrrrs"      rcCsTt}xD|rJ|dtkrJ|dtkr2t|\}}n t|\}}||qW||fS)Nr)rH CFWS_LEADERrrrrR)rrIr,rrrget_cfwss  rcCspt}|r,|dtkr,t|\}}||t|\}}|||rh|dtkrht|\}}||||fS)Nr)rQrrrRr)rZ quoted_stringr,rrrget_quoted_strings      rcCst}|r,|dtkr,t|\}}|||rL|dtkrLtd||dryt |\}}Wqtjk rt |\}}YqXn t |\}}|||r|dtkrt|\}}||||fS)Nrzexpected atom but found '{}'z=?) rJrrrR ATOM_ENDSrrr!rrr)rrKr,rrrget_atoms$        rcCst}|r|dtkr&td|xP|rv|dtkrvt|\}}|||r(|ddkr(|t|dd}q(W|dtkrtdd|||fS)Nrz8expected atom at a start of dot-atom-text but found '{}'r rhrjz4expected atom at end of dot-atom-text but found '{}')rwrrrr!rrRr)rZ dot_atom_textr,rrrget_dot_atom_text)s     rcCst}|dtkr(t|\}}|||drhyt|\}}Wqttjk rdt|\}}YqtXn t|\}}|||r|dtkrt|\}}||||fS)Nrz=?) rvrrrRrrrrr)rZdot_atomr,rrr get_dot_atom<s        rcCs|dtkrt|\}}nd}|s,td|ddkrFt|\}}n*|dtkrdtd|n t|\}}|dk r|g|dd<||fS)Nrz5Expected 'atom' or 'quoted-string' but found nothing.r z1Expected 'atom' or 'quoted-string' but found '{}')rrrrrSPECIALSr!r)rleaderr,rrrget_wordUs     rcCst}yt|\}}||Wn(tjk rH|jtdYnXx|r|dtkr|ddkr|t|jt d|dd}qLyt|\}}WnDtjk r|dt krt |\}}|jt dnYnX||qLW||fS)Nzphrase does not start with wordrr zperiod in 'phrase'rhzcomment found without atom) rErrRrrrr PHRASE_ENDSrObsoleteHeaderDefectrr)rrFr,rrr get_phrasews.          rc Csvt}d}|dtkr"t|\}}|s6td|yt|\}}Wn^tjk ryt|\}}Wn6tjk r|ddkr|dtkrt }YnXYnX|dk r|g|dd<| ||r4|ddks|dtkr4t t ||\}}|j dkr|j tdn|j td||d<y|jdWn(tk rl|j tdYnX||fS) Nrz"expected local-part but found '{}'r zinvalid-obs-local-partzzangle-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) rorrrRrrr!rrrr r r)rZ angle_addrr,rrrget_angle_addrsJ                rcCs<t}t|\}}||dd|jdd|_||fS)N)rrr*r)rrar,rrrget_display_names  rcCst}d}|dtkr6t|\}}|s6td||ddkr|dtkr^td|t|\}}|s~td||dk r|g|ddd<d}||t |\}}|dk r|g|dd<||||fS)Nrz!expected name-addr but found '{}'r) rgrrrrr!rrrRr)rZ name_addrrr,rrr get_name_addrs0           rc Cst}yt|\}}WnNtjk rdyt|\}}Wn&tjk r^td|YnXYnXtdd|jDrd|_| |||fS)Nzexpected mailbox but found '{}'css|]}t|tjVqdS)N)rrr)rrrrrrszget_mailbox..zinvalid-mailbox) rrrrrr r!anyr$r6rR)rrbr,rrr get_mailboxs  rcCsht}xX|r^|d|kr^|dtkrF|t|dd|dd}qt|\}}||qW||fS)Nrzmisplaced-specialrh)rsrrRrr)rrZinvalid_mailboxr,rrrget_invalid_mailboxs   rcCst}x|r|ddkryt|\}}||Wntjk r@d}|dtkrt|\}}|rz|ddkr|||jtdn@t |d\}}|dk r|g|dd<|||jt dnb|ddkr|jtdnBt |d\}}|dk r |g|dd<|||jt dYnX|r|ddkr|d}d|_ t |d\}}| ||jt d|r |ddkr |t |d d}q W||fS) Nr;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listrrjzinvalid-mailboxrh)rcrrRrrrrrrrrr6r*r )rZ mailbox_listr,rrbrrrget_mailbox_listsN                   rcCst}|s$|jtd||fSd}|r|dtkrt|\}}|sl|jtd||||fS|ddkr||||fSt|\}}t|j dkr|dk r||| ||jt d||fS|dk r|g|dd<||||fS)Nzend of header before group-listrzend of header in group-listrzgroup-list with empty entries) rdrrRrrrrrrir^r*r)rZ group_listrr,rrrget_group_listPs8           rcCs t}t|\}}|r"|ddkr2td||||tdd|dd}|r|ddkr|tdd||ddfSt|\}}|||s|jt dn|ddkrtd ||tdd|dd}|r|dt krt |\}}||||fS) Nrr z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorrhrzgroup-terminatorzend of header in groupz)expected ';' at end of group but found {}) rerrrr!rRrrrrrr)rr`r,rrr get_groupus2            rc Csxt}yt|\}}WnNtjk rdyt|\}}Wn&tjk r^td|YnXYnX||||fS)Nzexpected address but found '{}')r_rrrrr!rR)rr[r,rrr get_addresss rc Cst}x|ryt|\}}||Wn tjk rL}zd}|dtkrt|\}}|rn|ddkr|||jtdnFt |d\}}|dk r|g|dd<|t |g|jt dnh|ddkr|jtdnHt |d\}}|dk r|g|dd<|t |g|jt dWdd}~XYnX|r|ddkr|dd}d|_ t |d\}}| ||jt d|r |tdd|d d}q W||fS) Nrrz"address-list entry with no contentzinvalid address in address-listzempty element in address-listrjzinvalid-mailboxzlist-separatorrh)rZrrRrrrrrrrr_rr6r*r)rZ address_listr,errrrbrrrget_address_listsN                  rcCst}|s |jtd|S|dtkrXt|\}}|||sX|jtdd}x8|r|ddkr|dtkr||d7}|dd}q^W|s|jtd ||t |dnt ||_ |t |d |r |dtkr t|\}}|||r |ddkrX|j dk r>|jtd |rT|t |d|S|t dd |dd}|r|dtkrt|\}}|||s|j dk r|jtd |Sd}x2|r|dtkr||d7}|dd}qW|s2|jtd ||t |dnt ||_ |t |d |rv|dtkrvt|\}}|||r|jtd |t |d|S)Nz%Missing MIME version number (eg: 1.0)rz0Expected MIME version number but found only CFWSrr rhz1Expected 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)rrrRrHeaderMissingRequiredValuerrisdigitrr!rintrr)rZ mime_versionr,rrrrparse_mime_versionsv                        r!cCsht}xX|r^|ddkr^|dtkrF|t|dd|dd}qt|\}}||qW||fS)Nrrzmisplaced-specialrh)rrrRrr)rZinvalid_parameterr,rrrget_invalid_parameter2s   r"cCsNt|}|std||}|t|d}t|d}t|||fS)Nzexpected ttext but found '{}'ttext)_non_token_end_matcherrrr!r`rirr)rrr#rrr get_ttextDs   r%cCst}|r,|dtkr,t|\}}|||rL|dtkrLtd|t|\}}|||r|dtkrt|\}}||||fS)Nrzexpected token but found '{}') rLrrrR TOKEN_ENDSrrr!r%)rZmtokenr,rrr get_tokenWs        r'cCsNt|}|std||}|t|d}t|d}t|||fS)Nz expected attrtext but found {!r}r)_non_attribute_end_matcherrrr!r`rirr)rrrrrr get_attrtextns   r)cCst}|r,|dtkr,t|\}}|||rL|dtkrLtd|t|\}}|||r|dtkrt|\}}||||fS)Nrzexpected token but found '{}') rrrrRATTRIBUTE_ENDSrrr!r))rrr,rrr get_attributes        r+cCsNt|}|std||}|t|d}t|d}t|||fS)Nz)expected extended attrtext but found {!r}zextended-attrtext)#_non_extended_attribute_end_matcherrrr!r`rirr)rrrrrrget_extended_attrtexts  r-cCst}|r,|dtkr,t|\}}|||rL|dtkrLtd|t|\}}|||r|dtkrt|\}}||||fS)Nrzexpected token but found '{}') rrrrREXTENDED_ATTRIBUTE_ENDSrrr!r-)rrr,rrrget_extended_attributes       r/cCst}|r|ddkr&td||tdd|dd}|rR|dsbtd|d}x,|r|dr||d7}|dd}qhW|ddkr|dkr|jtd t ||_ |t|d ||fS) Nr*zExpected section but found {}zsection-markerrhz$Expected section number but found {}r0z'section number has an invalid leading 0r) rrrr!rRrrrZInvalidHeaderErrorr r)rrrrrr get_sections&     r2cCst}|stdd}|dtkr0t|\}}|sDtd||ddkr^t|\}}n t|\}}|dk r|g|dd<||||fS)Nz&Expected value but found end of stringrz Expected value but found only {}r ) rrrrrr!rr/rR)rvrr,rrr get_values       r4c Cst}t|\}}|||r,|ddkrL|jtd|||fS|ddkry t|\}}d|_||Wntj k rYnX|st d|ddkr|t dd|dd}d|_ |dd krt d |t d d |dd}d}|r,|dt kr,t |\}}||d}|}|j rF|rF|dd krFt|\}}|j}d }|jdkr|r|ddkrd}n$t|\}} | r| ddkrd}n(yt|\}} Wn Yn X| sd}|r0|jtd||x,|D]$} | jdkrg| dd<| }PqW|}nd}|jtd|r`|ddkr`d}n t|\}}|j r|jdkr|r|ddkr|||dk r|}||fS|jtd|s|jtd|||dkr||fSn|dk r@x|D]} | jdkr Pq W| jdk|| | j|_|ddkr^t d||t dd|dd}|r|ddkrt|\}}|||j|_|r|ddkrt d||t dd|dd}|dk rht} xd|r`|dtkr t|\}}n2|dd krFt d d}|dd}n t|\}}| |qW| }n t|\}}|||dk r|}||fS)Nrrz)Parameter contains name ({}) but no valuer0TzIncomplete parameterzextended-parameter-markerrh=zParameter not followed by '='zparameter-separatorr F'z5Quoted string value for extended parameter is invalidzbare-quoted-stringzZParameter 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 delimiterszextended-attrtextrz=Expected RFC2231 char/lang encoding delimiter, but found {!r}zRFC2231-delimiterz;Expected RFC2231 char/lang encoding delimiter, but found {}ZDQUOTE)rr+rRrrrr!r2rrrrrrrrUrr)r-r6r4rrOrPrrrr) rrr,rrZappendtoZqstringZ inner_valueZ semi_validrtr3rrr get_parameters                                              r8c Csht}xZ|rbyt|\}}||Wntjk r}zd}|dtkrZt|\}}|sl|||S|ddkr|dk r|||jtdn@t |\}}|r|g|dd<|||jtd |Wdd}~XYnX|r@|ddkr@|d}d|_ t |\}}| ||jtd ||r |t dd|d d}q W|S) Nrrzparameter entry with no contentzinvalid parameter {!r}rjzinvalid-parameterz)parameter with invalid trailing text {!r}zparameter-separatorrh)rr8rRrrrrrrr"r!r6r*r)rZmime_parametersr,rrrrrrparse_mime_parameters sD                 r9cCsxX|rX|ddkrX|dtkr@|t|dd|dd}qt|\}}||qW|sbdS|tdd|t|dddS)Nrrzmisplaced-specialrhzparameter-separator)rrRrrr9)Z tokenlistrr,rrr_find_mime_parameters s  r:c Cst}d}|s$|jtd|Syt|\}}Wn8tjk rl|jtd|t |||SX|||r|ddkr|jtd|rt |||S|j |_ |tdd|dd}yt|\}}Wn:tjk r"|jtd |t |||SX|||j |_|sH|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-separatorrhz'Expected content subtype but found {!r}rzcCsDd}|r@|dr@|ddtkr@|dd}|ddd|d<|S)Nrrj)r)linesZwsprrr_steal_trailing_WSP_if_existsL s  r@cCs|jp tj}|jrdnd}dg}d}d}d}tdd}t|} xl| r| d} | |krd|d8}qBt| } | jdkrt | t @rd }y| ||} Wn6t k rt d d | jDrd } nd} d }YnX| jd krt| |||qB|r|s| jstd}d}| jrt| j|ddt|j } |j| krtt| |t|dkrbt|}|||d| 7<qBt| dst| | } nt| |||| j| }d}qBt| |t|dkr|d| 7<qB| jrt| d|krt|}|s| r||| d}qBt| dsRt| }| jsH|d7}|||| } qB| jrr|sr| d| d }qBt|}|s| r||| qB|d| 7<qBW|j||jS)Nzutf-8zus-asciirrFwrap_as_ew_blockedrhrTcss|]}t|tjVqdS)N)rrr)rrrrrrm sz%_refold_parse_tree..z unknown-8bitzmime-parameters)r-rjr)Zmax_line_lengthsysmaxsizeutf8rrrr r6r}rrrrr$_fold_mime_parametersr'r:r/rilinesepr@rRr7 _fold_as_ewr;r&insertr)Z parse_treer-maxlenrr?last_ewrAZ want_encodingZend_ew_not_allowedrr(tstrrOZ encoded_partnewlineZnewpartsrrrr.S s                 r.cCs|dk r<|rrCrErGrHrJrLrMrQrVrWrZr_rcrdrergrorqrrrsrtrvrwrxrrrrrrrrrrrrrrrrrr rrrrrrrr r r!rrurrmatchrfindallrr$r(r,rrrrrrrrrrrrrrrrrrrrrrrr r rrrrrrrrrrr!r"r%r'r)r+r-r/r2r4r8r9r:r<r=r>r@r.rGrErrrrFs           C  "   !*$ V +         1C+ "&'/'&).9%>D49/gA