luci-base: fs.js: exec_direct(): add ability to encode command as latin1
authorJo-Philipp Wich <jo@mein.io>
Wed, 12 Feb 2020 10:38:53 +0000 (11:38 +0100)
committerJo-Philipp Wich <jo@mein.io>
Wed, 12 Feb 2020 10:59:41 +0000 (11:59 +0100)
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-base/htdocs/luci-static/resources/fs.js

index df3a14b75653b7027249b5ea79da850c8a47ddee..8d2760dd5e87b01837a5ef13f246d3242a648071 100644 (file)
@@ -390,12 +390,17 @@ var FileSystem = L.Class.extend(/** @lends LuCI.fs.prototype */ {
         * `text` to interpret the output as string, `json` to parse the output
         * as JSON or `blob` to return the output as Blob instance.
         *
+        * @param {boolean} [latin1=false]
+        * Whether to encode the command line as Latin1 instead of UTF-8. This
+        * is usually not needed but can be useful for programs that cannot
+        * handle UTF-8 input.
+        *
         * @returns {Promise<*>}
         * Returns a promise resolving with the command stdout output interpreted
         * according to the specified type or rejecting with an error stating the
         * failure reason.
         */
-       exec_direct: function(command, params, type) {
+       exec_direct: function(command, params, type, latin1) {
                var cmdstr = String(command)
                        .replace(/\\/g, '\\\\').replace(/(\s)/g, '\\$1');
 
@@ -404,8 +409,13 @@ var FileSystem = L.Class.extend(/** @lends LuCI.fs.prototype */ {
                                cmdstr += ' ' + String(params[i])
                                        .replace(/\\/g, '\\\\').replace(/(\s)/g, '\\$1');
 
+               if (latin1)
+                       cmdstr = escape(cmdstr).replace(/\+/g, '%2b');
+               else
+                       cmdstr = encodeURIComponent(cmdstr);
+
                var postdata = 'sessionid=%s&command=%s'
-                       .format(encodeURIComponent(L.env.sessionid), encodeURIComponent(cmdstr));
+                       .format(encodeURIComponent(L.env.sessionid), cmdstr);
 
                return L.Request.post(L.env.cgi_base + '/cgi-exec', postdata, {
                        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },