3
,6`D                 @   s   d Z ddddgZddlZddlZdZdZd	Zd
ddddddddddddddddddddddd gZd!d"d#d$d%d&d'gZddddd9d:d;d<d=d>d?d@dAdBd.Z	d/d Z
d0d1 Zd2d Zd3d Zd4d ZG d5d6 d6ZG d7d8 d8eZdS )CzcEmail 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aprZmayZjunZjulZaugsepoctZnovZdecZjanuaryZfebruaryZmarchZaprilZjuneZjulyZaugustZ	septemberZoctoberZnovemberZdecemberZmonZtueZwedZthuZfriZsatZsuni  i,  i  iX  i  i   )ZUTZUTCZGMTZZASTZADTZESTZEDTZCSTZCDTZMSTZMDTZPSTZPDTc             C   s,   t | }|sdS |d dkr$d|d< t|S )zQConvert a date string to a time tuple.

    Accounts for military timezones.
    N	   r   )_parsedate_tztuple)dataZres r   &/usr/lib/python3.6/email/_parseaddr.pyr   -   s    c             C   s  | sdS | j  } | d jds.| d j tkr6| d= n.| d jd}|dkrd| d |d d | d< t| dkr| d j d}t|dkr|| dd  } t| dkr | d }|jd}|dkr|jd}|dkr|d| ||d g| dd< n
| jd	 t| d
k rdS | dd
 } | \}}}}}|j }|tkrZ||j  }}|tkrZdS tj	|d }|dkrz|d8 }|d dkr|dd }|jd}|dkr|| }}|d dkr|dd }|d j
 s|| }}|d dkr|dd }|j d}t|dkr$|\}	}
d}n~t|dkr>|\}	}
}ndt|dkrd|d kr|d j d}t|dkr|\}	}
d}nt|dkr|\}	}
}ndS y,t|}t|}t|	}	t|
}
t|}W n tk
r   dS X |dk r|dkr|d7 }n|d7 }d}|j }|tkr,t| }n>yt|}W n tk
rN   Y nX |dkrj|jdrjd}|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  <   r    r    r    r    r    r    r    r    )splitendswithlower	_daynamesrfindlenfindappend_monthnamesindexisdigitint
ValueErrorupper
_timezones
startswith)r   iZstuffsZddZmmZyyZtmZ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    
c             C   s<   | d dkr"t j| dd d S tj| }|| d  S dS )zETurn a 10-tuple as returned by parsedate_tz() into a POSIX timestamp.r   N   r   r    )r    )timeZmktimecalendarZtimegm)r   r4   r   r   r   r      s    
c             C   s   | j ddj 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    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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atomendsr:   
phraseendsfieldcommentlist)selfrC   r   r   r   __init__   s    zAddrlistClass.__init__c             C   s   g }x| j t| jk r| j| j  | jd kr^| j| j  dkrN|j| j| j   |  j d7  _ q| j| j  dkr| jj| j  qP qW tj|S )z&Skip white space and extract comments.z
r   ()	r>   r&   rC   r?   r(   rD   
getcommentEMPTYSTRINGjoin)rE   Zwslistr   r   r   gotonext   s    zAddrlistClass.gotonextc             C   s>   g }x4| j t| jk r8| j }|r,||7 }q|jd qW |S )zVParse all addresses.

        Returns a list containing all of the addresses.
        r   )r   r   )r>   r&   rC   
getaddressr(   )rE   resultZadr   r   r   getaddrlist   s    
zAddrlistClass.getaddrlistc             C   s  g | _ | j  | j}| j }| j }| j  g }| jt| jkr\|rXtj| j |d fg}n\| j| j dkr|| _|| _ | j }tj| j |fg}n"| j| j dkrg }t| j}|  jd7  _x| jt| jk r| j  | j|k o| j| j dkr|  jd7  _P || j	  }qW n| j| j dkrx| j
 }| j rftj|d dj| j  d	 |fg}ntj||fg}n@|rtj| j |d fg}n"| j| j | jkr|  jd7  _| j  | 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   )rD   rK   r>   getphraselistr&   rC   SPACErJ   getaddrspecrL   getrouteaddrr=   )rE   ZoldposZoldclplistZ
returnlistZaddrspecZfieldlenZ	routeaddrr   r   r   rL     sL    
&$zAddrlistClass.getaddressc             C   s   | j | j dkrdS d}|  jd7  _| j  d}x| jt| j k r|rV| j  d}n~| j | j dkrx|  jd7  _P n\| j | j dkr|  jd7  _d}n8| j | j d	kr|  jd7  _n| j }|  jd7  _P | j  q4W |S )
zParse a route address (Return-path value).

        This method just skips all the route stuff and returns the addrspec.
        rP   NFr   r   >@Tr   )rC   r>   rK   r&   	getdomainrT   )rE   ZexpectrouteZadlistr   r   r   rU   ?  s.    zAddrlistClass.getrouteaddrc             C   s\  g }| j   x| jt| jk rd}| j| j dkrj|rL|d j  rL|j  |jd |  jd7  _d}nf| j| j dkr|jdt| j   n>| j| j | j	kr|r|d	 j  r|j  P n|j| j
  | j  }|r|r|j| qW | jt| jks| j| j dkrtj|S |jd |  jd7  _| j   | j }|sNtS tj|| S )
zParse an RFC 2822 addr-spec.Tr   r   Fr9   z"%s"rX   r    r    )rK   r>   r&   rC   strippopr(   r   getquoterA   getatomrI   rJ   rY   )rE   ZaslistZpreserve_wsZwsZdomainr   r   r   rT   _  s:    
$

zAddrlistClass.getaddrspecc             C   s   g }x| j t| jk r| j| j  | jkr8|  j d7  _ q| j| j  dkrZ| jj| j  q| j| j  dkrz|j| j  q| j| j  dkr|  j d7  _ |jd q| j| j  dkrtS | j| j  | j	krP q|j| j
  qW tj|S )z-Get the complete domain name from an address.r   rG   [r   rX   )r>   r&   rC   r?   rD   r(   rH   getdomainliteralrI   rA   r]   rJ   )rE   Zsdlistr   r   r   rY     s"    zAddrlistClass.getdomainTc             C   s   | j | j |krdS dg}d}|  jd7  _x| jt| j k r|rZ|j| j | j  d}np| j | j |kr||  jd7  _P nN|r| j | j dkr|j| j  q.n(| j | j dkrd}n|j| j | j  |  jd7  _q.W tj|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   rG   r8   T)rC   r>   r&   r(   rH   rI   rJ   )rE   Z	begincharZendcharsZallowcommentsZslistr   r   r   r   getdelimited  s(    zAddrlistClass.getdelimitedc             C   s   | j dddS )z1Get a quote-delimited fragment from self's field.r9   z"F)r`   )rE   r   r   r   r\     s    zAddrlistClass.getquotec             C   s   | j dddS )z7Get a parenthesis-delimited fragment from self's field.rG   z)T)r`   )rE   r   r   r   rH     s    zAddrlistClass.getcommentc             C   s   d| j ddd S )z!Parse an RFC 2822 domain-literal.z[%s]r^   z]F)r`   )rE   r   r   r   r_     s    zAddrlistClass.getdomainliteralNc             C   sh   dg}|dkr| j }xH| jt| jk r\| j| j |kr:P n|j| j| j  |  jd7  _qW tj|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   )rA   r>   r&   rC   r(   rI   rJ   )rE   rA   Zatomlistr   r   r   r]     s    zAddrlistClass.getatomc             C   s   g }x| j t| jk r| j| j  | jkr8|  j d7  _ q| j| j  dkrX|j| j  q| j| j  dkrz| jj| j  q| j| j  | jkrP q|j| j	| j qW |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   r9   rG   )
r>   r&   rC   r@   r(   r\   rD   rH   rB   r]   )rE   rV   r   r   r   rR     s    zAddrlistClass.getphraselist)T)N)__name__
__module____qualname____doc__rF   rK   rN   rL   rU   rT   rY   r`   r\   rH   r_   r]   rR   r   r   r   r   r<      s   ; &
%
r<   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 j| | |r| j | _ng | _d S )N)r<   rF   rN   addresslist)rE   rC   r   r   r   rF     s    zAddressList.__init__c             C   s
   t | jS )N)r&   rf   )rE   r   r   r   __len__  s    zAddressList.__len__c             C   sB   t d }| jd d  |_x$|jD ]}|| jkr |jj| q W |S )N)re   rf   r(   )rE   othernewaddrxr   r   r   __add__  s    
zAddressList.__add__c             C   s*   x$|j D ]}|| j kr| j j| qW | S )N)rf   r(   )rE   rh   rj   r   r   r   __iadd__  s    
zAddressList.__iadd__c             C   s2   t d }x$| jD ]}||jkr|jj| qW |S )N)re   rf   r(   )rE   rh   ri   rj   r   r   r   __sub__  s
    
zAddressList.__sub__c             C   s*   x$|j D ]}|| j kr| j j| qW | S )N)rf   remove)rE   rh   rj   r   r   r   __isub__  s    
zAddressList.__isub__c             C   s
   | j | S )N)rf   )rE   r*   r   r   r   __getitem__#  s    zAddressList.__getitem__N)ra   rb   rc   rd   rF   rg   rk   rl   rm   ro   rp   r   r   r   r   re     s   	re   ipiiipiiiDiiiD)rd   __all__r6   r7   rS   rI   Z
COMMASPACEr)   r$   r/   r   r   r   r   r   r<   re   r   r   r   r   <module>   s8   

u	

  /