a
    0fl                     @   s   d dl Z d dlmZmZmZmZmZmZmZ d dl	m
Z
mZmZ d dlmZ er\d dl mZ dZg dZG dd	 d	ZG d
d deZdS )    N)TYPE_CHECKINGBinaryIODictIterableListNoReturnOptional)HashMismatchHashMissingInstallationError)read_chunks)_Hashsha256)r   sha384sha512c                   @   s   e Zd ZdZd%eeeee f  ddddZd d dddZ	e
ed	d
dZeeedddZee ddddZeedf ddddZeddddZeddddZeeef edddZed	dd Zeedd!d"Zed	d#d$ZdS )&HasheszaA wrapper that builds multiple hashes at once and checks them against
    known-good values

    N)hashesreturnc                 C   s>   i }|dur4|  D ]\}}dd t|D ||< q|| _dS )zo
        :param hashes: A dict of algorithm names pointing to lists of allowed
            hex digests
        Nc                 S   s   g | ]}|  qS  )lower).0kr   r   S/var/www/ai-form-bot/venv/lib/python3.9/site-packages/pip/_internal/utils/hashes.py
<listcomp>$       z#Hashes.__init__.<locals>.<listcomp>)itemssorted_allowed)selfr   allowedalgkeysr   r   r   __init__   s
    zHashes.__init__)otherr   c                    sb   t |tstS |sS s|S i }|j D ],\ } jvr@q, fdd|D | < q,t|S )Nc                    s   g | ]}|j   v r|qS r   )r   )r   vr    r   r   r   r   7   r   z"Hashes.__and__.<locals>.<listcomp>)
isinstancer   NotImplementedr   r   )r   r#   newvaluesr   r%   r   __and__'   s    

zHashes.__and__r   c                 C   s   t dd | j D S )Nc                 s   s   | ]}t |V  qd S N)len)r   digestsr   r   r   	<genexpr><   r   z&Hashes.digest_count.<locals>.<genexpr>)sumr   r)   r   r   r   r   digest_count:   s    zHashes.digest_count)	hash_name
hex_digestr   c                 C   s   || j |g v S )z/Return whether the given hex digest is allowed.)r   get)r   r3   r4   r   r   r   is_hash_allowed>   s    zHashes.is_hash_allowed)chunksr   c              
   C   s   i }| j  D ]<}zt|||< W q ttfyH   td| Y q0 q|D ]}| D ]}|| q\qP|	 D ] \}}|
 | j | v rv dS qv| | dS )zCheck good hashes against ones built from iterable of chunks of
        data.

        Raise HashMismatch if none match.

        zUnknown hash name: N)r   r!   hashlibr(   
ValueError	TypeErrorr   r)   updater   	hexdigest_raise)r   r7   gotsr3   chunkhashgotr   r   r   check_against_chunksB   s    zHashes.check_against_chunksr   r   r>   r   c                 C   s   t | j|d S r,   )r	   r   r   r>   r   r   r   r=   Y   s    zHashes._raise)filer   c                 C   s   |  t|S )zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )rB   r   )r   rE   r   r   r   check_against_file\   s    zHashes.check_against_file)pathr   c                 C   s8   t |d}| |W  d    S 1 s*0    Y  d S )Nrb)openrF   )r   rG   rE   r   r   r   check_against_pathd   s    zHashes.check_against_pathc                 C   s(   |  D ]\}}| ||r dS qdS )z3Return whether any of the given hashes are allowed.TF)r   r6   )r   r   r3   r4   r   r   r   
has_one_ofh   s    zHashes.has_one_ofc                 C   s
   t | jS )z,Return whether I know any known-good hashes.)boolr   r1   r   r   r   __bool__o   s    zHashes.__bool__c                 C   s   t |tstS | j|jkS r,   )r&   r   r'   r   )r   r#   r   r   r   __eq__s   s    
zHashes.__eq__c                 C   s"   t dtdd | j D S )N,c                 s   s*   | ]"\}}|D ]}d  ||fV  qqdS ):N)join)r   r    digest_listdigestr   r   r   r/   {   s   z"Hashes.__hash__.<locals>.<genexpr>)r@   rQ   r   r   r   r1   r   r   r   __hash__x   s    zHashes.__hash__)N)__name__
__module____qualname____doc__r   r   strr   r"   r*   propertyintr2   rL   r6   r   bytesrB   r=   r   rF   rJ   rK   rM   objectrN   rT   r   r   r   r   r      s   "r   c                       s>   e Zd ZdZdd fddZeedf ddd	d
Z  ZS )MissingHasheszA workalike for Hashes used when we're missing a hash for a requirement

    It computes the actual hash of the requirement and raises a HashMissing
    exception showing it to the user.

    Nr+   c                    s   t  jtg id dS )z!Don't offer the ``hashes`` kwarg.)r   N)superr"   FAVORITE_HASHr1   	__class__r   r   r"      s    zMissingHashes.__init__r   r   rC   c                 C   s   t |t  d S r,   )r
   r`   r<   rD   r   r   r   r=      s    zMissingHashes._raise)	rU   rV   rW   rX   r"   r   rY   r=   __classcell__r   r   ra   r   r^      s   r^   )r8   typingr   r   r   r   r   r   r   pip._internal.exceptionsr	   r
   r   pip._internal.utils.miscr   r   r`   STRONG_HASHESr   r^   r   r   r   r   <module>   s   $o