File 0004-fix_rich_source_address_with_netmask.patch of Package firewalld.29803

commit 3809fef17dc779052a3f050041fe90e3599f35be
commit 9e9f94061b129e22e8c6fc2f8985d782bfe09689
commit e635bdffa630c827ff0ed2fc2bb201d560631be0
Author: Eric Garver <eric@garver.life>
Date:   Wed Sep 15 14:38:28 2021 -0400

    fix(nftables): rich: source address with netmask
    test(rich): source address with netmask
    test(zone): source with netmask

---
 src/firewall/core/nftables.py       |  5 +++--
 src/tests/cli/firewall-cmd.at       |  1 +
 src/tests/regression/regression.at  |  1 +
 src/tests/regression/rhbz1917766.at | 25 +++++++++++++++++++++++++
 4 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/src/firewall/core/nftables.py b/src/firewall/core/nftables.py
index ff077ad..f3b50c0 100644
--- a/src/firewall/core/nftables.py
+++ b/src/firewall/core/nftables.py
@@ -22,6 +22,7 @@ from __future__ import absolute_import
 
 import copy
 import json
+import ipaddress
 
 from firewall.core.logger import log
 from firewall.functions import check_mac, getPortRange, normalizeIP6, \
@@ -1213,8 +1214,8 @@ class nftables(object):
                 family = "ip"
             elif check_address("ipv4", address):
                 family = "ip"
-                addr_len = address.split("/")
-                address = {"prefix": {"addr": addr_len[0], "len": int(addr_len[1])}}
+                normalized_address = ipaddress.IPv4Network(address, strict=False)
+                address = {"prefix": {"addr": normalized_address.network_address.compressed, "len": normalized_address.prefixlen}}
             elif check_single_address("ipv6", address):
                 family = "ip6"
                 address = normalizeIP6(address)
diff --git a/src/tests/cli/firewall-cmd.at b/src/tests/cli/firewall-cmd.at
index 67af8a1..059fc98 100644
--- a/src/tests/cli/firewall-cmd.at
+++ b/src/tests/cli/firewall-cmd.at
@@ -214,6 +214,7 @@ sources: $1
 
     check_zone_source([1.2.3.4])
     check_zone_source([192.168.1.0/24])
+    check_zone_source([192.168.1.1/255.255.255.0])
     IF_HOST_SUPPORTS_IPV6_RULES([
     check_zone_source([3ffe:501:ffff::/64])
     check_zone_source([dead:beef::babe])
diff --git a/src/tests/regression/regression.at b/src/tests/regression/regression.at
index a90fc37..2fee7ce 100644
--- a/src/tests/regression/regression.at
+++ b/src/tests/regression/regression.at
@@ -38,3 +38,4 @@ m4_include([regression/rhbz1855140.at])
 m4_include([regression/rhbz1871298.at])
 m4_include([regression/rhbz1596304.at])
 m4_include([regression/gh703.at])
+m4_include([regression/rhbz1917766.at])
diff --git a/src/tests/regression/rhbz1917766.at b/src/tests/regression/rhbz1917766.at
new file mode 100644
index 0000000..961d514
--- /dev/null
+++ b/src/tests/regression/rhbz1917766.at
@@ -0,0 +1,25 @@
+FWD_START_TEST([rich rule source with netmask])
+AT_KEYWORDS(rich rhbz1917766)
+
+dnl Note: IPv6 only supports CIDR notation. It does not support address/netmask
+dnl notation.
+
+FWD_CHECK([            --zone public --add-rich-rule='rule family=ipv4 source address="192.168.1.0/255.255.255.0" accept'], 0, [ignore])
+FWD_CHECK([--permanent --zone public --add-rich-rule='rule family=ipv4 source address="192.168.1.0/255.255.255.0" accept'], 0, [ignore])
+
+AT_DATA([./zones/foobar.xml], [dnl
+<?xml version="1.0" encoding="utf-8"?>
+<zone>
+  <short>foobar</short>
+  <description>foobar</description>
+  <rule family="ipv4">
+    <source address="192.168.0.1/255.255.255.240"/>
+    <accept/>
+  </rule>
+</zone>
+])
+FWD_RELOAD()
+FWD_CHECK([--zone foobar --add-interface foobar0], 0, [ignore])
+
+FWD_END_TEST()
+~
openSUSE Build Service is sponsored by