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
=== modified file 'lib/lp/testing/factory.py'
--- lib/lp/testing/factory.py 2010-10-14 12:57:25 +0000
+++ lib/lp/testing/factory.py 2010-10-15 13:56:52 +0000
@@ -33,7 +33,10 @@
33 make_msgid,33 make_msgid,
34 )34 )
35from itertools import count35from itertools import count
36from operator import isSequenceType36from operator import (
37 isMappingType,
38 isSequenceType,
39 )
37import os40import os
38from random import randint41from random import randint
39from StringIO import StringIO42from StringIO import StringIO
@@ -237,17 +240,13 @@
237from lp.soyuz.interfaces.component import IComponentSet240from lp.soyuz.interfaces.component import IComponentSet
238from lp.soyuz.interfaces.packageset import IPackagesetSet241from lp.soyuz.interfaces.packageset import IPackagesetSet
239from lp.soyuz.interfaces.processor import IProcessorFamilySet242from lp.soyuz.interfaces.processor import IProcessorFamilySet
240from lp.soyuz.interfaces.publishing import (243from lp.soyuz.interfaces.publishing import IPublishingSet
241 IPublishingSet,
242 )
243from lp.soyuz.interfaces.section import ISectionSet244from lp.soyuz.interfaces.section import ISectionSet
244from lp.soyuz.model.files import (245from lp.soyuz.model.files import (
245 BinaryPackageFile,246 BinaryPackageFile,
246 SourcePackageReleaseFile,247 SourcePackageReleaseFile,
247 )248 )
248from lp.soyuz.model.packagediff import (249from lp.soyuz.model.packagediff import PackageDiff
249 PackageDiff,
250 )
251from lp.soyuz.model.processor import ProcessorFamilySet250from lp.soyuz.model.processor import ProcessorFamilySet
252from lp.testing import (251from lp.testing import (
253 ANONYMOUS,252 ANONYMOUS,
@@ -1844,22 +1843,6 @@
1844 expires=expires, restricted=restricted)1843 expires=expires, restricted=restricted)
1845 return library_file_alias1844 return library_file_alias
18461845
1847 def makePackageDiff(self, from_spr=None, to_spr=None):
1848 """Make a completed package diff."""
1849 if from_spr is None:
1850 from_spr = self.makeSourcePackageRelease()
1851 if to_spr is None:
1852 to_spr = self.makeSourcePackageRelease()
1853
1854 diff = from_spr.requestDiffTo(
1855 from_spr.creator, to_spr)
1856
1857 naked_diff = removeSecurityProxy(diff)
1858 naked_diff.status = PackageDiffStatus.COMPLETED
1859 naked_diff.diff_content = self.makeLibraryFileAlias()
1860 naked_diff.date_fulfilled = UTC_NOW
1861 return diff
1862
1863 def makeDistribution(self, name=None, displayname=None, owner=None,1846 def makeDistribution(self, name=None, displayname=None, owner=None,
1864 members=None, title=None, aliases=None):1847 members=None, title=None, aliases=None):
1865 """Make a new distribution."""1848 """Make a new distribution."""
@@ -3180,9 +3163,17 @@
3180# Some factory methods return simple Python types. We don't add3163# Some factory methods return simple Python types. We don't add
3181# security wrappers for them, as well as for objects created by3164# security wrappers for them, as well as for objects created by
3182# other Python libraries.3165# other Python libraries.
3183unwrapped_types = (3166unwrapped_types = frozenset((
3184 BaseRecipeBranch, DSCFile, InstanceType, MergeDirective2, Message,3167 BaseRecipeBranch,
3185 datetime, int, str, unicode)3168 DSCFile,
3169 InstanceType,
3170 MergeDirective2,
3171 Message,
3172 datetime,
3173 int,
3174 str,
3175 unicode,
3176 ))
31863177
31873178
3188def is_security_proxied_or_harmless(obj):3179def is_security_proxied_or_harmless(obj):
@@ -3193,11 +3184,15 @@
3193 return True3184 return True
3194 if type(obj) in unwrapped_types:3185 if type(obj) in unwrapped_types:
3195 return True3186 return True
3196 if isSequenceType(obj):3187 if isSequenceType(obj) or isinstance(obj, (set, frozenset)):
3197 for element in obj:3188 return all(
3198 if not is_security_proxied_or_harmless(element):3189 is_security_proxied_or_harmless(element)
3199 return False3190 for element in obj)
3200 return True3191 if isMappingType(obj):
3192 return all(
3193 (is_security_proxied_or_harmless(key) and
3194 is_security_proxied_or_harmless(obj[key]))
3195 for key in obj)
3201 return False3196 return False
32023197
32033198
32043199
=== modified file 'lib/lp/testing/tests/test_factory.py'
--- lib/lp/testing/tests/test_factory.py 2010-09-21 18:43:27 +0000
+++ lib/lp/testing/tests/test_factory.py 2010-10-15 13:56:52 +0000
@@ -27,8 +27,6 @@
27from lp.registry.interfaces.sourcepackage import SourcePackageFileType27from lp.registry.interfaces.sourcepackage import SourcePackageFileType
28from lp.registry.interfaces.suitesourcepackage import ISuiteSourcePackage28from lp.registry.interfaces.suitesourcepackage import ISuiteSourcePackage
29from lp.services.worlddata.interfaces.language import ILanguage29from lp.services.worlddata.interfaces.language import ILanguage
30from lp.soyuz.interfaces.binarypackagebuild import IBinaryPackageBuild
31from lp.soyuz.interfaces.binarypackagename import IBinaryPackageName
32from lp.soyuz.enums import (30from lp.soyuz.enums import (
33 BinaryPackageFileType,31 BinaryPackageFileType,
34 BinaryPackageFormat,32 BinaryPackageFormat,
@@ -36,9 +34,9 @@
36 PackagePublishingStatus,34 PackagePublishingStatus,
37 PackageUploadStatus,35 PackageUploadStatus,
38 )36 )
39from lp.soyuz.interfaces.binarypackagerelease import (37from lp.soyuz.interfaces.binarypackagebuild import IBinaryPackageBuild
40 IBinaryPackageRelease,38from lp.soyuz.interfaces.binarypackagename import IBinaryPackageName
41 )39from lp.soyuz.interfaces.binarypackagerelease import IBinaryPackageRelease
42from lp.soyuz.interfaces.files import (40from lp.soyuz.interfaces.files import (
43 IBinaryPackageFile,41 IBinaryPackageFile,
44 ISourcePackageReleaseFile,42 ISourcePackageReleaseFile,
@@ -48,9 +46,7 @@
48 ISourcePackagePublishingHistory,46 ISourcePackagePublishingHistory,
49 PackagePublishingPocket,47 PackagePublishingPocket,
50 )48 )
51from lp.soyuz.interfaces.queue import (49from lp.soyuz.interfaces.queue import IPackageUpload
52 IPackageUpload,
53 )
54from lp.soyuz.interfaces.sourcepackagerelease import ISourcePackageRelease50from lp.soyuz.interfaces.sourcepackagerelease import ISourcePackageRelease
55from lp.testing import TestCaseWithFactory51from lp.testing import TestCaseWithFactory
56from lp.testing.factory import is_security_proxied_or_harmless52from lp.testing.factory import is_security_proxied_or_harmless
@@ -643,20 +639,50 @@
643 self.assertFalse(is_security_proxied_or_harmless(unproxied_person))639 self.assertFalse(is_security_proxied_or_harmless(unproxied_person))
644640
645 def test_is_security_proxied_or_harmless__sequence_harmless_content(self):641 def test_is_security_proxied_or_harmless__sequence_harmless_content(self):
646 # is_security_proxied_or_harmless() checks all elements642 # is_security_proxied_or_harmless() checks all elements of a sequence
647 # of a sequence. If all elements are harmless, so is the643 # (including set and frozenset). If all elements are harmless, so is
648 # sequence.644 # the sequence.
649 proxied_person = self.factory.makePerson()645 proxied_person = self.factory.makePerson()
650 self.assertTrue(646 self.assertTrue(
651 is_security_proxied_or_harmless([1, '2', proxied_person]))647 is_security_proxied_or_harmless([1, '2', proxied_person]))
648 self.assertTrue(
649 is_security_proxied_or_harmless(
650 set([1, '2', proxied_person])))
651 self.assertTrue(
652 is_security_proxied_or_harmless(
653 frozenset([1, '2', proxied_person])))
652654
653 def test_is_security_proxied_or_harmless__sequence_harmful_content(self):655 def test_is_security_proxied_or_harmless__sequence_harmful_content(self):
654 # is_security_proxied_or_harmless() checks all elements656 # is_security_proxied_or_harmless() checks all elements of a sequence
655 # of a sequence. If at least one element is harmful, so is the657 # (including set and frozenset). If at least one element is harmful,
656 # sequence.658 # so is the sequence.
657 unproxied_person = removeSecurityProxy(self.factory.makePerson())659 unproxied_person = removeSecurityProxy(self.factory.makePerson())
658 self.assertFalse(660 self.assertFalse(
659 is_security_proxied_or_harmless([1, '2', unproxied_person]))661 is_security_proxied_or_harmless([1, '2', unproxied_person]))
662 self.assertFalse(
663 is_security_proxied_or_harmless(
664 set([1, '2', unproxied_person])))
665 self.assertFalse(
666 is_security_proxied_or_harmless(
667 frozenset([1, '2', unproxied_person])))
668
669 def test_is_security_proxied_or_harmless__mapping_harmless_content(self):
670 # is_security_proxied_or_harmless() checks all keys and values in a
671 # mapping. If all elements are harmless, so is the mapping.
672 proxied_person = self.factory.makePerson()
673 self.assertTrue(
674 is_security_proxied_or_harmless({1: proxied_person}))
675 self.assertTrue(
676 is_security_proxied_or_harmless({proxied_person: 1}))
677
678 def test_is_security_proxied_or_harmless__mapping_harmful_content(self):
679 # is_security_proxied_or_harmless() checks all keys and values in a
680 # mapping. If at least one element is harmful, so is the mapping.
681 unproxied_person = removeSecurityProxy(self.factory.makePerson())
682 self.assertFalse(
683 is_security_proxied_or_harmless({1: unproxied_person}))
684 self.assertFalse(
685 is_security_proxied_or_harmless({unproxied_person: 1}))
660686
661687
662def test_suite():688def test_suite():