a
    sh                     @  s   d dl mZ d dlZd dlmZ d dlmZmZmZ d dl	m
Z
mZmZ d dlmZ erdd dlmZ dZg d	ZG d
d dZG dd deZdS )    )annotationsN)Iterable)TYPE_CHECKINGBinaryIONoReturn)HashMismatchHashMissingInstallationError)read_chunks)_Hashsha256)r   sha384sha512c                   @  s   e Zd ZdZd.dddddZd d dd	d
ZeddddZddddddZdddddZ	dddddZ
ddddd Zddd!d"d#Zd$ddd%d&Zddd'd(Zd)ddd*d+Zddd,d-ZdS )/HasheszaA wrapper that builds multiple hashes at once and checks them against
    known-good values

    Nzdict[str, list[str]] | NoneNone)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   V/var/www/html/assistant/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   :   r   z"Hashes.__and__.<locals>.<listcomp>)
isinstancer   NotImplementedr   r   )r   r"   newvaluesr   r$   r   __and__*   s    

zHashes.__and__int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strbool)	hash_name
hex_digestr   c                 C  s   || j |g v S )z/Return whether the given hex digest is allowed.)r   get)r   r5   r6   r   r   r   is_hash_allowedA   s    zHashes.is_hash_allowedzIterable[bytes])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   r9   gotsr5   chunkhashgotr   r   r   check_against_chunksE   s    zHashes.check_against_chunksdict[str, _Hash]r   r@   r   c                 C  s   t | j|d S r,   )r   r   r   r@   r   r   r   r?   \   s    zHashes._raiser   )filer   c                 C  s   |  t|S )zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )rD   r
   )r   rH   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)openrI   )r   rJ   rH   r   r   r   check_against_pathg   s    zHashes.check_against_pathzdict[str, str]c                 C  s(   |  D ]\}}| ||r dS qdS )z3Return whether any of the given hashes are allowed.TF)r   r8   )r   r   r5   r6   r   r   r   
has_one_ofk   s    zHashes.has_one_ofc                 C  s
   t | jS )z,Return whether I know any known-good hashes.)r4   r   r1   r   r   r   __bool__r   s    zHashes.__bool__objectc                 C  s   t |tstS | j|jkS r,   )r%   r   r&   r   )r   r"   r   r   r   __eq__v   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>)rB   rT   r   r   r   r1   r   r   r   __hash__{   s    zHashes.__hash__)N)__name__
__module____qualname____doc__r!   r)   propertyr2   r8   rD   r?   rI   rM   rN   rO   rQ   rW   r   r   r   r   r      s   r   c                      s6   e Zd ZdZdd fddZd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.

    r   r+   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__rE   r   rF   c                 C  s   t |t  d S r,   )r   r_   r>   rG   r   r   r   r?      s    zMissingHashes._raise)rX   rY   rZ   r[   r!   r?   __classcell__r   r   r`   r   r]      s   r]   )
__future__r   r:   collections.abcr   typingr   r   r   pip._internal.exceptionsr   r   r	   pip._internal.utils.miscr
   r   r_   STRONG_HASHESr   r]   r   r   r   r   <module>   s   o