Merge ~pappacena/launchpad:fix-oci-build-args-proxy into launchpad:master

Proposed by Thiago F. Pappacena
Status: Merged
Approved by: Thiago F. Pappacena
Approved revision: 3159baaaf31c85a435588236af286556b9581820
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~pappacena/launchpad:fix-oci-build-args-proxy
Merge into: launchpad:master
Diff against target: 71 lines (+27/-1)
2 files modified
lib/lp/oci/model/ocirecipebuildbehaviour.py (+4/-1)
lib/lp/oci/tests/test_ocirecipebuildbehaviour.py (+23/-0)
Reviewer Review Type Date Requested Status
Tom Wardill (community) Approve
Review via email: mp+391760@code.launchpad.net

Commit message

Removing security proxy on data being sent over xml-rpc call

To post a comment you must log in.
Revision history for this message
Tom Wardill (twom) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/oci/model/ocirecipebuildbehaviour.py b/lib/lp/oci/model/ocirecipebuildbehaviour.py
2index 742c8a2..1008884 100644
3--- a/lib/lp/oci/model/ocirecipebuildbehaviour.py
4+++ b/lib/lp/oci/model/ocirecipebuildbehaviour.py
5@@ -96,7 +96,10 @@ class OCIRecipeBuildBehaviour(SnapProxyMixin, BuildFarmJobBehaviourBase):
6 logger=logger))
7
8 args['build_file'] = build.recipe.build_file
9- args['build_args'] = build.recipe.build_args
10+ # We have to remove the security proxy that Zope applies to this
11+ # dict, since otherwise we'll be unable to serialise it to
12+ # XML-RPC.
13+ args['build_args'] = removeSecurityProxy(build.recipe.build_args)
14 args['build_path'] = build.recipe.build_path
15
16 if build.recipe.git_ref is not None:
17diff --git a/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py b/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py
18index 6397405..9a15fb9 100644
19--- a/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py
20+++ b/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py
21@@ -36,6 +36,7 @@ from testtools.twistedsupport import (
22 )
23 from twisted.internet import defer
24 from zope.component import getUtility
25+from zope.proxy import isProxy
26 from zope.security.proxy import removeSecurityProxy
27
28 from lp.buildmaster.enums import (
29@@ -176,6 +177,24 @@ class TestAsyncOCIRecipeBuildBehaviour(MakeOCIBuildMixin, TestCaseWithFactory):
30 self.useFixture(FeatureFixture({OCI_RECIPE_ALLOW_CREATE: 'on'}))
31 self.addCleanup(shut_down_default_process_pool)
32
33+ def assertHasNoZopeSecurityProxy(self, data):
34+ """Makes sure that data doesn't contain a security proxy.
35+
36+ `data` can be a list, a tuple, a dict or an ordinary value. This
37+ method checks `data` itself, and if it's a collection, it checks
38+ each item in it.
39+ """
40+ self.assertFalse(
41+ isProxy(data), "%s should not be a security proxy." % data)
42+ # If it's a collection, keep searching for proxies.
43+ if isinstance(data, (list, tuple)):
44+ for i in data:
45+ self.assertHasNoZopeSecurityProxy(i)
46+ elif isinstance(data, dict):
47+ for k, v in data.items():
48+ self.assertHasNoZopeSecurityProxy(k)
49+ self.assertHasNoZopeSecurityProxy(v)
50+
51 @defer.inlineCallbacks
52 def test_composeBuildRequest(self):
53 [ref] = self.factory.makeGitRefs()
54@@ -238,6 +257,9 @@ class TestAsyncOCIRecipeBuildBehaviour(MakeOCIBuildMixin, TestCaseWithFactory):
55 self.assertIn('universe', archive_line)
56 with dbuser(config.builddmaster.dbuser):
57 args = yield job.extraBuildArgs()
58+ # Asserts that nothing here is a zope proxy, to avoid errors when
59+ # serializing it for XML-RPC call.
60+ self.assertHasNoZopeSecurityProxy(args)
61 self.assertThat(args, MatchesDict({
62 "archive_private": Is(False),
63 "archives": Equals(expected_archives),
64@@ -270,6 +292,7 @@ class TestAsyncOCIRecipeBuildBehaviour(MakeOCIBuildMixin, TestCaseWithFactory):
65 self.assertIn('universe', archive_line)
66 with dbuser(config.builddmaster.dbuser):
67 args = yield job.extraBuildArgs()
68+ self.assertHasNoZopeSecurityProxy(args)
69 self.assertThat(args, MatchesDict({
70 "archive_private": Is(False),
71 "archives": Equals(expected_archives),