U ��.eJR�@s�ddlZddlZddlZddlZddlZddlZzddlmZWn ek r`ddl mZYnXddl m Z ddl m Z mZmZmZmZmZddlmZmZmZe�e�ZdZdZGd d �d e�ZdS) �N)�Thread�)�DistlibException)�HTTPBasicAuthHandler�Request�HTTPPasswordMgr�urlparse� build_opener� string_types)�cached_property�zip_dir� ServerProxyzhttps://pypi.org/pypi�pypic@s�eZdZdZdZd*dd�Zdd�Zdd �Zd d �Zd d �Z dd�Z dd�Z d+dd�Z d,dd�Z d-dd�Zd.dd�Zdd�Zd/dd�Zd0d d!�Zd1d"d#�Zd$d%�Zd&d'�Zd2d(d)�ZdS)3� PackageIndexzc This class represents a package index compatible with PyPI, the Python Package Index. s.----------ThIs_Is_tHe_distlib_index_bouNdaRY_$Nc Cs�|pt|_|��t|j�\}}}}}}|s<|s<|s<|dkrJtd|j��d|_d|_d|_d|_t t j d��R}dD]F} z,t j | dg||d�} | dkr�| |_Wq�Wqttk r�YqtXqtW5QRXdS) z� Initialise an instance. :param url: The URL of the index. If not specified, the URL for PyPI is used. )ZhttpZhttpszinvalid repository: %sN�w)�gpgZgpg2z --version��stdout�stderrr)� DEFAULT_INDEX�url�read_configurationrr�password_handler� ssl_verifierr�gpg_home�open�os�devnull� subprocessZ check_call�OSError) �selfrZscheme�netloc�pathZparamsZqueryZfragZsink�s�rc�r%�=/usr/lib/python3.8/site-packages/pip/_vendor/distlib/index.py�__init__$s(  � zPackageIndex.__init__cCs&ddlm}ddlm}|�}||�S)zs Get the distutils command for interacting with PyPI configurations. :return: the command. r)� Distribution)� PyPIRCCommand)Zdistutils.corer(Zdistutils.configr))r r(r)�dr%r%r&�_get_pypirc_commandAs  z PackageIndex._get_pypirc_commandcCsR|��}|j|_|��}|�d�|_|�d�|_|�dd�|_|�d|j�|_dS)z� Read the PyPI access configuration as supported by distutils, getting PyPI to do the actual work. This populates ``username``, ``password``, ``realm`` and ``url`` attributes from the configuration. �username�password�realmr� repositoryN)r+rr/Z _read_pypirc�getr,r-r.)r �cZcfgr%r%r&rKs  zPackageIndex.read_configurationcCs$|��|��}|�|j|j�dS)z� Save the PyPI access configuration. You must have set ``username`` and ``password`` attributes before calling this method. Again, distutils is used to do the actual work. N)�check_credentialsr+Z _store_pypircr,r-)r r1r%r%r&�save_configurationZszPackageIndex.save_configurationcCs\|jdks|jdkrtd��t�}t|j�\}}}}}}|�|j||j|j�t|�|_ dS)zp Check that ``username`` and ``password`` have been set, and raise an exception if not. Nz!username and password must be set) r,r-rrrrZ add_passwordr.rr)r Zpm�_r!r%r%r&r2fs zPackageIndex.check_credentialscCs\|��|��|��}d|d<|�|��g�}|�|�}d|d<|�|��g�}|�|�S)aq Register a distribution on PyPI, using the provided metadata. :param metadata: A :class:`Metadata` instance defining at least a name and version number for the distribution to be registered. :return: The HTTP response received from PyPI upon submission of the request. Zverify�:actionZsubmit)r2�validate�todict�encode_request�items� send_request)r �metadatar*�requestZresponser%r%r&�registerrs  zPackageIndex.registercCsF|��}|sq:|�d���}|�|�t�d||f�q|��dS)ar Thread runner for reading lines of from a subprocess into a buffer. :param name: The logical name of the stream (used for logging only). :param stream: The stream to read from. This will typically a pipe connected to the output stream of a subprocess. :param outbuf: The list to append the read lines to. �utf-8z%s: %sN)�readline�decode�rstrip�append�logger�debug�close)r �name�streamZoutbufr#r%r%r&�_reader�s  zPackageIndex._readerc Cs�|jdddg}|dkr|j}|r.|�d|g�|dk rF|�dddg�t��}tj�|tj�|�d �}|�d d d |d ||g�t � dd�|��||fS)a� Return a suitable command for signing a file. :param filename: The pathname to the file to be signed. :param signer: The identifier of the signer of the file. :param sign_password: The passphrase for the signer's private key used for signing. :param keystore: The path to a directory which contains the keys used in verification. If not specified, the instance's ``gpg_home`` attribute is used instead. :return: The signing command as a list suitable to be passed to :class:`subprocess.Popen`. � --status-fd�2�--no-ttyN� --homedirz--batchz--passphrase-fd�0z.ascz --detach-signz--armorz --local-userz--output� invoking: %s� ) rr�extend�tempfileZmkdtemprr"�join�basenamerCrD)r �filename�signer� sign_password�keystore�cmdZtdZsfr%r%r&�get_sign_command�s" �zPackageIndex.get_sign_commandc Cs�tjtjd�}|dk r tj|d<g}g}tj|f|�}t|jd|j|fd�}|��t|jd|j|fd�}|��|dk r�|j� |�|j� �|� �|� �|� �|j ||fS)a� Run a command in a child process , passing it any input data specified. :param cmd: The command to run. :param input_data: If specified, this must be a byte string containing data to be sent to the child process. :return: A tuple consisting of the subprocess' exit code, a list of lines read from the subprocess' ``stdout``, and a list of lines read from the subprocess' ``stderr``. rN�stdinr)�target�argsr)r�PIPE�PopenrrHr�startrrZ�writerE�waitrR� returncode) r rXZ input_data�kwargsrr�p�t1�t2r%r%r&� run_command�s& �   zPackageIndex.run_commandc CsD|�||||�\}}|�||�d��\}}} |dkr@td|��|S)aR Sign a file. :param filename: The pathname to the file to be signed. :param signer: The identifier of the signer of the file. :param sign_password: The passphrase for the signer's private key used for signing. :param keystore: The path to a directory which contains the keys used in signing. If not specified, the instance's ``gpg_home`` attribute is used instead. :return: The absolute pathname of the file where the signature is stored. r>rz&sign command failed with error code %s)rYrg�encoder) r rTrUrVrWrX�sig_filer$rrr%r%r&� sign_file�s �� �zPackageIndex.sign_file�sdist�sourcec Cs(|��tj�|�s td|��|��|��}d} |rZ|jsJt� d�n|� ||||�} t |d��} | � �} W5QRXt �| ���} t �| ���} |�dd||| | d��dtj�|�| fg}| �rt | d��} | � �}W5QRX|�d tj�| �|f�t�tj�| ��|�|��|�}|�|�S) a� Upload a release file to the index. :param metadata: A :class:`Metadata` instance defining at least a name and version number for the file to be uploaded. :param filename: The pathname of the file to be uploaded. :param signer: The identifier of the signer of the file. :param sign_password: The passphrase for the signer's private key used for signing. :param filetype: The type of the file being uploaded. This is the distutils command which produced that file, e.g. ``sdist`` or ``bdist_wheel``. :param pyversion: The version of Python which the release relates to. For code compatible with any Python, this would be ``source``, otherwise it would be e.g. ``3.2``. :param keystore: The path to a directory which contains the keys used in signing. If not specified, the instance's ``gpg_home`` attribute is used instead. :return: The HTTP response received from PyPI upon submission of the request. z not found: %sNz)no signing program available - not signed�rbZ file_upload�1)r5Zprotocol_version�filetype� pyversion� md5_digest� sha256_digest�contentZ gpg_signature)r2rr"�existsrr6r7rrCZwarningrjr�read�hashlib�md5� hexdigestZsha256�updaterSrB�shutilZrmtree�dirnamer8r9r:)r r;rTrUrVrorprWr*ri�fZ file_datarqrr�filesZsig_datar<r%r%r&� upload_file�sD    � � �zPackageIndex.upload_filec Cs�|��tj�|�s td|��tj�|d�}tj�|�sFtd|��|��|j|j }}t |�� �}dd|fd|fg}d||fg}|� ||�} |� | �S)a2 Upload documentation to the index. :param metadata: A :class:`Metadata` instance defining at least a name and version number for the documentation to be uploaded. :param doc_dir: The pathname of the directory which contains the documentation. This should be the directory that contains the ``index.html`` for the documentation. :return: The HTTP response received from PyPI upon submission of the request. znot a directory: %rz index.htmlz not found: %r)r5Z doc_uploadrF�versionrs)r2rr"�isdirrrRrtr6rFrr �getvaluer8r:) r r;Zdoc_dir�fnrFrZzip_data�fieldsr}r<r%r%r&�upload_documentation(s      �  z!PackageIndex.upload_documentationcCsT|jdddg}|dkr|j}|r.|�d|g�|�d||g�t�dd�|��|S) a| Return a suitable command for verifying a file. :param signature_filename: The pathname to the file containing the signature. :param data_filename: The pathname to the file containing the signed data. :param keystore: The path to a directory which contains the keys used in verification. If not specified, the instance's ``gpg_home`` attribute is used instead. :return: The verifying command as a list suitable to be passed to :class:`subprocess.Popen`. rIrJrKNrLz--verifyrNrO)rrrPrCrDrR)r �signature_filename� data_filenamerWrXr%r%r&�get_verify_commandDszPackageIndex.get_verify_commandcCsH|jstd��|�|||�}|�|�\}}}|dkr@td|��|dkS)a6 Verify a signature for a file. :param signature_filename: The pathname to the file containing the signature. :param data_filename: The pathname to the file containing the signed data. :param keystore: The path to a directory which contains the keys used in verification. If not specified, the instance's ``gpg_home`` attribute is used instead. :return: True if the signature was verified, else False. z0verification unavailable because gpg unavailable)rrz(verify command failed with error code %sr)rrr�rg)r r�r�rWrXr$rrr%r%r&�verify_signature\s��zPackageIndex.verify_signaturec Csl|dkrd}t�d�n6t|ttf�r0|\}}nd}tt|��}t�d|�t|d���}|�t |��}z�|� �} d} d} d} d} d | kr�t | d �} |r�|| | | �|� | �}|s�q�| t|�7} |�|�|r�|�|�| d 7} |r�|| | | �q�W5|� �XW5QRX| dk�r0| | k�r0td | | f��|�rh|��}||k�r\td ||||f��t�d|�dS)a This is a convenience method for downloading a file from an URL. Normally, this will be a file from the index, though currently no check is made for this (i.e. a file can be downloaded from anywhere). The method is just like the :func:`urlretrieve` function in the standard library, except that it allows digest computation to be done during download and checking that the downloaded data matched any expected value. :param url: The URL of the file to be downloaded (assumed to be available via an HTTP GET request). :param destfile: The pathname where the downloaded file is to be saved. :param digest: If specified, this must be a (hasher, value) tuple, where hasher is the algorithm used (e.g. ``'md5'``) and ``value`` is the expected value. :param reporthook: The same as for :func:`urlretrieve` in the standard library. NzNo digest specifiedrwzDigest specified: %s�wbi �����rzcontent-lengthzContent-Lengthrz1retrieval incomplete: got only %d out of %d bytesz.%s digest mismatch for %s: expected %s, got %szDigest verified: %s)rCrD� isinstance�list�tuple�getattrrvrr:rrE�info�intru�lenr`ryrrx)r rZdestfileZdigestZ reporthookZdigesterZhasherZdfpZsfp�headersZ blocksize�sizeruZblocknum�block�actualr%r%r&� download_fileus^          �� ��zPackageIndex.download_filecCs:g}|jr|�|j�|jr(|�|j�t|�}|�|�S)z� Send a standard library :class:`Request` to PyPI and return its response. :param req: The request to send. :return: The HTTP response from PyPI (a standard library HTTPResponse). )rrBrr r)r ZreqZhandlersZopenerr%r%r&r:�s  zPackageIndex.send_requestc Cs�g}|j}|D]L\}}t|ttf�s*|g}|D]*}|�d|d|�d�d|�d�f�q.q|D].\}} } |�d|d|| f�d�d| f�q`|�d|ddf�d�|�} d|} | tt| ��d�} t |j | | �S) a& Encode fields and files for posting to an HTTP server. :param fields: The fields to send as a list of (fieldname, value) tuples. :param files: The files to send as a list of (fieldname, filename, file_bytes) tuple. s--z)Content-Disposition: form-data; name="%s"r>�z8Content-Disposition: form-data; name="%s"; filename="%s"s smultipart/form-data; boundary=)z Content-typezContent-length) �boundaryr�r�r�rPrhrR�strr�rr)r r�r}�partsr��k�values�v�keyrT�valueZbodyZctr�r%r%r&r8�sD  ��� ���  �zPackageIndex.encode_requestcCsFt|t�rd|i}t|jdd�}z|�||p.d�W�S|d��XdS)NrFg@)ZtimeoutrE�and)r�r r r�search)r Zterms�operatorZ rpc_proxyr%r%r&r��s  zPackageIndex.search)N)N)N)N)NNrkrlN)N)N)NN)N)�__name__� __module__� __qualname__�__doc__r�r'r+rr3r2r=rHrYrgrjr~r�r�r�r�r:r8r�r%r%r%r&rs6    �  # � 9� �  M+r)rvZloggingrrzrrQZ threadingr� ImportErrorZdummy_threading�r�compatrrrrr r �utilr r r Z getLoggerr�rCrZ DEFAULT_REALM�objectrr%r%r%r&�s