|
|
@@ -27,6 +27,7 @@ from desktop.models import import_saved_beeswax_query, Directory, Document2
|
|
|
|
|
|
from beeswax.models import SavedQuery
|
|
|
from beeswax.design import hql_query
|
|
|
+from useradmin.models import get_default_user_group
|
|
|
|
|
|
|
|
|
class TestDocument2(object):
|
|
|
@@ -83,6 +84,15 @@ class TestDocument2(object):
|
|
|
old_query.delete()
|
|
|
|
|
|
|
|
|
+ def test_get_document(self):
|
|
|
+ doc = Document2.objects.create(name='test_doc', type='query-hive', owner=self.user, data={})
|
|
|
+ self.home_dir.children.add(doc)
|
|
|
+ response = self.client.get('/desktop/api2/doc/get', {'uuid': doc.uuid})
|
|
|
+ data = json.loads(response.content)
|
|
|
+ assert_true('uuid' in data)
|
|
|
+ assert_equal(doc.uuid, data['uuid'])
|
|
|
+
|
|
|
+
|
|
|
def test_directory_create(self):
|
|
|
response = self.client.post('/desktop/api2/doc/mkdir', {'parent_uuid': json.dumps(self.home_dir.uuid), 'name': json.dumps('test_mkdir')})
|
|
|
data = json.loads(response.content)
|
|
|
@@ -187,7 +197,7 @@ class TestDocument2(object):
|
|
|
assert_equal(Document2.TRASH_DIR, data['children'][0]['name'])
|
|
|
|
|
|
|
|
|
- def test_validations(self):
|
|
|
+ def test_validate_name(self):
|
|
|
# Test invalid names
|
|
|
invalid_name = '/invalid'
|
|
|
response = self.client.post('/desktop/api2/doc/mkdir', {'parent_uuid': json.dumps(self.home_dir.uuid), 'name': json.dumps(invalid_name)})
|
|
|
@@ -195,6 +205,8 @@ class TestDocument2(object):
|
|
|
assert_equal(-1, data['status'], data)
|
|
|
assert_true('invalid character' in data['message'])
|
|
|
|
|
|
+
|
|
|
+ def test_validate_same_name_and_parent(self):
|
|
|
# Test error on creating documents with same name and location
|
|
|
test_dir = Directory.objects.create(name='test_dir', owner=self.user, parent_directory=self.home_dir)
|
|
|
response = self.client.post('/desktop/api2/doc/mkdir', {'parent_uuid': json.dumps(self.home_dir.uuid), 'name': json.dumps('test_dir')})
|
|
|
@@ -207,7 +219,10 @@ class TestDocument2(object):
|
|
|
data = json.loads(response.content)
|
|
|
assert_equal(0, data['status'], data)
|
|
|
|
|
|
+
|
|
|
+ def test_validate_immutable_user_directories(self):
|
|
|
# Test that home and Trash directories cannot be recreated or modified
|
|
|
+ test_dir = Directory.objects.create(name='test_dir', owner=self.user, parent_directory=self.home_dir)
|
|
|
response = self.client.post('/desktop/api2/doc/mkdir', {'parent_uuid': json.dumps(test_dir.uuid), 'name': json.dumps(Document2.TRASH_DIR)})
|
|
|
data = json.loads(response.content)
|
|
|
assert_equal(-1, data['status'], data)
|
|
|
@@ -228,4 +243,199 @@ class TestDocument2(object):
|
|
|
})
|
|
|
data = json.loads(response.content)
|
|
|
assert_equal(-1, data['status'], data)
|
|
|
- assert_equal('Cannot create or modify the home or .Trash directory.', data['message'])
|
|
|
+ assert_equal('Cannot create or modify the home or .Trash directory.', data['message'])
|
|
|
+
|
|
|
+
|
|
|
+class TestDocument2Permissions(object):
|
|
|
+
|
|
|
+ def setUp(self):
|
|
|
+ self.client = make_logged_in_client(username="perm_user", groupname="default", recreate=True, is_superuser=False)
|
|
|
+ self.client_not_me = make_logged_in_client(username="not_perm_user", groupname="default", recreate=True, is_superuser=False)
|
|
|
+
|
|
|
+ self.user = User.objects.get(username="perm_user")
|
|
|
+ self.user_not_me = User.objects.get(username="not_perm_user")
|
|
|
+
|
|
|
+ grant_access(self.user.username, self.user.username, "desktop")
|
|
|
+ grant_access(self.user_not_me.username, self.user_not_me.username, "desktop")
|
|
|
+
|
|
|
+ self.default_group = get_default_user_group()
|
|
|
+
|
|
|
+ # This creates the user directories for the new user
|
|
|
+ response = self.client.get('/desktop/api2/docs/')
|
|
|
+ data = json.loads(response.content)
|
|
|
+ assert_equal('/', data['document']['path'], data)
|
|
|
+
|
|
|
+ self.home_dir = Document2.objects.get_home_directory(user=self.user)
|
|
|
+
|
|
|
+
|
|
|
+ def test_default_permissions(self):
|
|
|
+ # Tests that for a new doc by default, read/write perms are set to no users, groups, or all
|
|
|
+ new_doc = Document2.objects.create(name='new_doc', type='query-hive', owner=self.user, data={}, parent_directory=self.home_dir)
|
|
|
+
|
|
|
+ response = self.client.get('/desktop/api2/doc/get', {'uuid': new_doc.uuid})
|
|
|
+ data = json.loads(response.content)
|
|
|
+ assert_equal(new_doc.uuid, data['uuid'], data)
|
|
|
+ assert_true('perms' in data)
|
|
|
+ assert_equal({'read': {'users': [], 'groups': [], 'all': False}, 'write': {'users': [], 'groups': [], 'all': False}},
|
|
|
+ data['perms'])
|
|
|
+
|
|
|
+
|
|
|
+ def test_share_document_read_by_user(self):
|
|
|
+ doc = Document2.objects.create(name='new_doc', type='query-hive', owner=self.user, data={}, parent_directory=self.home_dir)
|
|
|
+
|
|
|
+ # Share read perm by users
|
|
|
+ response = self.client.post("/desktop/api2/doc/share", {
|
|
|
+ 'uuid': json.dumps(doc.uuid),
|
|
|
+ 'data': json.dumps({
|
|
|
+ 'read': {
|
|
|
+ 'user_ids': [
|
|
|
+ self.user.id,
|
|
|
+ self.user_not_me.id
|
|
|
+ ],
|
|
|
+ 'group_ids': [],
|
|
|
+ 'all': False
|
|
|
+ },
|
|
|
+ 'write': {
|
|
|
+ 'user_ids': [],
|
|
|
+ 'group_ids': [],
|
|
|
+ 'all': False
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ assert_equal(0, json.loads(response.content)['status'], response.content)
|
|
|
+ assert_true(doc.can_read(self.user))
|
|
|
+ assert_true(doc.can_write(self.user))
|
|
|
+ assert_true(doc.can_read(self.user_not_me))
|
|
|
+ assert_false(doc.can_write(self.user_not_me))
|
|
|
+
|
|
|
+
|
|
|
+ def test_share_document_read_by_group(self):
|
|
|
+ doc = Document2.objects.create(name='new_doc', type='query-hive', owner=self.user, data={}, parent_directory=self.home_dir)
|
|
|
+
|
|
|
+ response = self.client.post("/desktop/api2/doc/share", {
|
|
|
+ 'uuid': json.dumps(doc.uuid),
|
|
|
+ 'data': json.dumps({
|
|
|
+ 'read': {
|
|
|
+ 'user_ids': [
|
|
|
+ self.user.id
|
|
|
+ ],
|
|
|
+ 'group_ids': [
|
|
|
+ self.default_group.id
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ 'write': {
|
|
|
+ 'user_ids': [],
|
|
|
+ 'group_ids': []
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ assert_equal(0, json.loads(response.content)['status'], response.content)
|
|
|
+ assert_true(doc.can_read(self.user))
|
|
|
+ assert_true(doc.can_write(self.user))
|
|
|
+ assert_true(doc.can_read(self.user_not_me))
|
|
|
+ assert_false(doc.can_write(self.user_not_me))
|
|
|
+
|
|
|
+
|
|
|
+ def test_share_document_write_by_user(self):
|
|
|
+ doc = Document2.objects.create(name='new_doc', type='query-hive', owner=self.user, data={}, parent_directory=self.home_dir)
|
|
|
+
|
|
|
+ # Share write perm by user
|
|
|
+ response = self.client.post("/desktop/api2/doc/share", {
|
|
|
+ 'uuid': json.dumps(doc.uuid),
|
|
|
+ 'data': json.dumps({
|
|
|
+ 'read': {
|
|
|
+ 'user_ids': [
|
|
|
+ self.user.id
|
|
|
+ ],
|
|
|
+ 'group_ids': []
|
|
|
+ },
|
|
|
+ 'write': {
|
|
|
+ 'user_ids': [
|
|
|
+ self.user_not_me.id
|
|
|
+ ],
|
|
|
+ 'group_ids': []
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ assert_equal(0, json.loads(response.content)['status'], response.content)
|
|
|
+ assert_true(doc.can_read(self.user))
|
|
|
+ assert_true(doc.can_write(self.user))
|
|
|
+ assert_true(doc.can_read(self.user_not_me))
|
|
|
+ assert_true(doc.can_write(self.user_not_me))
|
|
|
+
|
|
|
+
|
|
|
+ def test_share_document_write_by_group(self):
|
|
|
+ doc = Document2.objects.create(name='new_doc', type='query-hive', owner=self.user, data={}, parent_directory=self.home_dir)
|
|
|
+
|
|
|
+ # Share write perm by group
|
|
|
+ response = self.client.post("/desktop/api2/doc/share", {
|
|
|
+ 'uuid': json.dumps(doc.uuid),
|
|
|
+ 'data': json.dumps({
|
|
|
+ 'read': {
|
|
|
+ 'user_ids': [
|
|
|
+ self.user.id
|
|
|
+ ],
|
|
|
+ 'group_ids': []
|
|
|
+ },
|
|
|
+ 'write': {
|
|
|
+ 'user_ids': [],
|
|
|
+ 'group_ids': [
|
|
|
+ self.default_group.id
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ assert_equal(0, json.loads(response.content)['status'], response.content)
|
|
|
+ assert_true(doc.can_read(self.user))
|
|
|
+ assert_true(doc.can_write(self.user))
|
|
|
+ assert_true(doc.can_read(self.user_not_me))
|
|
|
+ assert_true(doc.can_write(self.user_not_me))
|
|
|
+
|
|
|
+
|
|
|
+ def test_share_directory(self):
|
|
|
+ # Test that updating the permissions for a directory updates all nested documents accordingly, with file structure:
|
|
|
+ # /
|
|
|
+ # /test_dir
|
|
|
+ # /test_dir/query1.sql
|
|
|
+ # /test_dir/nested_dir
|
|
|
+ # /test_dir/nested_dir/query2.sql
|
|
|
+
|
|
|
+ # All initially owned by self.user
|
|
|
+ parent_dir = Directory.objects.create(name='test_dir', owner=self.user, parent_directory=self.home_dir)
|
|
|
+ child_doc = Document2.objects.create(name='query1.sql', type='query-hive', owner=self.user, data={}, parent_directory=parent_dir)
|
|
|
+ nested_dir = Directory.objects.create(name='nested_dir', owner=self.user, parent_directory=parent_dir)
|
|
|
+ nested_doc = Document2.objects.create(name='query2.sql', type='query-hive', owner=self.user, data={}, parent_directory=nested_dir)
|
|
|
+
|
|
|
+ for doc in [parent_dir, child_doc, nested_dir, nested_doc]:
|
|
|
+ assert_true(doc.can_read(self.user))
|
|
|
+ assert_true(doc.can_write(self.user))
|
|
|
+ assert_false(doc.can_read(self.user_not_me))
|
|
|
+ assert_false(doc.can_write(self.user_not_me))
|
|
|
+
|
|
|
+ # Update parent_dir permissions to grant write permissions to default group
|
|
|
+ response = self.client.post("/desktop/api2/doc/share", {
|
|
|
+ 'uuid': json.dumps(parent_dir.uuid),
|
|
|
+ 'data': json.dumps({
|
|
|
+ 'read': {
|
|
|
+ 'user_ids': [],
|
|
|
+ 'group_ids': []
|
|
|
+ },
|
|
|
+ 'write': {
|
|
|
+ 'user_ids': [],
|
|
|
+ 'group_ids': [
|
|
|
+ self.default_group.id
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ assert_equal(0, json.loads(response.content)['status'], response.content)
|
|
|
+ for doc in [parent_dir, child_doc, nested_dir, nested_doc]:
|
|
|
+ assert_true(doc.can_read(self.user))
|
|
|
+ assert_true(doc.can_write(self.user))
|
|
|
+ assert_true(doc.can_read(self.user_not_me))
|
|
|
+ assert_true(doc.can_write(self.user_not_me))
|