B Uý0<8Vü^ã@sædddgZddlZddlZddlZddlZddlmZddlmZ e j Z dZ dZ d Z d Zd Zd Zd Ze dƒZe dƒZe dejejB¡Ze d¡Ze d¡ZejjZdd„Zddd„ZGdd„dƒZGdd„dƒZGdd„de ƒZ!dS)ÚHeaderÚ decode_headerÚ make_headeréN)ÚHeaderParseError)ÚcharsetÚ ú ó z ÚéNz zus-asciizutf-8ai =\? # literal =? (?P[^?]*?) # non-greedy up to the next ? is the charset \? # literal ? (?P[qQbB]) # either a "q" or a "b", case insensitive \? # literal ? (?P.*?) # non-greedy up to the next ?= is the encoded string \?= # literal ?= z[\041-\176]+:$z \n[^ \t]+:c Cs°t|dƒrdd„|jDƒSt |¡s.|dfgSg}x| ¡D]„}t |¡}d}xp|r¾| d¡}|rn| ¡}d}|r‚| |ddf¡|rP| d¡  ¡}| d¡  ¡}| d¡}| |||f¡qPWqMsz!decode_header..TrFééÚqÚbéz===zBase64 decoding errorzUnexpected encoding: zraw-unicode-escape)Úhasattrr ÚecreÚsearchÚ splitlinesÚsplitÚpopÚlstripÚappendÚlowerÚ enumerateÚisspaceÚreversedÚemailÚ quoprimimeZ header_decodeÚlenZ base64mimeÚdecodeÚbinasciiÚErrorrÚAssertionErrorÚ isinstancerÚbytesÚBSPACE)ÚheaderZwordsÚlineÚpartsÚfirstZ unencodedrÚencodingZencodedZdroplistÚnÚwÚdZ decoded_wordsZencoded_stringZwordZpaderrZ collapsedZ last_wordÚ last_charsetr r rr=sz       4           cCsJt|||d}x6|D].\}}|dk r6t|tƒs6t|ƒ}| ||¡qW|S)N)Ú maxlinelenÚ header_nameÚcontinuation_ws)rr,ÚCharsetr )Z decoded_seqr8r9r:ÚhÚsrr r rrœs c@sJeZdZddd„Zdd„Zdd „Zdd d „Zd d „Zddd„Zdd„Z dS)rNrÚstrictcCs||dkrt}nt|tƒs t|ƒ}||_||_g|_|dk rH| |||¡|dkrTt}||_|dkrjd|_ nt |ƒd|_ dS)Nrr) ÚUSASCIIr,r;rÚ_continuation_wsr r Ú MAXLINELENÚ _maxlinelenÚ _headerlenr')Úselfr=rr8r9r:Úerrorsr r rÚ__init__´s zHeader.__init__c CsÈ| ¡g}d}d}x¨|jD]ž\}}|}|tjkrJ| dd¡}| dd¡}|rš|o^| |d¡}|dkr„|dkrš|sš| t¡d}n|dkrš|sš| t¡|oª| |d¡}|}| |¡qWt   |¡S)NÚasciiÚsurrogateescapeÚreplacer)Nzus-asciiéÿÿÿÿ) Ú _normalizer rÚ UNKNOWN8BITÚencoder(Ú _nonctextr ÚSPACEÚ EMPTYSTRINGÚjoin) rDZuchunksÚlastcsÚ lastspacerrZnextcsZoriginal_bytesÚhasspacer r rÚ__str__ãs*       zHeader.__str__cCs |t|ƒkS)N)r)rDÚotherr r rÚ__eq__sz Header.__eq__cCs¶|dkr|j}nt|tƒs"t|ƒ}t|tƒsZ|jp4d}|tjkrN| dd¡}n | ||¡}|jpbd}|tjkr¢y| ||¡Wn"t k r |dkr˜‚t }YnX|j   ||f¡dS)Nzus-asciirH) rr,r;rZ input_codecrLr(Z output_codecrMÚUnicodeEncodeErrorÚUTF8r r )rDr=rrEZ input_charsetÚoutput_charsetr r rr s$        z Header.appendcCs| ¡p|dkS)N)ú(ú)ú\)r#)rDr=r r rrN4szHeader._nonctextú;, rcCsª| ¡|dkr|j}|dkr"d}t|j||j|ƒ}d}d}}x.|jD]"\}} |dk r |ol| |d¡}|dkrŒ|r‚| dkr | ¡n| dkr |s | ¡|o°| |d¡}| }d}| ¡} | rÚ|  d| d| ¡n|  dd| ¡xp| dd…D]`} |  ¡| j dk r(|  |jd|   ¡| ¡qö|   ¡} | dt | ƒt | ƒ…} |  | | | ¡qöWt | ƒdkrJ|  ¡qJW|jr‚| ¡| |¡}t |¡r¦td  |¡ƒ‚|S) Nri@B)Nzus-asciirJFr rrz8header value appears to contain an embedded header: {!r})rKrBÚ_ValueFormatterrCr@r rNÚadd_transitionrÚfeedÚnewlineÚheader_encodingrr'Ú_strÚ_embedded_headerrrÚformat)rDÚ splitcharsr8ÚlinesepÚ formatterrRrTrSrrÚlinesr0ZslineÚfwsÚvaluer r rrM9sR!         z Header.encodecCs|g}d}g}xL|jD]B\}}||kr0| |¡q|dk rL| t |¡|f¡|g}|}qW|rr| t |¡|f¡||_dS)N)r r rOrQ)rDZchunksr7Z last_chunkrrr r rrK‰s zHeader._normalize)NNNNrr>)Nr>)r^Nr) Ú__name__Ú __module__Ú __qualname__rFrUrWr rNrMrKr r r rr³s -  + Pc@sTeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dS)r_cCs0||_||_t|ƒ|_||_g|_t|ƒ|_dS)N)Ú_maxlenr@r'Ú_continuation_ws_lenÚ _splitcharsÚ_linesÚ _AccumulatorÚ _current_line)rDZ headerlenÚmaxlenr:rgr r rrFžs  z_ValueFormatter.__init__cCs| ¡| |j¡S)N)rbrQrs)rDrhr r rrd¦sz_ValueFormatter._strcCs | t¡S)N)rdÚNL)rDr r rrUªsz_ValueFormatter.__str__cCsv|j ¡}|dkr|jj|Žt|jƒdkrh|j ¡rV|jrV|jdt|jƒ7<n|j t|jƒ¡|j ¡dS)N)rr rrJ) rurÚpushr'Ú is_onlywsrsrr Úreset)rDZ end_of_liner r rrb­s  z_ValueFormatter.newlinecCs|j dd¡dS)Nrr )rurx)rDr r rr`¸sz_ValueFormatter.add_transitioncCsÄ|jdkr| |||j¡dS| || ¡¡}y| d¡}Wntk rPdSX|dk rf| ||¡y | ¡}Wntk r†dSX| ¡|j   |j |¡x|D]}|j   |j |¡q¦WdS)Nr)rcÚ _ascii_splitrrZheader_encode_linesÚ _maxlengthsrÚ IndexErrorÚ _append_chunkrbrurxr@rsr )rDrkrrZ encoded_linesZ first_lineÚ last_liner0r r rra»s$    z_ValueFormatter.feedccs*|jt|jƒVx|j|jVqWdS)N)rpr'rurq)rDr r rr|àsz_ValueFormatter._maxlengthscCsjt dtd||¡}|dr0dg|dd…<n | d¡x*tt|ƒgdŽD]\}}| ||¡qNWdS)Nz([z]+)rr r)ÚrerÚFWSrÚzipÚiterr~)rDrkrrgr1Úpartr r rr{æs  z_ValueFormatter._ascii_splitcCs |j ||¡t|jƒ|jkrxº|jD]t}xlt|j ¡dddƒD]P}| ¡rp|j|d}|rp|d|krpP|j|dd}|rD|d|krDPqDWq(Pq(W|j ¡\}}|jj dkrÊ|  ¡|sÊd}|j ||¡dS|j  |¡}|j   t|jƒ¡|j |¡dS)NrrrJr)rurxr'rprrÚrangeÚ part_countr#rÚ _initial_sizerbÚpop_fromrsr rrz)rDrkrZchÚiZprevpartr„Z remainderr r rr~üs.   z_ValueFormatter._append_chunkN) rmrnrorFrdrUrbr`rar|r{r~r r r rr_s %r_csjeZdZd‡fdd„ Zdd„Zddd„Z‡fdd „Zd d „Zd d „Zddd„Z dd„Z ‡fdd„Z ‡Z S)rtrcs||_tƒ ¡dS)N)r‡ÚsuperrF)rDZ initial_size)Ú __class__r rrFsz_Accumulator.__init__cCs| ||f¡dS)N)r )rDrkrr r rrx#sz_Accumulator.pushcCs||d…}g||d…<|S)Nr )rDr‰Zpoppedr r rrˆ&s  z_Accumulator.pop_fromcs| ¡dkrdStƒ ¡S)Nr)r r )r†rŠr)rD)r‹r rr+s z_Accumulator.popcCstdd„|Dƒ|jƒS)Ncss"|]\}}t|ƒt|ƒVqdS)N)r')rrkr„r r rú 1sz'_Accumulator.__len__..)Úsumr‡)rDr r rÚ__len__0sz_Accumulator.__len__cCst dd„|Dƒ¡S)Ncss |]\}}t ||f¡VqdS)N)rPrQ)rrkr„r r rrŒ5sz'_Accumulator.__str__..)rPrQ)rDr r rrU4s z_Accumulator.__str__NcCs"|dkr g}||dd…<d|_dS)Nr)r‡)rDZstartvalr r rrz8s z_Accumulator.resetcCs|jdko| pt|ƒ ¡S)Nr)r‡rr#)rDr r rry>sz_Accumulator.is_onlywscs tƒ ¡S)N)rŠrŽ)rD)r‹r rr†Asz_Accumulator.part_count)r)r)N) rmrnrorFrxrˆrrŽrUrzryr†Ú __classcell__r r )r‹rrts   rt)NNr)"Ú__all__r€r)Zemail.quoprimimer%Zemail.base64mimeZ email.errorsrrrr;rwrOr.ZSPACE8rPrArr?rYÚcompileÚVERBOSEÚ MULTILINErZfcrerer&Z _max_appendrrrr_Úlistrtr r r rÚs>    _ k