o
    i                     @  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r2d 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   Zsha384Zsha512c                   @  s   e Zd ZdZd/d0ddZd1d
dZed2ddZd3ddZd4ddZ	d5ddZ
d6d d!Zd7d#d$Zd8d&d'Zd9d(d)Zd:d+d,Zd2d-d.ZdS );HasheszaA wrapper that builds multiple hashes at once and checks them against
    known-good values

    Nhashesdict[str, list[str]] | NonereturnNonec                 C  s>   i }|dur|  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   :lib/python3.10/site-packages/pip/_internal/utils/hashes.py
<listcomp>'   s    z#Hashes.__init__.<locals>.<listcomp>)itemssorted_allowed)selfr   allowedalgkeysr   r   r   __init__   s
   
zHashes.__init__otherc                   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   :   s    z"Hashes.__and__.<locals>.<listcomp>)
isinstancer   NotImplementedr   r   )r   r    newvaluesr   r"   r   __and__*   s   

zHashes.__and__intc                 C  s   t dd | j D S )Nc                 s  s    | ]}t |V  qd S N)len)r   Zdigestsr   r   r   	<genexpr>?   s    z&Hashes.digest_count.<locals>.<genexpr>)sumr   r&   r   r   r   r   digest_count=   s   zHashes.digest_count	hash_namestr
hex_digestboolc                 C  s   || j |g v S )z/Return whether the given hex digest is allowed.)r   get)r   r/   r1   r   r   r   is_hash_allowedA   s   zHashes.is_hash_allowedchunksIterable[bytes]c              
   C  s   i }| j  D ]}z	t|||< W q ttfy"   td| w |D ]}| D ]}|| q+q%|	 D ]\}}|
 | j | v rH dS q8| | 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   r5   gotsr/   chunkhashZgotr   r   r   check_against_chunksE   s    zHashes.check_against_chunksr=   dict[str, _Hash]r   c                 C  s   t | j|r)   )r   r   r   r=   r   r   r   r<   \   s   zHashes._raisefiler   c                 C  s   |  t|S )zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )r@   r
   )r   rC   r   r   r   check_against_file_   s   zHashes.check_against_filepathc                 C  s8   t |d}| |W  d    S 1 sw   Y  d S )Nrb)openrD   )r   rE   rC   r   r   r   check_against_pathg   s   $zHashes.check_against_pathdict[str, str]c                 C  s(   |  D ]\}}| ||r dS qdS )z3Return whether any of the given hashes are allowed.TF)r   r4   )r   r   r/   r1   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.)r2   r   r-   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   Zdigest_listZdigestr   r   r   r+   ~   s    z"Hashes.__hash__.<locals>.<genexpr>)r?   rP   r   r   r   r-   r   r   r   __hash__{   s   zHashes.__hash__r)   )r   r   r   r   )r    r   r   r   )r   r(   )r/   r0   r1   r0   r   r2   )r5   r6   r   r   r=   rA   r   r   )rC   r   r   r   )rE   r0   r   r   )r   rI   r   r2   )r   r2   )r    rL   r   r2   )__name__
__module____qualname____doc__r   r'   propertyr.   r4   r@   r<   rD   rH   rJ   rK   rM   rQ   r   r   r   r   r      s    








r   c                      s,   e Zd ZdZd fddZ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_HASHr-   	__class__r   r   r      s   zMissingHashes.__init__r=   rA   r   c                 C  s   t |t  r)   )r   rZ   r;   rB   r   r   r   r<      s   zMissingHashes._raise)r   r   rR   )rS   rT   rU   rV   r   r<   __classcell__r   r   r[   r   rX      s    rX   )Z
__future__r   r7   Zcollections.abcr   typingr   r   r   Zpip._internal.exceptionsr   r   r	   Zpip._internal.utils.miscr
   r   rZ   ZSTRONG_HASHESr   rX   r   r   r   r   <module>   s    o