On Tue, Mar 19, 2013 at 3:37 PM, Daniel Holth <[email protected]> wrote: > On Tue, Mar 19, 2013 at 3:11 PM, Donald Stufft <[email protected]> wrote: >> >> On Mar 19, 2013, at 2:04 PM, Richard Jones <[email protected]> wrote: >> >>> Hi all, >>> >>> I present for your deliberation a draft PEP for the inclusion of a pip >>> bootstrap program in Python 3.4. Discussion of this PEP should remain >>> here on the distutils SIG. >>> >>> The PEP is revision controlled in my bitbucket account >>> https://bitbucket.org/r1chardj0n3s/pypi-pep (this is also where I'm >>> intending to develop the implementation.) >>> >>> >>> Richard >>> >>> PEP: XXXX >>> Title: Inclusion of pip bootstrap in Python installation >>> Version: >>> Last-Modified: >>> Author: Richard Jones <[email protected]> >>> BDFL-Delegate: Nick Coghlan <[email protected]> >>> Discussions-To: <[email protected]> >>> Status: Draft >>> Type: Standards Track >>> Created: 18-Mar-2013 >>> Python-Version: 3.4 >>> Post-History: 19-Mar-2013 >>> >>> Abstract >>> ======== >>> >>> This PEP proposes the inclusion of a pip boostrap executable in the Python >>> installation to simplify the use of 3rd-party modules by Python users. >>> >>> This PEP does not propose to include the pip implementation in the Python >>> standard library. Nor does it propose to implement any package management or >>> installation mechanisms beyond those provided by PEPs 470 ("The Wheel Binary >>> Package Format 1.0") and TODO distlib PEP. >>> >>> >>> Rationale >>> ========= >>> >>> Currently the user story for installing 3rd-party Python modules is >>> not as simple as it could be. It requires that all 3rd-party modules inform >>> the user of how to install the installer, typically via a link to the >>> installer. That link may be out of date or the steps required to perform the >>> install of the installer may be enough of a roadblock to prevent the user >>> from >>> further progress. >>> >>> Large Python projects which emphasise a low barrier to entry have shied away >>> from depending on third party packages because of the introduction of this >>> potential stumbling block for new users. >>> >>> With the inclusion of the package installer command in the standard Python >>> installation the barrier to installing additional software is considerably >>> reduced. It is hoped that this will therefore increase the likelihood that >>> Python projects will reuse third party software. >>> >>> It is also hoped that this is reduces the number of proposals to include >>> more and more software in the Python standard library, and therefore that >>> more popular Python software is more easily upgradeable beyond requiring >>> Python installation upgrades. >>> >>> >>> Proposal >>> ======== >>> >>> Python install includes an executable called "pip" that attempts to import >>> pip >>> machinery. If it can then the pip command proceeds as normal. If it cannot >>> it >>> will bootstrap pip by downloading the pip implementation wheel file. >>> Once installed, the pip command proceeds as normal. >>> >>> A boostrap is used in the place of a the full pip code so that we don't have >>> to bundle pip and also the install tool is upgradeable outside of the >>> regular >>> Python upgrade timeframe and processes. >>> >>> To avoid issues with sudo we will have the bootstrap default to installing >>> the >>> pip implementation to the per-user site-packages directory defined in PEP >>> 370 >>> and implemented in Python 2.6/3.0. Since we avoid installing to the system >>> Python we also avoid conflicting with any other packaging system (on Linux >>> systems, for example.) If the user is inside a virtual environment (TODO PEP >>> ref) then the pip implementation will be installed into that virtual >>> environment. >>> >>> The bootstrapping process will proceed as follows: >>> >>> 1. The user system has Python (3.4+) installed. In the "scripts" directory >>> of >>> the Python installation there is the bootstrap script called "pip". >>> 2. The user will invoke a pip command, typically "pip install <package>", >>> for >>> example "pip install Django". >>> 3. The boostrap script will attempt to import the pip implementation. If >>> this >>> succeeds, the pip command is processed normally. >>> 4. On failing to import the pip implementation the bootstrap notifies the >>> user >>> that it is "upgrading pip" and contacts PyPI to obtain the latest download >>> wheel file (see PEP 427.) >>> 5. Upon downloading the file it is installed using the distlib installation >>> machinery for wheel packages. Upon completing the installation the user >>> is notified that "pip has been upgraded." TODO how is it verified? >>> 6. The pip tool may now import the pip implementation and continues to >>> process >>> the requested user command normally. >>> >>> Users may be running in an environment which cannot access the public >>> Internet >>> and are relying solely on a local package repository. They would use the >>> "-i" >>> (Base URL of Python Package Index) argument to the "pip install" command. >>> This >>> use case will be handled by: >>> >>> 1. Recognising the command-line arguments that specify alternative or >>> additional >>> locations to discover packages and attempting to download the package >>> from those locations. >>> 2. If the package is not found there then we attempt to donwload it using >>> the standard "https://pypi.python.org/pypi/simple/pip" index. >>> 3. If that also fails, for any reason, we indicate to the user the operation >>> we were attempting, the reason for failure (if we know it) and display >>> further instructions for downloading and installing the file manually. >>> >>> Manual installation of the pip implementation will be supported through the >>> manual download of the wheel file and "pip install <downloaded wheel file>". >>> >>> This installation will not perform standard pip installation steps of >>> saving the >>> file to a cache directory or updating any local database of installed files. >>> >>> The download of the pip implementation install file should be performed >>> securely. The transport from pypi.python.org will be done over HTTPS but >>> the CA >>> certificate check will most likely not be performed. Therefore we will >>> utilise the embedded signature support in the wheel format to validate the >>> downloaded file. >> >> Major concern is how will this deal with key revocation? If the key used to >> sign the pip wheels gets compromised what's the path for this tool to revoke >> the key? > > The wheel scheme skips revocation to simplify the implementation. You > would be hard pressed to argue that it's not better than the current > pypi security model ;-) > > A proper revocation model would look like TUF, a simple one would > consist of grabbing the author keys over HTTPS at time of use. The > scheme is flipped from the revocation model: require an up-to-date > assertion that the key is current in order to trust the key, instead > of trusting a key until a revocation happens. > >> On the side of the HTTPS I've been looking into this recently as far as >> Python goes. If openssl is correctly configured (this is the case on Linux, >> and any Python compiled against the OSX OpenSSL) then >> `urllib.request.urlopen('https://pypi.python.org/', cadefault=True) will do >> the right thing. This gets sticker on cases where openssl _isn't_ configured >> with a default set of certificates (Windows i'm assuming, Homebrew on OSX >> for sure) this will cause a certificate error. It's possible a workable >> solution can be designed via SSL.
It would also be incredibly easy to require n signatures on the wheel instead of just 1. The signature format used, JWS-JS, already holds a list of signatures. This would make it much harder to compromise the system by pwning a single pip developer's machine and may help to put your mind at ease about revocation. _______________________________________________ Distutils-SIG maillist - [email protected] http://mail.python.org/mailman/listinfo/distutils-sig
