Forráskód Böngészése

Added permission check for creating model at root level

Yentl Van Tendeloo 7 éve
szülő
commit
dfbd40be4f
3 módosított fájl, 61 hozzáadás és 17 törlés
  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
 		if (allow_read(current_user_id, type_id)):
 			// 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:
-				return "Model exists: " + name!
+				return "Write permission denied to: " + name!
 		else:
 			return "Read permission denied to: " + type!
 	else:

+ 42 - 1
unit/test_all.py

@@ -215,8 +215,49 @@ class TestModelverse(unittest.TestCase):
         except ReadPermissionDenied:
             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):
+        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_delete(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)
 
-Date:   Thu Jun  7 14:01:58 2018
+Date:   Thu Jun  7 15:52:16 2018
 
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server