
    wOg=Q                         d dl Z d dlZd dlZd dlZd dlZd dlZ	 d dlmZ n# e$ r	 d dl	mZ Y nw xY 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j        e          ZdZdZ G 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                       e Zd ZdZdZddZd Zd Zd Zd Z	d	 Z
d
 ZddZddZddZ	 	 ddZd Z	 ddZ	 ddZddZd Zd Z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                    |pt           | _        |                                  t          | j                  \  }}}}}}|s|s|s|dvrt	          d| j        z            d| _        d| _        d| _        d| _        t          t          j        d          5 }dD ];}		 t          j        |	dg||          }
|
dk    r	|	| _         n,# t          $ r Y 8w xY wddd           dS # 1 swxY w 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rcs              S/var/www/AppWebDeiv/myenv/lib/python3.11/site-packages/pip/_vendor/distlib/index.py__init__zPackageIndex.__init__%   s~    '-!!!4<TX4F4F1feT 	HU 	Hd 	Hf4E&E&E"#;dh#FGGG $ "*c"" 	d %  #.;/?6:< < <BQww#$     D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s6   C!&CC!
CC!CC!!C%(C%c                 "    ddl m}  |            S )zs
        Get the distutils command for interacting with PyPI configurations.
        :return: the command.
        r   )_get_pypirc_command)utilr3   )r&   cmds     r0   r3   z PackageIndex._get_pypirc_commandB   s!    
 	544444suu    c                    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)r4   r8   getr9   r:   r;   r   )r&   r8   cfgs      r0   r   zPackageIndex.read_configurationJ   s{     	'&&&&&l4  
++
++WWWf--
77<22r6   c                 P    |                                   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_credentialsr4   r@   )r&   r@   s     r0   save_configurationzPackageIndex.save_configurationW   s>    
 	   ''''''dr6   c                    | j         | j        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)
r9   r:   r   r   r	   r   add_passwordr;   r   r   )r&   pm_r(   s       r0   rA   zPackageIndex.check_credentials`   s}    
 = DM$9"#FGGG ( 2 261aA

FDM4=III 4R 8 8r6   c                    |                                   |                                 |                                }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)rA   validatetodictencode_requestitemssend_request)r&   metadatadrequests       r0   registerzPackageIndex.registerl   s     	   OO)%%aggii44'""")%%aggii44  )))r6   c                    	 |                                 }|sn\|                    d                                          }|                    |           t                              |d|           s|                                 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: N)readlinedecoderstripappendloggerdebugclose)r&   namestreamoutbufr.   s        r0   _readerzPackageIndex._reader   s    	/!!A !!((**AMM!LLTTT11-...	/ 	r6   c           	         | j         dddg}|| j        }|r|                    d|g           ||                    g d           t          j                    }t
          j                            |t
          j                            |          dz             }|                    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basenamerZ   r[   )r&   filenamesignersign_passwordkeystorer5   tdsfs           r0   get_sign_commandzPackageIndex.get_sign_command   s     xZ8}H 	0JJX.///$JJ:::;;;W\\"bg..x886ABB

OYJH6 	7 	7 	7^SXXc]]333Bwr6   c                 @   t           j        t           j        d}|t           j        |d<   g }g }t          j        |fi |}t          | j        d|j        |f          }|                                 t          | j        d|j        |f          }|                                 |3|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   r`   r   startr   rv   writer\   waitrl   
returncode)	r&   r5   
input_datakwargsr   r   pt1t2s	            r0   run_commandzPackageIndex.run_command   s    !o o
 
 !(oF7OS++F++ 4<x6.JKKK



4<x6.JKKK



!GMM*%%%GMMOOO	
			
			|VV++r6   c                     |                      ||||          \  }}|                     ||                    d                    \  }}}	|dk    rt          d|z            |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.
        rU   r   z&sign command failed with error code %s)rt   r   encoder   )
r&   rn   ro   rp   rq   r5   sig_filer/   r   r   s
             r0   	sign_filezPackageIndex.sign_file   s     --h.68 8X!--c.;.B.B7.K.KM MFF77" $-/1$2 3 3 3r6   sdistsourcec           	         |                                   t          j                            |          st	          d|z            |                                 |                                }d}	|r:| j        st          	                    d           n| 
                    ||||          }	t          |d          5 }
|
                                }ddd           n# 1 swxY w Y   t          j        |                                          }t          j        |                                          }|                    dd||||d           dt          j                            |          |fg}|	rt          |	d          5 }
|
                                }ddd           n# 1 swxY w Y   |                    d	t          j                            |	          |f           t)          j        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)rI   protocol_versionfiletype	pyversion
md5_digestsha256_digestcontentgpg_signature)rA   r!   r)   existsr   rK   rL   r   rZ   warningr   r    readhashlibmd5	hexdigestsha256updaterm   rY   shutilrmtreedirnamerM   rN   rO   )r&   rP   rn   ro   rp   r   r   rq   rQ   r   f	file_datar   r   filessig_datarR   s                    r0   upload_filezPackageIndex.upload_file   s   . 	   w~~h'' 	?"?X#=>>>OO 	48 4JKKKK>>(FM*24 4(D!! 	!QI	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	![++5577
y11;;==	$ # "$*
 
 	 	 	 RW--h77CD 	5h%% $6688$ $ $ $ $ $ $ $ $ $ $ $ $ $ $LL/27+;+;H+E+E!# $ $ $M"'//(33444%%aggii77  )))s$   <CC!$C!F&&F*-F*c                 (   |                                   t          j                            |          st	          d|z            t          j                            |d          }t          j                            |          st	          d|z            |                                 |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)rI   
doc_uploadr]   versionr   )rA   r!   r)   isdirr   rl   r   rK   r]   r   r   getvaluerM   rO   )
r&   rP   doc_dirfnr]   r   zip_datafieldsr   rR   s
             r0   upload_documentationz!PackageIndex.upload_documentation!  s    	   w}}W%% 	D"#87#BCCCW\\'<00w~~b!! 	9"?R#7888 x'7g7##,,..+4.9g"68T8,-%%fe44  )))r6   c                     | j         dddg}|| 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`.
        rb   rc   rd   Nre   z--verifyrg   rh   )r   r   ri   rZ   r[   rl   )r&   signature_filenamedata_filenamerq   r5   s        r0   get_verify_commandzPackageIndex.get_verify_command=  s}     xZ8}H 	0JJX.///

J 2MBCCC^SXXc]]333
r6   c                     | j         st          d          |                     |||          }|                     |          \  }}}|dvrt          d|z            |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   rq   r5   r/   r   r   s           r0   verify_signaturezPackageIndex.verify_signatureU  s     x 	2" $1 2 2 2%%&8-&.0 0!--c22FFV"#MPR#RSSSQwr6   c           	      <   |d}t                               d           n^t          |t          t          f          r|\  }}nd} t          t          |                      }t                               d|z             t          |d          5 }|                     t          |                    }	 |
                                }	d}
d}d}d}d	|	v rt          |	d
                   }|r |||
|           	 |                    |
          }|snS|t          |          z  }|                    |           |r|                    |           |dz  }|r |||
|           k	 |                                 n# |                                 w xY w	 ddd           n# 1 swxY w Y   |dk    r||k     rt#          d||fz            |rQ|                                }||k    rt#          |d|d|d|          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 digest mismatch for z: expected z, got zDigest verified: %s)rZ   r[   
isinstancelisttuplegetattrr   r    rO   r   infointr   lenr|   r   r\   r   r   )r&   r   destfiledigest
reporthookdigesterhasherdfpsfpheaders	blocksizesizer   blocknumblockactuals                   r0   download_filezPackageIndex.download_filem  s   , >HLL.////&4-00 !'/ww//11HLL/&8999 (D!! 	S ##GCLL11C((** 	#w..w'7899D :JxD999
>HHY//E  CJJ&DIIe$$$ / ...MH! >"
8Y===
>  				5	 	 	 	 	 	 	 	 	 	 	 	 	 	 	: 199"C,       	8''))F&7=vvxxx7=vvvv(G H H H LL.77777	8 	8s+   #F2B0E8#F8FFF"%F"c                     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   rY   r   r
   r    )r&   reqhandlersopeners       r0   rO   zPackageIndex.send_request  se       	3OOD1222 	/OOD-...x({{3r6   c           
      L   g }| j         }|D ]n\  }}t          |t          t          f          s|g}|D ]G}|                    d|z   d|z                      d          d|                    d          f           Ho|D ]<\  }}	}
|                    d|z   d|d|	d                    d          d|
f           =|                    d|z   dz   df           d                    |          }d	|z   }|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"rU   r6   z&Content-Disposition: form-data; name="z"; filename=""s   
s   multipart/form-data; boundary=)zContent-typezContent-length)boundaryr   r   r   ri   r   rl   strr   r   r   )r&   r   r   partsr   kvaluesvkeyrn   valuebodyctr   s                 r0   rM   zPackageIndex.encode_request  s|    = 
	( 
	(IAvftUm44 "  ( (H$@wHHW%%' ( ( ( (( %* 	 	 C5LL  ##xxx!"(&//     	eh&.4555||E"".9!#d))nn
 
 txw///r6   c                     t          |t                    rd|i}t          | j        d          }	 |                    ||pd            |d                       S #   |d                       w xY w)Nr]   g      @)timeoutandr\   )r   r   r   r   search)r&   termsoperator	rpc_proxys       r0   r   zPackageIndex.search  s    e\** 	$UOE#666		!##E8+<u==IIg    IIg    s   A A1)N)NNr   r   N)NN)__name__
__module____qualname____doc__r   r1   r3   r   rB   rA   rS   r`   rt   r   r   r   r   r   r   r   rO   rM   r    r6   r0   r   r      s}        
 AH   :  3 3 3  
9 
9 
9* * *(  $   8!, !, !, !,F   . JNCG7* 7* 7* 7*r* * *: %)   2 #'   0K8 K8 K8 K8Z      )0 )0 )0V! ! ! ! ! !r6   r   )r   loggingr!   r   r#   rj   	threadingr   ImportErrordummy_threading r   compatr   r   r   r	   r
   r   r4   r   r   	getLoggerr   rZ   r   DEFAULT_REALMobjectr   r   r6   r0   <module>r      sc     				      '        ' ' '&&&&&&&&'      ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; & & & & & & & &		8	$	$'_! _! _! _! _!6 _! _! _! _! _!s   ! //