<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
B
    :—°a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yd dlmZ W n  ek
r`   d dl	mZ Y nX 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d0d d!„Zd1d"d#„Zd$d%„ Zd&d'„ Zd2d(d)„ZdS )3Ú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krJtd| j ƒ‚d| _d| _d| _d| _t	t
jdƒR}xJdD ]B}	y(tj|	dg||d}
|
dkr |	| _P W qv tk
r¶   Y qvX qvW W dQ R X dS )	z”
        Initialise an instance.

        :param url: The URL of the index. If not specified, the URL for PyPI is
                    used.
        )ZhttpZhttpszinvalid repository: %sNÚw)ÚgpgZ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ÚpathZparamsZqueryZfragZsinkÚsÚrc© r%   ú>/opt/alt/python37/lib/python3.7/site-packages/distlib/index.pyÚ__init__$   s&    

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)Úutilr(   )r   Úcmdr%   r%   r&   r(   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)r)   r+   Úgetr,   r-   r.   r   )r   r+   Z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_credentialsr)   r1   )r   r1   r%   r%   r&   Úsave_configurationV   s    zPackageIndex.save_configurationc             C   s\   | j dks| jdk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)
r,   r-   r   r   r   r   Zadd_passwordr.   r   r   )r   ZpmÚ_r!   r%   r%   r&   r2   _   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.
        Zverifyz:actionZsubmit)r2   ÚvalidateÚtodictÚencode_requestÚitemsÚsend_request)r   ÚmetadataÚdÚrequestÚresponser%   r%   r&   Úregisterk   s    

zPackageIndex.registerc             C   sJ   x<|  ¡ }|sP | d¡ ¡ }| |¡ t d||f ¡ qW | ¡  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.
        zutf-8z%s: %sN)ÚreadlineÚdecodeÚrstripÚappendÚloggerÚdebugÚclose)r   ÚnameÚstreamZoutbufr#   r%   r%   r&   Ú_reader   s    	
zPackageIndex._readerc          	   C   sš   | j dddg}|dkr| j}|r.| d|g¡ |dk	rF| dddg¡ 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`.
        z--status-fdÚ2z--no-ttyNz	--homedirz--batchz--passphrase-fdÚ0z.ascz--detach-signz--armorz--local-userz--outputzinvoking: %sú )r   r   ÚextendÚtempfileZmkdtempr   r"   ÚjoinÚbasenamerC   rD   )r   ÚfilenameÚsignerÚsign_passwordÚkeystorer*   ZtdZsfr%   r%   r&   Úget_sign_command‘   s    
zPackageIndex.get_sign_commandc       	      C   s´   t jt jdœ}|dk	r t j|d< g }g }t j|f|Ž}t| jd|j|fd}| ¡  t| jd|j|fd}| ¡  |dk	r|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   r   NÚstdinr   )ÚtargetÚargsr   )r   ÚPIPEÚPopenr   rH   r   Ústartr   rU   ÚwriterE   ÚwaitrN   Ú
returncode)	r   r*   Z
input_dataÚkwargsr   r   ÚpZt1Z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.
        zutf-8r   z&sign command failed with error code %s)rT   r`   Úencoder   )
r   rP   rQ   rR   rS   r*   Úsig_filer$   r   r   r%   r%   r&   Ú	sign_fileÑ   s    

zPackageIndex.sign_fileÚsdistÚsourcec          	   C   s(  |   ¡  tj |¡s td| ƒ‚| ¡  | ¡ }d}	|rZ| jsJt 	d¡ n|  
||||¡}	t|dƒ}
|
 ¡ }W dQ R X t |¡ ¡ }t |¡ ¡ }| dd||||dœ¡ dtj |¡|fg}|	rt|	dƒ}
|
 ¡ }W dQ R X | 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ÚrbZfile_uploadÚ1)z:actionZprotocol_versionÚfiletypeÚ	pyversionÚ
md5_digestÚsha256_digestÚcontentZgpg_signature)r2   r   r"   Úexistsr   r5   r6   r   rC   Úwarningrc   r   ÚreadÚhashlibÚmd5Ú	hexdigestZsha256ÚupdaterO   rB   ÚshutilÚrmtreeÚdirnamer7   r8   r9   )r   r:   rP   rQ   rR   rh   ri   rS   r;   rb   ÚfZ	file_datarj   rk   ÚfilesZsig_datar<   r%   r%   r&   Úupload_fileè   s>    

zPackageIndex.upload_filec       
      C   sœ   |   ¡  tj |¡s td| ƒ‚tj |d¡}tj |¡sFt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)z:actionZ
doc_uploadrF   Úversionrl   )r2   r   r"   Úisdirr   rN   rm   r5   rF   rz   r   Úgetvaluer7   r9   )
r   r:   Zdoc_dirÚfnrF   rz   Zzip_dataÚfieldsrx   r<   r%   r%   r&   Úupload_documentation!  s    z!PackageIndex.upload_documentationc             C   sT   | j dddg}|dk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`.
        z--status-fdrI   z--no-ttyNz	--homedirz--verifyzinvoking: %srK   )r   r   rL   rC   rD   rN   )r   Úsignature_filenameÚdata_filenamerS   r*   r%   r%   r&   Úget_verify_command=  s    zPackageIndex.get_verify_commandc             C   sH   | j stdƒ‚|  |||¡}|  |¡\}}}|dk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‚   r`   )r   r€   r   rS   r*   r$   r   r   r%   r%   r&   Úverify_signatureU  s    zPackageIndex.verify_signaturec          	   C   sp  |dkrd}t  d¡ n6t|ttfƒr0|\}}nd}tt|ƒƒ }t  d| ¡ t|dƒ²}|  t	|ƒ¡}z’| 
¡ }	d}
d}d}d}d	|	kr–t|	d
 ƒ}|r¦|||
|ƒ xP| |
¡}|s¸P |t|ƒ7 }| |¡ |rÜ| |¡ |d7 }|r¨|||
|ƒ q¨W W d| ¡  X W dQ R X |dkr4||k r4td||f ƒ‚|rl| ¡ }||kr`td||||f ƒ‚t  d|¡ 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 specifiedrq   zDigest specified: %sÚwbi    éÿÿÿÿr   zcontent-lengthzContent-Lengthr   z1retrieval incomplete: got only %d out of %d bytesz.%s digest mismatch for %s: expected %s, got %szDigest verified: %s)rC   rD   Ú
isinstanceÚlistÚtupleÚgetattrrp   r   r9   r   ÚinfoÚintro   Úlenr[   rs   rE   r   rr   )r   r   ZdestfileZdigestZ
reporthookZdigesterZhasherZdfpZsfpÚheadersZ	blocksizeÚsizero   ZblocknumÚblockZactualr%   r%   r&   Údownload_filen  sV    




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   rB   r   r	   r   )r   ZreqÚhandlersÚopenerr%   r%   r&   r9   »  s    zPackageIndex.send_requestc          
   C   sä   g }| j }xX|D ]P\}}t|ttfƒs,|g}x2|D ]*}| d| d|  d¡d| d¡f¡ q2W qW x6|D ].\}}	}
| d| d||	f  d¡d|
f¡ qjW | 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"zutf-8ó    z8Content-Disposition: form-data; name="%s"; filename="%s"s   
s   multipart/form-data; boundary=)zContent-typezContent-length)Úboundaryr†   r‡   rˆ   rL   ra   rN   ÚstrrŒ   r   r   )r   r~   rx   Úpartsr”   ÚkÚvaluesÚvÚkeyrP   ÚvalueZbodyÚctr   r%   r%   r&   r7   Ë  s2    


zPackageIndex.encode_requestc             C   sB   t |tƒrd|i}t| jdd}z| ||p.d¡S |dƒƒ  X d S )NrF   g      @)ÚtimeoutÚandrE   )r†   r
   r   r   Úsearch)r   ZtermsÚoperatorZ	rpc_proxyr%   r%   r&   rŸ   ö  s    
zPackageIndex.search)N)N)N)N)NNrd   re   N)N)N)NN)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r”   r'   r(   r   r3   r2   r>   rH   rT   r`   rc   ry   r   r‚   rƒ   r   r9   r7   rŸ   r%   r%   r%   r&   r      s*   
	

#
 
8


M+r   )rp   Úloggingr   rt   r   rM   Ú	threadingr   ÚImportErrorZdummy_threadingÚ r   Úcompatr   r   r   r   r	   r
   r)   r   r   Ú	getLoggerr¡   rC   r   ÚDEFAULT_REALMÚobjectr   r%   r%   r%   r&   Ú<module>   s     
