B
    od                 @   s   d dl Z d dl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rdd dl mZ d dlmZ dZddd	gZG d
d dZG dd deZdS )    N)TYPE_CHECKINGBinaryIODictIterableListOptional)HashMismatchHashMissingInstallationError)read_chunks)_Hash)NoReturnsha256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   s8   i }|dk	r.x |  D ]\}}t|||< qW || _dS )zo
        :param hashes: A dict of algorithm names pointing to lists of allowed
            hex digests
        N)itemssorted_allowed)selfr   allowedalgkeys r   L/var/www/html/venv/lib/python3.7/site-packages/pip/_internal/utils/hashes.py__init__   s
    zHashes.__init__)otherr   c                sf   t |tstS |sS s|S i }x:|j D ],\ } jkrBq. fdd|D | < q.W t|S )Nc                s   g | ]}|j   kr|qS r   )r   ).0v)r   r   r   r   
<listcomp>;   s    z"Hashes.__and__.<locals>.<listcomp>)
isinstancer   NotImplementedr   r   )r   r   newvaluesr   )r   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>@   s    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 kS )z/Return whether the given hex digest is allowed.)r   get)r   r,   r-   r   r   r   is_hash_allowedB   s    zHashes.is_hash_allowed)chunksr   c          
   C   s   i }xL| j  D ]>}yt|||< W q ttfk
rL   td| Y qX qW x(|D ] }x| D ]}|| qfW qXW x*|	 D ]\}}|
 | j | krdS qW | | 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   r0   gotsr,   chunkhashgotr   r   r   check_against_chunksF   s    
zHashes.check_against_chunksr   r   )r7   r   c             C   s   t | j|d S )N)r   r   )r   r7   r   r   r   r6   ]   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   r<   r   r   r   check_against_file`   s    zHashes.check_against_file)pathr   c          	   C   s    t |d}| |S Q R X d S )Nrb)openr=   )r   r>   r<   r   r   r   check_against_pathh   s    zHashes.check_against_pathc             C   s*   x$|  D ]\}}| ||r
dS q
W dS )z3Return whether any of the given hashes are allowed.TF)r   r/   )r   r   r,   r-   r   r   r   
has_one_ofl   s    zHashes.has_one_ofc             C   s
   t | jS )z,Return whether I know any known-good hashes.)boolr   )r   r   r   r   __bool__s   s    zHashes.__bool__c             C   s   t |tstS | j|jkS )N)r"   r   r#   r   )r   r   r   r   r   __eq__w   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>)r9   rH   r   r   r   )r   r   r   r   __hash__|   s
    zHashes.__hash__)N)__name__
__module____qualname____doc__r   r   strr   r   r&   propertyintr+   rC   r/   r   bytesr;   r6   r   r=   rA   rB   rD   objectrE   rK   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.

    N)r   c                s   t  jtg id dS )z!Don't offer the ``hashes`` kwarg.)r   N)superr   FAVORITE_HASH)r   )	__class__r   r   r      s    zMissingHashes.__init__r   r   )r7   r   c             C   s   t |t  d S )N)r	   rW   r5   )r   r7   r   r   r   r6      s    zMissingHashes._raise)	rL   rM   rN   rO   r   r   rP   r6   __classcell__r   r   )rX   r   rU      s   rU   )r1   typingr   r   r   r   r   r   pip._internal.exceptionsr   r	   r
   pip._internal.utils.miscr   r   r   rW   STRONG_HASHESr   rU   r   r   r   r   <module>   s    
o