a
    i                     @   s   d dgZ ddlZddlZddlZddlmZmZ ddlmZ ddlm	Z	 ddl
mZmZ ddlmZ dd	lmZ ejZd
ZedZdd ZdddZdd Zdd ZG dd  d ZG dd deZG dd deZdS )MessageEmailMessage    N)BytesIOStringIO)utils)errors)Policycompat32charset)decode_bz; z[ \(\)<>@,;:\\"/\[\]\?=]c                 C   s4   t | d\}}}|s$| d fS | | fS )N;)str	partitionstrip)paramasepb r   %/usr/lib64/python3.9/email/message.py_splitparam   s    r   Tc                 C   s   |d urt |dkrt|trL| d7 } t|d |d |d }d| |f S z|d W n4 ty   | d7 } t|dd}d| |f  Y S 0 |st|rd	| t	|f S d| |f S n| S d S )
Nr   *      %s=%sasciizutf-8 z%s="%s")
len
isinstancetupler   Zencode_rfc2231encodeUnicodeEncodeError	tspecialssearchquote)r   valuer%   r   r   r   _formatparam'   s    	
r'   c                 C   s
  dt |  } g }d}| d||kr|d7 }| d|}|d }}|dkr|| d||| d|| 7 }|d dkrzq|| d|d  }}qD|dk rt| }| d||}|dkr| || }n,| ||   d | |d |   }||  |}q|S )	Nr   r   r   "z\"r   =)	r   findcountr   rstriplowerlstripappendr   )sZpliststartendZinddiffifr   r   r   _parseparamI   s*    
 ,r7   c                 C   s4   t | tr&| d | d t| d fS t| S d S )Nr   r   r   )r   r    r   unquote)r&   r   r   r   _unquotevaluec   s    
r9   c                   @   s  e Zd ZefddZdd Zdcdd	Zd
d ZddddZdd Z	dd Z
dd Zdd ZdeddZdfd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.d/ Zdgd0d1Zd2d3 Zd4d5 Zdhd6d7Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%didJdKZ&djdLdMZ'dkdPdQZ(dldRdSZ)dmdTdUZ*dndVdWZ+dodXdYZ,dZd[ Z-dpd\d]Z.dqd^d_Z/d`da Z0ddbl1m2Z2 dS )rr   c                 C   s:   || _ g | _d | _d | _d | _d  | _| _g | _d| _d S )N
text/plain)	policy_headers	_unixfrom_payload_charsetZpreambleZepiloguedefects_default_type)selfr;   r   r   r   __init__~   s    zMessage.__init__c                 C   s   |   S N)	as_stringrB   r   r   r   __str__   s    zMessage.__str__Fr   Nc                 C   sJ   ddl m} |d u r| jn|}t }||d||d}|j| |d | S )Nr   )	GeneratorF)mangle_from_maxheaderlenr;   unixfrom)email.generatorrH   r;   r   flattengetvalue)rB   rL   rJ   r;   rH   fpgr   r   r   rE      s    zMessage.as_stringc                 C   s   |   S rD   )as_bytesrF   r   r   r   	__bytes__   s    zMessage.__bytes__c                 C   sH   ddl m} |d u r| jn|}t }||d|d}|j| |d | S )Nr   )BytesGeneratorF)rI   r;   rK   )rM   rT   r;   r   rN   rO   )rB   rL   r;   rT   rP   rQ   r   r   r   rR      s    zMessage.as_bytesc                 C   s   t | jtS rD   )r   r>   listrF   r   r   r   is_multipart   s    zMessage.is_multipartc                 C   s
   || _ d S rD   r=   )rB   rL   r   r   r   set_unixfrom   s    zMessage.set_unixfromc                 C   s   | j S rD   rW   rF   r   r   r   get_unixfrom   s    zMessage.get_unixfromc                 C   sD   | j d u r|g| _ n,z| j | W n ty>   tdY n0 d S )Nz=Attach is not valid on a message with a non-multipart payload)r>   r0   AttributeError	TypeError)rB   payloadr   r   r   attach   s    

zMessage.attachc                 C   s  |   r(|rd S |d u r| jS | j| S |d urNt| jtsNtdt| j | j}t| dd }t|trt	
|r|dd}|sz|| ddd}W q ty   |dd}Y q0 n0|rz|d}W n ty   |d}Y n0 |s |S |d	krt|S |d
krRtd| \}}|D ]}| j| | q8|S |dv rt|}	t }
ztj|	|
dd |
 W S  tjy   | Y S 0 t|tr|S |S )NzExpected list, got %szcontent-transfer-encodingr   r   surrogateescaper   replaceraw-unicode-escapezquoted-printablebase64    )z
x-uuencodeZuuencodeZuuezx-uueT)quiet)rV   r>   r   rU   r[   typer   getr.   r   Z_has_surrogatesr!   decode	get_paramLookupErrorUnicodeErrorquopriZdecodestringr   join
splitlinesr;   Zhandle_defectr   uurO   Error)rB   r5   rf   r\   cteZbpayloadr&   r@   ZdefectZin_fileZout_filer   r   r   get_payload   sV    "








zMessage.get_payloadc                 C   sp   t |dr:|d u r|| _d S t|ts.t|}||j}t |drT|dd| _n|| _|d url| | d S )Nr!   rf   r   r^   )hasattrr>   r   Charsetr!   output_charsetrf   set_charset)rB   r\   r   r   r   r   set_payload5  s    


zMessage.set_payloadc                 C   s  |d u r|  d d | _d S t|ts.t|}|| _d| vrH| dd d| vrf| jdd| d n| d|  || kr|| j| _d| vr|	 }z||  W nf t
y   | j}|rz|dd	}W n ty   ||j}Y n0 ||| _| d| Y n0 d S )
Nr   MIME-Version1.0Content-Typer:   r
   zContent-Transfer-Encodingr   r^   )	del_paramr?   r   rr   
add_headerZget_output_charset	set_paramZbody_encoder>   Zget_body_encodingr[   r!   ri   rs   )rB   r   ro   r\   r   r   r   rt   I  s:    


zMessage.set_charsetc                 C   s   | j S rD   )r?   rF   r   r   r   get_charsetx  s    zMessage.get_charsetc                 C   s
   t | jS rD   )r   r<   rF   r   r   r   __len__  s    zMessage.__len__c                 C   s
   |  |S rD   )re   rB   namer   r   r   __getitem__  s    	zMessage.__getitem__c                 C   sr   | j |}|rX| }d}| jD ]4\}}| |kr"|d7 }||kr"td||q"| j| j || d S )Nr   r   z/There may be at most {} {} headers in a message)r;   Zheader_max_countr.   r<   
ValueErrorformatr0   header_store_parse)rB   r   valZ	max_countZlnamefoundkvr   r   r   __setitem__  s    zMessage.__setitem__c                 C   s@   |  }g }| jD ]"\}}|  |kr|||f q|| _d S rD   )r.   r<   r0   )rB   r   
newheadersr   r   r   r   r   __delitem__  s    zMessage.__delitem__c                 C   s   |  dd | jD v S )Nc                 S   s   g | ]\}}|  qS r   )r.   .0r   r   r   r   r   
<listcomp>  rb   z(Message.__contains__.<locals>.<listcomp>)r.   r<   r~   r   r   r   __contains__  s    zMessage.__contains__c                 c   s   | j D ]\}}|V  qd S rD   r<   )rB   Zfieldr&   r   r   r   __iter__  s    zMessage.__iter__c                 C   s   dd | j D S )Nc                 S   s   g | ]\}}|qS r   r   r   r   r   r   r     rb   z Message.keys.<locals>.<listcomp>r   rF   r   r   r   keys  s    zMessage.keysc                    s    fdd j D S )Nc                    s   g | ]\}} j ||qS r   r;   header_fetch_parser   rF   r   r   r     s   z"Message.values.<locals>.<listcomp>r   rF   r   rF   r   values  s    
zMessage.valuesc                    s    fdd j D S )Nc                    s"   g | ]\}}| j ||fqS r   r   r   rF   r   r   r     s   z!Message.items.<locals>.<listcomp>r   rF   r   rF   r   items  s    
zMessage.itemsc                 C   s:   |  }| jD ]&\}}|  |kr| j||  S q|S rD   )r.   r<   r;   r   )rB   r   failobjr   r   r   r   r   re     s
    zMessage.getc                 C   s   | j ||f d S rD   )r<   r0   )rB   r   r&   r   r   r   set_raw  s    zMessage.set_rawc                 C   s   t | j S rD   )iterr<   copyrF   r   r   r   	raw_items  s    zMessage.raw_itemsc                 C   sH   g }|  }| jD ](\}}|  |kr|| j|| q|sD|S |S rD   )r.   r<   r0   r;   r   )rB   r   r   r   r   r   r   r   r   get_all  s    	zMessage.get_allc                 K   sp   g }|  D ]<\}}|d u r0||dd q|t|dd| q|d ur^|d| t|| |< d S )N_-r   )r   r0   r_   r'   insert	SEMISPACErk   )rB   _name_valueZ_paramspartsr   r   r   r   r   rz   	  s    zMessage.add_headerc                 C   s\   |  }ttt| j| jD ]0\}\}}|  |kr| j||| j|<  qXqt|d S rD   )r.   zipranger   r<   r;   r   KeyError)rB   r   r   r5   r   r   r   r   r   replace_header'  s    "zMessage.replace_headerc                 C   sH   t  }| d|}||u r"|  S t|d  }|ddkrDdS |S )Ncontent-typer   /r   r:   )objectre   get_default_typer   r.   r,   )rB   missingr&   ctyper   r   r   get_content_type:  s    zMessage.get_content_typec                 C   s   |   }|dd S )Nr   r   r   splitrB   r   r   r   r   get_content_maintypeR  s    zMessage.get_content_maintypec                 C   s   |   }|dd S )Nr   r   r   r   r   r   r   get_content_subtype[  s    zMessage.get_content_subtypec                 C   s   | j S rD   rA   rF   r   r   r   r   d  s    zMessage.get_default_typec                 C   s
   || _ d S rD   r   r   r   r   r   set_default_typem  s    zMessage.set_default_typec           	   	   C   s   t  }| ||}||u r|S g }t|D ]V}z$|dd\}}| }| }W n typ   | }d}Y n0 |||f q*t|}|S )Nr)   r   r   )	r   re   r7   r   r   r   r0   r   Zdecode_params)	rB   r   headerr   r&   paramspr   r   r   r   r   _get_params_preservev  s     

zMessage._get_params_preserver   Tc                 C   s8   t  }| ||}||u r|S |r0dd |D S |S d S )Nc                 S   s   g | ]\}}|t |fqS r   )r9   r   r   r   r   r     rb   z&Message.get_params.<locals>.<listcomp>)r   r   )rB   r   r   r8   r   r   r   r   r   
get_params  s    zMessage.get_paramsc                 C   sN   || vr|S |  ||D ]0\}}| | kr|r@t|  S |  S q|S rD   )r   r.   r9   )rB   r   r   r   r8   r   r   r   r   r   rg     s    
zMessage.get_paramrx   r   c                 C   s
  t |ts|r|||f}|| vr2| dkr2d}n
| |}| j||dst|s\t|||}qt|t|||g}nbd}| j||dD ]N\}	}
d}|	 | krt|||}nt|	|
|}|s|}qt||g}q|| |kr|r| 	|| n| |= || |< d S )Nr   r:   )r   r   r   r8   )
r   r    r.   re   rg   r'   r   rk   r   r   )rB   r   r&   r   requoter   languager_   r   Z	old_param	old_valueZappend_paramr   r   r   r{     s6    

zMessage.set_paramc                 C   s   || vrd S d}| j ||dD ]@\}}| | kr|sHt|||}qt|t|||g}q|| |kr|| |= || |< d S )Nr   r   )r   r.   r'   r   rk   re   )rB   r   r   r   Z	new_ctyper   r   r   r   r   ry     s    
zMessage.del_paramc                 C   s   | ddkst| dkr,| d= d| d< || vr@|| |< d S | j||d}| |= || |< |dd  D ]\}}| |||| qhd S )Nr   r   r   zmime-versionrw   rv   r   )r,   r   r.   r   r{   )rB   rd   r   r   r   r   r   r   r   r   set_type  s    zMessage.set_typec                 C   sD   t  }| d|d}||u r*| d|d}||u r6|S t| S )Nfilenamecontent-dispositionr   r   )r   rg   r   collapse_rfc2231_valuer   )rB   r   r   r   r   r   r   get_filename,  s    zMessage.get_filenamec                 C   s,   t  }| d|}||u r|S t| S )Nboundary)r   rg   r   r   r-   )rB   r   r   r   r   r   r   get_boundary<  s
    zMessage.get_boundaryc                 C   s  t  }| |d}||u r$tdg }d}|D ]:\}}| dkr\|dd| f d}q0|||f q0|s|dd| f g }| jD ]z\}	}
|	 dkrg }|D ].\}}
|
dkr|| q|d||
f  qt|}|| j	
|	| q||	|
f q|| _d S )	Nr   zNo Content-Type header foundFr   z"%s"Tr   r   )r   r   r   ZHeaderParseErrorr.   r0   r<   r   rk   r;   r   )rB   r   r   r   Z	newparamsZfoundpZpkZpvr   hr   r   r   r   r   r   r   set_boundaryI  s2    


zMessage.set_boundaryc              	   C   s   t  }| d|}||u r|S t|trp|d p2d}z|d d}t||}W n ttfyn   |d }Y n0 z|d W n ty   | Y S 0 | S )Nr   r   zus-asciir   r`   )	r   rg   r   r    r!   r   rh   ri   r.   )rB   r   r   r   ZpcharsetrR   r   r   r   get_content_charsetw  s     

zMessage.get_content_charsetc                    s    fdd|   D S )Nc                    s   g | ]}|  qS r   )r   )r   partr   r   r   r     rb   z(Message.get_charsets.<locals>.<listcomp>walk)rB   r   r   r   r   get_charsets  s    zMessage.get_charsetsc                 C   s*   |  d}|d u rd S t|d  }|S )Nr   r   )re   r   r.   )rB   r&   c_dr   r   r   get_content_disposition  s
    
zMessage.get_content_dispositionr   )Fr   N)FN)NF)N)N)N)Nr   T)Nr   T)rx   TNr   F)r   T)rx   T)N)N)N)N)3__name__
__module____qualname__r	   rC   rG   rE   rS   rR   rV   rX   rY   r]   rp   ru   rt   r|   r}   r   r   r   r   r   r   r   r   re   r   r   r   rz   r   r   r   r   r   r   r   r   rg   r{   ry   r   r   r   r   r   r   r   Zemail.iteratorsr   r   r   r   r   r   o   sd   


Z
/


				
  
"  
3

 

.

c                       s   e Zd Zd/ fdd	Zd0 fdd	Zdd Zd	d
 Zdd Zd1ddZh dZ	dd Z
dd ZddddZddddZdd Zd2ddZd3ddZd4d d!Zdd"d#d$Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Z  ZS )5MIMEPartNc                    s(   |d u rddl m} |}t | d S )Nr   )default)Zemail.policyr   superrC   )rB   r;   r   	__class__r   r   rC     s    zMIMEPart.__init__Fc                    s0   |d u r| j n|}|d u r |j}t |||S rD   )r;   Zmax_line_lengthr   rE   )rB   rL   rJ   r;   r   r   r   rE     s    zMIMEPart.as_stringc                 C   s   | j | jjdddS )NT)utf8r;   )rE   r;   ZclonerF   r   r   r   rG     s    zMIMEPart.__str__c                 C   s    |  d}|d u rdS |jdkS )Nr   F
attachment)re   Zcontent_disposition)rB   r   r   r   r   is_attachment  s    
zMIMEPart.is_attachmentc           	      c   s  |  rd S | d\}}|dkrB||v r>|||fV  d S |dksR|  sVd S |dkr| D ]}| ||E d H  qfd S d|v r|d|fV  d }|d}|r| D ]}|d |kr|} qq|d u r| }|r|d nd }|d ur
| ||E d H  d S )Nr   text	multipartrelatedr2   
content-idr   )	r   r   r   indexrV   
iter_parts
_find_bodyrg   rp   )	rB   r   preferencelistmaintypesubtypeZsubpart	candidater2   Zsubpartsr   r   r   r     s6    

zMIMEPart._find_bodyr   htmlplainc                 C   sB   t |}d }| | |D ]$\}}||k r|}|}|dkr q>q|S )Nr   )r   r   )rB   r   Z	best_priobodyZprior   r   r   r   get_body  s    
zMIMEPart.get_body>   )r   r   )r   r   )r   alternative)r   r   c           
      c   s"  |   d\}}|dks"|dkr&d S |  }z| }W n tyN   Y d S 0 |dkr|dkr| d}|rd}g }|D ]"}|d|krd}qz|| qz|r|E d H  d S |d	 |E d H  d S g }	|D ]L}|  d\}}||f| j	v r|
 s||	vr|	| q|V  qd S )
Nr   r   r   r   r2   Fr   Tr   )r   r   rp   r   rZ   rg   re   r0   pop_body_typesr   )
rB   r   r   r\   r   r2   r   Zattachmentsr   seenr   r   r   iter_attachments  sD    




zMIMEPart.iter_attachmentsc                 c   s   |   r|  E d H  d S rD   )rV   rp   rF   r   r   r   r   C  s    zMIMEPart.iter_parts)content_managerc                O   s(   |d u r| j j}|j| g|R i |S rD   )r;   r   get_contentrB   r   argskwr   r   r   r   K  s    zMIMEPart.get_contentc                O   s,   |d u r| j j}|j| g|R i | d S rD   )r;   r   set_contentr   r   r   r   r   P  s    zMIMEPart.set_contentc           
      C   s   |   dkr6|  }||f }||v r6td||g }g }| jD ]4\}}| drj|||f qD|||f qD|rt| | j	d}	||	_| j
|	_
|	g| _
ng | _
|| _d| | d< |d ur| d| d S )Nr   zCannot convert {} to {}content-r   z
multipart/rx   r   )r   r   r   r   r<   r.   
startswithr0   rd   r;   r>   r{   )
rB   r   Zdisallowed_subtypesr   Zexisting_subtypeZkeep_headersZpart_headersr   r&   r   r   r   r   _make_multipartU  s.    

zMIMEPart._make_multipartc                 C   s   |  dd| d S )Nr   )r   mixedr   rB   r   r   r   r   make_relatedp  s    zMIMEPart.make_relatedc                 C   s   |  dd| d S )Nr   )r   r   r   r   r   r   make_alternatives  s    zMIMEPart.make_alternativec                 C   s   |  dd| d S )Nr   r   r   r   r   r   r   
make_mixedv  s    zMIMEPart.make_mixed)_dispc                O   sj   |   dks|  |kr(t| d|   t| | jd}|j|i | |r\d|vr\||d< | | d S )Nr   Zmake_r   r   zContent-Disposition)r   r   getattrrd   r;   r   r]   )rB   Z_subtyper   r   r   r   r   r   r   _add_multiparty  s    
zMIMEPart._add_multipartc                 O   s    | j dg|R ddi| d S )Nr   r   Zinliner  rB   r   r   r   r   r   add_related  s    zMIMEPart.add_relatedc                 O   s   | j dg|R i | d S )Nr   r  r  r   r   r   add_alternative  s    zMIMEPart.add_alternativec                 O   s    | j dg|R ddi| d S )Nr   r   r   r  r  r   r   r   add_attachment  s    zMIMEPart.add_attachmentc                 C   s   g | _ d | _d S rD   r<   r>   rF   r   r   r   clear  s    zMIMEPart.clearc                 C   s   dd | j D | _ d | _d S )Nc                 S   s&   g | ]\}}|  d s||fqS )r   )r.   r   )r   nr   r   r   r   r     s   z*MIMEPart.clear_content.<locals>.<listcomp>r  rF   r   r   r   clear_content  s    zMIMEPart.clear_content)N)FNN)r   )N)N)N)r   r   r   rC   rE   rG   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r
  __classcell__r   r   r   r   r     s*   
7



r   c                       s   e Zd Z fddZ  ZS )r   c                    s&   t  j|i | d| vr"d| d< d S )Nrv   rw   )r   r   r  r   r   r   r     s    zEmailMessage.set_content)r   r   r   r   r  r   r   r   r   r     s   )NT)__all__rerm   rj   ior   r   Zemailr   r   Zemail._policybaser   r	   r   r?   Zemail._encoded_wordsr   rr   r   compiler#   r   r'   r7   r9   r   r   r   r   r   r   r   <module>   s4   


"      N `