Merge lp:~cjwatson/launchpad/no-private-base-images into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 19021
Proposed branch: lp:~cjwatson/launchpad/no-private-base-images
Merge into: lp:launchpad
Diff against target: 108 lines (+46/-1)
3 files modified
lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py (+25/-1)
lib/lp/soyuz/interfaces/distroarchseries.py (+10/-0)
lib/lp/soyuz/model/distroarchseries.py (+11/-0)
To merge this branch: bzr merge lp:~cjwatson/launchpad/no-private-base-images
Reviewer Review Type Date Requested Status
Kristian Glass (community) Approve
Launchpad code reviewers Pending
Review via email: mp+370760@code.launchpad.net

Commit message

Forbid setting base images to the output of a private livefs build.

Description of the change

This can't work at the moment because builders don't have authorisation to fetch the relevant private files, so just forbid it. If we need it in future (I can think of some edge cases where it might potentially be handy), then we could do something similar to https://code.launchpad.net/~cjwatson/launchpad/build-private-bpb-immediately/+merge/345104 to grant builders the necessary access (some extra work would be required in the librarian too), or we could do something like the thing where BPBs become public if their SPR is copied into a public archive.

To post a comment you must log in.
Revision history for this message
Kristian Glass (doismellburning) wrote :

LGTM

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py'
2--- lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py 2019-02-07 12:38:15 +0000
3+++ lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py 2019-07-30 11:59:56 +0000
4@@ -14,6 +14,7 @@
5 from zope.security.management import endInteraction
6
7 from lp.buildmaster.enums import BuildBaseImageType
8+from lp.registry.enums import PersonVisibility
9 from lp.registry.interfaces.pocket import PackagePublishingPocket
10 from lp.services.features.testing import FeatureFixture
11 from lp.soyuz.interfaces.livefs import LIVEFS_FEATURE_FLAG
12@@ -93,8 +94,9 @@
13 user = das.distroseries.distribution.main_archive.owner
14 webservice = launchpadlib_for("testing", user)
15 ws_das = ws_object(webservice, das)
16- self.assertRaises(
17+ e = self.assertRaises(
18 BadRequest, ws_das.setChroot, data='zyx', sha1sum='x')
19+ self.assertEqual("Chroot upload checksums do not match", e.content)
20
21 def test_setChroot_missing_trailing_cr(self):
22 # Due to http://bugs.python.org/issue1349106 launchpadlib sends
23@@ -230,6 +232,28 @@
24 Unauthorized, ws_das.setChrootFromBuild,
25 livefsbuild=build_url, filename="livecd.ubuntu-base.rootfs.tar.gz")
26
27+ def test_setChrootFromBuild_private(self):
28+ # Chroots may not be set to the output of a private livefs build.
29+ self.useFixture(FeatureFixture({LIVEFS_FEATURE_FLAG: "on"}))
30+ das = self.factory.makeDistroArchSeries()
31+ owner = self.factory.makePerson()
32+ private_team = self.factory.makeTeam(
33+ owner=owner, visibility=PersonVisibility.PRIVATE)
34+ login_as(owner)
35+ build = self.factory.makeLiveFSBuild(
36+ requester=owner, owner=private_team)
37+ build_url = api_url(build)
38+ build.addFile(self.factory.makeLibraryFileAlias(
39+ filename="livecd.ubuntu-base.rootfs.tar.gz"))
40+ user = das.distroseries.distribution.main_archive.owner
41+ private_team.addMember(user, owner)
42+ webservice = launchpadlib_for("testing", user)
43+ ws_das = ws_object(webservice, das)
44+ e = self.assertRaises(
45+ BadRequest, ws_das.setChrootFromBuild,
46+ livefsbuild=build_url, filename="livecd.ubuntu-base.rootfs.tar.gz")
47+ self.assertEqual("Cannot set chroot from a private build.", e.content)
48+
49 def test_setChrootFromBuild_pocket(self):
50 self.useFixture(FeatureFixture({LIVEFS_FEATURE_FLAG: "on"}))
51 das = self.factory.makeDistroArchSeries()
52
53=== modified file 'lib/lp/soyuz/interfaces/distroarchseries.py'
54--- lib/lp/soyuz/interfaces/distroarchseries.py 2019-02-07 12:28:52 +0000
55+++ lib/lp/soyuz/interfaces/distroarchseries.py 2019-07-30 11:59:56 +0000
56@@ -6,6 +6,7 @@
57 __metaclass__ = type
58
59 __all__ = [
60+ 'ChrootNotPublic',
61 'IDistroArchSeries',
62 'InvalidChrootUploaded',
63 'IPocketChroot',
64@@ -55,6 +56,15 @@
65 """Raised when the sha1sum of an uploaded chroot does not match."""
66
67
68+@error_status(httplib.BAD_REQUEST)
69+class ChrootNotPublic(Exception):
70+ """Raised when trying to set a chroot from a private livefs build."""
71+
72+ def __init__(self):
73+ super(Exception, self).__init__(
74+ "Cannot set chroot from a private build.")
75+
76+
77 class IDistroArchSeriesPublic(IHasBuildRecords, IHasOwner):
78 """Public attributes for a DistroArchSeries."""
79
80
81=== modified file 'lib/lp/soyuz/model/distroarchseries.py'
82--- lib/lp/soyuz/model/distroarchseries.py 2019-02-07 12:38:15 +0000
83+++ lib/lp/soyuz/model/distroarchseries.py 2019-07-30 11:59:56 +0000
84@@ -54,6 +54,7 @@
85 from lp.soyuz.interfaces.binarypackagename import IBinaryPackageName
86 from lp.soyuz.interfaces.buildrecords import IHasBuildRecords
87 from lp.soyuz.interfaces.distroarchseries import (
88+ ChrootNotPublic,
89 IDistroArchSeries,
90 InvalidChrootUploaded,
91 IPocketChroot,
92@@ -236,6 +237,16 @@
93 def setChrootFromBuild(self, livefsbuild, filename, pocket=None,
94 image_type=None):
95 """See `IDistroArchSeries`."""
96+ if livefsbuild.is_private:
97+ # This is disallowed partly because files that act as base
98+ # images for other builds (including public ones) ought to be
99+ # public on principle, and partly because
100+ # BuildFarmJobBehaviourBase.dispatchBuildToSlave doesn't
101+ # currently support sending a token that would allow builders to
102+ # fetch private URLs. If we ever need to change this (perhaps
103+ # for the sake of short-lived security fixes in base images?),
104+ # then we need to fix the latter problem first.
105+ raise ChrootNotPublic()
106 self.addOrUpdateChroot(
107 livefsbuild.getFileByName(filename), pocket=pocket,
108 image_type=image_type)