Browse Source

Added permission check for creating model at root level

Yentl Van Tendeloo 7 years ago
parent
commit
dfbd40be4f
3 changed files with 61 additions and 17 deletions
  1. 18 15
      bootstrap/core_algorithm.alc
  2. 42 1
      unit/test_all.py
  3. 1 1
      wrappers/modelverse_SCCD.py

+ 18 - 15
bootstrap/core_algorithm.alc

@@ -1170,25 +1170,28 @@ String function cmd_model_add(type : String, name : String, code : String):
 		// Type exists
 		// Type exists
 		if (allow_read(current_user_id, type_id)):
 		if (allow_read(current_user_id, type_id)):
 			// And is readable
 			// And is readable
-			create_folders(current_user_id, get_foldername(name))
-			//TODO check if bottommost existing model was writable by us
-
-			if (get_entry_id(name) == ""):
-				// Model doesn't exist yet
-				Element mm
-				mm = get_full_model(type_id, get_entry_id("formalisms/SimpleClassDiagrams"))
-				if (element_eq(mm, read_root())):
-					return "Type is not typed by formalisms/SimpleClassDiagrams: " + type!
+			if (element_neq(create_folders(current_user_id, get_foldername(name)), read_root())):
+				if (allow_write(current_user_id, get_entry_id(get_foldername(name)))):
+					if (get_entry_id(name) == ""):
+						// Model doesn't exist yet
+						Element mm
+						mm = get_full_model(type_id, get_entry_id("formalisms/SimpleClassDiagrams"))
+						if (element_eq(mm, read_root())):
+							return "Type is not typed by formalisms/SimpleClassDiagrams: " + type!
 
 
-				new_model = compile_model(code, mm)
+						new_model = compile_model(code, mm)
 
 
-				if (is_physical_string(new_model)):
-					return "Compilation error: " + cast_string(new_model)!
+						if (is_physical_string(new_model)):
+							return "Compilation error: " + cast_string(new_model)!
 
 
-				model_create(new_model, name, type_id, "Model")
-				return "Success"!
+						model_create(new_model, name, type_id, "Model")
+						return "Success"!
+					else:
+						return "Model exists: " + name!
+				else:
+					return "Write permission denied to: " + name!
 			else:
 			else:
-				return "Model exists: " + name!
+				return "Write permission denied to: " + name!
 		else:
 		else:
 			return "Read permission denied to: " + type!
 			return "Read permission denied to: " + type!
 	else:
 	else:

+ 42 - 1
unit/test_all.py

@@ -215,8 +215,49 @@ class TestModelverse(unittest.TestCase):
         except ReadPermissionDenied:
         except ReadPermissionDenied:
             pass
             pass
 
 
-    """
+        assert permission_modify("users/user/test/a", "200") == None
+        assert model_list_full("users/user/test") == set([("a", "user", "nobody", "200")])
+
+        # Check that we can read
+        element_list_nice("users/user/test/a")
+        # Check that we can write
+        instantiate("users/user/test/a", "Class")
+
     def test_op_model_add(self):
     def test_op_model_add(self):
+        assert model_list_full("users/user/test") == set([])
+        model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
+        assert model_list_full("users/user/test") == set([("a", "user", "nobody", "200")])
+
+        model_add("users/user/test/b", "formalisms/SimpleClassDiagrams", \
+            """
+            Class A {
+                name = "A"
+            }
+            Class B {
+                name = "B"
+                abstract = True
+            }
+            """)
+
+        assert model_list_full("users/user/test") == set([("a", "user", "nobody", "200"), ("b", "user", "nobody", "200")])
+        lst = element_list_nice("users/user/test/b")
+        assert len(lst) == 2
+        assert {'__id': "A", "__type": "Class", "abstract": None, "constraint": {"AL": ""}, "lower_cardinality": None, "upper_cardinality": None, "name": "A"} in lst
+        assert {'__id': "B", "__type": "Class", "abstract": True, "constraint": {"AL": ""}, "lower_cardinality": None, "upper_cardinality": None, "name": "B"} in lst
+
+        try:
+            model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
+            self.fail()
+        except ModelExists:
+            assert model_list_full("users/user/test") == set([("a", "user", "nobody", "200"), ("b", "user", "nobody", "200")])
+
+        try:
+            model_add("z", "formalisms/SimpleClassDiagrams")
+            self.fail()
+        except WritePermissionDenied:
+            assert model_list_full("users/user/test") == set([("a", "user", "nobody", "200"), ("b", "user", "nobody", "200")])
+
+    """
     def test_op_model_move(self):
     def test_op_model_move(self):
     def test_op_model_delete(self):
     def test_op_model_delete(self):
     def test_op_model_overwrite(self):
     def test_op_model_overwrite(self):

+ 1 - 1
wrappers/modelverse_SCCD.py

@@ -1,7 +1,7 @@
 """
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
 
-Date:   Thu Jun  7 14:01:58 2018
+Date:   Thu Jun  7 15:52:16 2018
 
 
 Model author: Yentl Van Tendeloo
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server
 Model name:   MvK Server