U
    5øi»P  ã                   @   s4  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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'dCd+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:ƒƒZ/eG d;d<„ d<ƒƒZ0d=d>„ Z1d?d@„ Z2eG dAdB„ dBƒƒZ3dS )Dé    N)ÚPath)ÚurlsplitÚ
urlunsplit)ÚValidationError)Údeconstructible)ÚRemovedInDjango41Warning)Ú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-gcyiijx6/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__5   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   Â¡-ï¿¿zW(?:0|25[0-5]|2[0-4]\d|1\d?\d?|[1-9]\d?)(?:\.(?:0|25[0-5]|2[0-4]\d|1\d?\d?|[1-9]\d?)){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 )(?::\d{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   r1   Úkwargs©Ú	__class__r   r   r   a   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: } z–|�r(zt|ƒ\}}}}}W n* tk
rÞ   t| j| jd|id�‚Y nX zt|ƒ}W n tk
�r   |‚Y nX t|||||fƒ}t
ƒ  |¡ n‚ W 5 d }~X Y n\X t dt|ƒj¡}	|	�r–|	d }
zt|
ƒ W n, tk
�r”   t| j| jd|id�‚Y nX tt|ƒjƒdk�rÀt| j| jd|id�‚d S )Nr   r   z://r   z^\[(.+)\](?::\d{1,5})?$é   éý   )r   r   r   r   r   Úunsafe_charsÚintersectionÚsplitÚlowerr1   r0   r    r   Ú
ValueErrorr   ÚUnicodeErrorr   Úrer   ÚnetlocÚvalidate_ipv6_addressÚlenÚhostname)r   r   ÚschemeÚer>   ÚpathÚqueryÚfragmentÚurlZ
host_matchZpotential_ipr3   r   r   r    f   s>    


zURLValidator.__call__)N)r&   r'   r(   ÚulZipv4_reZipv6_reZhostname_reÚ	domain_reZtld_reZhost_rer
   r=   Ú
IGNORECASEr   r)   r   r1   Ú	frozensetr7   r   r    Ú__classcell__r   r   r3   r   r*   @   sB   þþÿþþþþþþú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    rP   c                   @   s„   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edd„ ƒZejd	d„ ƒZdd
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Ú	localhostc                 C   s   t jdtdd� | jS ©NzJThe domain_whitelist attribute is deprecated in favor of domain_allowlist.é   ©Ú
stacklevel©ÚwarningsÚwarnr   Údomain_allowlist)r   r   r   r   Údomain_whitelist±   s    üzEmailValidator.domain_whitelistc                 C   s   t jdtdd� || _d S rS   rW   )r   Ú	allowlistr   r   r   r[   »   s    üN)Ú	whitelistc                C   sJ   |d k	r|}t jdtdd� |d k	r*|| _|d k	r8|| _|d k	rF|| _d S )Nz;The whitelist argument is deprecated in favor of allowlist.rT   rU   )rX   rY   r   r   r   rZ   )r   r   r   r\   r]   r   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®|  |¡s®zt|ƒ}W n t	k
rˆ   Y nX |  |¡r˜d S t | j| jd|id�‚d S )Nú@r   r   r5   )
r   r   r   ÚrsplitÚ
user_regexÚmatchrZ   Ú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 )NTr5   F)Údomain_regexra   Úliteral_regexÚvalidate_ipv46_addressr   )r   rc   Zliteral_matchÚ
ip_addressr   r   r   rb   é   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   rQ   rZ   r   r   r#   r   r   r   r%   ÷   s    

ÿ
þ
üzEmailValidator.__eq__)NNN)r&   r'   r(   r)   r   r   r
   r=   rJ   r`   rd   re   rZ   Úpropertyr[   Úsetterr   r    rb   r%   r   r   r   r   rQ   Ÿ   s.   ýýý
	
	rQ   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)   Úanyr9   rO   r   r   r   Úvalidate_ipv4_address  s    þýrs   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)   rO   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   )rs   r   r?   r)   rO   r   r   r   rf   +  s    rf   ru   rj   rt   )Ú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.
    rv   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_mapr:   ÚKeyErrorÚlist)ÚprotocolZunpack_ipv4r   r   r   Úip_address_validators<  s    ÿ
ÿr{   ú,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ÚseprM   )r
   r=   Úescaper   )r~   r   r   Zallow_negativeÚregexpr   r   r   Úint_list_validatorK  s
    
þ
r�   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!   )rƒ   r   )r   rƒ   r   r   r   r   r   ]  s    zBaseValidator.__init__c                 C   sP   |   |¡}t| jƒr|  ¡ n| j}|||dœ}|  ||¡rLt| j| j|d�‚d S )N)rƒ   Z
show_valuer   r   )ÚcleanÚcallablerƒ   Úcomparer   r   r   )r   r   Úcleanedrƒ   r   r   r   r   r    b  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   r4   ÚNotImplementedrƒ   r   r   r#   r   r   r   r%   i  s    
ÿ
ýzBaseValidator.__eq__c                 C   s   ||k	S r!   r   ©r   ÚaÚbr   r   r   r†   r  s    zBaseValidator.comparec                 C   s   |S r!   r   ©r   Úxr   r   r   r„   u  s    zBaseValidator.clean)N)r&   r'   r(   r)   r   r   r   r    r%   r†   r„   r   r   r   r   r‚   X  s   
	r‚   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   r†   ~  s    zMaxValueValidator.compareN©r&   r'   r(   r)   r   r   r†   r   r   r   r   rŽ   y  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   r†   ‡  s    zMinValueValidator.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).rƒ   Z
min_lengthc                 C   s   ||k S r!   r   r‰   r   r   r   r†   “  s    zMinLengthValidator.comparec                 C   s   t |ƒS r!   ©r@   rŒ   r   r   r   r„   –  s    zMinLengthValidator.cleanN©r&   r'   r(   r   r   r   r†   r„   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).rƒ   Ú
max_lengthc                 C   s   ||kS r!   r   r‰   r   r   r   r†   ¢  s    zMaxLengthValidator.comparec                 C   s   t |ƒS r!   r’   rŒ   r   r   r   r„   ¥  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r´t| jd d| j|dœd�‚| jd k	rä|| jkrät| 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 )Nr5   >   ÚNÚnÚFr   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    Æ  s>    
ý
ýÿýzDecimalValidator.__call__c                 C   s$   t || jƒo"| j|jko"| j|jkS r!   )r   r4   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   ©r:   )rl   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 )Nr5   z, )Ú	extensionr¨   r   r   )	r   ÚnameÚsuffixr:   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   r4   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 )r5   Nr¦   )rl   Úextr   r   r   r§   %  s     z2get_available_image_extensions.<locals>.<listcomp>)ZPILr®   ÚImportErrorÚinitZ	EXTENSIONr­   r   r   r   Úget_available_image_extensions  s    
r²   c                 C   s   t tƒ d�| ƒS )N)r¨   )r¥   r²   rO   r   r   r   Úvalidate_image_file_extension(  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!   rM   )r   r   r   r   r   r   r   2  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    8  s    z(ProhibitNullCharactersValidator.__call__c                 C   s$   t || jƒo"| j|jko"| j|jkS r!   )r   r4   r   r   r#   r   r   r   r%   <  s
    
ÿ
ýz&ProhibitNullCharactersValidator.__eq__)NN)
r&   r'   r(   r¤   r)   r   r   r   r    r%   r   r   r   r   r´   ,  s   
r´   )r|   Nr   F)4rp   r=   rX   Úpathlibr   Úurllib.parser   r   Zdjango.core.exceptionsr   Zdjango.utils.deconstructr   Zdjango.utils.deprecationr   Zdjango.utils.encodingr   Zdjango.utils.ipv6r	   Zdjango.utils.regex_helperr
   Zdjango.utils.translationr   r)   r   ZEMPTY_VALUESr   r*   rN   rP   rQ   Zvalidate_emailZslug_reZvalidate_slugZslug_unicode_reZvalidate_unicode_slugrs   r?   rf   rw   r{   r�   Z%validate_comma_separated_integer_listr‚   rŽ   r�   r‘   r”   r–   r¥   r²   r³   r´   r   r   r   r   Ú<module>   s†   ,Sý`üýý
ÿ M&
