a oeC@sdZddlZddlZddlZddlZddlmZddlmZm Z m Z ddl m Z ddl mZmZddlmZdd lmZeed deed deed dd ZGdddeZdS)zm distutils.command.upload Implements the Distutils 'upload' subcommand (upload package to a package index). N)standard_b64encode)urlopenRequest HTTPError)urlparse)DistutilsErrorDistutilsOptionError) PyPIRCCommand)spawnZmd5Zsha256Zblake2b)Z md5_digestZ sha256_digestZblake2_256_digestc@sJeZdZdZejddgZejdgZddZddZd d Z d d Z d S)uploadzupload binary package to PyPI)signszsign files to upload using gpg)z identity=izGPG identity used to sign filesr cCs,t|d|_d|_d|_d|_d|_dS)NrF)r initialize_optionsusernamepassword show_responser identity)selfrEC:\Program Files\Certbot\pkgs\setuptools\_distutils\command\upload.pyr's  zupload.initialize_optionscCsrt||jr|jstd|}|ikrV|d|_|d|_|d|_|d|_ |jsn|j jrn|j j|_dS)Nz.Must use --sign for --identity to have meaningrr repositoryrealm) r finalize_optionsrr r Z _read_pypircrrrr distribution)rZconfigrrrr/s      zupload.finalize_optionscCs:|jjsd}t||jjD]\}}}||||qdS)NzHMust create and upload files in one command (e.g. setup.py sdist upload))rZ dist_filesr upload_file)rmsgcommand pyversionfilenamerrrrun?s z upload.runc"Cs t|j\}}}}}} |s"|s"| r0td|j|dvrDtd||jr|ddd|g} |jrnd|jg| dd<t| |jd t|d } z| } W| n | 0|j j } d d | | tj|| f||d | | | | | | | | | | | | | d}d|d<tD]B\}}|durLq6z||  ||<Wnt!ytYn0q6|jrt|dd ,} tj|d| f|d<Wdn1s0Y|j"d|j#$d}dt%|&d}d}d|$d}|d}t'(}|D]\}}d|}t)|t*sB|g}|D]j}t+|t,urr|d|d7}|d}nt-|$d}|.||.|$d|.d|.|qFq |.||/}d0||j}|1|t2j3d |t-t4||d!}t5|j||d"}zt6|}|7}|j8}Wnjt9yX} z| j:}| j8}WYd} ~ nBd} ~ 0t;y} z |1t-| t2j<WYd} ~ n d} ~ 00|d#kr|1d$0||t2j3|j=r|>|}!d%?d&|!d&f}|1|t2j3n"d'0||}|1|t2j<t@|dS)(NzIncompatible url %s)httphttpszunsupported schema Zgpgz --detach-signz-az --local-userr)dry_runrbZ file_upload1z1.0)z:actionZprotocol_versionnameversioncontentZfiletyper Zmetadata_versionZsummaryZ home_pageZauthorZ author_emaillicense descriptionkeywordsplatformZ classifiersZ download_urlZprovidesZrequiresZ obsoletesrZcommentz.ascZ gpg_signature:asciizBasic z3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254s --s-- z+ Content-Disposition: form-data; name="%s"z; filename="%s"rzutf-8s zSubmitting {} to {}z multipart/form-data; boundary=%s)z Content-typezContent-lengthZ Authorization)dataheaderszServer response ({}): {} zK---------------------------------------------------------------------------zUpload failed ({}): {})ArrAssertionErrorr rr r%openreadclosermetadataZget_nameZ get_versionospathbasenameZget_descriptionZget_urlZ get_contactZget_contact_emailZ get_licenceZget_long_descriptionZ get_keywordsZ get_platformsZget_classifiersZget_download_urlZ get_providesZ get_requiresZ get_obsoletes_FILE_CONTENT_DIGESTSitemsZ hexdigest ValueErrorrrencoderdecodeioBytesIO isinstancelisttypetuplestrwritegetvalueformatZannounceloggingINFOlenrrZgetcoderrcodeOSErrorZERRORrZ_read_pypi_responsejoinr)"rrr r!ZschemanetlocurlparamsqueryZ fragmentsZgpg_argsfr*metar2Z digest_nameZ digest_consZ user_passZauthboundaryZ sep_boundaryZ end_boundarybodykeyvaluetitlerr3ZrequestresultstatusreasonetextrrrrIs       <          zupload.upload_fileN) __name__ __module__ __qualname__r,r Z user_optionsZboolean_optionsrrr"rrrrrr s  r )__doc__r;rCZhashlibrMbase64rZurllib.requestrrr urllib.parsererrorsrr Zcorer r getattrr>r rrrrs