a
    QҚh                     @   sr  d dl mZmZ d dlmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZ ddlZddlZddlZddlZddlmZmZmZmZ eeee eeef dddZeeed	d
dZeedddZG dd deZ d)eeeee dddZ!d*eeddddZ"eeeeddddZ#G dd deZ$d+eeee$ddd Z%edd!d"d#Z&G d$d% d%eZ'ee'd&d'd(Z(dS ),   )EmailSyntaxErrorValidatedEmail)EMAIL_MAX_LENGTHLOCAL_PART_MAX_LENGTHDOMAIN_MAX_LENGTHDOT_ATOM_TEXTDOT_ATOM_TEXT_INTLATEXT_REATEXT_INTL_DOT_REATEXT_HOSTNAME_INTL
QTEXT_INTLDNS_LABEL_LENGTH_LIMITDOT_ATOM_TEXT_HOSTNAMEDOMAIN_NAME_REGEXDOMAIN_LITERAL_CHARS    N)OptionalTuple	TypedDictUnion)emailreturnc                 C   s0  t tt df tt t f ddd}t tt tf ddd}|| d\}}|d	r| }||\}}|sd
d |D }|rtddt| d t|dd d|vrtd|d}|d dkrtd|dd  d}||d\}	}
nd }|| }	}
|
dr|
dd  }
||	\}	}||	|
|fS )N.)textspecialsr   c                 S   s   d}d}d}t | D ]\}}td| |d  d |krB||7 }q|r|||7 }|dkr`|s`d}q|dkrv|svd}d}qd}q|dkr||7 }d}q||v r qq||7 }qt|t| krtd| t|d  }||fS )	NF NFCr   \T"z%An email address must have an @-sign.)	enumerateunicodedata	normalizelenr   )r   r   Zinside_quoteescaped	left_partic
right_part r'   Q/wd/webapps/venvs/v2025_4um/lib/python3.9/site-packages/email_validator/syntax.py split_string_at_unquoted_special1   s0    

z5split_email.<locals>.split_string_at_unquoted_special)r   r   c              	   S   s   d}d}d}t | D ]\}}|r|r2||7 }d}q|dkr@d}q|dkr|t| d krtddd	d
 | |d d  D   qq||7 }q|dkr|dkrd}q||7 }q||fS )NFr   r   Tr   r   z,Extra character(s) found after close quote: , c                 s   s   | ]}t |V  qd S Nsafe_character_display.0r%   r'   r'   r(   	<genexpr>o       z=split_email.<locals>.unquote_quoted_string.<locals>.<genexpr>r   )r   r!   r   join)r   quotedr"   valuer$   r%   r'   r'   r(   unquote_quoted_string]   s*    

z*split_email.<locals>.unquote_quoted_string)@<r7   c                 S   s.   h | ]&}t |s|d ks"|dkrt|qS ) .r	   matchr-   r.   r'   r'   r(   	<setcomp>   s   zsplit_email.<locals>.<setcomp>z>The display name contains invalid characters when not quoted: r*   r9   Tallow_space>zoAn open angle bracket at the start of the email address has to be followed by a close angle bracket at the end.r8   z0There can't be anything after the email address.r   )r6   r6   )	strr   bool
startswithrstripr   r2   sortedcheck_unsafe_chars)r   r)   r5   r#   r&   display_nameZdisplay_name_quoted	bad_charsZ	addr_spec
local_partZdomain_partZis_quoted_local_partr'   r'   r(   split_email   s4    $",


rJ   )addrlimitr   c                 C   s.   t | | }|dkrdnd}d| d| dS )zEHelper function to return an error message related to invalid length.r   sr   (
 character
 too many))r!   )rK   rL   diffsuffixr'   r'   r(   get_length_reason   s    rS   )r%   r   c                 C   sp   | dkrd|  dS t | d dv r.t| S t| dk rPdt| d }ndt| d }t | |S )	Nr   r   r   LNPSi  zU+Z04x08x)r   categoryreprorduppername)r%   hr'   r'   r(   r-      s    r-   c                   @   s*   e Zd ZU eed< ee ed< eed< dS )LocalPartValidationResultrI   ascii_local_partsmtputf8N)__name__
__module____qualname__rA   __annotations__r   rB   r'   r'   r'   r(   r`      s   
r`   TF)localallow_smtputf8allow_empty_localquoted_local_partr   c           	   
   C   s  t | dkr$|std| | ddS t | tkrLt| td}td| dt| rb| | ddS d}d}t| r|sd	d
 | D }|rtddt| d tdd}d}nn|r$dd
 | D }|rtddt| d dd
 | D }|r d}|s tddt| d d}|rt	| |dkd z| 
d W n0 tyx } ztd|W Y d}~n
d}~0 0 |dkrdtdd|  d } | |s| nd|dS dd
 | D }|rtddt| d t| dddd tddS ) z;Validates the syntax of the local part of an email address.r   z*There must be something before the @-sign.F)rI   ra   rb   rL   z0The email address is too long before the @-sign r9   Nc                 S   s   h | ]}t |st|qS r'   r:   r.   r'   r'   r(   r<     s   
z,validate_email_local_part.<locals>.<setcomp>zBInternationalized characters before the @-sign are not supported: r*   zAInternationalized characters before the @-sign are not supported.zdot-atomTc                 S   s   h | ]}t |st|qS r'   )r   r;   r-   r.   r'   r'   r(   r<   $  s   
zKThe email address contains invalid characters in quotes before the @-sign: c                 S   s.   h | ]&}d t |  kr dksn t|qS )    ~   )r\   r-   r.   r'   r'   r(   r<   -  s   r3   r=   utf8z0The email address contains an invalid character.r   z(["\\])z\\\1c                 S   s   h | ]}t |st|qS r'   )r
   r;   r-   r.   r'   r'   r(   r<   a  s   
zAThe email address contains invalid characters before the @-sign: z(An email address cannot start with a {}.z@An email address cannot have a {} immediately before the @-sign.is_hostnamez@The email address contains invalid characters before the @-sign.)r!   r   r   rS   r   r;   r   r2   rE   rF   encode
ValueErrorresubcheck_dot_atom)	rg   rh   ri   rj   reasonZvalidZrequires_smtputf8rH   er'   r'   r(   validate_email_local_part   sx    	


 
rx   )rM   r>   r   c                 C   s   t  }t| D ]\}}t|}|d dv r.q|d dkrN|dkr|| q|dkrf|s|| q|d dkr~|| q|d dkr|| q|| q|rtddd	d
 t|D  d d S )Nr   rT   MZsZCz.The email address contains unsafe characters: r*   c                 s   s   | ]}t |V  qd S r+   r,   r.   r'   r'   r(   r0     r1   z%check_unsafe_chars.<locals>.<genexpr>r9   )setr   r   rZ   addr   r2   rE   )rM   r>   rH   r$   r%   rZ   r'   r'   r(   rF   r  s,    

rF   )labelstart_descr	end_descrrp   r   c                 C   s   |  drt|d| dr0t|dd| v r@td|r|  dr\t|d| drtt|dd| v sd| v rtd	d S )
Nr9   Zperiodz..z2An email address cannot have two periods in a row.-Zhyphenz.-z-.zFAn email address cannot have a period and a hyphen next to each other.)endswithr   formatrC   )r   r   r   rp   r'   r'   r(   ru     s    



ru   c                   @   s   e Zd ZU eed< eed< dS )DomainNameValidationResultascii_domaindomainN)rc   rd   re   rA   rf   r'   r'   r'   r(   r     s   
r   )r   test_environmentglobally_deliverabler   c              
   C   sr  dd | D }|r,t ddt| d t|  | }ztj| ddd} W n8 tjy } zt d| d	|W Y d
}~n
d
}~0 0 dd | D }|rt ddt| d t| dddd | dD ]}t	
d|t	jrt dqt
| r| }nnzddd | dD }W n: tjyR } zt d| d	|W Y d
}~n
d
}~0 0 t
|sht dt|tkr||krt|td}t d| dn4t|t }	|	dkrdnd}
t d|	 d|
 d|dD ]0}t|tkrt|td}t d| dq|rJd|vr6|d kr.|s6t d!t|sJt d"dd#lm} |D ]<}|d krr|rrqZ||ks|d| rZt d$qZzt|d%}W n: tjy } zt d&| d	|W Y d
}~n
d
}~0 0 d'd | D }|rt ddt| d t|  zt| W n: tjyf } zt d(| d	|W Y d
}~n
d
}~0 0 ||d)S )*z<Validates the syntax of the domain part of an email address.c                 S   s   h | ]}t |st|qS r'   r   r;   r-   r.   r'   r'   r(   r<     s   
z-validate_email_domain_name.<locals>.<setcomp>z7The part after the @-sign contains invalid characters: r*   r9   F)
std3_rulestransitionalz7The part after the @-sign contains invalid characters ().Nc                 S   s   h | ]}t |st|qS r'   r   r.   r'   r'   r(   r<     s   
zSThe part after the @-sign contains invalid characters after Unicode normalization: z?An email address cannot have a {} immediately after the @-sign.z&An email address cannot end with a {}.Tro   z
(?!xn)..--zAn email address cannot have two letters followed by two dashes immediately after the @-sign or after a period, except Punycode.c                 s   s   | ]}t |d V  qdS )asciiN)idnaalabeldecode)r/   r   r'   r'   r(   r0   
  s   z-validate_email_domain_name.<locals>.<genexpr>z&The part after the @-sign is invalid (zSThe email address contains invalid characters after the @-sign after IDNA encoding.rk   z/The email address is too long after the @-sign r   r   rM   z0The email address is too long after the @-sign ( bytez too many after IDNA encoding).zDAfter the @-sign, periods cannot be separated by so many characters testz@The part after the @-sign is not valid. It should have a period.zRThe part after the @-sign is not valid. It is not within a valid top-level domain.)SPECIAL_USE_DOMAIN_NAMESz[The part after the @-sign is a special-use or reserved name that cannot be used with email.r   z-The part after the @-sign is not valid IDNA (c                 S   s   h | ]}t |st|qS r'   r   r.   r'   r'   r(   r<   `  s   
zXThe part after the @-sign became invalid after normalizing to international characters ()r   r   )r   r2   rE   rF   r   uts46_remap	IDNAErrorru   splitrs   r;   Ir   r!   r   rS   r   r   searchr   r   r   r   rq   )r   r   r   rH   Zoriginal_domainrw   r   r   rv   rQ   rM   r   dZdomain_i18nr'   r'   r(   validate_email_domain_name  s    
(	


(	

((	r   )addrinfor   c           
      C   s*  | j d f| jdf| jp| jpdd | j dfg}|D ]\}}t|}t|d}|t }|dkr4|d u r||krt|td}n|d u rt	dd	 |D }t	d
|| }|d
krdnd}	||krd| d|	 d}nd| d| d|	 d}n&|d
krdnd}	|d| d|	 d7 }t
d| dq4d S )Nzafter normalizationr   r6   z9when the part after the @-sign is converted to IDNA ASCIIrn   r   rk   c                 s   s   | ]}t |d V  qdS )rn   N)r!   rq   r.   r'   r'   r(   r0     r1   z(validate_email_length.<locals>.<genexpr>r   rM   rN   rO   rP   r   z (r   zThe email address is too long r9   )original
normalizedra   rI   r   r!   rq   r   rS   maxr   )
r   Zaddresses_to_checkrK   rv   Zaddr_lenZaddr_utf8_lenrQ   ZmbpcZmcharsrR   r'   r'   r(   validate_email_length|  s*    r   c                   @   s*   e Zd ZU eejejf ed< eed< dS )DomainLiteralValidationResultdomain_addressr   N)	rc   rd   re   r   	ipaddressIPv4AddressIPv6Addressrf   rA   r'   r'   r'   r(   r     s   
r   )domain_literalr   c              
   C   s  t d| rdzt| }W n6 tyP } ztd| d|W Y d }~n
d }~0 0 |d| ddS | drzt| dd  }W n6 ty } ztd	| d
|W Y d }~n
d }~0 0 |d|j ddS d| vrtddd | D }|rtdd	t
| d tdd S )Nz
^[0-9\.]+$zRThe address in brackets after the @-sign is not valid: It is not an IPv4 address (z') or is missing an address literal tag.[])r   r   zIPv6:   z<The IPv6 address in brackets after the @-sign is not valid (r   z[IPv6::z\The part after the @-sign in brackets is not an IPv4 address and has no address literal tag.c                 S   s   h | ]}t |st|qS r'   )r   r;   r-   r.   r'   r'   r(   r<     s   
z0validate_email_domain_literal.<locals>.<setcomp>zCThe part after the @-sign contains invalid characters in brackets: r*   r9   zNThe part after the @-sign contains an invalid address literal tag in brackets.)rs   r;   r   r   rr   r   rC   r   
compressedr2   rE   )r   rK   rw   rH   r'   r'   r(   validate_email_domain_literal  s0    
(

(r   )TFF)F)FT))Zexceptions_typesr   r   Zrfc_constantsr   r   r   r   r   r	   r
   r   r   r   r   r   r   rs   r   r   r   typingr   r   r   r   rA   rB   rJ   intrS   r-   r`   rx   rF   ru   r   r   r   r   r   r'   r'   r'   r(   <module>   s2   <  '   "4 ??