* luci/libs/sys: fix password authentication for users with disabled password and...
[project/luci.git] / libs / sys / luasrc / sys.lua
index ea55ed5..c271dee 100644 (file)
@@ -35,7 +35,7 @@ luci.util   = require "luci.util"
 luci.fs     = require "luci.fs"
 luci.ip     = require "luci.ip"
 
-local tonumber, ipairs, pairs = tonumber, ipairs, pairs
+local tonumber, ipairs, pairs, pcall = tonumber, ipairs, pairs, pcall
 
 
 --- LuCI Linux and POSIX system utilities.
@@ -259,6 +259,38 @@ function net.arptable()
        return _parse_delimited_table(io.lines("/proc/net/arp"), "%s%s+")
 end
 
+--- Returns conntrack information
+-- @return     Table with the currently tracked IP connections
+function net.conntrack()
+       local connt = {}
+       if luci.fs.access("/proc/net/nf_conntrack") then
+               for line in io.lines("/proc/net/nf_conntrack") do
+                       local entry = _parse_mixed_record(line, " +")
+                       entry.layer3 = entry[1]
+                       entry.layer4 = entry[2]
+                       for i=1, #entry do
+                               entry[i] = nil
+                       end
+
+                       connt[#connt+1] = entry
+               end
+       elseif luci.fs.access("/proc/net/ip_conntrack") then
+               for line in io.lines("/proc/net/ip_conntrack") do
+                       local entry = _parse_mixed_record(line, " +")
+                       entry.layer3 = "ipv4"
+                       entry.layer4 = entry[1]
+                       for i=1, #entry do
+                               entry[i] = nil
+                       end
+
+                       connt[#connt+1] = entry
+               end
+       else
+               return nil
+       end
+       return connt
+end
+
 --- Determine the current default route.
 -- @return     Table with the properties of the current default route.
 --                     The following fields are defined:
@@ -459,8 +491,12 @@ function user.checkpasswd(username, password)
                        end
                end
 
-               return (pwd == posix.crypt(password, pwd))
+               if pwd and #pwd > 0 and password and #password > 0 then
+                       return (pwd == posix.crypt(password, pwd))
+               end
        end
+
+       return false
 end
 
 --- Change the password of given user.
@@ -547,7 +583,8 @@ function init.names()
 end
 
 --- Test whether the given init script is enabled
--- @return     Boolean indicating whether init is enabled
+-- @param name Name of the init script
+-- @return             Boolean indicating whether init is enabled
 function init.enabled(name)
        if luci.fs.access(init.dir..name) then
                return ( call(init.dir..name.." enabled") == 0 )
@@ -556,24 +593,27 @@ function init.enabled(name)
 end
 
 --- Get the index of he given init script
--- @return     Numeric index value
+-- @param name Name of the init script
+-- @return             Numeric index value
 function init.index(name)
        if luci.fs.access(init.dir..name) then
-               return call("source "..init.dir..name.." && exit $START")
+               return call("source "..init.dir..name.."; exit $START")
        end
 end
 
 --- Enable the given init script
--- @return     Boolean indicating success
+-- @param name Name of the init script
+-- @return             Boolean indicating success
 function init.enable(name)
        if luci.fs.access(init.dir..name) then
-               return ( call(init.dir..name.." enable") == 0 )
+               return ( call(init.dir..name.." enable") == 1 )
        end
 end
 
 --- Disable the given init script
--- @return     Boolean indicating success
-function init.enable(name)
+-- @param name Name of the init script
+-- @return             Boolean indicating success
+function init.disable(name)
        if luci.fs.access(init.dir..name) then
                return ( call(init.dir..name.." disable") == 0 )
        end
@@ -610,11 +650,12 @@ function _parse_delimited_table(iter, delimiter)
        return data
 end
 
-function _parse_mixed_record(cnt)
+function _parse_mixed_record(cnt, delimiter)
+       delimiter = delimiter or "  "
        local data = {}
 
        for i, l in pairs(luci.util.split(luci.util.trim(cnt), "\n")) do
-       for j, f in pairs(luci.util.split(luci.util.trim(l), "  ")) do
+               for j, f in pairs(luci.util.split(luci.util.trim(l), delimiter, nil, true)) do
                local k, x, v = f:match('([^%s][^:=]+) *([:=]*) *"*([^\n"]*)"*')
 
             if k then