Merge lp:~jelmer/launchpad/394798-auto-buildd-secret into lp:launchpad

Proposed by Jelmer Vernooij
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: no longer in the source branch.
Merged at revision: 11171
Proposed branch: lp:~jelmer/launchpad/394798-auto-buildd-secret
Merge into: lp:launchpad
Diff against target: 153 lines (+34/-29)
3 files modified
lib/lp/soyuz/browser/archive.py (+16/-7)
lib/lp/soyuz/browser/tests/test_archive_admin_view.py (+15/-7)
lib/lp/soyuz/stories/ppa/xx-ppa-workflow.txt (+3/-15)
To merge this branch: bzr merge lp:~jelmer/launchpad/394798-auto-buildd-secret
Reviewer Review Type Date Requested Status
Leonard Richardson (community) Approve
Review via email: mp+28759@code.launchpad.net

Commit message

Generate buildd_secret when none is specified and an archive is being make secret.

Description of the change

This trivial branch makes us generate buildd secrets for private PPA's on the fly, rather than requiring the administrator that makes the PPA private to come up with a random string.

To post a comment you must log in.
Revision history for this message
Leonard Richardson (leonardr) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/lp/soyuz/browser/archive.py'
--- lib/lp/soyuz/browser/archive.py 2010-07-15 14:20:49 +0000
+++ lib/lp/soyuz/browser/archive.py 2010-07-20 10:28:18 +0000
@@ -46,6 +46,7 @@
4646
47from canonical.cachedproperty import cachedproperty47from canonical.cachedproperty import cachedproperty
48from canonical.launchpad import _48from canonical.launchpad import _
49from canonical.launchpad.components.tokens import create_token
49from canonical.launchpad.helpers import english_list50from canonical.launchpad.helpers import english_list
50from canonical.lazr.utils import smartquote51from canonical.lazr.utils import smartquote
51from lp.buildmaster.interfaces.buildbase import BuildStatus52from lp.buildmaster.interfaces.buildbase import BuildStatus
@@ -1877,11 +1878,24 @@
18771878
1878 custom_widget('enabled_restricted_families', LabeledMultiCheckBoxWidget)1879 custom_widget('enabled_restricted_families', LabeledMultiCheckBoxWidget)
18791880
1881 def updateContextFromData(self, data):
1882 """Update context from form data.
1883
1884 If the user did not specify a buildd secret but marked the
1885 archive as private, generate a secret for them.
1886 """
1887 if data['private'] and data['buildd_secret'] is None:
1888 # buildd secrets are only used by builders, autogenerate one.
1889 self.context.buildd_secret = create_token(16)
1890 del(data['buildd_secret'])
1891 super(ArchiveAdminView, self).updateContextFromData(data)
1892
1880 def validate_save(self, action, data):1893 def validate_save(self, action, data):
1881 """Validate the save action on ArchiveAdminView.1894 """Validate the save action on ArchiveAdminView.
18821895
1883 buildd_secret can only be set, and must be set, when1896 buildd_secret can only, and must, be set for private archives.
1884 this is a private archive.1897 If the archive is private and the buildd secret is not set it will be
1898 generated.
1885 """1899 """
1886 form.getWidgetsData(self.widgets, 'field', data)1900 form.getWidgetsData(self.widgets, 'field', data)
18871901
@@ -1893,11 +1907,6 @@
1893 'This archive already has published sources. It is '1907 'This archive already has published sources. It is '
1894 'not possible to switch the privacy.')1908 'not possible to switch the privacy.')
18951909
1896 if data.get('buildd_secret') is None and data['private']:
1897 self.setFieldError(
1898 'buildd_secret',
1899 'Required for private archives.')
1900
1901 if self.owner_is_private_team and not data['private']:1910 if self.owner_is_private_team and not data['private']:
1902 self.setFieldError(1911 self.setFieldError(
1903 'private',1912 'private',
19041913
=== modified file 'lib/lp/soyuz/browser/tests/test_archive_admin_view.py'
--- lib/lp/soyuz/browser/tests/test_archive_admin_view.py 2010-02-16 15:53:05 +0000
+++ lib/lp/soyuz/browser/tests/test_archive_admin_view.py 2010-07-20 10:28:18 +0000
@@ -23,19 +23,19 @@
23 # object.23 # object.
24 login('admin@canonical.com')24 login('admin@canonical.com')
2525
26 def initialize_admin_view(self, private=True):26 def initialize_admin_view(self, private=True, buildd_secret=''):
27 """Initialize the admin view to set the privacy.."""27 """Initialize the admin view to set the privacy.."""
28 method = 'POST'28 method = 'POST'
29 form = {29 form = {
30 'field.enabled': 'on',30 'field.enabled': 'on',
31 'field.actions.save': 'Save',31 'field.actions.save': 'Save',
32 }32 }
33
34 form['field.buildd_secret'] = buildd_secret
33 if private is True:35 if private is True:
34 form['field.private'] = 'on'36 form['field.private'] = 'on'
35 form['field.buildd_secret'] = 'test'
36 else:37 else:
37 form['field.private'] = 'off'38 form['field.private'] = 'off'
38 form['field.buildd_secret'] = ''
3939
40 view = ArchiveAdminView(self.ppa, LaunchpadTestRequest(40 view = ArchiveAdminView(self.ppa, LaunchpadTestRequest(
41 method=method, form=form))41 method=method, form=form))
@@ -56,7 +56,7 @@
56 def test_set_private_without_packages(self):56 def test_set_private_without_packages(self):
57 # If a ppa does not have packages published, it is possible to57 # If a ppa does not have packages published, it is possible to
58 # update the private attribute.58 # update the private attribute.
59 view = self.initialize_admin_view(private=True)59 view = self.initialize_admin_view(private=True, buildd_secret="test")
60 self.assertEqual(0, len(view.errors))60 self.assertEqual(0, len(view.errors))
61 self.assertTrue(view.context.private)61 self.assertTrue(view.context.private)
6262
@@ -66,14 +66,22 @@
66 self.make_ppa_private(self.ppa)66 self.make_ppa_private(self.ppa)
67 self.assertTrue(self.ppa.private)67 self.assertTrue(self.ppa.private)
6868
69 view = self.initialize_admin_view(private=False)69 view = self.initialize_admin_view(private=False, buildd_secret='')
70 self.assertEqual(0, len(view.errors))70 self.assertEqual(0, len(view.errors))
71 self.assertFalse(view.context.private)71 self.assertFalse(view.context.private)
7272
73 def test_set_private_without_buildd_secret(self):
74 """If a PPA is marked private but no buildd secret is specified,
75 one will be generated."""
76 view = self.initialize_admin_view(private=True, buildd_secret='')
77 self.assertEqual(0, len(view.errors))
78 self.assertTrue(view.context.private)
79 self.assertTrue(len(view.context.buildd_secret) > 4)
80
73 def test_set_private_with_packages(self):81 def test_set_private_with_packages(self):
74 # A PPA that does have packages cannot be privatised.82 # A PPA that does have packages cannot be privatised.
75 self.publish_to_ppa(self.ppa)83 self.publish_to_ppa(self.ppa)
76 view = self.initialize_admin_view(private=True)84 view = self.initialize_admin_view(private=True, buildd_secret="test")
77 self.assertEqual(1, len(view.errors))85 self.assertEqual(1, len(view.errors))
78 self.assertEqual(86 self.assertEqual(
79 'This archive already has published sources. '87 'This archive already has published sources. '
@@ -87,7 +95,7 @@
87 self.assertTrue(self.ppa.private)95 self.assertTrue(self.ppa.private)
88 self.publish_to_ppa(self.ppa)96 self.publish_to_ppa(self.ppa)
8997
90 view = self.initialize_admin_view(private=False)98 view = self.initialize_admin_view(private=False, buildd_secret='')
91 self.assertEqual(1, len(view.errors))99 self.assertEqual(1, len(view.errors))
92 self.assertEqual(100 self.assertEqual(
93 'This archive already has published sources. '101 'This archive already has published sources. '
94102
=== modified file 'lib/lp/soyuz/stories/ppa/xx-ppa-workflow.txt'
--- lib/lp/soyuz/stories/ppa/xx-ppa-workflow.txt 2010-06-16 21:49:38 +0000
+++ lib/lp/soyuz/stories/ppa/xx-ppa-workflow.txt 2010-07-20 10:28:18 +0000
@@ -402,25 +402,13 @@
402 'deb not_a_url' is not a complete and valid sources.list entry402 'deb not_a_url' is not a complete and valid sources.list entry
403403
404404
405When the archive is private, the buildd secret must also be set, or an405Setting the buildd secret for non-private archives also generates
406error is issued:
407
408 >>> admin_browser.getControl(
409 ... name="field.external_dependencies").value = ""
410 >>> admin_browser.getControl(name="field.private").value = True
411 >>> admin_browser.getControl(name="field.buildd_secret").value = ""
412 >>> admin_browser.getControl("Save").click()
413
414 >>> for error in get_feedback_messages(admin_browser.contents):
415 ... print error
416 There is 1 error.
417 Required for private archives.
418
419Conversely, setting the buildd secret for non-private archives also generates
420an error. Because the "commercial" flag is also currently set, removing406an error. Because the "commercial" flag is also currently set, removing
421privacy will also trigger a validation error because the commercial flag can407privacy will also trigger a validation error because the commercial flag can
422only be set on private archives:408only be set on private archives:
423409
410 >>> admin_browser.getControl(
411 ... name="field.external_dependencies").value = ""
424 >>> admin_browser.getControl(name="field.private").value = False412 >>> admin_browser.getControl(name="field.private").value = False
425 >>> admin_browser.getControl(name="field.buildd_secret").value = "secret"413 >>> admin_browser.getControl(name="field.buildd_secret").value = "secret"
426 >>> admin_browser.getControl("Save").click()414 >>> admin_browser.getControl("Save").click()