luci-base: firewall fixes

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>
This commit is contained in:
Paul Donald
2026-02-19 05:11:37 +01:00
parent c7a778719f
commit 7f2614caec

View 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');
},