* libs/web: Reworked authentication
This commit is contained in:
parent
2787a7f688
commit
f9fa6d82da
6 changed files with 30 additions and 23 deletions
|
@ -23,6 +23,9 @@ if pcall(require, "uci") and pcall(require, "luci.model.uci") then
|
||||||
luci.model.uci.set_confdir(luci.model.uci.confdir_default)
|
luci.model.uci.set_confdir(luci.model.uci.confdir_default)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
require("luci.sys")
|
||||||
|
luci.sys.user.checkpasswd = function() return true end
|
||||||
|
|
||||||
|
|
||||||
filehandler = luci.httpd.handler.file.Simple(DOCROOT)
|
filehandler = luci.httpd.handler.file.Simple(DOCROOT)
|
||||||
vhost:set_default_handler(filehandler)
|
vhost:set_default_handler(filehandler)
|
||||||
|
|
|
@ -32,7 +32,6 @@ end
|
||||||
|
|
||||||
function Luci.handle_head(self, ...)
|
function Luci.handle_head(self, ...)
|
||||||
local response, sourceout = self:handle_get(...)
|
local response, sourceout = self:handle_get(...)
|
||||||
self.running = self.running - 1
|
|
||||||
return response
|
return response
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -67,7 +66,6 @@ function Luci.handle_get(self, request, sourcein, sinkerr)
|
||||||
status = 500
|
status = 500
|
||||||
headers["Content-Type"] = "text/plain"
|
headers["Content-Type"] = "text/plain"
|
||||||
local err = {id}
|
local err = {id}
|
||||||
self.running = self.running - 1
|
|
||||||
return Response( status, headers ), function() return table.remove(err) end
|
return Response( status, headers ), function() return table.remove(err) end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -295,10 +295,7 @@ user.getuser = posix.getpasswd
|
||||||
function user.checkpasswd(username, password)
|
function user.checkpasswd(username, password)
|
||||||
local account = user.getuser(username)
|
local account = user.getuser(username)
|
||||||
|
|
||||||
-- FIXME: detect testing environment
|
if account then
|
||||||
if luci.fs.stat("/etc/shadow") and not luci.fs.access("/etc/shadow", "r") then
|
|
||||||
return true
|
|
||||||
elseif account then
|
|
||||||
if account.passwd == "!" then
|
if account.passwd == "!" then
|
||||||
return true
|
return true
|
||||||
else
|
else
|
||||||
|
|
|
@ -33,6 +33,8 @@ require("luci.fs")
|
||||||
|
|
||||||
context = luci.util.threadlocal()
|
context = luci.util.threadlocal()
|
||||||
|
|
||||||
|
authenticator = {}
|
||||||
|
|
||||||
-- Index table
|
-- Index table
|
||||||
local index = nil
|
local index = nil
|
||||||
|
|
||||||
|
@ -76,25 +78,20 @@ function error500(message)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Render and evaluate the system authentication login form.
|
function authenticator.htmlauth(validator, default)
|
||||||
-- @param default Default username
|
|
||||||
-- @return Authentication status
|
|
||||||
function sysauth(default)
|
|
||||||
local user = luci.http.formvalue("username")
|
local user = luci.http.formvalue("username")
|
||||||
local pass = luci.http.formvalue("password")
|
local pass = luci.http.formvalue("password")
|
||||||
|
|
||||||
if user and luci.sys.user.checkpasswd(user, pass) then
|
if user and validator(user, pass) then
|
||||||
local sid = luci.sys.uniqueid(16)
|
return user
|
||||||
luci.http.header("Set-Cookie", "sysauth=" .. sid.."; path=/")
|
|
||||||
luci.sauth.write(sid, user)
|
|
||||||
return true
|
|
||||||
else
|
|
||||||
require("luci.i18n")
|
|
||||||
require("luci.template")
|
|
||||||
context.path = {}
|
|
||||||
luci.template.render("sysauth", {duser=default, fuser=user})
|
|
||||||
return false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
require("luci.i18n")
|
||||||
|
require("luci.template")
|
||||||
|
context.path = {}
|
||||||
|
luci.template.render("sysauth", {duser=default, fuser=user})
|
||||||
|
return false
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Dispatch an HTTP request.
|
--- Dispatch an HTTP request.
|
||||||
|
@ -172,13 +169,23 @@ function dispatch(request)
|
||||||
|
|
||||||
if track.sysauth then
|
if track.sysauth then
|
||||||
require("luci.sauth")
|
require("luci.sauth")
|
||||||
|
local authen = authenticator[track.sysauth_authenticator]
|
||||||
local def = (type(track.sysauth) == "string") and track.sysauth
|
local def = (type(track.sysauth) == "string") and track.sysauth
|
||||||
local accs = def and {track.sysauth} or track.sysauth
|
local accs = def and {track.sysauth} or track.sysauth
|
||||||
local user = luci.sauth.read(luci.http.getcookie("sysauth"))
|
local user = luci.sauth.read(luci.http.getcookie("sysauth"))
|
||||||
|
|
||||||
|
|
||||||
if not luci.util.contains(accs, user) then
|
if not luci.util.contains(accs, user) then
|
||||||
if not sysauth(def) then
|
if authen then
|
||||||
|
local user = authen(luci.sys.user.checkpasswd, def)
|
||||||
|
if not user or not luci.util.contains(accs, user) then
|
||||||
|
return
|
||||||
|
else
|
||||||
|
local sid = luci.sys.uniqueid(16)
|
||||||
|
luci.http.header("Set-Cookie", "sysauth=" .. sid.."; path=/")
|
||||||
|
luci.sauth.write(sid, user)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
luci.http.status(403, "Forbidden")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -30,6 +30,7 @@ function index()
|
||||||
page.order = 10
|
page.order = 10
|
||||||
page.i18n = "admin-core"
|
page.i18n = "admin-core"
|
||||||
page.sysauth = "root"
|
page.sysauth = "root"
|
||||||
|
page.sysauth_authenticator = "htmlauth"
|
||||||
page.ucidata = true
|
page.ucidata = true
|
||||||
|
|
||||||
local page = node("admin", "index")
|
local page = node("admin", "index")
|
||||||
|
|
|
@ -29,6 +29,7 @@ function index()
|
||||||
local page = entry({"mini"}, alias("mini", "index"), i18n("essentials", "Essentials"), 10)
|
local page = entry({"mini"}, alias("mini", "index"), i18n("essentials", "Essentials"), 10)
|
||||||
page.i18n = "admin-core"
|
page.i18n = "admin-core"
|
||||||
page.sysauth = "root"
|
page.sysauth = "root"
|
||||||
|
page.sysauth_authenticator = "htmlauth"
|
||||||
page.ucidata = true
|
page.ucidata = true
|
||||||
|
|
||||||
entry({"mini", "index"}, alias("mini", "index", "index"), i18n("overview"), 10)
|
entry({"mini", "index"}, alias("mini", "index", "index"), i18n("overview"), 10)
|
||||||
|
|
Loading…
Reference in a new issue