Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@sugarlabs.org>2012-10-04 09:50:26 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2012-10-04 09:50:26 (GMT)
commit6fdaeb595cff999d4ef06ab23567940b601fb7ac (patch)
tree2d84cf4ca32edc0c68d025a59e7fabd02dc510fa
parente7175ecac17ea8604be178394b7b7e30ff0ac075 (diff)
Restrict client request with layers
-rw-r--r--sugar_network/local/__init__.py4
-rw-r--r--sugar_network/local/mounts.py2
-rw-r--r--tests/__init__.py1
-rwxr-xr-xtests/units/remote_mount.py82
4 files changed, 89 insertions, 0 deletions
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()