U
    ={f                     @   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|k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||k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'   U/var/www/html/Darija-Ai-API/env/lib/python3.8/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   s     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)@<r6   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*   r8   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.r7   z0There can't be anything after the email address.r   )r5   r5   )	strr   bool
startswithrstripr   r1   sortedcheck_unsafe_chars)r   r)   r4   r#   r&   Zdisplay_nameZdisplay_name_quoted	bad_charsZ	addr_spec
local_partZdomain_partZis_quoted_local_partr'   r'   r(   split_email   s4    $",


rH   )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!   )rI   rJ   diffsuffixr'   r'   r(   get_length_reason   s    rQ   )r%   r   c                 C   sp   | dkrd|  dS t | d dk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 )LocalPartValidationResultrG   ascii_local_partsmtputf8N)__name__
__module____qualname__r@   __annotations__r   rA   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 n. tk
rv } ztd|W 5 d}~X Y nX |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)rG   r_   r`   rJ   z0The email address is too long before the @-sign r8   Nc                 S   s   h | ]}t |st|qS r'   r9   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 )    ~   )rZ   r-   r.   r'   r'   r(   r;   -  s
     
r2   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   rQ   r   r:   r   r1   rD   rE   encode
ValueErrorresubcheck_dot_atom)	re   rf   rg   rh   reasonZvalidZrequires_smtputf8rF   er'   r'   r(   validate_email_local_part   sx    	



rv   )rK   r=   r   c                 C   s   t  }t| D ]\}}t|}|d dk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   rR   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     s     z%check_unsafe_chars.<locals>.<genexpr>r8   )setr   r   rX   addr   r1   rD   )rK   r=   rF   r$   r%   rX   r'   r'   r(   rE   r  s,    

rE   )labelstart_descr	end_descrrn   r   c                 C   s   |  drt|d| dr0t|dd| kr@td|r|  dr\t|d| drtt|dd| ksd| krtd	d S )
Nr8   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   formatrB   )r}   r~   r   rn   r'   r'   r(   rs     s    



rs   c                   @   s   e Zd ZU eed< eed< dS )DomainNameValidationResultascii_domaindomainN)ra   rb   rc   r@   rd   r'   r'   r'   r(   r     s   
r   )r   test_environmentglobally_deliverabler   c              
   C   sj  dd | D }|r,t ddt| d t|  | }ztj| ddd} W n6 tjk
r } zt d| d	|W 5 d
}~X Y nX dd | D }|rt ddt| d t| dddd | dD ]}t	
d|t	jrt dqt
| r| }nlzddd | dD }W n8 tjk
rN } zt d| d	|W 5 d
}~X Y nX t
|sdt 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|rFd|kr2|d kr*|s2t d!t|sFt d"dd#lm} |D ]<}|d krn|rnqV||ks|d| rVt d$qVzt|d%}W n8 tjk
r } zt d&| d	|W 5 d
}~X Y nX d'd | D }|rt ddt| d t|  zt| W n8 tjk
r^ } zt d(| d	|W 5 d
}~X Y nX ||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*   r8   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 {}.Trm   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.ri   z/The email address is too long after the @-sign r   r   rK   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   r1   rD   rE   r   uts46_remap	IDNAErrorrs   splitrq   r:   Ir   r!   r   rQ   r   r   searchr   r   r   r   ro   )r   r   r   rF   Zoriginal_domainru   r}   r   rt   rO   rK   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 kr||krt|td}n|d k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   r5   z9when the part after the @-sign is converted to IDNA ASCIIrl   r   ri   c                 s   s   | ]}t |d V  qdS )rl   N)r!   ro   r.   r'   r'   r(   r0     s     z(validate_email_length.<locals>.<genexpr>r   rK   rL   rM   rN   r   z (r   zThe email address is too long r8   )original
normalizedr_   rG   r   r!   ro   r   rQ   maxr   )
r   Zaddresses_to_checkrI   rt   Zaddr_lenZaddr_utf8_lenrO   ZmbpcZmcharsrP   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)	ra   rb   rc   r   	ipaddressIPv4AddressIPv6Addressrd   r@   r'   r'   r'   r(   r     s   
r   )domain_literalr   c              
   C   s  t d| rbzt| }W n4 tk
rN } ztd| d|W 5 d }~X Y nX |d| ddS | drzt| dd  }W n4 tk
r } ztd	| d
|W 5 d }~X Y nX |d|j ddS d| k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*   r8   zNThe part after the @-sign contains an invalid address literal tag in brackets.)rq   r:   r   r   rp   r   rB   r   
compressedr1   rD   )r   rI   ru   rF   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   rq   r   r   r   typingr   r   r   r   r@   rA   rH   intrQ   r-   r^   rv   rE   rs   r   r   r   r   r   r'   r'   r'   r(   <module>   s4   <  '    "4 ??