diff options
| author | John Estabrook <jestabro@vyos.io> | 2025-09-05 10:03:39 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-05 10:03:39 -0500 |
| commit | a4b72d3839f2ee05456b0677a8f2cc27c04a9423 (patch) | |
| tree | 0dcf5a3e7cff03ce625f8b84e60afc11e98fbab8 /src/conf_mode | |
| parent | c99f1c05879374a47b8981144cb0163bd3b69a88 (diff) | |
| parent | dd431104c9c5be1db6dc9e448d4802c2cce7012b (diff) | |
| download | vyos-1x-a4b72d3839f2ee05456b0677a8f2cc27c04a9423.tar.gz vyos-1x-a4b72d3839f2ee05456b0677a8f2cc27c04a9423.zip | |
Merge pull request #4651 from l0crian1/fw-empty-nodes
T7366: Firewall rules allow empty nodes
Diffstat (limited to 'src/conf_mode')
| -rwxr-xr-x | src/conf_mode/firewall.py | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/conf_mode/firewall.py b/src/conf_mode/firewall.py index 90fdded99..cfccc88da 100755 --- a/src/conf_mode/firewall.py +++ b/src/conf_mode/firewall.py @@ -196,6 +196,42 @@ def verify_jump_target(firewall, hook, jump_target, family, recursive=False): targets_seen.append(target) +def is_node_empty(rule_conf): + is_empty_list = [] + is_empty_list.append([ + ['add_address_to_group'], + ['connection_status'], + ['destination'], + ['destination', 'group'], + ['destination', 'geoip'], + ['fragment'], + ['gre'], + ['gre', 'flags'], + ['hop_limit'], + ['icmp'], + ['icmpv6'], + ['inbound_interface'], + ['ipsec'], + ['limit'], + ['log_options'], + ['outbound_interface'], + ['set'], + ['source'], + ['source', 'group'], + ['source', 'geoip'], + ['tcp'], + ['tcp', 'flags'], + ['time'], + ['ttl'], + ['vlan'] + ]) + + for node in is_empty_list[0]: + if dict_search_args(rule_conf, *node) == {}: + return True, node + + return False, None + def verify_rule(firewall, family, hook, priority, rule_id, rule_conf): if 'action' not in rule_conf: raise ConfigError('Rule action must be defined') @@ -244,6 +280,11 @@ def verify_rule(firewall, family, hook, priority, rule_id, rule_conf): if {'match_frag', 'match_non_frag'} <= set(rule_conf['fragment']): raise ConfigError('Cannot specify both "match-frag" and "match-non-frag"') + node_empty, node_name = is_node_empty(rule_conf) + if node_empty: + tmp = ' '.join(node_name).replace('_', '-') + raise ConfigError(f'Configuration node {tmp} may not be empty') + if 'limit' in rule_conf: if 'rate' in rule_conf['limit']: rate_int = re.sub(r'\D', '', rule_conf['limit']['rate']) |
