From 6fdaeb595cff999d4ef06ab23567940b601fb7ac Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Thu, 04 Oct 2012 09:50:26 +0000 Subject: Restrict client request with layers --- diff --git a/sugar_network/local/__init__.py b/sugar_network/local/__init__.py index c143c60..5fed679 100644 --- a/sugar_network/local/__init__.py +++ b/sugar_network/local/__init__.py @@ -84,6 +84,10 @@ hub_root = Option( 'from file:// url', default='/usr/share/sugar-network/hub') +layers = Option( + 'space separated list of layers to restrict Sugar Network content by', + default=[], type_cast=Option.list_cast, type_repr=Option.list_repr) + def path(*args): """Calculate a path from the root. diff --git a/sugar_network/local/mounts.py b/sugar_network/local/mounts.py index cb936a7..7c53121 100644 --- a/sugar_network/local/mounts.py +++ b/sugar_network/local/mounts.py @@ -314,6 +314,8 @@ class RemoteMount(ad.CommandsProcessor, _Mount, _ProxyCommands): try: return ad.CommandsProcessor.call(self, request, response) except ad.CommandNotFound: + if local.layers.value and 'layer' not in request: + request['layer'] = local.layers.value return self._client.call(request, response) return self._proxy_call(request, response, super_call) diff --git a/tests/__init__.py b/tests/__init__.py index c95f45a..725508a 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -84,6 +84,7 @@ class Test(unittest.TestCase): local.server_mode.value = False local.mounts_root.value = None local.ipc_port.value = 5101 + local.layers.value = None mounts_monitor.stop() mounts_monitor._COMPLETE_MOUNT_TIMEOUT = .1 stats.stats_root.value = tmpdir + '/stats' diff --git a/tests/units/remote_mount.py b/tests/units/remote_mount.py index 3d58a65..7897b4d 100755 --- a/tests/units/remote_mount.py +++ b/tests/units/remote_mount.py @@ -312,6 +312,88 @@ class RemoteMountTest(tests.Test): remote.get(['artifact', guid], reply=['data'])) self.assertRaises(urllib2.HTTPError, urllib2.urlopen, blob_url) + def test_RestrictLayers(self): + self.start_ipc_and_restful_server() + remote = IPCClient(mountpoint='/') + + context = remote.post(['context'], { + 'type': 'activity', + 'title': 'title', + 'summary': 'summary', + 'description': 'description', + }) + impl = remote.post(['implementation'], { + 'context': context, + 'license': 'GPLv3+', + 'version': '1', + 'date': 0, + 'stability': 'stable', + 'notes': '', + 'spec': {'*-*': {}}, + }) + + self.assertEqual( + [{'layer': ['public']}], + remote.get(['context'], reply='layer')['result']) + self.assertEqual( + [], + remote.get(['context'], reply='layer', layer='foo')['result']) + self.assertEqual( + [{'layer': ['public']}], + remote.get(['context'], reply='layer', layer='public')['result']) + + self.assertEqual( + [{'layer': ['public']}], + remote.get(['implementation'], reply='layer')['result']) + self.assertEqual( + [], + remote.get(['implementation'], reply='layer', layer='foo')['result']) + self.assertEqual( + [{'layer': ['public']}], + remote.get(['implementation'], reply='layer', layer='public')['result']) + + self.assertEqual( + [{'stability': 'stable', 'guid': impl, 'arch': '*-*', 'version': '1'}], + remote.get(['context', context], cmd='feed')) + self.assertEqual( + [], + remote.get(['context', context], cmd='feed', layer='foo')) + self.assertEqual( + [{'stability': 'stable', 'guid': impl, 'arch': '*-*', 'version': '1'}], + remote.get(['context', context], cmd='feed', layer='public')) + + local.layers.value = ['foo', 'bar'] + + self.assertEqual( + [], + remote.get(['context'], reply='layer')['result']) + self.assertEqual( + [], + remote.get(['context'], reply='layer', layer='foo')['result']) + self.assertEqual( + [{'layer': ['public']}], + remote.get(['context'], reply='layer', layer='public')['result']) + + self.assertEqual( + [], + remote.get(['implementation'], reply='layer')['result']) + self.assertEqual( + [], + remote.get(['implementation'], reply='layer', layer='foo')['result']) + self.assertEqual( + [{'layer': ['public']}], + remote.get(['implementation'], reply='layer', layer='public')['result']) + + self.assertEqual( + [], + remote.get(['context', context], cmd='feed')) + self.assertEqual( + [], + remote.get(['context', context], cmd='feed', layer='foo')) + self.assertEqual( + [{'stability': 'stable', 'guid': impl, 'arch': '*-*', 'version': '1'}], + remote.get(['context', context], cmd='feed', layer='public')) + if __name__ == '__main__': tests.main() -- cgit v0.9.1