* libs/web: Reworked authentication

This commit is contained in:
Steven Barth 2008-08-10 12:58:05 +00:00
parent 2787a7f688
commit f9fa6d82da
6 changed files with 30 additions and 23 deletions

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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=/") end
luci.sauth.write(sid, user)
return true
else
require("luci.i18n") require("luci.i18n")
require("luci.template") require("luci.template")
context.path = {} context.path = {}
luci.template.render("sysauth", {duser=default, fuser=user}) luci.template.render("sysauth", {duser=default, fuser=user})
return false return false
end
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

View file

@ -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")

View file

@ -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)