a
    ӗa:E                     @   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, )ZjanZfebZmarZaprmayZjunZjulZaugsepoctZnovZdecZjanuaryZfebruaryZmarchZaprilr   ZjuneZjulyZaugustZ	septemberZoctoberZnovemberZdecember)ZmonZtueZwedZthuZfriZsatZsunipiiiiDi)ZUTZUTCGMTZZASTZADTZESTZEDTZCSTZCDTZMSTZMDTZPSTZ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 r   3/home/manager/Python-3.9.10/Lib/email/_parseaddr.pyr   -   s    r   c              
   C   s  | sdS |   } | sdS | d ds6| d  tv r>| d= n.| d d}|dkrl| d |d d | d< t| dkr| d  d}t|dkr|| dd  } t| dkr| d }|d}|d	kr|d}|dkr|d| ||d g| dd< n
| d
 t| dk rdS | dd } | \}}}}}| }|tvrb||  }}|tvrbdS t	|d }|dkr|d8 }|d	 dkr|dd	 }|d}|dkr|| }}|d	 dkr|dd	 }|d 
 s|| }}|d	 dkr|dd	 }| d}t|dkr,|\}	}
d}nt|dkrF|\}	}
}njt|dkrd|d v r|d  d}t|dkr|\}	}
d}nt|dkr|\}	}
}ndS ndS z,t|}t|}t|	}	t|
}
t|}W n ty   Y dS 0 |dk r|dkr|d7 }n|d7 }d}| }|tv r:t| }n<zt|}W n tyZ   Y n0 |dkrv|drvd}|r|dk rd	}| }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)r   istuffsddmmZyytmtzZthhZtmmZtssZtzoffsetZtzsignr   r   r   r   9   s    


"














r   c                 C   s&   t | }t|tr|dd S |S dS )z&Convert a time string to a time tuple.Nr   )r   
isinstancer   r   tr   r   r   r      s    
r   c                 C   s<   | d du r"t | dd d S t| }|| d  S dS )zETurn a 10-tuple as returned by parsedate_tz() into a POSIX timestamp.r   N   )r   )timemktimecalendarZtimegmr<   r   r   r   r      s    
r   c                 C   s   |  dd ddS )zPrepare 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)strr   r   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 )zInitialize a new instance.

        `field' is an unparsed address header field, containing
        one or more addresses.
        z()<>@,:;."[]r   z 	z
r    r   N)
specialsposLWSZCRFWSatomendsrD   
phraseendsfieldcommentlistselfrM   r   r   r   __init__   s    zAddrlistClass.__init__c                 C   s   g }| j t| jk r| j| j  | jd v r\| j| j  dvrL|| j| j   |  j d7  _ q| j| j  dkr| j|   qqqt|S )z&Skip white space and extract comments.z
r   ()	rH   r)   rM   rI   r+   rN   
getcommentEMPTYSTRINGjoin)rP   Zwslistr   r   r   gotonext   s    zAddrlistClass.gotonextc                 C   s:   g }| j t| jk r6|  }|r*||7 }q|d q|S )zVParse all addresses.

        Returns a list containing all of the addresses.
        )r   r   )rH   r)   rM   
getaddressr+   )rP   resultZadr   r   r   getaddrlist   s    
zAddrlistClass.getaddrlistc                 C   s  g | _ |   | j}| j }|  }|   g }| jt| jkr\|rXt| j |d fg}n\| j| j dv r|| _|| _ |  }t| j |fg}n"| j| j dkrg }t| j}|  jd7  _| jt| jk r|   | j|k r| j| j dkr|  jd7  _q|| 	  }qn| j| j dkrx| 
 }| j rft|d d| j  d	 |fg}nt||fg}n@|rt| 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.@r   r   ;<z (r   )r   )rN   rV   rH   getphraselistr)   rM   SPACErU   getaddrspecrW   getrouteaddrrG   )rP   ZoldposZoldclplistZ
returnlistZaddrspecZfieldlenZ	routeaddrr   r   r   rW     sX    

$zAddrlistClass.getaddressc                 C   s   | j | j dkrdS d}|  jd7  _|   d}| jt| j k r|rT|   d}n~| j | j dkrv|  jd7  _qn\| j | j dkr|  jd7  _d}n8| j | j d	kr|  jd7  _n|  }|  jd7  _q|   q2|S )
zParse a route address (Return-path value).

        This method just skips all the route stuff and returns the addrspec.
        r[   NFr   r   >@Tr   )rM   rH   rV   r)   	getdomainr_   )rP   ZexpectrouteZadlistr   r   r   r`   C  s.    
zAddrlistClass.getrouteaddrc                 C   sT  g }|    | jt| jk rd}| j| j dkrf|rH|d  sH|  |d |  jd7  _d}nd| j| j dkr|dt|    n<| j| j | j	v r|r|d  s|  qn|| 
  |   }|r|r|| q| jt| jks
| j| j dkrt|S |d |  jd7  _|    |  }|sFtS t|| S )	zParse an RFC 2822 addr-spec.Tr    r   r   FrC   z"%s"rc   )rV   rH   r)   rM   strippopr+   r   getquoterK   getatomrT   rU   rd   )rP   ZaslistZpreserve_wswsdomainr   r   r   r_   c  s:    
$

zAddrlistClass.getaddrspecc                 C   s   g }| j t| jk r| j| j  | jv r6|  j d7  _ q| j| j  dkrX| j|   q| j| j  dkrx||   q| j| j  dkr|  j d7  _ |d q| j| j  dkrtS | j| j  | j	v rqq|| 
  qt|S )z-Get the complete domain name from an address.r   rR   [r    rc   )rH   r)   rM   rI   rN   r+   rS   getdomainliteralrT   rK   rh   rU   )rP   Zsdlistr   r   r   rd     s"    zAddrlistClass.getdomainTc                 C   s   | j | j |krdS dg}d}|  jd7  _| jt| j k r|rX|| j | j  d}np| j | j |v rz|  jd7  _qnN|r| j | j dkr||   q,n(| j | j dkrd}n|| j | j  |  jd7  _q,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   rR   rB   T)rM   rH   r)   r+   rS   rT   rU   )rP   Z	begincharZendcharsZallowcommentsZslistr   r   r   r   getdelimited  s(    zAddrlistClass.getdelimitedc                 C   s   |  dddS )z1Get a quote-delimited fragment from self's field.rC   z"Frm   rP   r   r   r   rg     s    zAddrlistClass.getquotec                 C   s   |  dddS )z7Get a parenthesis-delimited fragment from self's field.rR   z)Trn   ro   r   r   r   rS     s    zAddrlistClass.getcommentc                 C   s   d|  ddd S )z!Parse an RFC 2822 domain-literal.z[%s]rk   z]Frn   ro   r   r   r   rl     s    zAddrlistClass.getdomainliteralNc                 C   sd   dg}|du r| j }| jt| jk rZ| j| j |v r8qZn|| j| j  |  jd7  _q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   )rK   rH   r)   rM   r+   rT   rU   )rP   rK   Zatomlistr   r   r   rh     s    zAddrlistClass.getatomc                 C   s   g }| j t| jk r| j| j  | jv r6|  j d7  _ q| j| j  dkrV||   q| j| j  dkrx| j|   q| j| j  | jv rqq|| 	| j q|S )zParse 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   rC   rR   )
rH   r)   rM   rJ   r+   rg   rN   rS   rL   rh   )rP   ra   r   r   r   r]     s    zAddrlistClass.getphraselist)T)N)__name__
__module____qualname____doc__rQ   rV   rY   rW   r`   r_   rd   rm   rg   rS   rl   rh   r]   r   r   r   r   rF      s   	; &
%
rF   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|  | _ng | _d S N)rF   rQ   rY   addresslistrO   r   r   r   rQ     s    zAddressList.__init__c                 C   s
   t | jS ru   )r)   rv   ro   r   r   r   __len__  s    zAddressList.__len__c                 C   s>   t d }| jd d  |_|jD ]}|| jvr|j| q|S ru   rt   rv   r+   rP   otherZnewaddrxr   r   r   __add__  s    

zAddressList.__add__c                 C   s&   |j D ]}|| j vr| j | q| S ru   )rv   r+   rP   rz   r{   r   r   r   __iadd__  s    

zAddressList.__iadd__c                 C   s.   t d }| jD ]}||jvr|j| q|S ru   rx   ry   r   r   r   __sub__  s
    

zAddressList.__sub__c                 C   s&   |j D ]}|| j v r| j | q| S ru   )rv   remover}   r   r   r   __isub__   s    

zAddressList.__isub__c                 C   s
   | j | S ru   )rv   )rP   r-   r   r   r   __getitem__'  s    zAddressList.__getitem__N)rp   rq   rr   rs   rQ   rw   r|   r~   r   r   r   r   r   r   r   rt     s   	rt   )rs   __all__r?   rA   r^   rT   
COMMASPACEr,   r'   r2   r   r   r   r   r   rF   rt   r   r   r   r   <module>   s.   	y	

  /