From 6ec0353201435e0d0d7d32820d8ba600b4ca7b5b Mon Sep 17 00:00:00 2001 From: "Daniel F. Dickinson" Date: Thu, 2 Aug 2018 09:39:48 -0400 Subject: [PATCH] modules: Make luci-base sufficient to use luci apps Per the discussion in https://github.com/openwrt/luci/issues/869, make luci-base sufficient to login, logout, and review and apply or revert uci changes. This allows most luci-app-xxx to work without having luci-mod-admin-full installed. It has been tested with some apps and not luci-mod-admin-full, as well as with luci-mod-admin-full (to make sure the usual case doesn't break). Instead of creating a new module namespace (e.g. 'Base') we reduce the opportunities for breakage by having luci-base take over the 'shell' of the 'Administration' (admin/....) namespace. Since admin is assumed by all current building LuCI components (including Freifunk), this doesn't introduce the 'Administration' tab into any situation where it would not already be present (but includes it where it was before). We also add a "Component not installed" page to avoid fatal errors and backtrace when e.g. luci-mod-admin-full is not installed. Signed-off-by: Daniel F. Dickinson --- .../luasrc/controller/admin/index.lua | 82 +++++++++++++++++++ .../luasrc/controller/admin/uci.lua | 0 modules/luci-base/luasrc/dispatcher.lua | 11 +-- .../luasrc/view/admin_uci/changelog.htm | 0 .../luasrc/view/admin_uci/changes.htm | 0 .../luasrc/view/admin_uci/revert.htm | 0 .../luasrc/view/empty_node_placeholder.htm | 11 +++ .../luasrc/controller/admin/index.lua | 42 ---------- .../luasrc/controller/admin/network.lua | 6 -- .../luasrc/controller/admin/status.lua | 1 - .../luasrc/controller/admin/system.lua | 1 - .../luasrc/view/themes/bootstrap/header.htm | 4 +- .../luasrc/view/themes/material/header.htm | 4 +- .../luasrc/view/themes/openwrt.org/header.htm | 4 +- 14 files changed, 108 insertions(+), 58 deletions(-) create mode 100644 modules/luci-base/luasrc/controller/admin/index.lua rename modules/{luci-mod-admin-full => luci-base}/luasrc/controller/admin/uci.lua (100%) rename modules/{luci-mod-admin-full => luci-base}/luasrc/view/admin_uci/changelog.htm (100%) rename modules/{luci-mod-admin-full => luci-base}/luasrc/view/admin_uci/changes.htm (100%) rename modules/{luci-mod-admin-full => luci-base}/luasrc/view/admin_uci/revert.htm (100%) create mode 100644 modules/luci-base/luasrc/view/empty_node_placeholder.htm delete mode 100644 modules/luci-mod-admin-full/luasrc/controller/admin/index.lua diff --git a/modules/luci-base/luasrc/controller/admin/index.lua b/modules/luci-base/luasrc/controller/admin/index.lua new file mode 100644 index 0000000000..39e6e573b1 --- /dev/null +++ b/modules/luci-base/luasrc/controller/admin/index.lua @@ -0,0 +1,82 @@ +-- Copyright 2008 Steven Barth +-- Licensed to the public under the Apache License 2.0. + +module("luci.controller.admin.index", package.seeall) + +function index() + function toplevel_page(page, preflookup, preftarget) + if preflookup and preftarget then + if lookup(preflookup) then + page.target = preftarget + end + end + + if not page.target then + page.target = firstchild() + end + end + + local root = node() + if not root.target then + root.target = alias("admin") + root.index = true + end + + local page = node("admin") + page.title = _("Administration") + page.order = 10 + page.sysauth = "root" + page.sysauth_authenticator = "htmlauth" + page.ucidata = true + page.index = true + toplevel_page(page, "admin/status/overview", alias("admin", "status")) + + -- Empty menu tree to be populated by addons and modules + + page = node("admin", "status") + page.title = _("Status") + page.order = 10 + page.index = true + -- overview is from mod-admin-full + toplevel_page(page, "admin/status/overview", alias("admin", "status", "overview")) + + page = node("admin", "system") + page.title = _("System") + page.order = 20 + page.index = true + -- system/system is from mod-admin-full + toplevel_page(page, "admin/system/system", alias("admin", "system", "system")) + + -- Only used if applications add items + page = node("admin", "services") + page.title = _("Services") + page.order = 40 + page.index = true + toplevel_page(page, false, false) + + -- Even for mod-admin-full network just uses first submenu item as landing + page = node("admin", "network") + page.title = _("Network") + page.order = 50 + page.index = true + toplevel_page(page, false, false) + + -- Logout is last + entry({"admin", "logout"}, call("action_logout"), _("Logout"), 999) +end + +function action_logout() + local dsp = require "luci.dispatcher" + local utl = require "luci.util" + local sid = dsp.context.authsession + + if sid then + utl.ubus("session", "destroy", { ubus_rpc_session = sid }) + + luci.http.header("Set-Cookie", "sysauth=%s; expires=%s; path=%s/" %{ + sid, 'Thu, 01 Jan 1970 01:00:00 GMT', dsp.build_url() + }) + end + + luci.http.redirect(dsp.build_url()) +end diff --git a/modules/luci-mod-admin-full/luasrc/controller/admin/uci.lua b/modules/luci-base/luasrc/controller/admin/uci.lua similarity index 100% rename from modules/luci-mod-admin-full/luasrc/controller/admin/uci.lua rename to modules/luci-base/luasrc/controller/admin/uci.lua diff --git a/modules/luci-base/luasrc/dispatcher.lua b/modules/luci-base/luasrc/dispatcher.lua index 6cf2712eb4..09d5d72846 100644 --- a/modules/luci-base/luasrc/dispatcher.lua +++ b/modules/luci-base/luasrc/dispatcher.lua @@ -741,11 +741,12 @@ function _firstchild() end end - assert(lowest ~= nil, - "The requested node contains no childs, unable to redispatch") - - path[#path+1] = lowest - dispatch(path) + if lowest == nil then + require "luci.template".render("empty_node_placeholder") + else + path[#path+1] = lowest + dispatch(path) + end end function firstchild() diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm b/modules/luci-base/luasrc/view/admin_uci/changelog.htm similarity index 100% rename from modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm rename to modules/luci-base/luasrc/view/admin_uci/changelog.htm diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm b/modules/luci-base/luasrc/view/admin_uci/changes.htm similarity index 100% rename from modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm rename to modules/luci-base/luasrc/view/admin_uci/changes.htm diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_uci/revert.htm b/modules/luci-base/luasrc/view/admin_uci/revert.htm similarity index 100% rename from modules/luci-mod-admin-full/luasrc/view/admin_uci/revert.htm rename to modules/luci-base/luasrc/view/admin_uci/revert.htm diff --git a/modules/luci-base/luasrc/view/empty_node_placeholder.htm b/modules/luci-base/luasrc/view/empty_node_placeholder.htm new file mode 100644 index 0000000000..b7e276b960 --- /dev/null +++ b/modules/luci-base/luasrc/view/empty_node_placeholder.htm @@ -0,0 +1,11 @@ +<%# + Copyright 2010 Jo-Philipp Wich + Copyright 2018 Daniel F. Dickinson + Licensed to the public under the Apache License 2.0. +-%> + +<%+header%> + +

Component not present.

+ +<%+footer%> diff --git a/modules/luci-mod-admin-full/luasrc/controller/admin/index.lua b/modules/luci-mod-admin-full/luasrc/controller/admin/index.lua deleted file mode 100644 index cc8c2e3ae6..0000000000 --- a/modules/luci-mod-admin-full/luasrc/controller/admin/index.lua +++ /dev/null @@ -1,42 +0,0 @@ --- Copyright 2008 Steven Barth --- Licensed to the public under the Apache License 2.0. - -module("luci.controller.admin.index", package.seeall) - -function index() - local root = node() - if not root.target then - root.target = alias("admin") - root.index = true - end - - local page = node("admin") - page.target = firstchild() - page.title = _("Administration") - page.order = 10 - page.sysauth = "root" - page.sysauth_authenticator = "htmlauth" - page.ucidata = true - page.index = true - - -- Empty services menu to be populated by addons - entry({"admin", "services"}, firstchild(), _("Services"), 40).index = true - - entry({"admin", "logout"}, call("action_logout"), _("Logout"), 90) -end - -function action_logout() - local dsp = require "luci.dispatcher" - local utl = require "luci.util" - local sid = dsp.context.authsession - - if sid then - utl.ubus("session", "destroy", { ubus_rpc_session = sid }) - - luci.http.header("Set-Cookie", "sysauth=%s; expires=%s; path=%s/" %{ - sid, 'Thu, 01 Jan 1970 01:00:00 GMT', dsp.build_url() - }) - end - - luci.http.redirect(dsp.build_url()) -end diff --git a/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua b/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua index c45605a983..c4e1c3aa16 100644 --- a/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua +++ b/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua @@ -8,12 +8,6 @@ function index() local uci = require("luci.model.uci").cursor() local page - page = node("admin", "network") - page.target = firstchild() - page.title = _("Network") - page.order = 50 - page.index = true - -- if page.inreq then local has_switch = false diff --git a/modules/luci-mod-admin-full/luasrc/controller/admin/status.lua b/modules/luci-mod-admin-full/luasrc/controller/admin/status.lua index ff95f3d915..4f04cce545 100644 --- a/modules/luci-mod-admin-full/luasrc/controller/admin/status.lua +++ b/modules/luci-mod-admin-full/luasrc/controller/admin/status.lua @@ -5,7 +5,6 @@ module("luci.controller.admin.status", package.seeall) function index() - entry({"admin", "status"}, alias("admin", "status", "overview"), _("Status"), 20).index = true entry({"admin", "status", "overview"}, template("admin_status/index"), _("Overview"), 1) entry({"admin", "status", "iptables"}, template("admin_status/iptables"), _("Firewall"), 2).leaf = true diff --git a/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua b/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua index 46d2e36c32..4e83769ee0 100644 --- a/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua +++ b/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua @@ -7,7 +7,6 @@ module("luci.controller.admin.system", package.seeall) function index() local fs = require "nixio.fs" - entry({"admin", "system"}, alias("admin", "system", "system"), _("System"), 30).index = true entry({"admin", "system", "system"}, cbi("admin_system/system"), _("System"), 1) entry({"admin", "system", "clock_status"}, post_on({ set = true }, "action_clock_status")) diff --git a/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm b/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm index 4347f133a4..a6bb326976 100644 --- a/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm +++ b/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm @@ -193,7 +193,9 @@

<%:No password set!%>

<%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%>

- + <% if disp.lookup("amdin/system/admin") then %> + + <% end %>
<%- end -%> diff --git a/themes/luci-theme-material/luasrc/view/themes/material/header.htm b/themes/luci-theme-material/luasrc/view/themes/material/header.htm index c070b1a617..564c680f1d 100644 --- a/themes/luci-theme-material/luasrc/view/themes/material/header.htm +++ b/themes/luci-theme-material/luasrc/view/themes/material/header.htm @@ -239,7 +239,9 @@

<%:No password set!%>

<%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%>

- + <% if disp.lookup("admin/system/admin") then %> + + <% end %>
<%- end -%> diff --git a/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm b/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm index 6fc657ddce..1d2161168b 100644 --- a/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm +++ b/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm @@ -257,6 +257,8 @@

<%:No password set!%>

<%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%>

- + <% if disp.lookup("admin/system/admin") then %> + + <% end %>
<%- end -%> -- 2.30.2