luci-base: firewall fixes
authorPaul Donald <newtwen+github@gmail.com>
Thu, 19 Feb 2026 04:11:37 +0000 (05:11 +0100)
committerPaul Donald <newtwen+github@gmail.com>
Fri, 20 Feb 2026 00:29:43 +0000 (01:29 +0100)
Firewall.newZone() treated this.getZone(name)
(an async function returning a Promise) as if it
were synchronous, causing the while loop never
to terminate. Although, it's not used anywhere.

Sort in getZones was not producing expected results.
Now use a localeCompare which returns an integer result
for sorting purposes. The previous comparison
returned a boolean, but for sorting to work, it must
return either -1 to go before, +1 to go after, or 0 for
equality.

Rule and Redirect shall also have a sid.

Signed-off-by: Paul Donald <newtwen+github@gmail.com>
modules/luci-base/htdocs/luci-static/resources/firewall.js

index 45eca100458ce200a85675ef7f28b44d8e455f23..8db4268daede3bd72bf8dd94d7e795a9051f4000 100644 (file)
@@ -95,11 +95,11 @@ Firewall = L.Class.extend({
        },
 
        newZone: function() {
-               return initFirewallState().then(L.bind(function() {
+               return initFirewallState().then(L.bind(async function() {
                        var name = 'newzone',
                            count = 1;
 
-                       while (this.getZone(name) != null)
+                       while ((await this.getZone(name)) != null)
                                name = 'newzone%d'.format(++count);
 
                        return this.addZone(name);
@@ -140,7 +140,7 @@ Firewall = L.Class.extend({
                        for (let s of sections)
                                zones.push(new Zone(s['.name']));
 
-                       zones.sort(function(a, b) { return a.getName() > b.getName() });
+                       zones.sort(function(a, b) { return L.naturalCompare(a.getName() || '', b.getName() || '') });
 
                        return zones;
                });
@@ -546,6 +546,10 @@ Forwarding = AbstractFirewallItem.extend({
 
 
 Rule = AbstractFirewallItem.extend({
+       __init__: function(sid) {
+               this.sid = sid;
+       },
+
        getSource: function() {
                return this.get('src');
        },
@@ -565,6 +569,10 @@ Rule = AbstractFirewallItem.extend({
 
 
 Redirect = AbstractFirewallItem.extend({
+       __init__: function(sid) {
+               this.sid = sid;
+       },
+
        getSource: function() {
                return this.get('src');
        },