diff --git a/warden_server/test_warden_server.py b/warden_server/test_warden_server.py index fddf0a0e7bcdd66e604e2979d6f51b29e176623b..4926f6c8c55edf7692ab0f098286ae7ac5776945 100755 --- a/warden_server/test_warden_server.py +++ b/warden_server/test_warden_server.py @@ -200,12 +200,17 @@ class Warden3ServerTest(unittest.TestCase): ("/sendEvents?secret=abc", "", "200 OK", ['{"saved": 0}']), ("/sendEvents?secret=abc", "{'test': 'true'}", "400 Deserialization error.", None), ("/sendEvents?secret=abc", '{"test": "true"}', "400 List of events expected.", None), - ("/sendEvents?secret=abc", '[{"test": "true"}]', "422 Event does not bear valid Node attribute", None), - ("/sendEvents?secret=abc", '[{"Node": ["test", "test2"]}]', "422 Event does not bear valid Node attribute", None), - ("/sendEvents?secret=abc", '[{"Node": ["Name", "test"]}]', "422 Event does not bear valid Node attribute", None), - ("/sendEvents?secret=abc", '[{"Node": [{"Name"}]}]', "400 Deserialization error.", None), - ("/sendEvents?secret=abc", '[{"Node": [{"Name": "test"}]}]', "422 Node does not correspond with saving client", None), - ("/sendEvents?secret=abc", '[{"Node": [{"Name": "cz.cesnet.warden3test"}]}]', "200 OK", ['{"saved": 1}']), + ("/sendEvents?secret=abc", '[{"test": "true"}]', "422 Missing IDEA ID", None), + ("/sendEvents?secret=abc", '[{"test": "true", "ID": "120820201142"}]', "422 Event does not bear valid Node attribute", None), + ("/sendEvents?secret=abc", '[{"Node": ["test", "test2"], "ID": "120820201142"}]', "422 Event does not bear valid Node attribute", None), + ("/sendEvents?secret=abc", '[{"Node": ["Name", "test"], "ID": "120820201142"}]', "422 Event does not bear valid Node attribute", None), + ("/sendEvents?secret=abc", '[{"Node": [{"Name"}], "ID": "120820201142"}]', "400 Deserialization error.", None), + ("/sendEvents?secret=abc", '[{"Node": [{"Name": "test"}], "ID": "120820201142"}]', "422 Node does not correspond with saving client", None), + ("/sendEvents?secret=abc", '[{"Node": [{"Name": "test"}], "ID": "verylongideaidverylongideaidverylongideaidverylongideaidverylongideaid"}]', "422 The provided event ID is too long", None), + ("/sendEvents?secret=abc", '[{"Node": [{"Name": "cz.cesnet.warden3test"}], "ID": "verylongideaidverylongideaidverylongideaidverylongideaidverylongideaid"}]', "422 The provided event ID is too long", None), + ("/sendEvents?secret=abc", '[{"Node": [{"Name": "cz.cesnet.warden3test"}], "ID": "ideaidcontaininga\\u0000byte"}]', "422 IDEA ID cannot contain null bytes", None), + ("/sendEvents?secret=abc", '[{"Node": [{"Name": "cz.cesnet.warden3test"}], "ID": "verylongideaidverylongideaid\\u0000verylongideaidverylongideaidverylongideaid"}]', "422 Multiple errors", None), + ("/sendEvents?secret=abc", '[{"Node": [{"Name": "cz.cesnet.warden3test"}], "ID": "120820201142"}]', "200 OK", ['{"saved": 1}']), ] for query, payload, expected_status, expected_response in tests: with self.subTest(query=query, payload=payload, expected_status=expected_status, expected_response=expected_response): diff --git a/warden_server/warden_server.py b/warden_server/warden_server.py index 6c1b86b899c8adf29e911dd106dd8dbdb3b82b1e..3e84cb829d9c1ce73db4c4407b2ca9d1f8ca8eba 100755 --- a/warden_server/warden_server.py +++ b/warden_server/warden_server.py @@ -1743,6 +1743,27 @@ class WardenHandler(ObjectBase): ] return [] + def check_idea_id(self, event, event_indx): + id_length_limit = 64 + try: + id_ = event["ID"] + except (KeyError, TypeError, ValueError): + return [ErrorMessage(422, "Missing IDEA ID", {event_indx})] + if not isinstance(id_, unicode) or len(id_) == 0: + return [ErrorMessage(422, "The provided IDEA ID is invalid", {event_indx})] + + errors = [] + if len(id_) > id_length_limit: + errors.append( + ErrorMessage( + 422, "The provided event ID is too long", + {event_indx}, id_length_limit=id_length_limit + ) + ) + if '\x00' in id_: + errors.append(ErrorMessage(422, "IDEA ID cannot contain null bytes", {event_indx})) + return errors + def add_errors(self, errs_to_add): for err in errs_to_add: self.errs.setdefault((err.error, err.message, err.unique_id), err).events.update(err.events) @@ -1774,6 +1795,11 @@ class WardenHandler(ObjectBase): self.add_errors(v_errs) continue + idea_id_errs = self.check_idea_id(event, i) + if idea_id_errs: + self.add_errors(idea_id_errs) + continue + node_errs = self.check_node(event, i, self.req.client.name) if node_errs: self.add_errors(node_errs)