U ÀÒ.e´ã@sÐddlmZddlZddlmZmZmZddlmZm Z m Z ddl m Z ddl mZeržddlmZmZmZmZmZddlmZer’dd lmZn dd lmZd Zd d d gZGdd„deƒZGdd„deƒZdS)é)Úabsolute_importN)Ú iteritemsÚiterkeysÚ itervalues)Ú HashMismatchÚ HashMissingÚInstallationError)Ú read_chunks)ÚMYPY_CHECK_RUNNING)ÚDictÚListÚBinaryIOÚNoReturnÚIterator)ÚPY3)Ú_Hash)Ú_hashZsha256Zsha384Zsha512c@s^eZdZdZddd„Zedd„ƒZdd„Zd d „Zd d „Z d d„Z dd„Z dd„Z dd„Z dS)ÚHasheszaA wrapper that builds multiple hashes at once and checks them against known-good values NcCs|dkr in||_dS)zo :param hashes: A dict of algorithm names pointing to lists of allowed hex digests N)Ú_allowed)ÚselfÚhashes©rú>/usr/lib/python3.8/site-packages/pip/_internal/utils/hashes.pyÚ__init__,szHashes.__init__cCstdd„|j ¡DƒƒS)Ncss|]}t|ƒVqdS©N)Úlen)Ú.0ZdigestsrrrÚ 7sz&Hashes.digest_count..)ÚsumrÚvalues©rrrrÚ digest_count4szHashes.digest_countcCs||j |g¡kS)z/Return whether the given hex digest is allowed.)rÚget)rÚ hash_nameZ hex_digestrrrÚis_hash_allowed9szHashes.is_hash_allowedc Cs¦i}t|jƒD]<}zt |¡||<Wqttfk rHtd|ƒ‚YqXq|D]}t|ƒD]}| |¡q\qPt |ƒD] \}}|  ¡|j|krvdSqv|  |¡dS)z‚Check good hashes against ones built from iterable of chunks of data. Raise HashMismatch if none match. zUnknown hash name: %sN) rrÚhashlibÚnewÚ ValueErrorÚ TypeErrorrrÚupdaterÚ hexdigestÚ_raise)rZchunksÚgotsr#ÚchunkÚhashZgotrrrÚcheck_against_chunksAs zHashes.check_against_chunkscCst|j|ƒ‚dSr)rr©rr,rrrr+Ysz Hashes._raisecCs| t|ƒ¡S)zaCheck good hashes against a file-like object Raise HashMismatch if none match. )r/r )rÚfilerrrÚcheck_against_file]szHashes.check_against_filec Cs,t|dƒ�}| |¡W5QR£SQRXdS)NÚrb)Úopenr2)rÚpathr1rrrÚcheck_against_pathfs zHashes.check_against_pathcCs t|jƒS)z,Return whether I know any known-good hashes.)Úboolrr rrrÚ __nonzero__kszHashes.__nonzero__cCs| ¡Sr)r8r rrrÚ__bool__pszHashes.__bool__)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__rÚpropertyr!r$r/r+r2r6r8r9rrrrr's   rcs(eZdZdZ‡fdd„Zdd„Z‡ZS)Ú MissingHasheszÀA 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. cstt|ƒjtgid�dS)z!Don't offer the ``hashes`` kwarg.)rN)Úsuperr?rÚ FAVORITE_HASHr ©Ú __class__rrr|szMissingHashes.__init__cCst|t ¡ƒ‚dSr)rrAr*r0rrrr+ƒszMissingHashes._raise)r:r;r<r=rr+Ú __classcell__rrrBrr?us r?)Z __future__rr%Zpip._vendor.sixrrrZpip._internal.exceptionsrrrZpip._internal.utils.miscr Zpip._internal.utils.typingr Útypingr r r rrrrrrAZ STRONG_HASHESÚobjectrr?rrrrÚs      N