* ffluci/core: dispatcher.lua: setgid() won't work after setuid() due to missing permission - swapped set*id() calls; whitespace cleanups

This commit is contained in:
Jo-Philipp Wich 2008-05-24 22:58:45 +00:00
parent 628701518a
commit 32aa488d9b

View file

@ -12,9 +12,9 @@ Copyright 2008 Steven Barth <steven@midlink.org>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
@ -40,78 +40,78 @@ dispatched = nil
-- Builds a URL -- Builds a URL
function build_url(...) function build_url(...)
return ffluci.http.dispatcher() .. "/" .. table.concat(arg, "/") return ffluci.http.dispatcher() .. "/" .. table.concat(arg, "/")
end end
-- Sends a 404 error code and renders the "error404" template if available -- Sends a 404 error code and renders the "error404" template if available
function error404(message) function error404(message)
ffluci.http.status(404, "Not Found") ffluci.http.status(404, "Not Found")
message = message or "Not Found" message = message or "Not Found"
require("ffluci.template") require("ffluci.template")
if not pcall(ffluci.template.render, "error404") then if not pcall(ffluci.template.render, "error404") then
ffluci.http.prepare_content("text/plain") ffluci.http.prepare_content("text/plain")
print(message) print(message)
end end
return false return false
end end
-- Sends a 500 error code and renders the "error500" template if available -- Sends a 500 error code and renders the "error500" template if available
function error500(message) function error500(message)
ffluci.http.status(500, "Internal Server Error") ffluci.http.status(500, "Internal Server Error")
require("ffluci.template") require("ffluci.template")
if not pcall(ffluci.template.render, "error500", {message=message}) then if not pcall(ffluci.template.render, "error500", {message=message}) then
ffluci.http.prepare_content("text/plain") ffluci.http.prepare_content("text/plain")
print(message) print(message)
end end
return false return false
end end
-- Dispatches a request depending on the PATH_INFO variable -- Dispatches a request depending on the PATH_INFO variable
function httpdispatch() function httpdispatch()
local pathinfo = ffluci.http.env.PATH_INFO or "" local pathinfo = ffluci.http.env.PATH_INFO or ""
local c = tree local c = tree
for s in pathinfo:gmatch("/([%w-]+)") do for s in pathinfo:gmatch("/([%w-]+)") do
table.insert(request, s) table.insert(request, s)
end end
dispatch() dispatch()
end end
function dispatch() function dispatch()
local c = tree local c = tree
local track = {} local track = {}
for i, s in ipairs(request) do for i, s in ipairs(request) do
c = c.nodes[s] c = c.nodes[s]
if not c then if not c then
break break
end end
for k, v in pairs(c) do for k, v in pairs(c) do
track[k] = v track[k] = v
end end
end end
if track.i18n then if track.i18n then
require("ffluci.i18n").loadc(track.i18n) require("ffluci.i18n").loadc(track.i18n)
end end
if track.setuser then
ffluci.sys.process.setuser(track.setuser)
end
if track.setgroup then if track.setgroup then
ffluci.sys.process.setgroup(track.setgroup) ffluci.sys.process.setgroup(track.setgroup)
end end
if track.setuser then
ffluci.sys.process.setuser(track.setuser)
end
if c and type(c.target) == "function" then if c and type(c.target) == "function" then
dispatched = c dispatched = c
stat, err = pcall(c.target) stat, err = pcall(c.target)
if not stat then if not stat then
error500(err) error500(err)
@ -126,16 +126,16 @@ end
function createindex() function createindex()
local root = ffluci.sys.libpath() .. "/controller/" local root = ffluci.sys.libpath() .. "/controller/"
local suff = ".lua" local suff = ".lua"
local controllers = ffluci.util.combine( local controllers = ffluci.util.combine(
ffluci.fs.glob(root .. "*" .. suff), ffluci.fs.glob(root .. "*" .. suff),
ffluci.fs.glob(root .. "*/*" .. suff) ffluci.fs.glob(root .. "*/*" .. suff)
) )
for i,c in ipairs(controllers) do for i,c in ipairs(controllers) do
c = "ffluci.controller." .. c:sub(#root+1, #c-#suff):gsub("/", ".") c = "ffluci.controller." .. c:sub(#root+1, #c-#suff):gsub("/", ".")
stat, mod = pcall(require, c) stat, mod = pcall(require, c)
if stat and mod and type(mod.index) == "function" then if stat and mod and type(mod.index) == "function" then
ffluci.util.updfenv(mod.index, ffluci.dispatcher) ffluci.util.updfenv(mod.index, ffluci.dispatcher)
pcall(mod.index) pcall(mod.index)
@ -151,30 +151,30 @@ function entry(path, target, title, order, add)
c.target = target c.target = target
c.title = title c.title = title
c.order = order c.order = order
for k,v in pairs(add) do for k,v in pairs(add) do
c[k] = v c[k] = v
end end
return c return c
end end
-- Fetch a dispatching node -- Fetch a dispatching node
function node(...) function node(...)
local c = tree local c = tree
if arg[1] and type(arg[1]) == "table" then if arg[1] and type(arg[1]) == "table" then
arg = arg[1] arg = arg[1]
end end
for k,v in ipairs(arg) do for k,v in ipairs(arg) do
if not c.nodes[v] then if not c.nodes[v] then
c.nodes[v] = {nodes={}} c.nodes[v] = {nodes={}}
end end
c = c.nodes[v] c = c.nodes[v]
end end
return c return c
end end
@ -195,22 +195,22 @@ end
function cbi(model) function cbi(model)
require("ffluci.cbi") require("ffluci.cbi")
require("ffluci.template") require("ffluci.template")
return function() return function()
local stat, res = pcall(ffluci.cbi.load, model) local stat, res = pcall(ffluci.cbi.load, model)
if not stat then if not stat then
error500(res) error500(res)
return true return true
end end
local stat, err = pcall(res.parse, res) local stat, err = pcall(res.parse, res)
if not stat then if not stat then
error500(err) error500(err)
return true return true
end end
ffluci.template.render("cbi/header") ffluci.template.render("cbi/header")
res:render() res:render()
ffluci.template.render("cbi/footer") ffluci.template.render("cbi/footer")
end end
end end