
    FwgX                        d Z ddlmZ ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
mZ ddgZdd	lZdd
lmZ ddlmZ ddlmZ  ej&                  d      Z ej&                  d      Z ej&                  d      Z ej&                  d      Z ej&                  d      ZdZdZ e       Z G d de      Z G d de      Z G d de      Zy	)a  FeedParser - An email feed parser.

The feed parser implements an interface for incrementally parsing an email
message, line by line.  This has advantages for certain applications, such as
those reading email messages off a socket.

FeedParser.feed() is the primary interface for pushing new data into the
parser.  It returns when there's nothing more it can do with the available
data.  When you have no more data to push into the parser, call .close().
This completes the parsing and returns the root message object.

The other advantage of this parser is that it will never raise a parsing
exception.  Instead, when it finds something unexpected, it adds a 'defect' to
the current message.  Defects are just instances that live on the message
object's .defects attribute.
    )unicode_literals)division)absolute_import)objectrangesuper)implements_iteratorPY3
FeedParserBytesFeedParserN)errors)message)compat32z
||
z(
||
)z
(
||
)\Zz(^(From |[\041-\071\073-\176]{1,}:|[\t ]) 
c                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)BufferedSubFileak  A file-ish object that can have new data loaded into it.

    You can also push and pop line-matching predicates onto a stack.  When the
    current predicate matches the current line, a false EOF response
    (i.e. empty string) is returned instead.  This lets the parser adhere to a
    simple abstraction -- it parses until EOF closes the current message.
    c                 <    d| _         g | _        g | _        d| _        y )Nr   F)_partial_lines	_eofstack_closedselfs    X/var/www/horilla/myenv/lib/python3.12/site-packages/future/backports/email/feedparser.py__init__zBufferedSubFile.__init__9   s        c                 :    | j                   j                  |       y N)r   append)r   preds     r   push_eof_matcherz BufferedSubFile.push_eof_matcherC   s    d#r   c                 6    | j                   j                         S r   )r   popr   s    r   pop_eof_matcherzBufferedSubFile.pop_eof_matcherF   s    ~~!!##r   c                 j    | j                   j                  | j                         d| _        d| _        y )Nr   T)r   r    r   r   r   s    r   closezBufferedSubFile.closeI   s&    4==)r   c                     | j                   s| j                  ryt        S | j                   j                         }| j                  d d d   D ]'  } ||      s| j                   j                  |        y |S )Nr   )r   r   NeedMoreDatar$   r   r    )r   lineateofs      r   readlinezBufferedSubFile.readlineO   sl    {{|| {{  ^^DbD) 	ET{""4(		
 r   c                 N    |t         usJ | j                  j                  |       y r   )r*   r   r    r   r+   s     r   
unreadlinezBufferedSubFile.unreadlinea   s"    <'''4 r   c                    | j                   |z   dc}| _         t        j                  |      }|j                         | _         | j                   s=|r;|d   j	                  d      r'|j                  d      |j                         z   | _         g }t        t        |      dz        D ]%  }|j                  ||dz     ||dz  dz      z          ' | j                  |       y)z$Push some new data into this object.r   r)         N)	r   NLCRE_cracksplitr$   endswithr   lenr    	pushlines)r   datapartslinesis        r   pushzBufferedSubFile.pushf   s     #mmd2Bdm!!$'
 		 }}59+=+=d+C!IIbM%))+5DM s5zQ' 	4ALLqseAaCEl23	4ur   c                 .    |d d d   | j                   d d y )Nr)   r   )r   )r   r=   s     r   r:   zBufferedSubFile.pushlines}   s    "+BQr   c                     | S r    r   s    r   __iter__zBufferedSubFile.__iter__   s    r   c                 <    | j                         }|dk(  rt        |S )Nr   )r-   StopIterationr/   s     r   __next__zBufferedSubFile.__next__   s    }}2:r   N)__name__
__module____qualname____doc__r   r"   r%   r'   r-   r0   r?   r:   rC   rF   rB   r   r   r   r   1   s9    $$$!
.&r   r   c                   ^    e Zd ZdZej
                  fdZd Zd Zd Z	d Z
d Zd Zd	 Zd
 Zy)r   zA feed-style parser of email.c                     d|v r	|d   }|d= nt         }	 | _        | _        	  | j                          fd _        t                _        g  _        t        r  j                         j                   _        n j                         j                   _        d  _        d  _        d _        y # t        $ r d  _        Y w xY w)NpolicyrM   c                       d j                   iS )NrM   rN   r   s   r   <lambda>z%FeedParser.__init__.<locals>.<lambda>   s    (DKK)@ r   c                      i S r   rB   rB   r   r   rP   z%FeedParser.__init__.<locals>.<lambda>   s     r   F)r   _factoryrM   _factory_kwds	TypeErrorr   _input	_msgstackr
   	_parsegenrF   _parsenext_cur_last_headersonly)r   rR   _3to2kwargsrM   s   `   r   r   zFeedParser.__init__   s    {"[-BFT\H]f	 !	,DKK(!@D &'..*33DK..*//DK	
!  	,!+D	,s   B3 3CCc                     d| _         y )NT)r\   r   s    r   _set_headersonlyzFeedParser._set_headersonly   s
     r   c                 Z    | j                   j                  |       | j                          y)zPush more data into the parser.N)rU   r?   _call_parse)r   r;   s     r   feedzFeedParser.feed   s     r   c                 D    	 | j                          y # t        $ r Y y w xY wr   )rX   rE   r   s    r   ra   zFeedParser._call_parse   s"    	KKM 		s    	c                 <   | j                   j                          | j                          | j                         }| j                  rJ |j                         dk(  r@|j                         s0t        j                         }| j                  j                  ||       |S )z<Parse all remaining data and return the root message object.	multipart)rU   r'   ra   _pop_messagerV   get_content_maintypeis_multipartr   !MultipartInvariantViolationDefectrM   handle_defect)r   rootdefects      r   r'   zFeedParser.close   s}      ">>!!$$&+5((*==?FKK%%dF3r   c                 ^    | j                   di | j                         }| j                  r.| j                  j                         dk(  r|j	                  d       | j
                  r| j
                  d   j                  |       | j
                  j                  |       || _        || _        y )Nzmultipart/digestzmessage/rfc822r)   rB   )	rR   rS   rZ   get_content_typeset_default_typerV   attachr    r[   )r   msgs     r   _new_messagezFeedParser._new_message   s    dmm3d0023993359KK  !12>>NN2%%c*c"	
r   c                     | j                   j                         }| j                   r| j                   d   | _        |S d | _        |S )Nr)   )rV   r$   rZ   )r   retvals     r   rf   zFeedParser._pop_message   s@    ##%>>r*DI  DIr   c              #   8  K   | j                          g }| j                  D ]  }|t        u r	t         t        j	                  |      slt
        j	                  |      sUt        j                         }| j                  j                  | j                  |       | j                  j                  |        n|j                  |        | j                  |       | j                  rug }	 | j                  j                         }|t        u r	t         ,|dk(  rn|j                  |       C| j                  j!                  t"        j%                  |             y | j                  j'                         dk(  r	 | j                  j)                  t
        j                         | j+                         D ]  }|t        u r	t          n | j-                         }| j                  j/                          	 | j                  j                         }|t        u r	t         ,	 	 | j                  j                         }|t        u r	t         ,	 |dk(  r	 y | j                  j                  |       | j                  j1                         dk(  r8| j+                         D ]  }|t        u r	t          n | j-                          y | j                  j1                         dk(  r| j                  j3                         }|t        j4                         }| j                  j                  | j                  |       g }| j                  D ]$  }|t        u r	t         |j                  |       & | j                  j!                  t"        j%                  |             y | j                  j7                  dd      j9                         dvr:t        j:                         }| j                  j                  | j                  |       d	|z   }t=        j>                  d
t=        j@                  |      z   dz         }	d}
g }d}d}	 | j                  j                         }|t        u r	t         ,|dk(  rn|	j	                  |      }|r|jC                  d      rd}|jC                  d      }n}|
r|ra|d   }tD        jG                  |      }|r!|d tI        |jC                  d              |d<   t"        j%                  |      | j                  _%        d}
| j                  j                  |       	 | j                  j                         }|t        u r	t         ,|	j	                  |      }|s| j                  j                  |       n[| j                  j)                  |	j                         | j+                         D ]  }|t        u r	t          n | jL                  j1                         dk(  rv| jL                  jN                  }|dk(  rd | jL                  _'        n|tD        jG                  |      }|rtI        |jC                  d            }|d |  | jL                  _'        nl| jL                  jP                  }tS        |tT              rFtD        jG                  |      }|r/|d tI        |jC                  d              }|| jL                  _(        | j                  j/                          | j-                          | j                  | _&        n|
sJ |j                  |       |
rt        jV                         }| j                  j                  | j                  |       | j                  j!                  t"        j%                  |             g }| j                  D ]  }|t        u st          t"        j%                  |      | j                  _'        y |s;t        jX                         }| j                  j                  | j                  |       y |rdg}ng }| j                  D ]$  }|t        u r	t         |j                  |       & |r<|d   }tZ        j	                  |      }|r |tI        |jC                  d            d  |d<   t"        j%                  |      | j                  _'        y g }| j                  D ]$  }|t        u r	t         |j                  |       & | j                  j!                  t"        j%                  |             y w)NTr   zmessage/delivery-statusr   re   zcontent-transfer-encoding8bit)7bitrv   binaryz--z(?P<sep>z4)(?P<end>--)?(?P<ws>[ \t]*)(?P<linesep>\r\n|\r|\n)?$Fendlinesepr)   r   ).rr   rU   r*   headerREmatchNLCREr    MissingHeaderBodySeparatorDefectrM   rj   rZ   r0   r    _parse_headersr\   r-   set_payloadEMPTYSTRINGjoinrn   r"   rW   rf   r%   rg   get_boundaryNoBoundaryInMultipartDefectgetlower-InvalidMultipartContentTransferEncodingDefectrecompileescapegroup	NLCRE_eolsearchr9   preambler[   epilogue_payload
isinstancestrStartBoundaryNotFoundDefectCloseBoundaryNotFoundDefect	NLCRE_bol)r   headersr+   rl   r=   rt   rq   boundary	separator
boundaryrecapturing_preambler   rz   close_boundary_seenmolastlineeolmor   ry   payload	firstlinebolmos                         r   rW   zFeedParser._parsegen   s     KK 	!D|#"">>$' {{4(#DDFFKK--dii@KK**40NN4 	!  	G$ E{{++-<'&&2:T"  II!!+"2"25"9:99%%'+DD ,,U[[9"nn. F-** 	
 '') ++-
 ;;//1D|+** ;;//1D|+** 2:  &&t,? B 99))+y8 ..* \)&&	
 99))+{:yy--/H
  ;;=))$))V< KK 'D|+** LL&	'
 		%%k&6&6u&=>		96BHHJ56MMO))$))V<
 xIRYYy11GHIJ "&HG"'{{++-<'&&2:%%d+
 xx.2+"$((9"5)# (0|H$-$4$4X$>E$/78M#ekk!n:M9M/N1<1A1A(1KDII.-2*..t4 
 #{{335</"..$'--d3! KK2248!  KK001A1AB"&.."2 !\1"..$	 zz668KG#'::#6#6#r>26DJJ/%1!*!1!1(!;B!&)"((1+&66>uo

 3"&**"5"5%gs3!*!1!1'!:B!*12DC4D3D*E6=

 3KK//1%%' "&DJ .--OOD)_ f ";;=))$))V<		%%k&6&6x&@A KK !D|+** ! &1%5%5h%?		" ';;=))$))V< 4 &<'&&%	& $QK	!	2"+CA,?,@"AHQK!,!1!1(!;DII KK 	D|#""LL		
 			k..u56s   ^)d,E.dc                    d}g }t        |      D ]  \  }}|d   dv rP|s<t        j                  |      }| j                  j	                  | j
                  |       L|j                  |       ^|r6 | j
                  j                  | j                  j                  |        dg }}|j                  d      r|dk(  rQt        j                  |      }|r|d t        |j                  d              }| j
                  j                  |       |t        |      dz
  k(  r| j                  j!                  |        y t        j"                  |      }| j
                  j$                  j                  |       g|j'                  d      }|dkD  sJ d       |d | }|g} |r3 | j
                  j                  | j                  j                  |        y y )Nr   r   z 	zFrom r5   :z3_parse_headers fed line with no : and no leading WS)	enumerater   #FirstHeaderLineIsContinuationDefectrM   rj   rZ   r    set_rawheader_source_parse
startswithr   r   r9   r   set_unixfromrU   r0   MisplacedEnvelopeHeaderDefectdefectsfind)	r   r=   
lastheader	lastvaluelinenor+   rl   r   r>   s	            r   r   zFeedParser._parse_headers  s   
	%e, *	LFDAw%! $GGMFKK--dii@  &!		!!4;;#B#B9#MN(*BI
w'Q;"))$/B#$6c"((1+&6%67II**40s5zA~- KK**40 $AA$GFII%%,,V4 		#AQ3MMM3bqJIU*	X DIIt{{>>yIJ r   N)rG   rH   rI   rJ   r   Messager   r_   rb   ra   r'   rr   rf   rW   r   rB   r   r   r   r      s<    ' ' ":!
{7z1Kr   c                   "     e Zd ZdZ fdZ xZS )r   z(Like FeedParser, but feed accepts bytes.c                 X    t               j                  |j                  dd             y )Nasciisurrogateescape)r   rb   decode)r   r;   	__class__s     r   rb   zBytesFeedParser.feed  s    T[[*;<=r   )rG   rH   rI   rJ   rb   __classcell__)r   s   @r   r   r   	  s    2> >r   )rJ   
__future__r   r   r   future.builtinsr   r   r   future.utilsr	   r
   __all__r   future.backports.emailr   r   "future.backports.email._policybaser   r   r}   r   r   r6   r{   r   NLr*   r   r   r   rB   r   r   <module>r      s   
  (  & 0 0 1*
+ 	 ) * 7

< BJJ~&	BJJ'(	bjj( 2::AB	xWf Wt{K {K|>j >r   