diff --git a/varlink/scanner.py b/varlink/scanner.py index b9c98e1..f1c766b 100644 --- a/varlink/scanner.py +++ b/varlink/scanner.py @@ -291,7 +291,7 @@ def filter_params(self, parent_name, varlink_type, _namespaced, args, kwargs): ) return args else: - InvalidParameter(parent_name) + raise InvalidParameter(parent_name) if isinstance(varlink_type, _CustomType): # print("CustomType", varlink_type.name) @@ -307,7 +307,8 @@ def filter_params(self, parent_name, varlink_type, _namespaced, args, kwargs): return args if isinstance(varlink_type, _Enum) and isinstance(args, str): - # print("Returned str:", args) + if args not in varlink_type.fields: + raise InvalidParameter(parent_name) return args if isinstance(varlink_type, _Array): diff --git a/varlink/tests/test_scanner.py b/varlink/tests/test_scanner.py index cb4e95e..4beee24 100755 --- a/varlink/tests/test_scanner.py +++ b/varlink/tests/test_scanner.py @@ -121,3 +121,19 @@ def test_interfacename(self): self.assertIsNotNone( varlink.Interface("interface xn--c1yn36f.xn--c1yn36f.xn--c1yn36f\nmethod F()->()").name ) + + def test_bad_types(self): + interface = varlink.Interface(""" + interface org.example.testerrors + type TypeEnum ( a, b, c ) + type TypeDict (dict: [string]string) + + method Foo(param: TypeEnum) -> () + method Bar(param: TypeDict) -> () + """) + foo = interface.get_method("Foo") + with self.assertRaises(varlink.InvalidParameter): + interface.filter_params("test.call", foo.in_type, False, (), {"param": "d"}) + bar = interface.get_method("Bar") + with self.assertRaises(varlink.InvalidParameter): + interface.filter_params("test.call", bar.in_type, False, (), {"param": {"dict": [1, 2, 3]}})