diff options
Diffstat (limited to 'src/ffluci/dispatcher.lua')
-rw-r--r-- | src/ffluci/dispatcher.lua | 257 |
1 files changed, 0 insertions, 257 deletions
diff --git a/src/ffluci/dispatcher.lua b/src/ffluci/dispatcher.lua deleted file mode 100644 index b60a9beefa..0000000000 --- a/src/ffluci/dispatcher.lua +++ /dev/null @@ -1,257 +0,0 @@ ---[[ -FFLuCI - Dispatcher - -Description: -The request dispatcher and module dispatcher generators - - -The dispatching process: - For a detailed explanation of the dispatching process we assume: - You have installed the FFLuCI CGI-Dispatcher in /cgi-bin/ffluci - - To enforce a higher level of security only the CGI-Dispatcher - resides inside the web server's document root, everything else - stays inside an external directory, we assume this is /lua/ffluci - for this explanation. - - All controllers and action are reachable as sub-objects of /cgi-bin/ffluci - as if they were virtual folders and files - e.g.: /cgi-bin/ffluci/public/info/about - /cgi-bin/ffluci/admin/network/interfaces - and so on. - - The PATH_INFO variable holds the dispatch path and - will be split into three parts: /category/module/action - - Category: This is the category in which modules are stored in - By default there are two categories: - "public" - which is the default public category - "admin" - which is the default protected category - - As FFLuCI itself does not implement authentication - you should make sure that "admin" and other sensitive - categories are protected by the webserver. - - E.g. for busybox add a line like: - /cgi-bin/ffluci/admin:root:$p$root - to /etc/httpd.conf to protect the "admin" category - - - Module: This is the controller which will handle the request further - It is always a submodule of ffluci.controller, so a module - called "helloworld" will be stored in - /lua/ffluci/controller/helloworld.lua - You are free to submodule your controllers any further. - - Action: This is action that will be invoked after loading the module. - The kind of how the action will be dispatched depends on - the module dispatcher that is defined in the controller. - See the description of the default module dispatcher down - on this page for some examples. - - - The main dispatcher at first searches for the module by trying to - include ffluci.controller.category.module - (where "category" is the category name and "module" is the module name) - If this fails a 404 status code will be send to the client and FFLuCI exits - - Then the main dispatcher calls the module dispatcher - ffluci.controller.category.module.dispatcher with the request object - as the only argument. The module dispatcher is then responsible - for the further dispatching process. - - -FileId: -$Id$ - -License: -Copyright 2008 Steven Barth <steven@midlink.org> - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -]]-- - -module("ffluci.dispatcher", package.seeall) -require("ffluci.http") -require("ffluci.template") -require("ffluci.config") -require("ffluci.sys") - - --- Sets privilege for given category -function assign_privileges(category) - local cp = ffluci.config.category_privileges - if cp and cp[category] then - local u, g = cp[category]:match("([^:]+):([^:]+)") - ffluci.sys.process.setuser(u) - ffluci.sys.process.setgroup(g) - end -end - --- Dispatches the "request" -function dispatch(req) - request = req - local m = "ffluci.controller." .. request.category .. "." .. request.module - local stat, module = pcall(require, m) - if not stat then - return error404() - else - module.request = request - module.dispatcher = module.dispatcher or dynamic - setfenv(module.dispatcher, module) - return module.dispatcher(request) - end -end - --- Sends a 404 error code and renders the "error404" template if available -function error404(message) - message = message or "Not Found" - - if not pcall(ffluci.template.render, "error404") then - ffluci.http.textheader() - print(message) - end - return false -end - --- Sends a 500 error code and renders the "error500" template if available -function error500(message) - ffluci.http.status(500, "Internal Server Error") - - if not pcall(ffluci.template.render, "error500", {message=message}) then - ffluci.http.textheader() - print(message) - end - return false -end - - --- Dispatches a request depending on the PATH_INFO variable -function httpdispatch() - local pathinfo = os.getenv("PATH_INFO") or "" - local parts = pathinfo:gmatch("/[%w-]+") - - local sanitize = function(s, default) - return s and s:sub(2) or default - end - - local cat = sanitize(parts(), "public") - local mod = sanitize(parts(), "index") - local act = sanitize(parts(), "index") - - assign_privileges(cat) - dispatch({category=cat, module=mod, action=act}) -end - - --- Dispatchers -- - - --- The Action Dispatcher searches the module for any function called --- action_"request.action" and calls it -function action(request) - local i18n = require("ffluci.i18n") - local disp = require("ffluci.dispatcher") - - i18n.loadc(request.module) - local action = getfenv()["action_" .. request.action:gsub("-", "_")] - if action then - action() - else - disp.error404() - end -end - --- The CBI dispatcher directly parses and renders the CBI map which is --- placed in ffluci/modles/cbi/"request.module"/"request.action" -function cbi(request) - local i18n = require("ffluci.i18n") - local disp = require("ffluci.dispatcher") - local tmpl = require("ffluci.template") - local cbi = require("ffluci.cbi") - - local path = request.category.."_"..request.module.."/"..request.action - - i18n.loadc(request.module) - - local stat, map = pcall(cbi.load, path) - if stat and map then - local stat, err = pcall(map.parse, map) - if not stat then - disp.error500(err) - return - end - tmpl.render("cbi/header") - map:render() - tmpl.render("cbi/footer") - elseif not stat then - disp.error500(map) - else - disp.error404() - end -end - --- The dynamic dispatchers combines the action, simpleview and cbi dispatchers --- in one dispatcher. It tries to lookup the request in this order. -function dynamic(request) - local i18n = require("ffluci.i18n") - local disp = require("ffluci.dispatcher") - local tmpl = require("ffluci.template") - local cbi = require("ffluci.cbi") - - i18n.loadc(request.module) - - local action = getfenv()["action_" .. request.action:gsub("-", "_")] - if action then - action() - return - end - - local path = request.category.."_"..request.module.."/"..request.action - if pcall(tmpl.render, path) then - return - end - - local stat, map = pcall(cbi.load, path) - if stat and map then - local stat, err = pcall(map.parse, map) - if not stat then - disp.error500(err) - return - end - tmpl.render("cbi/header") - map:render() - tmpl.render("cbi/footer") - return - elseif not stat then - disp.error500(map) - return - end - - disp.error404() -end - --- The Simple View Dispatcher directly renders the template --- which is placed in ffluci/views/"request.module"/"request.action" -function simpleview(request) - local i18n = require("ffluci.i18n") - local tmpl = require("ffluci.template") - local disp = require("ffluci.dispatcher") - - local path = request.category.."_"..request.module.."/"..request.action - - i18n.loadc(request.module) - if not pcall(tmpl.render, path) then - disp.error404() - end -end
\ No newline at end of file |