
    g=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 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y# e$ r	 d dl	mZ Y Mw xY w)    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y)PackageIndexzc
    This class represents a package index compatible with PyPI, the Python
    Package Index.
    s.   ----------ThIs_Is_tHe_distlib_index_bouNdaRY_$Nc                    |xs t         | _        | j                          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- ddd       y# t        $ r Y Bw xY w# 1 sw Y   yxY w)	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              V/var/www/django_project/virt/lib/python3.12/site-packages/pip/_vendor/distlib/index.py__init__zPackageIndex.__init__%   s     '-!4<TXX4F1feTUdf4E&E"#;dhh#FGG $ "**c" 	d % #..;/?6:<BQw#$ 		 	  	 	s0   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u    c                     ddl m}  ||       }|j                  d      | _        |j                  d      | _        |j                  dd      | _        |j                  d| j                        | _        y)	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   sY     	'4 
+
+WWWf-
77<2r6   c                 @    | j                          ddlm}  ||        y)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                   | j                         t        |      | _	        y)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`   sq    
 == DMM$9"#FGG ( 261aA


FDMM4==I 4R 8r6   c                 :   | j                          |j                          |j                         }d|d<   | j                  |j	                         g       }| j                  |       d|d<   | j                  |j	                         g       }| j                  |      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)%%aggi4'")%%aggi4  ))r6   c                     	 |j                         }|snK|j                  d      j                         }|j                  |       t        j                  |d|       ^|j                          y)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: N)readlinedecoderstripappendloggerdebugclose)r&   namestreamoutbufr.   s        r0   _readerzPackageIndex._reader   s]     !A!((*AMM!LLT1-.  	r6   c           	         | j                   dddg}|| j                  }|r|j                  d|g       ||j                  g d       t        j                         }t
        j                  j                  |t
        j                  j                  |      dz         }|j                  ddd	|d
||g       t        j                  ddj                  |             ||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-tty	--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     xxZ8}}HJJX./$JJ:;WW\\"bgg..x86AB

OYJH6 	7^SXXc]3Bwr6   c                 ^   t         j                  t         j                  d}|t         j                  |d<   g }g }t        j                  |fi |}t        | j                  d|j
                  |f      }|j                          t        | j                  d|j                  |f      }|j                          |5|j                  j                  |       |j                  j                          |j                          |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   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     !oo oo
 !(ooF7OS+F+ 4<<x6.JK

4<<x6.JK

!GGMM*%GGMMO	
	
	||VV++r6   c                     | j                  ||||      \  }}| j                  ||j                  d            \  }}}	|dk7  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   so     --h.68X!--c.;.B.B7.KMFF7" $-/1$2 3 3r6   c           	      $   | j                          t        j                  j                  |      st	        d|z        |j                          |j                         }d}	|r6| j                  st        j                  d       n| j                  ||||      }	t        |d      5 }
|
j                         }ddd       t        j                        j                         }t        j                   |      j                         }|j#                  dd||||d       dt        j                  j%                  |      |fg}|	rt        |	d      5 }
|
j                         }ddd       |j'                  d	t        j                  j%                  |	      f       t)        j*                  t        j                  j-                  |	             | j/                  |j1                         |      }| j3                  |      S # 1 sw Y   FxY w# 1 sw Y   xY w)
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   . 	 ww~~h'"?X#=>>OO88JK>>(FM*24(D! 	!QI	![[+557
y1;;=	$ # "$*
 	 RWW--h7CDh% $668$LL/277+;+;H+E!# $MM"''//(34%%aggi7  )))	! 	!$ $s   $G9H9HHc                    | j                          t        j                  j                  |      st	        d|z        t        j                  j                  |d      }t        j                  j                  |      st	        d|z        |j                          |j                  |j                  }}t        |      j                         }dd|fd|fg}d||fg}| j                  ||      }	| j                  |	      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     	 ww}}W%"#87#BCCWW\\'<0ww~~b!"?R#788 x'7'7g7#,,.+4.9g"68T8,-%%fe4  ))r6   c                     | j                   dddg}|| j                  }|r|j                  d|g       |j                  d||g       t        j	                  ddj                  |             |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   re   z--verifyrg   rh   )r   r   ri   rZ   r[   rl   )r&   signature_filenamedata_filenamerq   r5   s        r0   get_verify_commandzPackageIndex.get_verify_command=  sh     xxZ8}}HJJX./

J 2MBC^SXXc]3
r6   c                     | j                   st        d      | j                  |||      }| j                  |      \  }}}|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  so     xx" $1 2 2%%&8-&.0!--c2FFV"#MPR#RSSQwr6   c           	      n   |d}t         j                  d       nKt        |t        t        f      r|\  }}nd} t        t        |             }t         j                  d|z         t        |d      5 }| j                  t        |            }	 |j                         }	d}
d}d}d}d	|	v rt        |	d
         }|r
 |||
|       	 |j                  |
      }|snD|t        |      z  }|j                  |       |r|j                  |       |dz  }|r
 |||
|       X	 |j!                          	 ddd       dk\  r|k  rt#        d||fz        |rB|j%                         }||k7  rt#        d|d|d|      t         j                  d|       yy# |j!                          w xY w# 1 sw Y   }xY w)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-Lengthr   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!'/ww/1HLL/&89 (D! 	S ##GCL1C((* 	#w.w'789DxD9HHY/E CJ&DIIe$ .MH!"8Y=   		5	: 19"C,    '')F&7=x7=v(G H H LL.7  		5	 	s%   2F+BFF+F((F++F4c                     g }| j                   r|j                  | j                          | j                  r|j                  | j                         t        | }|j	                  |      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  sX       OOD112OOD--.x({{3r6   c           
         g }| j                   }|D ]^  \  }}t        |t        t        f      s|g}|D ];  }|j	                  d|z   d|z  j                  d      d|j                  d      f       = ` |D ]4  \  }}	}
|j	                  d|z   d|d|	dj                  d      d|
f       6 |j	                  d|z   dz   df       dj                  |      }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  (H$@wHHW%' ((	
	( %* 	 C5LL x!"(&/ 	 	eh&.45||E".9!#d)n
 txxw//r6   c                     t        |t              rd|i}t        | j                  d      }	 |j	                  ||xs 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		!##E8+<u=Ig Ig s   A A)N)NNsdistsourceN)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
9*($8!,F. JNCG7*r*: %)2 #'0K8Z  )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      sq      	   '  ; ; &			8	$'_!6 _!  '&'s   A   A.-A.