Skip to content
Snippets Groups Projects
Commit 45e1029c authored by Jakub Maloštík's avatar Jakub Maloštík
Browse files

Add IDEA ID checking

parent 683d586a
No related branches found
No related tags found
No related merge requests found
...@@ -200,12 +200,17 @@ class Warden3ServerTest(unittest.TestCase): ...@@ -200,12 +200,17 @@ class Warden3ServerTest(unittest.TestCase):
("/sendEvents?secret=abc", "", "200 OK", ['{"saved": 0}']), ("/sendEvents?secret=abc", "", "200 OK", ['{"saved": 0}']),
("/sendEvents?secret=abc", "{'test': 'true'}", "400 Deserialization error.", None), ("/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"}', "400 List of events expected.", None),
("/sendEvents?secret=abc", '[{"test": "true"}]', "422 Event does not bear valid Node attribute", None), ("/sendEvents?secret=abc", '[{"test": "true"}]', "422 Missing IDEA ID", None),
("/sendEvents?secret=abc", '[{"Node": ["test", "test2"]}]', "422 Event does not bear valid Node attribute", None), ("/sendEvents?secret=abc", '[{"test": "true", "ID": "120820201142"}]', "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": ["test", "test2"], "ID": "120820201142"}]', "422 Event does not bear valid Node attribute", None),
("/sendEvents?secret=abc", '[{"Node": [{"Name"}]}]', "400 Deserialization error.", None), ("/sendEvents?secret=abc", '[{"Node": ["Name", "test"], "ID": "120820201142"}]', "422 Event does not bear valid Node attribute", None),
("/sendEvents?secret=abc", '[{"Node": [{"Name": "test"}]}]', "422 Node does not correspond with saving client", None), ("/sendEvents?secret=abc", '[{"Node": [{"Name"}], "ID": "120820201142"}]', "400 Deserialization error.", None),
("/sendEvents?secret=abc", '[{"Node": [{"Name": "cz.cesnet.warden3test"}]}]', "200 OK", ['{"saved": 1}']), ("/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: for query, payload, expected_status, expected_response in tests:
with self.subTest(query=query, payload=payload, expected_status=expected_status, expected_response=expected_response): with self.subTest(query=query, payload=payload, expected_status=expected_status, expected_response=expected_response):
......
...@@ -1743,6 +1743,27 @@ class WardenHandler(ObjectBase): ...@@ -1743,6 +1743,27 @@ class WardenHandler(ObjectBase):
] ]
return [] 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): def add_errors(self, errs_to_add):
for err in errs_to_add: for err in errs_to_add:
self.errs.setdefault((err.error, err.message, err.unique_id), err).events.update(err.events) self.errs.setdefault((err.error, err.message, err.unique_id), err).events.update(err.events)
...@@ -1774,6 +1795,11 @@ class WardenHandler(ObjectBase): ...@@ -1774,6 +1795,11 @@ class WardenHandler(ObjectBase):
self.add_errors(v_errs) self.add_errors(v_errs)
continue 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) node_errs = self.check_node(event, i, self.req.client.name)
if node_errs: if node_errs:
self.add_errors(node_errs) self.add_errors(node_errs)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment