o
    ˜»áfE  ã                   @   s¤   d Z g d¢ZddlZddlZdZdZdZg d¢Zg d¢Zddddd	d
dd	dddddddœZ	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZG dd„ dƒZG dd„ deƒZdS )zcEmail address parsing code.

Lifted directly from rfc822.py.  This should eventually be rewritten.
)Ú	mktime_tzÚ	parsedateÚparsedate_tzÚquoteé    Nú Ú z, )ÚjanÚfebÚmarÚaprÚmayÚjunÚjulÚaugÚsepÚoctÚnovÚdecÚjanuaryÚfebruaryÚmarchÚaprilr   ÚjuneÚjulyÚaugustÚ	septemberÚoctoberÚnovemberÚdecember)ÚmonÚtueÚwedÚthuÚfriÚsatÚsunipþÿÿiÔþÿÿiþÿÿi¨ýÿÿiDýÿÿiàüÿÿ)ÚUTÚUTCÚGMTÚZÚASTÚADTÚESTÚEDTÚCSTÚCDTÚMSTÚMDTÚPSTÚPDTc                 C   s,   t | ƒ}|sdS |d du rd|d< t|ƒS )zQConvert a date string to a time tuple.

    Accounts for military timezones.
    Né	   r   )Ú_parsedate_tzÚtuple)ÚdataÚres© r9   ú'/usr/lib/python3.10/email/_parseaddr.pyr   -   s   r   c              
   C   sÎ  | sdS |   ¡ } | sdS | d  d¡s| d  ¡ tv r| d= n| d  d¡}|dkr6| d |d d… | d< t| ƒdkrQ| d   d¡}t|ƒdkrQ|| dd…  } t| ƒdkrƒ| d }| d¡}|d	kri| d¡}|dkr~|d|… ||d… g| dd…< n|  d
¡ t| ƒdk r‹dS | dd… } | \}}}}}|rž|rž|s dS | ¡ }|tvrµ|| ¡ }}|tvrµdS t 	|¡d }|dkrÄ|d8 }|d	 dkrÐ|dd	… }| d¡}|dkrÞ||}}|d	 dkrî|dd	… }|sîdS |d  
¡ sù||}}|d	 dkr|dd	… }|  d¡}t|ƒdkr|\}	}
d}nAt|ƒdkr&|\}	}
}n4t|ƒdkrXd|d v rX|d   d¡}t|ƒdkrI|\}	}
d}nt|ƒdkrV|\}	}
}ndS dS zt|ƒ}t|ƒ}t|	ƒ}	t|
ƒ}
t|ƒ}W n ty{   Y dS w |dk r|dkr‹|d7 }n|d7 }d}| ¡ }|tv rŸt| }nzt|ƒ}W n
 ty¯   Y nw |dkr½| d¡r½d}|rÛ|dk rËd	}| }nd}||d d |d d   }||||	|
|ddd	|g
S )a†  Convert date to extended time tuple.

    The last (additional) element is the time zone offset in seconds, except if
    the timezone was specified as -0000.  In that case the last element is
    None.  This indicates a UTC timestamp that explicitly declaims knowledge of
    the source timezone, as opposed to a +0000 timestamp that indicates the
    source timezone really was UTC.

    Nr   ú,é   é   ú-é   ú+éÿÿÿÿr   é   é   ú:é   Ú0Ú.éd   éD   il  iÐ  i  é<   )ÚsplitÚendswithÚlowerÚ	_daynamesÚrfindÚlenÚfindÚappendÚ_monthnamesÚindexÚisdigitÚintÚ
ValueErrorÚupperÚ
_timezonesÚ
startswith)r7   ÚiÚstuffÚsÚddÚmmÚyyÚtmÚtzÚthhÚtmmÚtssÚtzoffsetÚtzsignr9   r9   r:   r5   9   s¾   


"




ÿ




ÿ
r5   c                 C   s"   t | ƒ}t|tƒr|dd… S |S )z&Convert a time string to a time tuple.Nr4   )r   Ú
isinstancer6   ©r7   Útr9   r9   r:   r   ¶   s   
r   c                 C   s8   | d du rt  | dd… d ¡S t | ¡}|| d  S )zETurn a 10-tuple as returned by parsedate_tz() into a POSIX timestamp.r4   Né   )rA   )ÚtimeÚmktimeÚcalendarÚtimegmri   r9   r9   r:   r   ¿   s   
r   c                 C   s   |   dd¡  dd¡S )zøPrepare string to be used in a quoted string.

    Turns backslash and double quote characters into quoted pairs.  These
    are the only characters that need to be quoted inside a quoted string.
    Does not add the surrounding double quotes.
    ú\z\\ú"z\")Úreplace)Ústrr9   r9   r:   r   É   s   r   c                   @   s|   e Zd 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d„Zdd„ Zdd„ Zdd„ Zddd„Zdd„ ZdS ) ÚAddrlistClassa  Address parser class by Ben Escoto.

    To understand what this class does, it helps to have a copy of RFC 2822 in
    front of you.

    Note: this class interface is deprecated and may be removed in the future.
    Use email.utils.AddressList instead.
    c                 C   sZ   d| _ d| _d| _d| _| j| j | _| j | j | j | _| j dd¡| _|| _g | _	dS )zƒInitialize a new instance.

        `field' is an unparsed address header field, containing
        one or more addresses.
        z()<>@,:;."[]r   z 	z
rG   r   N)
ÚspecialsÚposÚLWSÚCRÚFWSÚatomendsrr   Ú
phraseendsÚfieldÚcommentlist©Úselfr|   r9   r9   r:   Ú__init__Ý   s   
zAddrlistClass.__init__c                 C   sš   g }| j t| jƒk rH| j| j  | jd v r.| j| j  dvr&| | j| j  ¡ |  j d7  _ n| j| j  dkr?| j |  ¡ ¡ nn| j t| jƒk s
t |¡S )z&Skip white space and extract comments.z
r<   ú()	rv   rP   r|   rw   rR   r}   Ú
getcommentÚEMPTYSTRINGÚjoin)r   Úwslistr9   r9   r:   Úgotonextð   s   ø
	zAddrlistClass.gotonextc                 C   sH   g }| j t| jƒk r"|  ¡ }|r||7 }n| d¡ | j t| jƒk s
|S )zVParse all addresses.

        Returns a list containing all of the addresses.
        )r   r   )rv   rP   r|   Ú
getaddressrR   )r   ÚresultÚadr9   r9   r:   Úgetaddrlistþ   s   

ûzAddrlistClass.getaddrlistc                 C   sê  g | _ |  ¡  | j}| j }|  ¡ }|  ¡  g }| jt| jƒkr-|r,t | j ¡|d fg}n«| j| j dv rI|| _|| _ |  ¡ }t | j ¡|fg}n| j| j dkrg }t| jƒ}|  jd7  _| jt| jƒk rŽ|  ¡  | j|k r€| j| j dkr€|  jd7  _n||  	¡  }| jt| jƒk sgnI| j| j dkrº|  
¡ }| j r±t |¡d d | j ¡ d	 |fg}n't |¡|fg}n|rÈt | j ¡|d fg}n| j| j | jv rØ|  jd7  _|  ¡  | jt| jƒk ró| j| j d
kró|  jd7  _|S )zParse the next address.r   z.@rD   r<   ú;ú<z (r   ú)r;   )r}   r†   rv   ÚgetphraselistrP   r|   ÚSPACEr„   Úgetaddrspecr‡   Úgetrouteaddrru   )r   ÚoldposÚoldclÚplistÚ
returnlistÚaddrspecÚfieldlenÚ	routeaddrr9   r9   r:   r‡     s^   €
û€
ÿÿÿ zAddrlistClass.getaddressc                 C   sô   | j | j dkr
dS d}|  jd7  _|  ¡  d}| jt| j ƒk rx|r*|  ¡  d}nB| j | j dkr<|  jd7  _	 |S | j | j dkrN|  jd7  _d}n| j | j d	kr^|  jd7  _n|  ¡ }|  jd7  _	 |S |  ¡  | jt| j ƒk s!|S )
zParse a route address (Return-path value).

        This method just skips all the route stuff and returns the addrspec.
        rŒ   NFr<   r   ú>ú@TrD   )r|   rv   r†   rP   Ú	getdomainr   )r   ÚexpectrouteÚadlistr9   r9   r:   r‘   G  s4   õþðzAddrlistClass.getrouteaddrc                 C   sZ  g }|   ¡  | jt| jƒk ryd}| j| j dkr3|r$|d  ¡ s$| ¡  | d¡ |  jd7  _d}n1| j| j dkrG| dt|  ¡ ƒ ¡ n| j| j | j	v r]|r\|d  ¡ s\| ¡  n| |  
¡ ¡ |   ¡ }|rq|rq| |¡ | jt| jƒk s| jt| jƒks‰| j| j dkrŽt |¡S | d¡ |  jd7  _|   ¡  |  ¡ }|s¦tS t |¡| S )	zParse an RFC 2822 addr-spec.TrG   rA   r<   Frq   z"%s"rš   )r†   rv   rP   r|   ÚstripÚpoprR   r   Úgetquoterz   Úgetatomrƒ   r„   r›   )r   ÚaslistÚpreserve_wsÚwsÚdomainr9   r9   r:   r   g  s<   

î 

zAddrlistClass.getaddrspecc                 C   sò   g }| j t| jƒk rt| j| j  | jv r|  j d7  _ nQ| j| j  dkr,| j |  ¡ ¡ n@| j| j  dkr<| |  ¡ ¡ n0| j| j  dkrQ|  j d7  _ | d¡ n| j| j  dkr[tS | j| j  | j	v ren| |  
¡ ¡ | j t| jƒk s
t |¡S )z-Get the complete domain name from an address.r<   r   ú[rG   rš   )rv   rP   r|   rw   r}   rR   r‚   Úgetdomainliteralrƒ   rz   r¡   r„   )r   Úsdlistr9   r9   r:   r›     s$   ï
zAddrlistClass.getdomainTc                 C   sì   | j | j |kr
dS dg}d}|  jd7  _| jt| j ƒk rq|r,| | j | j ¡ d}n6| j | j |v r<|  jd7  _n5|rN| j | j dkrN| |  ¡ ¡ q| j | j dkrYd}n	| | j | j ¡ |  jd7  _| jt| j ƒk st |¡S )aæ  Parse a header fragment delimited by special characters.

        `beginchar' is the start character for the fragment.
        If self is not looking at an instance of `beginchar' then
        getdelimited returns the empty string.

        `endchars' is a sequence of allowable end-delimiting characters.
        Parsing stops when one of these is encountered.

        If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed
        within the parsed fragment.
        r   Fr<   r   rp   T)r|   rv   rP   rR   r‚   rƒ   r„   )r   Ú	begincharÚendcharsÚallowcommentsÚslistr   r9   r9   r:   Úgetdelimited¤  s*   ò
zAddrlistClass.getdelimitedc                 C   ó   |   ddd¡S )z1Get a quote-delimited fragment from self's field.rq   z"F©r­   ©r   r9   r9   r:   r    É  ó   zAddrlistClass.getquotec                 C   r®   )z7Get a parenthesis-delimited fragment from self's field.r   z)Tr¯   r°   r9   r9   r:   r‚   Í  r±   zAddrlistClass.getcommentc                 C   s   d|   ddd¡ S )z!Parse an RFC 2822 domain-literal.z[%s]r¦   z]Fr¯   r°   r9   r9   r:   r§   Ñ  s   zAddrlistClass.getdomainliteralNc                 C   sp   dg}|du r
| j }| jt| jƒk r3| j| j |v rn| | j| j ¡ |  jd7  _| jt| jƒk st |¡S )a  Parse an RFC 2822 atom.

        Optional atomends specifies a different set of end token delimiters
        (the default is to use self.atomends).  This is used e.g. in
        getphraselist() since phrase endings must not include the `.' (which
        is legal in phrases).r   Nr<   )rz   rv   rP   r|   rR   rƒ   r„   )r   rz   Úatomlistr9   r9   r:   r¡   Õ  s   û
zAddrlistClass.getatomc                 C   s¶   g }| j t| jƒk rY| j| j  | jv r|  j d7  _ n6| j| j  dkr+| |  ¡ ¡ n&| j| j  dkr<| j |  ¡ ¡ n| j| j  | jv rH	 |S | |  	| j¡¡ | j t| jƒk s
|S )zýParse a sequence of RFC 2822 phrases.

        A phrase is a sequence of words, which are in turn either RFC 2822
        atoms or quoted-strings.  Phrases are canonicalized by squeezing all
        runs of continuous whitespace into one space.
        r<   rq   r   )
rv   rP   r|   ry   rR   r    r}   r‚   r{   r¡   )r   r”   r9   r9   r:   rŽ   é  s   þözAddrlistClass.getphraselist)T©N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r€   r†   rŠ   r‡   r‘   r   r›   r­   r    r‚   r§   r¡   rŽ   r9   r9   r9   r:   rt   Ó   s    	; &
%
rt   c                   @   sH   e Zd 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S )ÚAddressListz@An AddressList encapsulates a list of parsed RFC 2822 addresses.c                 C   s(   t  | |¡ |r|  ¡ | _d S g | _d S r³   )rt   r€   rŠ   Úaddresslistr~   r9   r9   r:   r€     s   
zAddressList.__init__c                 C   s
   t | jƒS r³   )rP   r¹   r°   r9   r9   r:   Ú__len__	  s   
zAddressList.__len__c                 C   s>   t d ƒ}| jd d … |_|jD ]}|| jvr|j |¡ q|S r³   ©r¸   r¹   rR   ©r   ÚotherÚnewaddrÚxr9   r9   r:   Ú__add__  s   

€zAddressList.__add__c                 C   s&   |j D ]}|| j vr| j  |¡ q| S r³   )r¹   rR   ©r   r½   r¿   r9   r9   r:   Ú__iadd__  ó
   

€zAddressList.__iadd__c                 C   s.   t d ƒ}| jD ]}||jvr|j |¡ q|S r³   r»   r¼   r9   r9   r:   Ú__sub__  s   

€zAddressList.__sub__c                 C   s&   |j D ]}|| j v r| j  |¡ q| S r³   )r¹   ÚremoverÁ   r9   r9   r:   Ú__isub__$  rÃ   zAddressList.__isub__c                 C   s
   | j | S r³   )r¹   )r   rT   r9   r9   r:   Ú__getitem__+  s   
zAddressList.__getitem__N)r´   rµ   r¶   r·   r€   rº   rÀ   rÂ   rÄ   rÆ   rÇ   r9   r9   r9   r:   r¸      s    	r¸   )r·   Ú__all__rl   rn   r   rƒ   Ú
COMMASPACErS   rN   rY   r   r5   r   r   r   rt   r¸   r9   r9   r9   r:   Ú<module>   s0   û	}	

  /