o
    MfQ                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZzd dlmZ W n ey/   d dl	mZ Y nw ddl
mZ ddlmZmZmZmZmZmZ ddlmZmZ eeZdZdZG d	d
 d
eZdS )    N)Thread   )DistlibException)HTTPBasicAuthHandlerRequestHTTPPasswordMgrurlparsebuild_openerstring_types)zip_dirServerProxyzhttps://pypi.org/pypipypic                   @   s   e Zd ZdZdZd*ddZdd Zdd	 Zd
d Zdd Z	dd Z
dd Z	d*ddZd*ddZd*ddZ		d+ddZdd Z	d*ddZ	d*d d!Zd,d"d#Zd$d% Zd&d' Zd*d(d)ZdS )-PackageIndexzc
    This class represents a package index compatible with PyPI, the Python
    Package Index.
    s.   ----------ThIs_Is_tHe_distlib_index_bouNdaRY_$Nc              
   C   s   |pt | _|   t| j\}}}}}}|s|s|s|dvr%td| j d| _d| _d| _d| _t	t
jd5}dD ]!}	ztj|	dg||d}
|
dkrQ|	| _W  nW q: ty[   Y q:w W d   dS W d   dS 1 sow   Y  dS )	z
        Initialise an instance.

        :param url: The URL of the index. If not specified, the URL for PyPI is
                    used.
        )httphttpszinvalid repository: %sNw)gpggpg2z	--versionstdoutstderrr   )DEFAULT_INDEXurlread_configurationr   r   password_handlerssl_verifierr   gpg_homeopenosdevnull
subprocess
check_callOSError)selfr   schemenetlocpathparamsqueryfragsinksrc r-   [/var/www/html/analyze/labelStudio/lib/python3.10/site-packages/pip/_vendor/distlib/index.py__init__$   s4   
	"zPackageIndex.__init__c                 C   s   ddl m} | S )zs
        Get the distutils command for interacting with PyPI configurations.
        :return: the command.
        r   )_get_pypirc_command)utilr0   )r#   cmdr-   r-   r.   r0   A   s   z PackageIndex._get_pypirc_commandc                 C   sN   ddl m} || }|d| _|d| _|dd| _|d| j| _dS )	z
        Read the PyPI access configuration as supported by distutils. This populates
        ``username``, ``password``, ``realm`` and ``url`` attributes from the
        configuration.
        r   )_load_pypircusernamepasswordrealmr   
repositoryN)r1   r3   getr4   r5   r6   r   )r#   r3   cfgr-   r-   r.   r   I   s   zPackageIndex.read_configurationc                 C   s    |    ddlm} ||  dS )z
        Save the PyPI access configuration. You must have set ``username`` and
        ``password`` attributes before calling this method.
        r   )_store_pypircN)check_credentialsr1   r:   )r#   r:   r-   r-   r.   save_configurationV   s   zPackageIndex.save_configurationc                 C   s\   | j du s
| jdu rtdt }t| j\}}}}}}|| j|| j | j t|| _	dS )zp
        Check that ``username`` and ``password`` have been set, and raise an
        exception if not.
        Nz!username and password must be set)
r4   r5   r   r   r   r   add_passwordr6   r   r   )r#   pm_r%   r-   r-   r.   r;   _   s   zPackageIndex.check_credentialsc                 C   s\   |    |  | }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.
        verify:actionsubmit)r;   validatetodictencode_requestitemssend_request)r#   metadatadrequestresponser-   r-   r.   registerk   s   


zPackageIndex.registerc                 C   sH   	 |  }|sn|d }|| td||f  q|  dS )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.
        Tutf-8z%s: %sN)readlinedecoderstripappendloggerdebugclose)r#   namestreamoutbufr+   r-   r-   r.   _reader   s   	
zPackageIndex._readerc              	   C   s   | j dddg}|du r| j}|r|d|g |dur"|g d t }tj|tj|d }|dd	d
|d||g t	
dd| ||fS )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	--homedir)z--batchz--passphrase-fd0z.ascz--detach-signz--armorz--local-userz--outputinvoking: %s )r   r   extendtempfilemkdtempr   r&   joinbasenamerR   rS   )r#   filenamesignersign_passwordkeystorer2   tdsfr-   r-   r.   get_sign_command   s   
zPackageIndex.get_sign_commandc           	      C   s   t jt jd}|durt j|d< g }g }t j|fi |}t| jd|j|fd}|  t| jd|j|fd}|  |durJ|j	| |j
  |  |  |  |j||fS )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``.
        r   Nstdinr   )targetargsr   )r    PIPEPopenr   rX   r   startr   rl   writerT   waitrc   
returncode)	r#   r2   
input_datakwargsr   r   pt1t2r-   r-   r.   run_command   s&   

zPackageIndex.run_commandc           
      C   sD   |  ||||\}}| ||d\}}}	|dkr td| |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.
        rM   r   z&sign command failed with error code %s)rk   rz   encoder   )
r#   re   rf   rg   rh   r2   sig_filer,   r   r   r-   r-   r.   	sign_file   s   

zPackageIndex.sign_filesdistsourcec              	   C   sN  |    tj|std| |  | }d}	|r-| js%t	d n| 
||||}	t|d}
|
 }W d   n1 sAw   Y  t| }t| }|dd||||d dtj||fg}|	rt|	d}
|
 }W d   n1 sw   Y  |d	tj|	|f ttj|	 | | |}| |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rbfile_upload1)rA   protocol_versionfiletype	pyversion
md5_digestsha256_digestcontentgpg_signature)r;   r   r&   existsr   rC   rD   r   rR   warningr}   r   readhashlibmd5	hexdigestsha256updaterd   rQ   shutilrmtreedirnamerE   rF   rG   )r#   rH   re   rf   rg   r   r   rh   rI   r|   f	file_datar   r   filessig_datarJ   r-   r-   r.   upload_file   sH   



zPackageIndex.upload_filec           
      C   s   |    tj|std| tj|d}tj|s#td| |  |j|j	}}t
| }dd|fd|fg}d||fg}| ||}	| |	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.
        znot a directory: %rz
index.htmlznot found: %r)rA   
doc_uploadrU   versionr   )r;   r   r&   isdirr   rc   r   rC   rU   r   r   getvaluerE   rG   )
r#   rH   doc_dirfnrU   r   zip_datafieldsr   rJ   r-   r-   r.   upload_documentation!  s   
z!PackageIndex.upload_documentationc                 C   sT   | j dddg}|du r| j}|r|d|g |d||g tdd| |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`.
        rY   rZ   r[   Nr\   z--verifyr^   r_   )r   r   r`   rR   rS   rc   )r#   signature_filenamedata_filenamerh   r2   r-   r-   r.   get_verify_command=  s   zPackageIndex.get_verify_commandc                 C   sH   | j std| |||}| |\}}}|dvr td| |dkS )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)r   r   z(verify command failed with error code %sr   )r   r   r   rz   )r#   r   r   rh   r2   r,   r   r   r-   r-   r.   verify_signatureU  s   zPackageIndex.verify_signaturec              	   C   s  |du rd}t d nt|ttfr|\}}nd}tt| }t d|  t|da}| t	|}zL|
 }	d}
d}d}d}d	|	v rKt|	d
 }|rS|||
| 	 ||
}|s\n|t|7 }|| |rn|| |d7 }|rz|||
| qTW |  n|  w W d   n1 sw   Y  |dkr||k rtd||f |r| }||krtd||||f t d| dS dS )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.
        NzNo digest specifiedr   zDigest specified: %swbi    r   zcontent-lengthzContent-LengthTr   z1retrieval incomplete: got only %d out of %d bytesz.%s digest mismatch for %s: expected %s, got %szDigest verified: %s)rR   rS   
isinstancelisttuplegetattrr   r   rG   r   infointr   lenrr   r   rT   r   r   )r#   r   destfiledigest
reporthookdigesterhasherdfpsfpheaders	blocksizesizer   blocknumblockactualr-   r-   r.   download_filen  sf   



	zPackageIndex.download_filec                 C   s:   g }| j r|| j  | jr|| 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).
        )r   rQ   r   r	   r   )r#   reqhandlersopenerr-   r-   r.   rG     s   
zPackageIndex.send_requestc              
   C   s   g }| j }|D ]&\}}t|ttfs|g}|D ]}|d| d| dd|df qq|D ]\}}	}
|d| d||	f dd|
f q0|d| d df d|}d| }|tt|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"rM       z8Content-Disposition: form-data; name="%s"; filename="%s"s   
s   multipart/form-data; boundary=)zContent-typezContent-length)boundaryr   r   r   r`   r{   rc   strr   r   r   )r#   r   r   partsr   kvaluesvkeyre   valuebodyctr   r-   r-   r.   rE     sB   

zPackageIndex.encode_requestc                 C   sJ   t |tr	d|i}t| jdd}z|||pdW |d  S |d  w )NrU   g      @)timeoutandrT   )r   r
   r   r   search)r#   termsoperator	rpc_proxyr-   r-   r.   r     s   
zPackageIndex.search)N)NNr~   r   N)NN)__name__
__module____qualname____doc__r   r/   r0   r   r<   r;   rL   rX   rk   rz   r}   r   r   r   r   r   rG   rE   r   r-   r-   r-   r.   r      s4    
	


#
9


M+r   )r   loggingr   r   r    ra   	threadingr   ImportErrordummy_threading r   compatr   r   r   r   r	   r
   r1   r   r   	getLoggerr   rR   r   DEFAULT_REALMobjectr   r-   r-   r-   r.   <module>   s$    
