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
diff --git a/lib/lp/oci/model/ocirecipebuildbehaviour.py b/lib/lp/oci/model/ocirecipebuildbehaviour.py
index 742c8a2..1008884 100644
--- a/lib/lp/oci/model/ocirecipebuildbehaviour.py
+++ b/lib/lp/oci/model/ocirecipebuildbehaviour.py
@@ -96,7 +96,10 @@ class OCIRecipeBuildBehaviour(SnapProxyMixin, BuildFarmJobBehaviourBase):
96 logger=logger))96 logger=logger))
9797
98 args['build_file'] = build.recipe.build_file98 args['build_file'] = build.recipe.build_file
99 args['build_args'] = build.recipe.build_args99 # We have to remove the security proxy that Zope applies to this
100 # dict, since otherwise we'll be unable to serialise it to
101 # XML-RPC.
102 args['build_args'] = removeSecurityProxy(build.recipe.build_args)
100 args['build_path'] = build.recipe.build_path103 args['build_path'] = build.recipe.build_path
101104
102 if build.recipe.git_ref is not None:105 if build.recipe.git_ref is not None:
diff --git a/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py b/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py
index 6397405..9a15fb9 100644
--- a/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py
+++ b/lib/lp/oci/tests/test_ocirecipebuildbehaviour.py
@@ -36,6 +36,7 @@ from testtools.twistedsupport import (
36 )36 )
37from twisted.internet import defer37from twisted.internet import defer
38from zope.component import getUtility38from zope.component import getUtility
39from zope.proxy import isProxy
39from zope.security.proxy import removeSecurityProxy40from zope.security.proxy import removeSecurityProxy
4041
41from lp.buildmaster.enums import (42from lp.buildmaster.enums import (
@@ -176,6 +177,24 @@ class TestAsyncOCIRecipeBuildBehaviour(MakeOCIBuildMixin, TestCaseWithFactory):
176 self.useFixture(FeatureFixture({OCI_RECIPE_ALLOW_CREATE: 'on'}))177 self.useFixture(FeatureFixture({OCI_RECIPE_ALLOW_CREATE: 'on'}))
177 self.addCleanup(shut_down_default_process_pool)178 self.addCleanup(shut_down_default_process_pool)
178179
180 def assertHasNoZopeSecurityProxy(self, data):
181 """Makes sure that data doesn't contain a security proxy.
182
183 `data` can be a list, a tuple, a dict or an ordinary value. This
184 method checks `data` itself, and if it's a collection, it checks
185 each item in it.
186 """
187 self.assertFalse(
188 isProxy(data), "%s should not be a security proxy." % data)
189 # If it's a collection, keep searching for proxies.
190 if isinstance(data, (list, tuple)):
191 for i in data:
192 self.assertHasNoZopeSecurityProxy(i)
193 elif isinstance(data, dict):
194 for k, v in data.items():
195 self.assertHasNoZopeSecurityProxy(k)
196 self.assertHasNoZopeSecurityProxy(v)
197
179 @defer.inlineCallbacks198 @defer.inlineCallbacks
180 def test_composeBuildRequest(self):199 def test_composeBuildRequest(self):
181 [ref] = self.factory.makeGitRefs()200 [ref] = self.factory.makeGitRefs()
@@ -238,6 +257,9 @@ class TestAsyncOCIRecipeBuildBehaviour(MakeOCIBuildMixin, TestCaseWithFactory):
238 self.assertIn('universe', archive_line)257 self.assertIn('universe', archive_line)
239 with dbuser(config.builddmaster.dbuser):258 with dbuser(config.builddmaster.dbuser):
240 args = yield job.extraBuildArgs()259 args = yield job.extraBuildArgs()
260 # Asserts that nothing here is a zope proxy, to avoid errors when
261 # serializing it for XML-RPC call.
262 self.assertHasNoZopeSecurityProxy(args)
241 self.assertThat(args, MatchesDict({263 self.assertThat(args, MatchesDict({
242 "archive_private": Is(False),264 "archive_private": Is(False),
243 "archives": Equals(expected_archives),265 "archives": Equals(expected_archives),
@@ -270,6 +292,7 @@ class TestAsyncOCIRecipeBuildBehaviour(MakeOCIBuildMixin, TestCaseWithFactory):
270 self.assertIn('universe', archive_line)292 self.assertIn('universe', archive_line)
271 with dbuser(config.builddmaster.dbuser):293 with dbuser(config.builddmaster.dbuser):
272 args = yield job.extraBuildArgs()294 args = yield job.extraBuildArgs()
295 self.assertHasNoZopeSecurityProxy(args)
273 self.assertThat(args, MatchesDict({296 self.assertThat(args, MatchesDict({
274 "archive_private": Is(False),297 "archive_private": Is(False),
275 "archives": Equals(expected_archives),298 "archives": Equals(expected_archives),