diff --git a/irrd/rpsl/fields.py b/irrd/rpsl/fields.py index 2456ebc9d..d2ce3fa06 100644 --- a/irrd/rpsl/fields.py +++ b/irrd/rpsl/fields.py @@ -465,10 +465,15 @@ def parse_set_name(prefixes: List[str], value: str, messages: RPSLParserMessages output_components: List[str] = [] prefix_display = '/'.join(prefixes) + if strict_validation and len(input_components) > 5: + messages.error(f'Set names can have a maximum of five components.') + return None + if strict_validation and not any([c.upper().startswith(tuple(prefixes)) for c in input_components]): messages.error(f"Invalid set name {value}: at least one component must be " f"an actual set name (i.e. start with {prefix_display})") return None + for component in input_components: if strict_validation and component.upper() in reserved_words: messages.error(f"Invalid set name {value}: component {component} is a reserved word") diff --git a/irrd/rpsl/tests/test_fields.py b/irrd/rpsl/tests/test_fields.py index 222dc52b8..c42bc2b58 100644 --- a/irrd/rpsl/tests/test_fields.py +++ b/irrd/rpsl/tests/test_fields.py @@ -249,14 +249,17 @@ def test_validate_set_name_field(): "Set name AS01:AS-3 was reformatted as AS1:AS-3" ] + long_set = "AS1:AS-B:AS-C:AS-D:AS-E:AS-F" assert_validation_err("at least one component must be an actual set name", field.parse, "AS1",) assert_validation_err("at least one component must be an actual set name", field.parse, "AS1:AS3") assert_validation_err("not a valid AS number, nor does it start with AS-", field.parse, "AS1:AS-FOO:RS-FORBIDDEN") assert_validation_err("not a valid AS number nor a valid set name", field.parse, ":AS-FOO") assert_validation_err("not a valid AS number nor a valid set name", field.parse, "AS-FOO:") + assert_validation_err("can have a maximum of five components", field.parse, long_set) assert_validation_err("reserved word", field.parse, "AS1:AS-ANY") assert field.parse("AS-ANY", messages, strict_validation=False).value == "AS-ANY" + assert field.parse(long_set, messages, strict_validation=False).value == long_set field = RPSLSetNameField(prefix="RS") messages = RPSLParserMessages()