3 \&^@sdddgZddlZddlZddlZddlZddlmZddlmZ e j Z dZ dZ d Z dZd Zd Zd Ze dZe dZejdejejBejBZejdZejdZejjZddZdddZGdddZGdddZ Gddde!Z"dS)Header decode_header make_headerN)HeaderParseError)charset   Nz zus-asciizutf-8ai =\? # literal =? (?P[^?]*?) # non-greedy up to the next ? is the charset \? # literal ? (?P[qb]) # 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 Cst|drdd|jDStj|s.|dfgSg}x|jD]}tj|}d}xp|r|jd}|rn|j}d}|r|j|ddf|rP|jdj }|jdj }|jd}|j|||fqPWqMsz!decode_header..TrFqbz===zBase64 decoding errorzUnexpected encoding: zraw-unicode-escape)hasattrr ecresearch splitlinessplitpoplstripappendlower enumerateisspacereversedemail quoprimimeZ header_decodelenZ base64mimedecodebinasciiErrorrAssertionError isinstancerbytesBSPACE)headerZwordslinepartsfirstZ unencodedrencodingZencodedZdroplistnwdZ decoded_wordsZencoded_stringZwordZpaderrZ collapsedZ last_word last_charsetrrrr=sz       4           cCsLt|||d}x8|D]0\}}|dk r8t|t r8t|}|j||qW|S)N) maxlinelen header_namecontinuation_ws)rr-Charsetr!)Z decoded_seqr9r:r;hsrrrrrs c@sJeZdZdddZddZdd Zdd d Zd d ZdddZddZ dS)rNrstrictcCs||dkrt}nt|ts t|}||_||_g|_|dk rH|j||||dkrTt}||_|dkrjd|_ nt |d|_ dS)Nrr) USASCIIr-r<r_continuation_wsr r! MAXLINELEN _maxlinelen _headerlenr()selfr>rr9r:r;errorsrrr__init__s zHeader.__init__c Cs|jg}d}d}x|jD]\}}|}|tjkrJ|jdd}|jdd}|r|o^|j|d}|dkr|dkr| r|jtd}n|d kr| r|jt|o|j|d }|}|j|qWt j |S) Nasciisurrogateescapereplacerus-asciir)NrK)NrK)NrK) _normalizer r UNKNOWN8BITencoder) _nonctextr!SPACE EMPTYSTRINGjoin) rEZuchunkslastcs lastspacerrZnextcsZoriginal_byteshasspacerrr__str__s*     zHeader.__str__cCs |t|kS)N)r)rEotherrrr__eq__sz Header.__eq__c Cs|dkr|j}nt|ts"t|}t|tsZ|jp4d}|tjkrN|jdd}n |j||}|jpbd}|tjkry|j||Wn"t k r|dkrt }YnX|j j ||fdS)Nzus-asciirI) rr-r<rZ input_codecrNr)Z output_codecrOUnicodeEncodeErrorUTF8r r!)rEr>rrFZ input_charsetZoutput_charsetrrrr! s$        z Header.appendcCs|jp|dkS)N()\)r\r]r^)r$)rEr>rrrrP4szHeader._nonctext;, rcCs|j|dkr|j}|dkr"d}t|j||j|}d}d}}x4|jD](\}} |dk r|ol|j|d}|d kr| s| d kr|jn| d kr| r|j|o|j|d }| }d}|j} | r|j d| d| n|j dd| xr| ddD]b} |j | j dk r,|j |jd| j | n.| j } | dt | t | } |j | | | qWt | dkrJ|j qJW|jr|j|j|}tj|rtdj||S) Nri@Bus-asciirFr rz8header value appears to contain an embedded header: {!r})Nr`)Nr`)Nr`rL)rMrC_ValueFormatterrDrAr rPadd_transitionrfeednewlineheader_encodingr r(_str_embedded_headerrrformat)rE splitcharsr9linesepZ formatterrTrVrUrrlinesr1ZslinefwsvaluerrrrO9sR!       z Header.encodecCs|g}d}g}xL|jD]B\}}||kr0|j|q|dk rL|jtj||f|g}|}qW|rr|jtj||f||_dS)N)r r!rQrS)rEZchunksr8Z last_chunkrrrrrrMs zHeader._normalize)NNNNrr?)Nr?)r_Nr) __name__ __module__ __qualname__rGrWrYr!rPrOrMrrrrrs -  + Pc@sTeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dS)racCs0||_||_t||_||_g|_t||_dS)N)_maxlenrAr(_continuation_ws_len _splitchars_lines _Accumulator _current_line)rEZ headerlenmaxlenr;rirrrrGs  z_ValueFormatter.__init__cCs|j|j|jS)N)rdrSrt)rErjrrrrfsz_ValueFormatter._strcCs |jtS)N)rfNL)rErrrrWsz_ValueFormatter.__str__cCsp|jj}|dkr|jj|t|jdkrb|jjrP|jdt|j7<n|jjt|j|jjdS)Nrr rr)rr rL) rvrpushr( is_onlywsrtrr!reset)rEZ end_of_linerrrrds   z_ValueFormatter.newlinecCs|jjdddS)Nrr )rvry)rErrrrbsz_ValueFormatter.add_transitioncCs|jdkr|j|||jdS|j||j}y|jd}Wntk rPdSX|dk rf|j||y |j}Wntk rdSX|j|j j |j |x|D]}|j j |j |qWdS)Nr)re _ascii_splitrsZheader_encode_lines _maxlengthsr IndexError _append_chunkrdrvryrArtr!)rErlrrZ encoded_linesZ first_line last_liner1rrrrcs$    z_ValueFormatter.feedccs*|jt|jVx|j|jVqWdS)N)rqr(rvrr)rErrrr}sz_ValueFormatter._maxlengthscCsjtjdtd||}|dr0dg|dd<n |jdx*tt|gdD]\}}|j||qNWdS)Nz([z]+)rr r)rerFWSrzipiterr)rErlrrir2partrrrr|s  z_ValueFormatter._ascii_splitcCs |jj||t|j|jkrx|jD]t}xlt|jjdddD]P}|jrp|j|d}|rp|d|krpP|j|dd}|rD|d|krDPqDWq(Pq(W|jj\}}|jj dkr|j |sd}|jj||dS|jj |}|j j t|j|jj|dS)NrrrrLrL)rvryr(rqrsrange part_countr$r _initial_sizerdpop_fromrtr!rr{)rErlrZchiZprevpartrZ remainderrrrrs.   z_ValueFormatter._append_chunkN) rnrorprGrfrWrdrbrcr}r|rrrrrras %racsjeZdZdfdd ZddZdddZfdd Zd d Zd d ZdddZ ddZ fddZ Z S)rurcs||_tjdS)N)rsuperrG)rEZ initial_size) __class__rrrGsz_Accumulator.__init__cCs|j||fdS)N)r!)rErlrrrrry#sz_Accumulator.pushcCs||d}g||d<|S)Nr)rErZpoppedrrrr&s  z_Accumulator.pop_fromcs|jdkrdStjS)Nrr )r r )rrr)rE)rrrr+s z_Accumulator.popcCstdd|D|jS)Ncss"|]\}}t|t|VqdS)N)r()rrlrrrr 1sz'_Accumulator.__len__..)sumr)rErrr__len__0sz_Accumulator.__len__cCstjdd|DS)Ncss |]\}}tj||fVqdS)N)rRrS)rrlrrrrr5sz'_Accumulator.__str__..)rRrS)rErrrrW4s z_Accumulator.__str__NcCs"|dkr g}||dd<d|_dS)Nr)r)rEZstartvalrrrr{8s z_Accumulator.resetcCs|jdko| pt|jS)Nr)rrr$)rErrrrz>sz_Accumulator.is_onlywscs tjS)N)rr)rE)rrrrAsz_Accumulator.part_count)r)r)N) rnrorprGryrrrrWr{rzr __classcell__rr)rrrus   ruz )NNr)#__all__rr*Zemail.quoprimimer&Zemail.base64mimeZ email.errorsrrrr<rxrQr/ZSPACE8rRrBrr@r[compileVERBOSE IGNORECASE MULTILINErZfcrergr'Z _max_appendrrrralistrurrrrs>    _ k