libs/core: network model fixes
[project/luci.git] / libs / core / luasrc / model / firewall.lua
index 1251fea..c4904eb 100644 (file)
@@ -64,14 +64,31 @@ function commit(self, ...)
        uci_r:load(...)
 end
 
+function get_defaults()
+       return defaults()
+end
+
+function new_zone(self)
+       local name = "newzone"
+       local count = 1
+
+       while self:get_zone(name) do
+               count = count + 1
+               name = "newzone%d" % count
+       end
+
+       return self:add_zone(name)
+end
+
 function add_zone(self, n)
        if _valid_id(n) and not self:get_zone(n) then
+               local d = defaults()
                local z = uci_r:section("firewall", "zone", nil, {
                        name    = n,
                        network = " ",
-                       input   = defaults:input()   or "DROP",
-                       forward = defaults:forward() or "DROP",
-                       output  = defaults:output()  or "DROP"
+                       input   = d:input()   or "DROP",
+                       forward = d:forward() or "DROP",
+                       output  = d:output()  or "DROP"
                })
 
                return z and zone(z)
@@ -315,15 +332,15 @@ function zone.network(self)
 end
 
 function zone.input(self)
-       return self:get("input") or "DROP"
+       return self:get("input") or defaults():input() or "DROP"
 end
 
 function zone.forward(self)
-       return self:get("forward") or "DROP"
+       return self:get("forward") or defaults():forward() or "DROP"
 end
 
 function zone.output(self)
-       return self:get("output") or "DROP"
+       return self:get("output") or defaults():output() or "DROP"
 end
 
 function zone.add_network(self, net)
@@ -339,11 +356,8 @@ function zone.add_network(self, net)
 
                nets[#nets+1] = net
 
-               if #nets > 0 then
-                       self:set("network", table.concat(nets, " "))
-               else
-                       self:set("network", " ")
-               end
+               _M:del_network(net)
+               self:set("network", table.concat(nets, " "))
        end
 end
 
@@ -375,6 +389,10 @@ function zone.get_networks(self)
        return nets
 end
 
+function zone.clear_networks(self)
+       self:set("network", " ")
+end
+
 function zone.get_forwardings_by(self, what)
        local name = self:name()
        local forwards = { }
@@ -399,7 +417,7 @@ function zone.add_forwarding_to(self, dest)
                end
        end
 
-       if not exist and dest ~= self:name() then
+       if not exist and dest ~= self:name() and _valid_id(dest) then
                local s = uci_r:section("firewall", "forwarding", nil, {
                        src     = self:name(),
                        dest    = dest
@@ -419,7 +437,7 @@ function zone.add_forwarding_from(self, src)
                end
        end
 
-       if not exist and src ~= self:name() then
+       if not exist and src ~= self:name() and _valid_id(src) then
                local s = uci_r:section("firewall", "forwarding", nil, {
                        src     = src,
                        dest    = self:name()
@@ -432,11 +450,9 @@ end
 function zone.del_forwardings_by(self, what)
        local name = self:name()
 
-       uci_r:foreach("firewall", "forwarding",
+       uci_r:delete_all("firewall", "forwarding",
                function(s)
-                       if s.src and s.dest and s[what] == name then
-                               uci_r:delete("firewall", s['.name'])
-                       end
+                       return (s.src and s.dest and s[what] == name)
                end)
 end