Merge lp:~allenap/launchpad/check-mappings-and-sets-for-proxy into lp:launchpad

Proposed by Gavin Panella
Status: Merged
Approved by: Gavin Panella
Approved revision: no longer in the source branch.
Merged at revision: 11787
Proposed branch: lp:~allenap/launchpad/check-mappings-and-sets-for-proxy
Merge into: lp:launchpad
Diff against target: 194 lines (+66/-45)
2 files modified
lib/lp/testing/factory.py (+26/-31)
lib/lp/testing/tests/test_factory.py (+40/-14)
To merge this branch: bzr merge lp:~allenap/launchpad/check-mappings-and-sets-for-proxy
Reviewer Review Type Date Requested Status
Abel Deuring (community) code Approve
Review via email: mp+38539@code.launchpad.net

Commit message

Makes is_security_proxied_or_harmless() check set, frozenset and mapping types for proxied objects. Previously objects of these types would be considered okay.

Description of the change

This makes is_security_proxied_or_harmless() check set, frozenset and mapping types for proxied objects. Previously objects of these types would be considered okay.

I have also removed a superfluous makePackageDiff() method in the object factory. There are two methods with than name in a single class, so I removed the earlier one because it is obviously unused.

To post a comment you must log in.
Revision history for this message
Abel Deuring (adeuring) :
review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/testing/factory.py'
2--- lib/lp/testing/factory.py 2010-10-14 12:57:25 +0000
3+++ lib/lp/testing/factory.py 2010-10-15 13:56:52 +0000
4@@ -33,7 +33,10 @@
5 make_msgid,
6 )
7 from itertools import count
8-from operator import isSequenceType
9+from operator import (
10+ isMappingType,
11+ isSequenceType,
12+ )
13 import os
14 from random import randint
15 from StringIO import StringIO
16@@ -237,17 +240,13 @@
17 from lp.soyuz.interfaces.component import IComponentSet
18 from lp.soyuz.interfaces.packageset import IPackagesetSet
19 from lp.soyuz.interfaces.processor import IProcessorFamilySet
20-from lp.soyuz.interfaces.publishing import (
21- IPublishingSet,
22- )
23+from lp.soyuz.interfaces.publishing import IPublishingSet
24 from lp.soyuz.interfaces.section import ISectionSet
25 from lp.soyuz.model.files import (
26 BinaryPackageFile,
27 SourcePackageReleaseFile,
28 )
29-from lp.soyuz.model.packagediff import (
30- PackageDiff,
31- )
32+from lp.soyuz.model.packagediff import PackageDiff
33 from lp.soyuz.model.processor import ProcessorFamilySet
34 from lp.testing import (
35 ANONYMOUS,
36@@ -1844,22 +1843,6 @@
37 expires=expires, restricted=restricted)
38 return library_file_alias
39
40- def makePackageDiff(self, from_spr=None, to_spr=None):
41- """Make a completed package diff."""
42- if from_spr is None:
43- from_spr = self.makeSourcePackageRelease()
44- if to_spr is None:
45- to_spr = self.makeSourcePackageRelease()
46-
47- diff = from_spr.requestDiffTo(
48- from_spr.creator, to_spr)
49-
50- naked_diff = removeSecurityProxy(diff)
51- naked_diff.status = PackageDiffStatus.COMPLETED
52- naked_diff.diff_content = self.makeLibraryFileAlias()
53- naked_diff.date_fulfilled = UTC_NOW
54- return diff
55-
56 def makeDistribution(self, name=None, displayname=None, owner=None,
57 members=None, title=None, aliases=None):
58 """Make a new distribution."""
59@@ -3180,9 +3163,17 @@
60 # Some factory methods return simple Python types. We don't add
61 # security wrappers for them, as well as for objects created by
62 # other Python libraries.
63-unwrapped_types = (
64- BaseRecipeBranch, DSCFile, InstanceType, MergeDirective2, Message,
65- datetime, int, str, unicode)
66+unwrapped_types = frozenset((
67+ BaseRecipeBranch,
68+ DSCFile,
69+ InstanceType,
70+ MergeDirective2,
71+ Message,
72+ datetime,
73+ int,
74+ str,
75+ unicode,
76+ ))
77
78
79 def is_security_proxied_or_harmless(obj):
80@@ -3193,11 +3184,15 @@
81 return True
82 if type(obj) in unwrapped_types:
83 return True
84- if isSequenceType(obj):
85- for element in obj:
86- if not is_security_proxied_or_harmless(element):
87- return False
88- return True
89+ if isSequenceType(obj) or isinstance(obj, (set, frozenset)):
90+ return all(
91+ is_security_proxied_or_harmless(element)
92+ for element in obj)
93+ if isMappingType(obj):
94+ return all(
95+ (is_security_proxied_or_harmless(key) and
96+ is_security_proxied_or_harmless(obj[key]))
97+ for key in obj)
98 return False
99
100
101
102=== modified file 'lib/lp/testing/tests/test_factory.py'
103--- lib/lp/testing/tests/test_factory.py 2010-09-21 18:43:27 +0000
104+++ lib/lp/testing/tests/test_factory.py 2010-10-15 13:56:52 +0000
105@@ -27,8 +27,6 @@
106 from lp.registry.interfaces.sourcepackage import SourcePackageFileType
107 from lp.registry.interfaces.suitesourcepackage import ISuiteSourcePackage
108 from lp.services.worlddata.interfaces.language import ILanguage
109-from lp.soyuz.interfaces.binarypackagebuild import IBinaryPackageBuild
110-from lp.soyuz.interfaces.binarypackagename import IBinaryPackageName
111 from lp.soyuz.enums import (
112 BinaryPackageFileType,
113 BinaryPackageFormat,
114@@ -36,9 +34,9 @@
115 PackagePublishingStatus,
116 PackageUploadStatus,
117 )
118-from lp.soyuz.interfaces.binarypackagerelease import (
119- IBinaryPackageRelease,
120- )
121+from lp.soyuz.interfaces.binarypackagebuild import IBinaryPackageBuild
122+from lp.soyuz.interfaces.binarypackagename import IBinaryPackageName
123+from lp.soyuz.interfaces.binarypackagerelease import IBinaryPackageRelease
124 from lp.soyuz.interfaces.files import (
125 IBinaryPackageFile,
126 ISourcePackageReleaseFile,
127@@ -48,9 +46,7 @@
128 ISourcePackagePublishingHistory,
129 PackagePublishingPocket,
130 )
131-from lp.soyuz.interfaces.queue import (
132- IPackageUpload,
133- )
134+from lp.soyuz.interfaces.queue import IPackageUpload
135 from lp.soyuz.interfaces.sourcepackagerelease import ISourcePackageRelease
136 from lp.testing import TestCaseWithFactory
137 from lp.testing.factory import is_security_proxied_or_harmless
138@@ -643,20 +639,50 @@
139 self.assertFalse(is_security_proxied_or_harmless(unproxied_person))
140
141 def test_is_security_proxied_or_harmless__sequence_harmless_content(self):
142- # is_security_proxied_or_harmless() checks all elements
143- # of a sequence. If all elements are harmless, so is the
144- # sequence.
145+ # is_security_proxied_or_harmless() checks all elements of a sequence
146+ # (including set and frozenset). If all elements are harmless, so is
147+ # the sequence.
148 proxied_person = self.factory.makePerson()
149 self.assertTrue(
150 is_security_proxied_or_harmless([1, '2', proxied_person]))
151+ self.assertTrue(
152+ is_security_proxied_or_harmless(
153+ set([1, '2', proxied_person])))
154+ self.assertTrue(
155+ is_security_proxied_or_harmless(
156+ frozenset([1, '2', proxied_person])))
157
158 def test_is_security_proxied_or_harmless__sequence_harmful_content(self):
159- # is_security_proxied_or_harmless() checks all elements
160- # of a sequence. If at least one element is harmful, so is the
161- # sequence.
162+ # is_security_proxied_or_harmless() checks all elements of a sequence
163+ # (including set and frozenset). If at least one element is harmful,
164+ # so is the sequence.
165 unproxied_person = removeSecurityProxy(self.factory.makePerson())
166 self.assertFalse(
167 is_security_proxied_or_harmless([1, '2', unproxied_person]))
168+ self.assertFalse(
169+ is_security_proxied_or_harmless(
170+ set([1, '2', unproxied_person])))
171+ self.assertFalse(
172+ is_security_proxied_or_harmless(
173+ frozenset([1, '2', unproxied_person])))
174+
175+ def test_is_security_proxied_or_harmless__mapping_harmless_content(self):
176+ # is_security_proxied_or_harmless() checks all keys and values in a
177+ # mapping. If all elements are harmless, so is the mapping.
178+ proxied_person = self.factory.makePerson()
179+ self.assertTrue(
180+ is_security_proxied_or_harmless({1: proxied_person}))
181+ self.assertTrue(
182+ is_security_proxied_or_harmless({proxied_person: 1}))
183+
184+ def test_is_security_proxied_or_harmless__mapping_harmful_content(self):
185+ # is_security_proxied_or_harmless() checks all keys and values in a
186+ # mapping. If at least one element is harmful, so is the mapping.
187+ unproxied_person = removeSecurityProxy(self.factory.makePerson())
188+ self.assertFalse(
189+ is_security_proxied_or_harmless({1: unproxied_person}))
190+ self.assertFalse(
191+ is_security_proxied_or_harmless({unproxied_person: 1}))
192
193
194 def test_suite():