U
    mf/P                     @   sD  d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ ddg di fZeG dd dZeG dd deZeededddZdd ZeG dd dZe ZedZeeeddZedZeeeddZ dd Z!dd  Z"d!d" Z#e#ged#fe!ged$fe"ged%fd&Z$d'd( Z%dEd+d,Z&e&ed-d.Z'eG d/d0 d0Z(eG d1d2 d2e(Z)eG d3d4 d4e(Z*eG d5d6 d6e(Z+eG d7d8 d8e(Z,eG d9d: d:e(Z-eG d;d< d<Z.eG d=d> d>Z/d?d@ Z0dAdB Z1eG dCdD dDZ2dS )F    N)Path)urlsplit
urlunsplit)ValidationError)deconstructible)punycode)is_valid_ipv6_address)_lazy_re_compile)gettext_lazy)ngettext_lazy  c                   @   s>   e Zd ZdZedZdZdZdZdddZ	d	d
 Z
dd ZdS )RegexValidatorr   zEnter a valid value.invalidFr   Nc                 C   st   |d k	r|| _ |d k	r|| _|d k	r*|| _|d k	r8|| _|d k	rF|| _| jr`t| j ts`tdt| j | j| _ d S )Nz@If the flags are set, regex must be a regular expression string.)	regexmessagecodeinverse_matchflags
isinstancestr	TypeErrorr	   )selfr   r   r   r   r   r   r   :/tmp/pip-unpacked-wheel-siwebuq3/django/core/validators.py__init__   s    zRegexValidator.__init__c                 C   s>   | j t|}| jr|n| }|r:t| j| jd|iddS )z
        Validate that the input contains (or does *not* contain, if
        inverse_match is True) a match for the regular expression.
        valuer   paramsN)r   searchr   r   r   r   r   )r   r   Zregex_matchesZinvalid_inputr   r   r   __call__/   s    zRegexValidator.__call__c                 C   sN   t |toL| jj|jjkoL| jj|jjkoL| j|jkoL| j|jkoL| j|jkS N)r   r   r   patternr   r   r   r   r   otherr   r   r   __eq__9   s    



zRegexValidator.__eq__)NNNNN)__name__
__module____qualname__r   _r   r   r   r   r   r   r$   r   r   r   r   r      s            

r   c                       s   e Zd ZdZdZdZde d e d e d Zde d	 Zd
e d Zde e e d Z	e
de d e d e	 d ejZedZddddgZedZd fdd	Z fddZ  ZS )URLValidatoru   ¡-￿zo(?:0|25[0-5]|2[0-4][0-9]|1[0-9]?[0-9]?|[1-9][0-9]?)(?:\.(?:0|25[0-5]|2[0-4][0-9]|1[0-9]?[0-9]?|[1-9][0-9]?)){3}z\[[0-9a-f:.]+\]z[a-zz0-9](?:[a-zz0-9-]{0,61}[a-zz0-9])?z(?:\.(?!-)[a-zz0-9-]{1,63}(?<!-))*z\.(?!-)(?:[a-zz%-]{2,63}|xn--[a-z0-9]{1,59})(?<!-)\.?(z|localhost)z5^(?:[a-z0-9.+-]*)://(?:[^\s:@/]+(?::[^\s:@/]*)?@)?(?:|z#)(?::[0-9]{1,5})?(?:[/?#][^\s]*)?\ZzEnter a valid URL.httphttpsftpZftpsz	
Nc                    s    t  jf | |d k	r|| _d S r    )superr   schemes)r   r0   kwargs	__class__r   r   r   l   s    zURLValidator.__init__c                    s  t |ts t| j| jd|id| j|rBt| j| jd|id|dd  }|| j	krtt| j| jd|idzt
|}W n* tk
r   t| j| jd|idY nX zt | W n tk
r> } zb|r,|\}}}}}zt|}W n tk
r
   |Y nX t|||||f}	t |	 n W 5 d }~X Y nXX td|j}
|
r|
d }zt| W n, tk
r   t| j| jd|idY nX |jd kst|jdkrt| j| jd|idd S )Nr   r   z://r   z^\[(.+)\](?::[0-9]{1,5})?$      )r   r   r   r   r   unsafe_charsintersectionsplitlowerr0   r   
ValueErrorr/   r   r   UnicodeErrorr   rer   netlocvalidate_ipv6_addresshostnamelen)r   r   schemeZsplitted_urler=   pathqueryfragmenturlZ
host_matchZpotential_ipr2   r   r   r   q   sH    


  zURLValidator.__call__)N)r%   r&   r'   ulZipv4_reZipv6_reZhostname_re	domain_reZtld_reZhost_rer	   r<   
IGNORECASEr   r(   r   r0   	frozensetr6   r   r   __classcell__r   r   r2   r   r)   D   sF   	r)   z^-?\d+\ZzEnter a valid integer.r   r   r   c                 C   s   t | S r    )integer_validatorr   r   r   r   validate_integer   s    rO   c                   @   sd   e Zd ZedZdZedejZ	edejZ
edejZdgZddd	Zd
d Zdd Zdd ZdS )EmailValidatorzEnter a valid email address.r   z(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*\Z|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"\Z)zH((?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+)(?:[A-Z0-9-]{2,63}(?<!-))\Zz\[([A-F0-9:.]+)\]\Z	localhostNc                 C   s.   |d k	r|| _ |d k	r|| _|d k	r*|| _d S r    )r   r   domain_allowlist)r   r   r   Z	allowlistr   r   r   r      s    zEmailValidator.__init__c                 C   s   |rd|kr"t | j| jd|id|dd\}}| j|sTt | j| jd|id|| jkr| |szt|}W n t	k
r   Y nX | |rd S t | j| jd|idd S )N@r   r   r4   )
r   r   r   rsplit
user_regexmatchrR   validate_domain_partr   r;   )r   r   Z	user_partdomain_partr   r   r   r      s    
zEmailValidator.__call__c                 C   sP   | j |rdS | j|}|rL|d }zt| W dS  tk
rJ   Y nX dS )NTr4   F)domain_regexrV   literal_regexvalidate_ipv46_addressr   )r   rX   Zliteral_match
ip_addressr   r   r   rW      s    z#EmailValidator.validate_domain_partc                 C   s.   t |to,| j|jko,| j|jko,| j|jkS r    )r   rP   rR   r   r   r"   r   r   r   r$      s    



zEmailValidator.__eq__)NNN)r%   r&   r'   r(   r   r   r	   r<   rI   rU   rY   rZ   rR   r   r   rW   r$   r   r   r   r   rP      s&   
rP   z^[-a-zA-Z0-9_]+\ZuP   Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.z	^[-\w]+\ZuY   Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or hyphens.c                 C   sl   zt |  W n* tk
r8   ttddd| idY n0X tdd | dD rhttddd| idd S )NEnter a valid IPv4 address.r   r   r   c                 s   s"   | ]}|d ko|d d kV  qdS )0r   Nr   ).0octetr   r   r   	<genexpr>  s     z(validate_ipv4_address.<locals>.<genexpr>.)	ipaddressIPv4Addressr:   r   r(   anyr8   rN   r   r   r   validate_ipv4_address  s      rf   c                 C   s"   t | sttddd| idd S )NEnter a valid IPv6 address.r   r   r   )r   r   r(   rN   r   r   r   r>   "  s      r>   c                 C   s^   zt |  W nL tk
rX   zt|  W n* tk
rR   ttddd| idY nX Y nX d S )N#Enter a valid IPv4 or IPv6 address.r   r   r   )rf   r   r>   r(   rN   r   r   r   r[   )  s    r[   rh   r]   rg   )bothZipv4Zipv6c                 C   sP   | dkr|rt dzt|   W S  tk
rJ   t d| ttf Y nX dS )zq
    Depending on the given parameters, return the appropriate validators for
    the GenericIPAddressField.
    ri   z=You can only use `unpack_ipv4` if `protocol` is set to 'both'z+The protocol '%s' is unknown. Supported: %sN)r:   ip_address_validator_mapr9   KeyErrorlist)protocolZunpack_ipv4r   r   r   ip_address_validators>  s    
rn   ,Fc                 C   s.   t d|rdndt| d }t|||dS )Nz#^%(neg)s\d+(?:%(sep)s%(neg)s\d+)*\Zz(-)?r   )negseprL   )r	   r<   escaper   )rq   r   r   Zallow_negativeregexpr   r   r   int_list_validatorP  s    
rt   z&Enter only digits separated by commas.)r   c                   @   sB   e Zd ZedZdZdddZdd Zdd	 Zd
d Z	dd Z
dS )BaseValidatorz<Ensure this value is %(limit_value)s (it is %(show_value)s).limit_valueNc                 C   s   || _ |r|| _d S r    )rv   r   )r   rv   r   r   r   r   r   e  s    zBaseValidator.__init__c                 C   sP   |  |}t| jr|  n| j}|||d}| ||rLt| j| j|dd S )N)rv   Z
show_valuer   r   )cleancallablerv   comparer   r   r   )r   r   cleanedrv   r   r   r   r   r   j  s    
zBaseValidator.__call__c                 C   s4   t || jstS | j|jko2| j|jko2| j|jkS r    )r   r3   NotImplementedrv   r   r   r"   r   r   r   r$   s  s    

zBaseValidator.__eq__c                 C   s   ||k	S r    r   r   abr   r   r   ry   |  s    zBaseValidator.comparec                 C   s   |S r    r   r   xr   r   r   rw     s    zBaseValidator.clean)N)r%   r&   r'   r(   r   r   r   r   r$   ry   rw   r   r   r   r   ru   `  s   
		ru   c                   @   s    e Zd ZedZdZdd ZdS )MaxValueValidatorz;Ensure this value is less than or equal to %(limit_value)s.Z	max_valuec                 C   s   ||kS r    r   r|   r   r   r   ry     s    zMaxValueValidator.compareNr%   r&   r'   r(   r   r   ry   r   r   r   r   r     s   r   c                   @   s    e Zd ZedZdZdd ZdS )MinValueValidatorz>Ensure this value is greater than or equal to %(limit_value)s.Z	min_valuec                 C   s   ||k S r    r   r|   r   r   r   ry     s    zMinValueValidator.compareNr   r   r   r   r   r     s   r   c                   @   s    e Zd ZedZdZdd ZdS )StepValueValidatorz=Ensure this value is a multiple of step size %(limit_value)s.Z	step_sizec                 C   s   t jt ||ddd S )Nr   g&.>)Zabs_tol)mathisclose	remainderr|   r   r   r   ry     s    zStepValueValidator.compareNr   r   r   r   r   r     s   r   c                   @   s,   e Zd ZedddZdZdd Zdd Zd	S )
MinLengthValidatorzQEnsure this value has at least %(limit_value)d character (it has %(show_value)d).zREnsure this value has at least %(limit_value)d characters (it has %(show_value)d).rv   Z
min_lengthc                 C   s   ||k S r    r   r|   r   r   r   ry     s    zMinLengthValidator.comparec                 C   s   t |S r    r@   r   r   r   r   rw     s    zMinLengthValidator.cleanNr%   r&   r'   r   r   r   ry   rw   r   r   r   r   r     s   r   c                   @   s,   e Zd ZedddZdZdd Zdd Zd	S )
MaxLengthValidatorzPEnsure this value has at most %(limit_value)d character (it has %(show_value)d).zQEnsure this value has at most %(limit_value)d characters (it has %(show_value)d).rv   
max_lengthc                 C   s   ||kS r    r   r|   r   r   r   ry     s    zMaxLengthValidator.comparec                 C   s   t |S r    r   r   r   r   r   rw     s    zMaxLengthValidator.cleanNr   r   r   r   r   r     s   r   c                   @   sR   e Zd ZdZededddedddedd	dd
Zdd Zdd Zdd Z	dS )DecimalValidatorz}
    Validate that the input does not exceed the maximum number of digits
    expected, otherwise raise ValidationError.
    zEnter a number.z:Ensure that there are no more than %(max)s digit in total.z;Ensure that there are no more than %(max)s digits in total.maxz9Ensure that there are no more than %(max)s decimal place.z:Ensure that there are no more than %(max)s decimal places.zJEnsure that there are no more than %(max)s digit before the decimal point.zKEnsure that there are no more than %(max)s digits before the decimal point.)r   
max_digitsmax_decimal_placesmax_whole_digitsc                 C   s   || _ || _d S r    )r   decimal_places)r   r   r   r   r   r   r     s    zDecimalValidator.__init__c                 C   s4  |  dd  \}}|dkr4t| jd dd|id|dkrNt|| }d}n.t|t|krlt| }}nt|}t|}|| }| jd k	r|| jkrt| jd d| j|dd| jd k	r|| jkrt| jd	 d	| j|dd| jd k	r0| jd k	r0|| j| j kr0t| jd
 d
| j| j |ddd S )Nr4   >   NFnr   r   r   r   r   )r   r   r   r   )as_tupler   messagesr@   absr   r   )r   r   Zdigit_tupleexponentdigitsZdecimalsZwhole_digitsr   r   r   r     sL      

zDecimalValidator.__call__c                 C   s$   t || jo"| j|jko"| j|jkS r    )r   r3   r   r   r"   r   r   r   r$     s
    

zDecimalValidator.__eq__N)
r%   r&   r'   __doc__r(   r   r   r   r   r$   r   r   r   r   r     s*   .r   c                   @   s2   e Zd ZedZdZd
ddZdd Zdd	 ZdS )FileExtensionValidatorub   File extension “%(extension)s” is not allowed. Allowed extensions are: %(allowed_extensions)s.Zinvalid_extensionNc                 C   s<   |d k	rdd |D }|| _ |d k	r*|| _|d k	r8|| _d S )Nc                 S   s   g | ]}|  qS r   r9   )r_   Zallowed_extensionr   r   r   
<listcomp>"  s    z3FileExtensionValidator.__init__.<locals>.<listcomp>)allowed_extensionsr   r   )r   r   r   r   r   r   r   r      s    zFileExtensionValidator.__init__c                 C   sR   t |jjdd   }| jd k	rN|| jkrNt| j| j|d| j|ddd S )Nr4   z, )	extensionr   r   r   )	r   namesuffixr9   r   r   r   r   join)r   r   r   r   r   r   r   +  s    
zFileExtensionValidator.__call__c                 C   s0   t || jo.| j|jko.| j|jko.| j|jkS r    )r   r3   r   r   r   r"   r   r   r   r$   ;  s    


zFileExtensionValidator.__eq__)NNN)	r%   r&   r'   r(   r   r   r   r   r$   r   r   r   r   r     s   
r   c                  C   sF   zddl m}  W n tk
r(   g  Y S X |   dd | jD S d S )Nr   Imagec                 S   s   g | ]}|  d d qS )r4   Nr   )r_   extr   r   r   r   K  s     z2get_available_image_extensions.<locals>.<listcomp>)ZPILr   ImportErrorinitZ	EXTENSIONr   r   r   r   get_available_image_extensionsD  s    
r   c                 C   s   t t d| S )N)r   )r   r   rN   r   r   r   validate_image_file_extensionN  s    
r   c                   @   s6   e Zd ZdZedZdZdddZdd Zd	d
 Z	dS )ProhibitNullCharactersValidatorz<Validate that the string doesn't contain the null character.z Null characters are not allowed.Znull_characters_not_allowedNc                 C   s    |d k	r|| _ |d k	r|| _d S r    rL   )r   r   r   r   r   r   r   [  s    z(ProhibitNullCharactersValidator.__init__c                 C   s&   dt |kr"t| j| jd|idd S )N r   r   )r   r   r   r   )r   r   r   r   r   r   a  s    z(ProhibitNullCharactersValidator.__call__c                 C   s$   t || jo"| j|jko"| j|jkS r    )r   r3   r   r   r"   r   r   r   r$   e  s
    

z&ProhibitNullCharactersValidator.__eq__)NN)
r%   r&   r'   r   r(   r   r   r   r   r$   r   r   r   r   r   T  s   
r   )ro   Nr   F)3rc   r   r<   pathlibr   urllib.parser   r   Zdjango.core.exceptionsr   Zdjango.utils.deconstructr   Zdjango.utils.encodingr   Zdjango.utils.ipv6r   Zdjango.utils.regex_helperr	   Zdjango.utils.translationr
   r(   r   ZEMPTY_VALUESr   r)   rM   rO   rP   Zvalidate_emailZslug_reZvalidate_slugZslug_unicode_reZvalidate_unicode_slugrf   r>   r[   rj   rn   rt   Z%validate_comma_separated_integer_listru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   0]L

"U+
