a
    åzeüX  ã                   @   s²   d dgZ ddlZddlmZ ddlmZ ddlmZ ddlm	Z	 e 
d¡Ze 
d	¡Ze 
d
¡Ze 
d	¡Ze 
d¡ZdZdZeƒ ZG dd„ deƒZG dd „ d ƒZG dd„ deƒZdS )Ú
FeedParserÚBytesFeedParseré    N)Úerrors)Úcompat32)Údeque)ÚStringIOz
\r\n|\r|\nz(\r\n|\r|\n)z(\r\n|\r|\n)\Zz%^(From |[\041-\071\073-\176]*:|[\t ])Ú Ú
c                   @   s\   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d„ ZdS )ÚBufferedSubFilec                 C   s$   t dd| _tƒ | _g | _d| _d S )Nr   )ÚnewlineF)r   Ú_partialr   Ú_linesÚ	_eofstackÚ_closed©Úself© r   ú&/usr/lib/python3.9/email/feedparser.pyÚ__init__5   s    zBufferedSubFile.__init__c                 C   s   | j  |¡ d S ©N)r   Úappend)r   Zpredr   r   r   Úpush_eof_matcher@   s    z BufferedSubFile.push_eof_matcherc                 C   s
   | j  ¡ S r   )r   Úpopr   r   r   r   Úpop_eof_matcherC   s    zBufferedSubFile.pop_eof_matcherc                 C   s<   | j  d¡ |  | j  ¡ ¡ | j  d¡ | j  ¡  d| _d S )Nr   T)r   ÚseekÚ	pushlinesÚ	readlinesÚtruncater   r   r   r   r   ÚcloseF   s
    
zBufferedSubFile.closec                 C   sL   | j s| jrdS tS | j  ¡ }t| jƒD ]}||ƒr(| j  |¡  dS q(|S ©Nr   )r   r   ÚNeedMoreDataÚpopleftÚreversedr   Ú
appendleft)r   ÚlineZateofr   r   r   ÚreadlineN   s    
zBufferedSubFile.readlinec                 C   s   | j  |¡ d S r   )r   r#   ©r   r$   r   r   r   Ú
unreadline`   s    zBufferedSubFile.unreadlinec                 C   sx   | j  |¡ d|vr d|vr d S | j  d¡ | j  ¡ }| j  d¡ | j  ¡  |d  d¡sj| j  | ¡ ¡ |  |¡ d S )Nr	   úr   éÿÿÿÿ)r   Úwriter   r   r   Úendswithr   r   )r   ÚdataÚpartsr   r   r   Úpushe   s    

zBufferedSubFile.pushc                 C   s   | j  |¡ d S r   )r   Úextend)r   Úlinesr   r   r   r   z   s    zBufferedSubFile.pushlinesc                 C   s   | S r   r   r   r   r   r   Ú__iter__}   s    zBufferedSubFile.__iter__c                 C   s   |   ¡ }|dkrt‚|S r   )r%   ÚStopIterationr&   r   r   r   Ú__next__€   s    zBufferedSubFile.__next__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r%   r'   r.   r   r1   r3   r   r   r   r   r
   -   s   r
   c                   @   s\   e Zd Zdedœ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 )r   N©Úpolicyc                C   sœ   || _ d| _|d u r<|jd u r2ddlm} || _ql|j| _n0|| _z|| j d W n tyj   d| _Y n0 tƒ | _g | _	|  
¡ j| _d | _d | _d| _d S )NFr   )ÚMessager7   T)r8   Ú_old_style_factoryZmessage_factoryZemail.messager9   Ú_factoryÚ	TypeErrorr
   Ú_inputÚ	_msgstackÚ	_parsegenr3   Ú_parseÚ_curÚ_lastÚ_headersonly)r   r;   r8   r9   r   r   r   r   ‹   s$    

zFeedParser.__init__c                 C   s
   d| _ d S )NT)rC   r   r   r   r   Ú_set_headersonlyª   s    zFeedParser._set_headersonlyc                 C   s   | j  |¡ |  ¡  d S r   )r=   r.   Ú_call_parse©r   r,   r   r   r   Úfeed­   s    zFeedParser.feedc                 C   s$   z|   ¡  W n ty   Y n0 d S r   )r@   r2   r   r   r   r   rE   ²   s    zFeedParser._call_parsec                 C   sH   | j  ¡  |  ¡  |  ¡ }| ¡ dkrD| ¡ sDt ¡ }| j 	||¡ |S )NÚ	multipart)
r=   r   rE   Ú_pop_messageÚget_content_maintypeZis_multipartr   Z!MultipartInvariantViolationDefectr8   Úhandle_defect)r   ÚrootÚdefectr   r   r   r   ¸   s    
ÿzFeedParser.closec                 C   sn   | j r|  ¡ }n| j| jd}| jr<| j ¡ dkr<| d¡ | jrR| jd  |¡ | j |¡ || _|| _	d S )Nr7   zmultipart/digestzmessage/rfc822r)   )
r:   r;   r8   rA   Úget_content_typeZset_default_typer>   Zattachr   rB   )r   Úmsgr   r   r   Ú_new_messageÅ   s    

zFeedParser._new_messagec                 C   s(   | j  ¡ }| j r| j d | _nd | _|S )Nr)   )r>   r   rA   )r   Úretvalr   r   r   rI   Ò   s
    
zFeedParser._pop_messagec                 c   s  |   ¡  g }| jD ]Z}|tu r&tV  qt |¡sbt |¡s^t ¡ }| j 	| j
|¡ | j |¡  qn| |¡ q|  |¡ | jrÈg }| j ¡ }|tu rœtV  q‚|dkr¦q²| |¡ q‚| j
 t |¡¡ d S | j
 ¡ dkrŠ| j tj¡ |  ¡ D ]}|tu rtV  qî qqî|  ¡ }| j ¡  | j ¡ }|tu rDtV  qqDq| j ¡ }|tu rjtV  qDqjqD|dkrxq†| j |¡ qØd S | j
 ¡ dkrÐ|  ¡ D ] }|tu rºtV  q¢ qÄq¢|  ¡  d S | j
 ¡ dkrÔ| j
 ¡ }|d u rRt ¡ }| j 	| j
|¡ g }| jD ]$}|tu r.tV  q| |¡ q| j
 t |¡¡ d S t| j
 dd¡ƒ ¡ dvr†t ¡ }| j 	| j
|¡ d| }t  d	t !|¡ d
 ¡}	d}
g }d}d}| j ¡ }|tu rÔtV  q¶|dkrâqÂ|	 |¡}|r´| "d¡rd}| "d¡}qÂ|
rr|r^|d }t# $|¡}|rP|d t%| "d¡ƒ … |d< t |¡| j
_&d}
| j |¡ q¶| j ¡ }|tu rtV  qr|	 |¡}|sr| j |¡ q´qr| j |	j¡ |  ¡ D ] }|tu râtV  qÊ qìqÊ| j' ¡ dkrT| j'j(}|dkrd | j'_(n:|d ur˜t# $|¡}|r˜t%| "d¡ƒ}|d | … | j'_(nD| j'j)}t*|tƒr˜t# $|¡}|r˜|d t%| "d¡ƒ … }|| j'_)| j ¡  |  ¡  | j
| _'n
| |¡ q¶|
r*t +¡ }| j 	| j
|¡ | j
 t |¡¡ g }| jD ]}|tu rütV  qüqüt |¡| j
_(d S |sLt ,¡ }| j 	| j
|¡ d S |rZdg}ng }| jD ]$}|tu r|tV  qd| |¡ qd|rÂ|d }t- |¡}|rÂ|t%| "d¡ƒd … |d< t |¡| j
_(d S g }| jD ]$}|tu rötV  qÞ| |¡ qÞ| j
 t |¡¡ d S )Nr   zmessage/delivery-statusÚmessagerH   zcontent-transfer-encodingÚ8bit)Z7bitrS   Úbinaryz--z(?P<sep>z4)(?P<end>--)?(?P<ws>[ \t]*)(?P<linesep>\r\n|\r|\n)?$TFÚendÚlinesepr)   r   ).rP   r=   r    ÚheaderREÚmatchÚNLCREr   Z MissingHeaderBodySeparatorDefectr8   rK   rA   r'   r   Ú_parse_headersrC   r%   Zset_payloadÚEMPTYSTRINGÚjoinrN   r   r?   rI   r   rJ   Zget_boundaryZNoBoundaryInMultipartDefectÚstrÚgetÚlowerZ-InvalidMultipartContentTransferEncodingDefectÚreÚcompileÚescapeÚgroupÚ	NLCRE_eolÚsearchÚlenÚpreamblerB   ÚepilogueZ_payloadÚ
isinstanceZStartBoundaryNotFoundDefectZCloseBoundaryNotFoundDefectÚ	NLCRE_bol)r   Zheadersr$   rM   r0   rQ   rO   ÚboundaryÚ	separatorZ
boundaryreZcapturing_preamblerg   rV   Zclose_boundary_seenÚmoZlastlineZeolmorh   rU   ÚpayloadÚ	firstlineZbolmor   r   r   r?   Ú   s`   

















ÿÿÿ
























zFeedParser._parsegenc           	      C   sX  d}g }t |ƒD ]&\}}|d dv rR|sFt |¡}| j | j|¡ q| |¡ q|rt| jj| j |¡Ž  dg  }}| 	d¡rø|dkr¼t
 |¡}|r¬|d t| d¡ƒ … }| j |¡ qn<|t|ƒd krÞ| j |¡  d S t |¡}| jj |¡ q| d¡}|dkr&t d¡}| jj |¡ q|d |… }|g}q|rT| jj| j |¡Ž  d S )Nr   r   z 	zFrom é   ú:zMissing header name.)Ú	enumerater   Z#FirstHeaderLineIsContinuationDefectr8   rK   rA   r   Zset_rawZheader_source_parseÚ
startswithrd   re   rf   rc   Zset_unixfromr=   r'   ZMisplacedEnvelopeHeaderDefectZdefectsÚfindZInvalidHeaderDefect)	r   r0   Z
lastheaderZ	lastvalueÚlinenor$   rM   rm   Úir   r   r   rZ   ×  sF    








zFeedParser._parse_headers)N)r4   r5   r6   r   r   rD   rG   rE   r   rP   rI   r?   rZ   r   r   r   r   r   ˆ   s    ~c                       s   e Zd Z‡ fdd„Z‡  ZS )r   c                    s   t ƒ  | dd¡¡ d S )NÚasciiÚsurrogateescape)ÚsuperrG   ÚdecoderF   ©Ú	__class__r   r   rG     s    zBytesFeedParser.feed)r4   r5   r6   rG   Ú__classcell__r   r   r{   r   r     s   )Ú__all__r`   Zemailr   Zemail._policybaser   Úcollectionsr   Úior   ra   rY   rj   rd   ZNLCRE_crackrW   r[   ÚNLÚobjectr    r
   r   r   r   r   r   r   Ú<module>   s&   




[   