B
    18™\^  ã               @   sæ   d ddgZ ddlZddlZddlZddlZddlmZ ddlmZ	 e	j
Z
dZdZd	Zd
ZdZdZdZe
dƒZe
dƒZe dejejB ¡Ze d¡Ze d¡ZejjZdd„ Zddd„ZG dd „ d ƒZG dd„ dƒZG dd„ de ƒZ!dS )ÚHeaderÚdecode_headerÚmake_headeré    N)ÚHeaderParseError)ÚcharsetÚ
ú ó    z        Ú éN   z 	zus-asciizutf-8ai  
  =\?                   # literal =?
  (?P<charset>[^?]*?)   # non-greedy up to the next ? is the charset
  \?                    # literal ?
  (?P<encoding>[qQbB])  # either a "q" or a "b", case insensitive
  \?                    # literal ?
  (?P<encoded>.*?)      # non-greedy up to the next ?= is the encoded string
  \?=                   # literal ?=
  z[\041-\176]+:$z
\n[^ \t]+:c          	   C   s°  t | dƒrdd„ | jD ƒS t | ¡s.| d fgS g }x|  ¡ D ]„}t |¡}d}xp|r¾| d¡}|rn| ¡ }d}|r‚| |d d f¡ |rP| d¡ 	¡ }| d¡ 	¡ }| d¡}| |||f¡ qPW q<W g }	xVt
|ƒD ]J\}
}|
dkrÒ|d rÒ||
d  d rÒ||
d  d  ¡ rÒ|	 |
d ¡ qÒW xt|	ƒD ]}||= q*W g }xÒ|D ]Ê\}}}|d krh| ||f¡ n¤|d	krŽtj |¡}| ||f¡ n~|d
kr t|ƒd }|r¾|dd d| … 7 }ytj |¡}W n  tjk
rî   tdƒ‚Y nX | ||f¡ ntd| ƒ‚qDW g }d  }}x~|D ]v\}}t|tƒrBt|dƒ}|d krV|}|}nB||krx| ||f¡ |}|}n |d kr|t| 7 }n||7 }q$W | ||f¡ |S )NÚ_chunksc             S   s(   g | ] \}}t  |t|ƒ¡t|ƒf‘qS © )Ú_charsetZ_encodeÚstr)Ú.0Ústringr   r   r   úP/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/email/header.pyú
<listcomp>M   s   z!decode_header.<locals>.<listcomp>Tr   Fé   é   ÚqÚbé   z===zBase64 decoding errorzUnexpected encoding: zraw-unicode-escape)Úhasattrr   ÚecreÚsearchÚ
splitlinesÚsplitÚpopÚlstripÚappendÚlowerÚ	enumerateÚisspaceÚreversedÚemailÚ
quoprimimeZheader_decodeÚlenÚ
base64mimeÚdecodeÚbinasciiÚErrorr   ÚAssertionErrorÚ
isinstancer   ÚbytesÚBSPACE)ÚheaderÚwordsÚlineÚpartsÚfirstZ	unencodedr   ÚencodingÚencodedZdroplistÚnÚwÚdZdecoded_wordsZencoded_stringZwordZpaderrZ	collapsedZ	last_wordÚlast_charsetr   r   r   r   =   sz    






4






c             C   sJ   t |||d}x6| D ].\}}|d k	r6t|tƒs6t|ƒ}| ||¡ qW |S )N)Ú
maxlinelenÚheader_nameÚcontinuation_ws)r   r-   ÚCharsetr    )Zdecoded_seqr;   r<   r=   ÚhÚsr   r   r   r   r   œ   s    c               @   sJ   e Zd Zddd„Zdd„ Zdd	„ Zdd
d„Zdd„ Zddd„Zdd„ Z	dS )r   Nr   Ústrictc             C   s|   |d krt }nt|tƒs t|ƒ}|| _|| _g | _|d k	rH|  |||¡ |d krTt}|| _|d krjd| _	nt
|ƒd | _	d S )Nr   r   )ÚUSASCIIr-   r>   r   Ú_continuation_wsr   r    Ú
MAXLINELENÚ_maxlinelenÚ
_headerlenr'   )Úselfr@   r   r;   r<   r=   Úerrorsr   r   r   Ú__init__´   s    
zHeader.__init__c       	      C   sÈ   |   ¡  g }d }d }x¨| jD ]ž\}}|}|tjkrJ| dd¡}| dd¡}|rš|o^|  |d ¡}|dkr„|dkrš|sš| t¡ d }n|dkrš|sš| t¡ |oª|  |d ¡}|}| |¡ qW t	 
|¡S )NÚasciiÚsurrogateescapeÚreplacer   )Nzus-asciiéÿÿÿÿ)Ú
_normalizer   r   ÚUNKNOWN8BITÚencoder)   Ú	_nonctextr    ÚSPACEÚEMPTYSTRINGÚjoin)	rG   ZuchunksÚlastcsÚ	lastspacer   r   ZnextcsZoriginal_bytesÚhasspacer   r   r   Ú__str__ã   s*    


zHeader.__str__c             C   s   |t | ƒkS )N)r   )rG   Úotherr   r   r   Ú__eq__  s    zHeader.__eq__c             C   s¶   |d kr| j }nt|tƒs"t|ƒ}t|tƒsZ|jp4d}|t jkrN| dd¡}n| ||¡}|jpbd}|t jkr¢y| ||¡ W n" t	k
r    |dkr˜‚ t
}Y nX | j ||f¡ d S )Nzus-asciirK   )r   r-   r>   r   Zinput_codecrO   r)   Zoutput_codecrP   ÚUnicodeEncodeErrorÚUTF8r   r    )rG   r@   r   rH   Zinput_charsetZoutput_charsetr   r   r   r    	  s$    






zHeader.appendc             C   s   |  ¡ p|dkS )N)ú(ú)ú\)r#   )rG   r@   r   r   r   rQ   4  s    zHeader._nonctextú;, 	r   c             C   sª  |   ¡  |d kr| j}|dkr"d}t| j|| j|ƒ}d }d  }}x.| jD ]"\}}	|d k	r |ol|  |d ¡}|dkrŒ|r‚|	dkr | ¡  n|	dkr |s | ¡  |o°|  |d ¡}|	}d}| ¡ }
|
rÚ| 	d|
d |	¡ n| 	dd|	¡ xp|
dd … D ]`}| 
¡  |	jd k	r(| 	| jd| ¡  |	¡ qö| ¡ }|d t|ƒt|ƒ … }| 	|||	¡ qöW t|
ƒdkrJ| 
¡  qJW | jr‚| ¡  | |¡}t |¡r¦td	 |¡ƒ‚|S )
Nr   i@B )Nzus-asciirM   Fr
   r   r   z8header value appears to contain an embedded header: {!r})rN   rE   Ú_ValueFormatterrF   rC   r   rQ   Úadd_transitionr   ÚfeedÚnewlineÚheader_encodingr   r'   Ú_strÚ_embedded_headerr   r   Úformat)rG   Ú
splitcharsr;   ÚlinesepÚ	formatterrU   rW   rV   r   r   Úlinesr2   ZslineÚfwsÚvaluer   r   r   rP   9  sR    !


zHeader.encodec             C   s|   g }d }g }xL| j D ]B\}}||kr0| |¡ q|d k	rL| t |¡|f¡ |g}|}qW |rr| t |¡|f¡ || _ d S )N)r   r    rR   rT   )rG   Úchunksr:   Z
last_chunkr   r   r   r   r   rN   ‰  s    zHeader._normalize)NNNNr   rA   )NrA   )r`   Nr   )
Ú__name__Ú
__module__Ú__qualname__rI   rX   rZ   r    rQ   rP   rN   r   r   r   r   r   ³   s     
- 
+
Pc               @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ra   c             C   s0   || _ || _t|ƒ| _|| _g | _t|ƒ| _d S )N)Ú_maxlenrC   r'   Ú_continuation_ws_lenÚ_splitcharsÚ_linesÚ_AccumulatorÚ_current_line)rG   Z	headerlenÚmaxlenr=   ri   r   r   r   rI   ž  s    
z_ValueFormatter.__init__c             C   s   |   ¡  | | j¡S )N)rd   rT   rv   )rG   rj   r   r   r   rf   ¦  s    z_ValueFormatter._strc             C   s
   |   t¡S )N)rf   ÚNL)rG   r   r   r   rX   ª  s    z_ValueFormatter.__str__c             C   sp   | j  ¡ }|dkr| j j|Ž  t| j ƒdkrb| j  ¡ rP| jd  t| j ƒ7  < n| j t| j ƒ¡ | j  ¡  d S )N)r   r
   r   rM   )	rx   r   Úpushr'   Ú	is_onlywsrv   r   r    Úreset)rG   Zend_of_liner   r   r   rd   ­  s    

z_ValueFormatter.newlinec             C   s   | j  dd¡ d S )Nr   r
   )rx   r{   )rG   r   r   r   rb   ¸  s    z_ValueFormatter.add_transitionc             C   sÄ   |j d kr|  ||| j¡ d S | ||  ¡ ¡}y| d¡}W n tk
rP   d S X |d k	rf|  ||¡ y| ¡ }W n tk
r†   d S X |  ¡  | j	 
| j|¡ x|D ]}| j | j| ¡ q¦W d S )Nr   )re   Ú_ascii_splitru   Zheader_encode_linesÚ_maxlengthsr   Ú
IndexErrorÚ_append_chunkrd   rx   r{   rC   rv   r    )rG   rm   r   r   Zencoded_linesZ
first_lineÚ	last_liner2   r   r   r   rc   »  s$    

z_ValueFormatter.feedc             c   s*   | j t| jƒ V  x| j | j V  qW d S )N)rs   r'   rx   rt   )rG   r   r   r   r   à  s    z_ValueFormatter._maxlengthsc             C   sj   t  dt d || ¡}|d r0dg|d d…< n
| d¡ x*tt|ƒgd Ž D ]\}}|  ||¡ qNW d S )Nz([z]+)r   r
   r   )Úrer   ÚFWSr   ÚzipÚiterr   )rG   rm   r   ri   r3   Úpartr   r   r   r~   æ  s    
z_ValueFormatter._ascii_splitc             C   s
  | j  ||¡ t| j ƒ| jkrxº| jD ]t}xlt| j  ¡ d ddƒD ]P}| ¡ rp| j | d }|rp|d |krpP | j |d  d }|rD|d |krDP qDW q(P q(W | j  ¡ \}}| j j	dkrÊ|  
¡  |sÊd}| j  ||¡ d S | j  |¡}| j t| j ƒ¡ | j  |¡ d S )Nr   r   rM   r   )rx   r{   r'   rs   ru   ÚrangeÚ
part_countr#   r   Ú_initial_sizerd   Úpop_fromrv   r    r   r}   )rG   rm   r   ZchÚiZprevpartr‡   Ú	remainderr   r   r   r   ü  s.    z_ValueFormatter._append_chunkN)rp   rq   rr   rI   rf   rX   rd   rb   rc   r   r~   r   r   r   r   r   ra     s   %ra   c                   sj   e Zd Zd‡ fdd„	Zdd„ Zddd„Z‡ fdd	„Zd
d„ Zdd„ Zddd„Z	dd„ Z
‡ fdd„Z‡  ZS )rw   r   c                s   || _ tƒ  ¡  d S )N)rŠ   ÚsuperrI   )rG   Zinitial_size)Ú	__class__r   r   rI     s    z_Accumulator.__init__c             C   s   |   ||f¡ d S )N)r    )rG   rm   r   r   r   r   r{   #  s    z_Accumulator.pushc             C   s   | |d … }g | |d …< |S )Nr   )rG   rŒ   Zpoppedr   r   r   r‹   &  s    z_Accumulator.pop_fromc                s   |   ¡ dkrdS tƒ  ¡ S )Nr   )r
   r
   )r‰   rŽ   r   )rG   )r   r   r   r   +  s    z_Accumulator.popc             C   s   t dd„ | D ƒ| jƒS )Nc             s   s"   | ]\}}t |ƒt |ƒ V  qd S )N)r'   )r   rm   r‡   r   r   r   ú	<genexpr>1  s    z'_Accumulator.__len__.<locals>.<genexpr>)ÚsumrŠ   )rG   r   r   r   Ú__len__0  s    z_Accumulator.__len__c             C   s   t  dd„ | D ƒ¡S )Nc             s   s    | ]\}}t  ||f¡V  qd S )N)rS   rT   )r   rm   r‡   r   r   r   r   5  s   z'_Accumulator.__str__.<locals>.<genexpr>)rS   rT   )rG   r   r   r   rX   4  s    
z_Accumulator.__str__Nc             C   s"   |d krg }|| d d …< d| _ d S )Nr   )rŠ   )rG   Zstartvalr   r   r   r}   8  s    z_Accumulator.resetc             C   s   | j dko|  pt| ƒ ¡ S )Nr   )rŠ   r   r#   )rG   r   r   r   r|   >  s    z_Accumulator.is_onlywsc                s
   t ƒ  ¡ S )N)rŽ   r’   )rG   )r   r   r   r‰   A  s    z_Accumulator.part_count)r   )r   )N)rp   rq   rr   rI   r{   r‹   r   r’   rX   r}   r|   r‰   Ú__classcell__r   r   )r   r   rw     s   

rw   )NNr   )"Ú__all__rƒ   r*   Zemail.quoprimimer%   Zemail.base64mimeZemail.errorsr   r   r   r>   rz   rR   r/   ZSPACE8rS   rD   r„   rB   r\   ÚcompileÚVERBOSEÚ	MULTILINEr   Zfcrerg   r&   Z_max_appendr   r   r   ra   Úlistrw   r   r   r   r   Ú<module>   s>   

_ 
 k 