From 3c6dd6deec672cbc051f5b14845d13e92afdffcd Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Sun, 12 Apr 2020 22:27:16 +0200 Subject: [PATCH] luci-base: luci.js: add LuCI.fspath() helper The LuCI.fspath() function allows constructing absolute filesystem paths from path segments relative to the document root. Signed-off-by: Jo-Philipp Wich (cherry picked from commit fde144c9be61d7886e81240233328a61d7088d08) --- .../htdocs/luci-static/resources/luci.js | 31 +++++++++++++++++++ modules/luci-base/luasrc/view/header.htm | 1 + 2 files changed, 32 insertions(+) diff --git a/modules/luci-base/htdocs/luci-static/resources/luci.js b/modules/luci-base/htdocs/luci-static/resources/luci.js index 19ff2e199..954a8aa2b 100644 --- a/modules/luci-base/htdocs/luci-static/resources/luci.js +++ b/modules/luci-base/htdocs/luci-static/resources/luci.js @@ -2596,6 +2596,37 @@ */ env: {}, + /** + * Construct an absolute filesystem path relative to the server + * document root. + * + * @instance + * @memberof LuCI + * + * @param {...string} [parts] + * An array of parts to join into a path. + * + * @return {string} + * Return the joined path. + */ + fspath: function(/* ... */) { + var path = this.env.documentroot; + + for (var i = 0; i < arguments.length; i++) + path += '/' + arguments[i]; + + var p = path.replace(/\/+$/, '').replace(/\/+/g, '/').split(/\//), + res = []; + + for (var i = 0; i < p.length; i++) + if (p[i] == '..') + res.pop(); + else if (p[i] != '.') + res.push(p[i]); + + return res.join('/'); + }, + /** * Construct a relative URL path from the given prefix and parts. * The resulting URL is guaranteed to only contain the characters diff --git a/modules/luci-base/luasrc/view/header.htm b/modules/luci-base/luasrc/view/header.htm index 43aedf278..387c76f8f 100644 --- a/modules/luci-base/luasrc/view/header.htm +++ b/modules/luci-base/luasrc/view/header.htm @@ -22,6 +22,7 @@ resource = resource, scriptname = luci.http.getenv("SCRIPT_NAME"), pathinfo = luci.http.getenv("PATH_INFO"), + documentroot = luci.http.getenv("DOCUMENT_ROOT"), requestpath = luci.dispatcher.context.requestpath, dispatchpath = luci.dispatcher.context.path, pollinterval = luci.config.main.pollinterval or 5, -- 2.25.1