o
    n#fk                  	   @   s   d dl 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mZ ddlZddlZddlZddlZddlmZ dd Zdefd	d
Zdd Z		ddedededefddZdddZdd Zd ddZdd Z dd Z!dS )!   )EmailSyntaxError)EMAIL_MAX_LENGTHLOCAL_PART_MAX_LENGTHDOMAIN_MAX_LENGTHDOT_ATOM_TEXTDOT_ATOM_TEXT_INTLATEXT_REATEXT_INTL_REATEXT_HOSTNAME_INTL
QTEXT_INTLDNS_LABEL_LENGTH_LIMITDOT_ATOM_TEXT_HOSTNAMEDOMAIN_NAME_REGEXDOMAIN_LITERAL_CHARSQUOTED_LOCAL_PART_ADDR    N)Optionalc                 C   sb   t |  }r| \}}tdd|}||dfS | d}t|dkr(td|\}}||dfS )Nz\\(.)z\1T@   z@The email address is not valid. It must have exactly one @-sign.F)r   matchgroupsresubsplitlenr   )emailm
local_partdomain_partparts r    L/home/ubuntu/dev/venv/lib/python3.10/site-packages/email_validator/syntax.pysplit_email   s   	


r"   Fc                 C   s>   t | | }|r
dnd}|dkrdnd}d| | d| dS )zEHelper function to return an error message related to invalid length.z	at least  r   s(z
 characterz
 too many))r   )addrutf8limitdiffprefixsuffixr    r    r!   get_length_reason*   s   r,   c                 C   sp   | dkr
d|  dS t | d dv rt| S t| dk r(dt| d }n
dt| d }t | |S )	N\"r   LNPSi  zU+04x08x)unicodedatacategoryreprorduppername)chr    r    r!   safe_character_display2   s   r>   Tlocalallow_smtputf8allow_empty_localquoted_local_partc           	   
   C   s  t | dkr|std| | ddS t | tkr&t| td}td| dt| r1| | ddS d}d}t| r[|sVd	d
 | D }|rRtddt| d tdd}d}n4|rdd
 | D }|rstddt| d dd
 | D }|rd}|stddt| d d}|rt	
d| } t| |dkd z| d W n ty } ztd|d}~ww |dkrdtdd|  d } | |s| |dS d|dS dd
 | D }|rtddt| d t| dddd td )!z;Validates the syntax of the local part of an email address.r   z*There must be something before the @-sign.F)r   ascii_local_partsmtputf8r(   z0The email address is too long before the @-sign .Nc                 S      h | ]}t |st|qS r    )r   r   r>   .0r<   r    r    r!   	<setcomp>~       z,validate_email_local_part.<locals>.<setcomp>zBInternationalized characters before the @-sign are not supported: , zAInternationalized characters before the @-sign are not supported.zdot-atomTc                 S   rG   r    )r   r   r>   rH   r    r    r!   rJ      rK   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 )    ~   )r9   r>   rH   r    r    r!   rJ      s
    quotedNFC)allow_spacer'   z0The email address contains an invalid character.r.   z(["\\])z\\\1c                 S   rG   r    )r	   r   r>   rH   r    r    r!   rJ      rK   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   r,   r   r   r   joinsortedr6   	normalizecheck_unsafe_charsencode
ValueErrorr   r   check_dot_atom)	r?   r@   rA   rB   reasonvalidrequires_smtputf8	bad_charser    r    r!   validate_email_local_partC   s   
	


r`   c                 C   s   t  }t| D ]I\}}t|}|d dv rq|d dkr'|dkr&|| q|dkr3|s2|| q|d dkr?|| q|d dkrK|| q|| q|retddd	d
 t|D  d d S )Nr   r/   MZsZCz.The email address contains unsafe characters: rL   c                 s   s    | ]}t |V  qd S )N)r>   rH   r    r    r!   	<genexpr>  s    z%check_unsafe_chars.<locals>.<genexpr>rF   )set	enumerater6   r7   addr   rT   rU   )r$   rQ   r^   ir<   r7   r    r    r!   rW      s2   



rW   c                 C   s   |  drt|d| drt|dd| v r td|rF|  dr.t|d| dr:t|dd| v sBd| v rHtd	d S d S )
NrF   periodz..z2An email address cannot have two periods in a row.-hyphenz.-z-.zFAn email address cannot have a period and a hyphen next to each other.)endswithr   format
startswith)labelstart_descr	end_descrrS   r    r    r!   rZ     s   



rZ   c              
   C   s  dd | D }|rt ddt| d t|  z
tj| ddd} W n tjy: } z	t d| d	|d
}~ww t| dddd | dD ]}t	
d|t	jrVt dqHt
| r_| }n7ztj| ddd}W n! tjy } zdt|v rt d|t d| d	|d
}~ww t
|st dt|tkrt|td}t d| d|dD ]}t|tkrt|td}t d| dq|rd|vr|dkr|st dt|st dddlm} |D ]}	|	dkr|rq||	ks|d|	 rt dqz
t|d}
W n tjy! } z	t d| d	|d
}~ww d d | D }|r9t ddt| d t|  ||
d!S )"z<Validates the syntax of the domain part of an email address.c                 S   rG   r    r
   r   r>   rH   r    r    r!   rJ   4  rK   z-validate_email_domain_name.<locals>.<setcomp>z7The part after the @-sign contains invalid characters: rL   rF   F)
std3_rulestransitionalz7The part after the @-sign contains invalid characters ().Nz?An email address cannot have a {} immediately after the @-sign.z&An email address cannot end with a {}.TrR   z
(?!xn)..--zAn email address cannot have two letters followed by two dashes immediately after the @-sign or after a period, except Punycode.)uts46asciizDomain too longz/The email address is too long after the @-sign.zSThe email address contains invalid characters after the @-sign after IDNA encoding.rE   z/The email address is too long after the @-sign 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.r   )SPECIAL_USE_DOMAIN_NAMESz[The part after the @-sign is a special-use or reserved name that cannot be used with email.z-The part after the @-sign is not valid IDNA (c                 S   rG   r    rs   rH   r    r    r!   rJ     rK   )ascii_domaindomain)r   rT   rU   rW   idnauts46_remap	IDNAErrorrZ   r   r   r   Ir   rX   decodestrr   r   r,   r   r   searchr#   rz   rm   )r|   test_environmentglobally_deliverabler^   r_   rp   r{   r[   rz   ddomain_i18nr    r    r!   validate_email_domain_name/  s   	



	
		r   c                 C   s   | j r/t| j tkr/| j | jkrt| j }nt| jtkr%t| jdd}nd}td| dt| jdtkrRt| jtkrHt| jdd}nd}td| dd S )NT)r'   z(when converted to IDNA ASCII)zThe email address is too long rF   r'   z(when encoded in bytes))ascii_emailr   r   
normalizedr,   r   rX   )addrinfor[   r    r    r!   validate_email_length  s   
r   c              
   C   s   t d| r,zt| }W n ty" } z	td| d|d }~ww |d| ddS | dr\zt| dd  }W n tyQ } z	td	| d
|d }~ww |d|j ddS d| vrdtddd | D }|rztdd	t
| d td)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.[])domain_addressr|   zIPv6:   z<The IPv6 address in brackets after the @-sign is not valid (rv   z[IPv6::z\The part after the @-sign in brackets is not an IPv4 address and has no address literal tag.c                 S   rG   r    )r   r   r>   rH   r    r    r!   rJ   )  rK   z0validate_email_domain_literal.<locals>.<setcomp>zCThe part after the @-sign contains invalid characters in brackets: rL   rF   zNThe part after the @-sign contains an invalid address literal tag in brackets.)r   r   	ipaddressIPv4AddressrY   r   ro   IPv6Address
compressedrT   rU   )domain_literalr&   r_   r^   r    r    r!   validate_email_domain_literal  s8   

r   )TFF)F)FT)"exceptions_typesr   rfc_constantsr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r6   r}   r   typingr   r"   r,   r>   r   boolr`   rW   rZ   r   r   r   r    r    r    r!   <module>   s,    @
 
&4
 %)