summaryrefslogtreecommitdiff
path: root/src/conf_mode
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2025-09-05 10:03:39 -0500
committerGitHub <noreply@github.com>2025-09-05 10:03:39 -0500
commita4b72d3839f2ee05456b0677a8f2cc27c04a9423 (patch)
tree0dcf5a3e7cff03ce625f8b84e60afc11e98fbab8 /src/conf_mode
parentc99f1c05879374a47b8981144cb0163bd3b69a88 (diff)
parentdd431104c9c5be1db6dc9e448d4802c2cce7012b (diff)
downloadvyos-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-xsrc/conf_mode/firewall.py41
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'])