From 75d49db30b6d8d98617bd5df5094ac594aab146b Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Mon, 25 Nov 2019 14:12:43 -0800 Subject: [PATCH] Plugin system improvements. --- MeshCentralServer.njsproj | 1 + agents/meshcore.js | 3 +- agents/meshcore.min.js | 3 +- db.js | 64 +- meshcentral.js | 9 +- meshuser.js | 4 +- pluginHandler.js | 375 +- public/images/leftbar-64.png | Bin 41983 -> 45169 bytes public/images/plugin.png | Bin 0 -> 5391 bytes public/images/plugin24.png | Bin 0 -> 1594 bytes public/images/plus32.png | Bin 656 -> 0 bytes public/styles/style.css | 49 +- views/default-min.handlebars | 273 +- views/default.handlebars | 212 +- views/translations/default-min_fr.handlebars | 273 +- views/translations/default_fr.handlebars | 311 +- webserver.js | 61 +- x.txt | 9735 ++++++++++++++++++ 18 files changed, 10962 insertions(+), 411 deletions(-) create mode 100644 public/images/plugin.png create mode 100644 public/images/plugin24.png delete mode 100644 public/images/plus32.png create mode 100644 x.txt diff --git a/MeshCentralServer.njsproj b/MeshCentralServer.njsproj index d2d0cf3f..bc357bcb 100644 --- a/MeshCentralServer.njsproj +++ b/MeshCentralServer.njsproj @@ -170,6 +170,7 @@ + diff --git a/agents/meshcore.js b/agents/meshcore.js index 87578b1f..ba7b9874 100644 --- a/agents/meshcore.js +++ b/agents/meshcore.js @@ -1102,8 +1102,7 @@ function createMeshCore(agent) { if (fs.existsSync("/usr/bin/python") && fs.existsSync("/bin/bash")) { this.httprequest.process = childProcess.execFile("/usr/bin/python", [ "python", "-c", "import pty; pty.spawn([\"/bin/bash\"])" ]); if (process.platform == 'linux') { this.httprequest.process.stdin.write("export TERM='xterm'\nalias ls='ls --color=auto'\nclear\n"); } - } - else if (fs.existsSync("/bin/bash")) { + } else if (fs.existsSync("/bin/bash")) { this.httprequest.process = childProcess.execFile("/bin/bash", ["bash", "-i"], { type: childProcess.SpawnTypes.TERM }); if (process.platform == 'linux') { this.httprequest.process.stdin.write("alias ls='ls --color=auto'\nclear\n"); } } else { diff --git a/agents/meshcore.min.js b/agents/meshcore.min.js index 87578b1f..ba7b9874 100644 --- a/agents/meshcore.min.js +++ b/agents/meshcore.min.js @@ -1102,8 +1102,7 @@ function createMeshCore(agent) { if (fs.existsSync("/usr/bin/python") && fs.existsSync("/bin/bash")) { this.httprequest.process = childProcess.execFile("/usr/bin/python", [ "python", "-c", "import pty; pty.spawn([\"/bin/bash\"])" ]); if (process.platform == 'linux') { this.httprequest.process.stdin.write("export TERM='xterm'\nalias ls='ls --color=auto'\nclear\n"); } - } - else if (fs.existsSync("/bin/bash")) { + } else if (fs.existsSync("/bin/bash")) { this.httprequest.process = childProcess.execFile("/bin/bash", ["bash", "-i"], { type: childProcess.SpawnTypes.TERM }); if (process.platform == 'linux') { this.httprequest.process.stdin.write("alias ls='ls --color=auto'\nclear\n"); } } else { diff --git a/db.js b/db.js index 07a0e3f0..fec1c3d9 100644 --- a/db.js +++ b/db.js @@ -442,9 +442,9 @@ module.exports.CreateDB = function (parent, func) { }); } }); - + // Setup plugin info collection - obj.pluginsfile = db.collection('plugins'); + if (parent.config.settings != null) { obj.pluginsfile = db.collection('plugins'); } setupFunctions(func); // Completed setup of MongoDB }); @@ -548,7 +548,7 @@ module.exports.CreateDB = function (parent, func) { }); // Setup plugin info collection - obj.pluginsfile = db.collection('plugins'); + if (parent.config.settings != null) { obj.pluginsfile = db.collection('plugins'); } setupFunctions(func); // Completed setup of MongoJS } else { @@ -611,8 +611,10 @@ module.exports.CreateDB = function (parent, func) { obj.serverstatsfile.ensureIndex({ fieldName: 'expire', expireAfterSeconds: 0 }); // Auto-expire events // Setup plugin info collection - obj.pluginsfile = new Datastore({ filename: parent.getConfigFilePath('meshcentral-plugins.db'), autoload: true }); - obj.pluginsfile.persistence.setAutocompactionInterval(36000); + if (parent.config.settings != null) { + obj.pluginsfile = new Datastore({ filename: parent.getConfigFilePath('meshcentral-plugins.db'), autoload: true }); + obj.pluginsfile.persistence.setAutocompactionInterval(36000); + } setupFunctions(func); // Completed setup of NeDB } @@ -764,22 +766,16 @@ module.exports.CreateDB = function (parent, func) { func(r); }); } - - // Add a plugin - obj.addPlugin = function (plugin, func) { plugin.type = "plugin"; obj.pluginsfile.insertOne(plugin, func); }; - - // Get all plugins - obj.getPlugins = function (func) { obj.pluginsfile.find({"type": "plugin"}).project({"type": 0}).sort({ name: 1 }).toArray(func); }; - - // Get plugin - obj.getPlugin = function (id, func) { id = require('mongodb').ObjectID(id); obj.pluginsfile.find({ _id: id }).sort({ name: 1 }).toArray(func); }; - - // Delete plugin - obj.deletePlugin = function (id, func) { id = require('mongodb').ObjectID(id); obj.pluginsfile.deleteOne({ _id: id }, func); }; - - obj.setPluginStatus = function(id, status, func) { id = require('mongodb').ObjectID(id); obj.pluginsfile.updateOne({ _id: id }, { $set: {status: status } }, func); }; - - obj.updatePlugin = function(id, args, func) { delete args._id; id = require('mongodb').ObjectID(id); obj.pluginsfile.updateOne({ _id: id }, { $set: args }, func); }; + + // Plugin operations + if (parent.config.settings.plugins != null) { + obj.addPlugin = function (plugin, func) { plugin.type = "plugin"; obj.pluginsfile.insertOne(plugin, func); }; // Add a plugin + obj.getPlugins = function (func) { obj.pluginsfile.find({ "type": "plugin" }).project({ "type": 0 }).sort({ name: 1 }).toArray(func); }; // Get all plugins + obj.getPlugin = function (id, func) { id = require('mongodb').ObjectID(id); obj.pluginsfile.find({ _id: id }).sort({ name: 1 }).toArray(func); }; // Get plugin + obj.deletePlugin = function (id, func) { id = require('mongodb').ObjectID(id); obj.pluginsfile.deleteOne({ _id: id }, func); }; // Delete plugin + obj.setPluginStatus = function (id, status, func) { id = require('mongodb').ObjectID(id); obj.pluginsfile.updateOne({ _id: id }, { $set: { status: status } }, func); }; + obj.updatePlugin = function (id, args, func) { delete args._id; id = require('mongodb').ObjectID(id); obj.pluginsfile.updateOne({ _id: id }, { $set: args }, func); }; + } } else { // Database actions on the main collection (NeDB and MongoJS) @@ -911,22 +907,16 @@ module.exports.CreateDB = function (parent, func) { func(r); }); } - - // Add a plugin - obj.addPlugin = function (plugin, func) { plugin.type = "plugin"; obj.pluginsfile.insert(plugin, func); }; - - // Get all plugins - obj.getPlugins = function (func) { obj.pluginsfile.find({"type": "plugin"}, {"type": 0}).sort({ name: 1 }).exec(func); }; - - // Get plugin - obj.getPlugin = function (id, func) { obj.pluginsfile.find({ _id: id }).sort({ name: 1 }).exec(func); }; - - // Delete plugin - obj.deletePlugin = function (id, func) { obj.pluginsfile.remove({ _id: id }, func); }; - - obj.setPluginStatus = function(id, status, func) { obj.pluginsfile.update({ _id: id }, { $set: {status: status } }, func); }; - - obj.updatePlugin = function(id, args, func) { delete args._id; obj.pluginsfile.update({ _id: id }, { $set: args }, func); }; + + // Plugin operations + if (parent.config.settings.plugins != null) { + obj.addPlugin = function (plugin, func) { plugin.type = "plugin"; obj.pluginsfile.insert(plugin, func); }; // Add a plugin + obj.getPlugins = function (func) { obj.pluginsfile.find({ "type": "plugin" }, { "type": 0 }).sort({ name: 1 }).exec(func); }; // Get all plugins + obj.getPlugin = function (id, func) { obj.pluginsfile.find({ _id: id }).sort({ name: 1 }).exec(func); }; // Get plugin + obj.deletePlugin = function (id, func) { obj.pluginsfile.remove({ _id: id }, func); }; // Delete plugin + obj.setPluginStatus = function (id, status, func) { obj.pluginsfile.update({ _id: id }, { $set: { status: status } }, func); }; + obj.updatePlugin = function (id, args, func) { delete args._id; obj.pluginsfile.update({ _id: id }, { $set: args }, func); }; + } } diff --git a/meshcentral.js b/meshcentral.js index 3fe365bf..df75489c 100644 --- a/meshcentral.js +++ b/meshcentral.js @@ -840,7 +840,13 @@ function CreateMeshCentralServer(config, args) { // Start plugin manager if configuration allows this. if ((obj.config) && (obj.config.settings) && (obj.config.settings.plugins != null)) { - obj.pluginHandler = require('./pluginHandler.js').pluginHandler(obj); + const nodeVersion = Number(process.version.match(/^v(\d+\.\d+)/)[1]); + if (nodeVersion < 7) { + console.log("WARNING: Plugin support requires Node 7 or higher."); + delete obj.config.settings.plugins; + } else { + obj.pluginHandler = require('./pluginHandler.js').pluginHandler(obj); + } } // Load the default meshcore and meshcmd @@ -2073,6 +2079,7 @@ function mainStart() { if (config.settings.mqtt != null) { modules.push('aedes'); } // Add MQTT Modules if (config.settings.mongodb != null) { modules.push('mongodb'); } // Add MongoDB, official driver. if (config.settings.vault != null) { modules.push('node-vault'); } // Add official HashiCorp's Vault module. + if ((config.settings.plugins != null) && (config.settings.plugins.proxy != null)) { modules.push('https-proxy-agent'); } // Required for HTTP/HTTPS proxy support else if (config.settings.xmongodb != null) { modules.push('mongojs'); } // Add MongoJS, old driver. if (config.smtp != null) { modules.push('nodemailer'); } // Add SMTP support diff --git a/meshuser.js b/meshuser.js index a4780c80..952f8862 100644 --- a/meshuser.js +++ b/meshuser.js @@ -3138,6 +3138,8 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use break; } case 'distributeCore': { + // This is only available when plugins are enabled since it could cause stress on the server + if ((user.siteadmin & 0xFFFFFFFF) == 0 || parent.parent.pluginHandler == null) break; // must be full admin with plugins enabled for (var i in command.nodes) { parent.sendMeshAgentCore(user, domain, command.nodes[i]._id, 'default'); } @@ -3170,7 +3172,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use }) .catch(function(err) { if (typeof err == 'object') err = err.message; - try { ws.send(JSON.stringify({ action: 'pluginError', msg: err })); } catch (er) { } + try { ws.send(JSON.stringify({ action: 'pluginError', msg: err })); } catch (er) { } }); } catch(e) { console.log('Cannot add plugin: ' + e); } diff --git a/pluginHandler.js b/pluginHandler.js index 0c70e55d..d88cd980 100644 --- a/pluginHandler.js +++ b/pluginHandler.js @@ -25,27 +25,27 @@ module.exports.pluginHandler = function (parent) { obj.plugins = {}; obj.exports = {}; obj.loadList = obj.parent.config.settings.plugins.list; // For local development / manual install, not from DB - + if (typeof obj.loadList != 'object') { obj.loadList = {}; - parent.db.getPlugins(function(err, plugins){ - plugins.forEach(function(plugin){ - if (plugin.status != 1) return; - if (obj.fs.existsSync(obj.pluginPath + '/' + plugin.shortName)) { - try { - obj.plugins[plugin.shortName] = require(obj.pluginPath + '/' + plugin.shortName + '/' + plugin.shortName + '.js')[plugin.shortName](obj); - obj.exports[plugin.shortName] = obj.plugins[plugin.shortName].exports; - } catch (e) { - console.log("Error loading plugin: " + plugin.shortName + " (" + e + "). It has been disabled.", e.stack); - } - try { // try loading local info about plugin to database (if it changed locally) - var plugin_config = obj.fs.readFileSync(obj.pluginPath + '/' + plugin.shortName + '/config.json'); - plugin_config = JSON.parse(plugin_config); - parent.db.updatePlugin(plugin._id, plugin_config); - } catch (e) { console.log('Plugin config file for '+ plugin.name +' could not be parsed.'); } - } - obj.parent.updateMeshCore(); // db calls are delayed, lets inject here once we're ready - }); + parent.db.getPlugins(function (err, plugins) { + plugins.forEach(function (plugin) { + if (plugin.status != 1) return; + if (obj.fs.existsSync(obj.pluginPath + '/' + plugin.shortName)) { + try { + obj.plugins[plugin.shortName] = require(obj.pluginPath + '/' + plugin.shortName + '/' + plugin.shortName + '.js')[plugin.shortName](obj); + obj.exports[plugin.shortName] = obj.plugins[plugin.shortName].exports; + } catch (e) { + console.log("Error loading plugin: " + plugin.shortName + " (" + e + "). It has been disabled.", e.stack); + } + try { // try loading local info about plugin to database (if it changed locally) + var plugin_config = obj.fs.readFileSync(obj.pluginPath + '/' + plugin.shortName + '/config.json'); + plugin_config = JSON.parse(plugin_config); + parent.db.updatePlugin(plugin._id, plugin_config); + } catch (e) { console.log("Plugin config file for " + plugin.name + " could not be parsed."); } + } + obj.parent.updateMeshCore(); // db calls are delayed, lets inject here once we're ready + }); }); } else { obj.loadList.forEach(function (plugin, index) { @@ -59,15 +59,15 @@ module.exports.pluginHandler = function (parent) { } }); } - + obj.prepExports = function () { var str = 'function() {\r\n'; str += ' var obj = {};\r\n'; - for (const p of Object.keys(obj.plugins)) { + for (var p of Object.keys(obj.plugins)) { str += ' obj.' + p + ' = {};\r\n'; if (Array.isArray(obj.exports[p])) { - for (const l of Object.values(obj.exports[p])) { + for (var l of Object.values(obj.exports[p])) { str += ' obj.' + p + '.' + l + ' = ' + obj.plugins[p][l].toString() + '\r\n'; } } @@ -97,7 +97,7 @@ module.exports.pluginHandler = function (parent) { meshserver.send({ action: 'addplugin', url: Q('pluginurlinput').value}); }; obj.addPluginDlg = function() { - setDialogMode(2, "Plugin Config URL", 3, obj.addPluginEx, ''); + setDialogMode(2, "Plugin Download URL", 3, obj.addPluginEx, '

WARNING: Downloading plugins may compromise server security. Only download from trusted sources.

'); focusTextBox('pluginurlinput'); }; obj.refreshPluginHandler = function() { @@ -108,20 +108,20 @@ module.exports.pluginHandler = function (parent) { return obj; };`; return str; } - - obj.refreshJS = function(req, res) { + + obj.refreshJS = function (req, res) { // to minimize server reboots when installing new plugins, we call the new data and overwrite the old pluginHandler on the front end res.set('Content-Type', 'text/javascript'); - res.send('pluginHandlerBuilder = '+obj.prepExports() + ' pluginHandler = new pluginHandlerBuilder();'); + res.send('pluginHandlerBuilder = ' + obj.prepExports() + ' pluginHandler = new pluginHandlerBuilder();'); } - + obj.callHook = function (hookName, ...args) { for (var p in obj.plugins) { if (typeof obj.plugins[p][hookName] == 'function') { try { obj.plugins[p][hookName](args); } catch (e) { - console.log('Error ocurred while running plugin hook' + p + ':' + hookName + ' (' + e + ')'); + console.log("Error ocurred while running plugin hook" + p + ':' + hookName + ' (' + e + ')'); } } } @@ -187,20 +187,20 @@ module.exports.pluginHandler = function (parent) { panel[p].header = obj.plugins[p].on_device_header(); panel[p].content = obj.plugins[p].on_device_page(); } catch (e) { - console.log('Error ocurred while getting plugin views ' + p + ':' + ' (' + e + ')'); + console.log("Error ocurred while getting plugin views " + p + ':' + ' (' + e + ')'); } } } return panel; }; - - obj.isValidConfig = function(conf, url) { // check for the required attributes + + obj.isValidConfig = function (conf, url) { // check for the required attributes var isValid = true; if (!( typeof conf.name == 'string' && typeof conf.shortName == 'string' && typeof conf.version == 'string' - // && typeof conf.author == 'string' + // && typeof conf.author == 'string' && typeof conf.description == 'string' && typeof conf.hasAdminPanel == 'boolean' && typeof conf.homepage == 'string' @@ -210,7 +210,7 @@ module.exports.pluginHandler = function (parent) { && typeof conf.repository.type == 'string' && typeof conf.repository.url == 'string' && typeof conf.meshCentralCompat == 'string' - // && conf.configUrl == url // make sure we're loading a plugin from its desired config + // && conf.configUrl == url // make sure we're loading a plugin from its desired config )) isValid = false; // more checks here? if (conf.repository.type == 'git') { @@ -218,119 +218,120 @@ module.exports.pluginHandler = function (parent) { } return isValid; }; - - obj.getPluginConfig = function(configUrl) { - return new Promise(function(resolve, reject) { - if (configUrl.indexOf('https://') >= 0) { - var http = require('https'); - } else { - var http = require('http'); + + // https://raw.githubusercontent.com/ryanblenis/MeshCentral-Sample/master/config.json + obj.getPluginConfig = function (configUrl) { + return new Promise(function (resolve, reject) { + var http = (configUrl.indexOf('https://') >= 0) ? require('https') : require('http'); + if (configUrl.indexOf('://') === -1) reject("Unable to fetch the config: Bad URL (" + configUrl + ")"); + var options = require('url').parse(configUrl); + if (typeof parent.config.settings.plugins.proxy == 'string') { // Proxy support + const HttpsProxyAgent = require('https-proxy-agent'); + options.agent = new HttpsProxyAgent(require('url').parse(parent.config.settings.plugins.proxy)); } - if (configUrl.indexOf('://') === -1) reject('Unable to fetch the config: Bad URL (' + configUrl + ')'); - http.get(configUrl, function(res) { - var configStr = ''; - res.on('data', function(chunk){ - configStr += chunk; - }); - res.on('end', function(){ - if (configStr[0] == '{') { // let's be sure we're JSON - try { - var pluginConfig = JSON.parse(configStr); - if (Array.isArray(pluginConfig) && pluginConfig.length == 1) pluginConfig = pluginConfig[0]; - if (obj.isValidConfig(pluginConfig, configUrl)) { - resolve(pluginConfig); - } else { - reject("This does not appear to be a valid plugin configuration."); - } - - } catch (e) { reject('Error getting plugin config. Check that you have valid JSON.'); } - } else { - reject('Error getting plugin config. Check that you have valid JSON.'); - } - }); - - }).on('error', function(e) { + http.get(options, function (res) { + var configStr = ''; + res.on('data', function (chunk) { + configStr += chunk; + }); + res.on('end', function () { + if (configStr[0] == '{') { // Let's be sure we're JSON + try { + var pluginConfig = JSON.parse(configStr); + if (Array.isArray(pluginConfig) && pluginConfig.length == 1) pluginConfig = pluginConfig[0]; + if (obj.isValidConfig(pluginConfig, configUrl)) { + resolve(pluginConfig); + } else { + reject("This does not appear to be a valid plugin configuration."); + } + } catch (e) { reject("Error getting plugin config. Check that you have valid JSON."); } + } else { + reject("Error getting plugin config. Check that you have valid JSON."); + } + }); + + }).on('error', function (e) { reject("Error getting plugin config: " + e.message); - }); + }); }) }; - - obj.getPluginLatest = function() { - return new Promise(function(resolve, reject) { - parent.db.getPlugins(function(err, plugins) { + + obj.getPluginLatest = function () { + return new Promise(function (resolve, reject) { + parent.db.getPlugins(function (err, plugins) { var proms = []; - plugins.forEach(function(curconf) { - proms.push(obj.getPluginConfig(curconf.configUrl).catch(e => { return null; } )); + plugins.forEach(function (curconf) { + proms.push(obj.getPluginConfig(curconf.configUrl).catch(e => { return null; })); }); var latestRet = []; - Promise.all(proms).then(function(newconfs) { + Promise.all(proms).then(function (newconfs) { var nconfs = []; - // filter out config download issues - newconfs.forEach(function(nc) { - if (nc !== null) nconfs.push(nc); - }); - nconfs.forEach(function(newconf) { - var curconf = null; - plugins.forEach(function(conf) { - if (conf.configUrl == newconf.configUrl) curconf = conf; + // Filter out config download issues + newconfs.forEach(function (nc) { if (nc !== null) nconfs.push(nc); }); + if (nconfs.length == 0) { resolve([]); } else { + nconfs.forEach(function (newconf) { + var curconf = null; + plugins.forEach(function (conf) { + if (conf.configUrl == newconf.configUrl) curconf = conf; + }); + if (curconf == null) reject("Some plugin configs could not be parsed"); + var s = require('semver'); + // MeshCentral doesn't adhere to semantic versioning (due to the - at the end of the version) + // Convert the letter to ASCII for a "true" version number comparison + var mcCurVer = parent.currentVer.replace(/-(.)$/, (m, p1) => { return p1.charCodeAt(0); }); + var piCompatVer = newconf.meshCentralCompat.replace(/-(.)\b/g, (m, p1) => { return p1.charCodeAt(0); }); + latestRet.push({ + 'id': curconf._id, + 'installedVersion': curconf.version, + 'version': newconf.version, + 'hasUpdate': s.gt(newconf.version, curconf.version), + 'meshCentralCompat': s.satisfies(mcCurVer, piCompatVer), + 'changelogUrl': curconf.changelogUrl, + 'status': curconf.status + }); + resolve(latestRet); }); - if (curconf == null) reject('Some plugin configs could not be parsed'); - var s = require('semver'); - // MeshCentral doesn't adhere to semantic versioning (due to the - at the end of the version) - // Convert the letter to ASCII for a "true" version number comparison - var mcCurVer = parent.currentVer.replace(/-(.)$/, (m, p1) => { return p1.charCodeAt(0); }); - var piCompatVer = newconf.meshCentralCompat.replace(/-(.)\b/g, (m, p1) => { return p1.charCodeAt(0); }); - latestRet.push({ - "id": curconf._id, - "installedVersion": curconf.version, - "version": newconf.version, - "hasUpdate": s.gt(newconf.version, curconf.version), - "meshCentralCompat": s.satisfies(mcCurVer, piCompatVer), - "changelogUrl": curconf.changelogUrl, - "status": curconf.status - }); - resolve(latestRet); - }); - }).catch((e) => { console.log('Error reaching plugins, update call aborted. ', e)}); + } + }).catch((e) => { console.log("Error reaching plugins, update call aborted.", e) }); }); }); }; - - obj.addPlugin = function(pluginConfig) { - return new Promise(function(resolve, reject) { - parent.db.addPlugin({ - "name": pluginConfig.name, - "shortName": pluginConfig.shortName, - "version": pluginConfig.version, - "description": pluginConfig.description, - "hasAdminPanel": pluginConfig.hasAdminPanel, - "homepage": pluginConfig.homepage, - "changelogUrl": pluginConfig.changelogUrl, - "configUrl": pluginConfig.configUrl, - "downloadUrl": pluginConfig.downloadUrl, - "repository": { - "type": pluginConfig.repository.type, - "url": pluginConfig.repository.url - }, - "meshCentralCompat": pluginConfig.meshCentralCompat, - "versionHistoryUrl": pluginConfig.versionHistoryUrl, - "status": 0 // 0: disabled, 1: enabled - }, function() { - parent.db.getPlugins(function(err, docs){ - if (err) reject(err); - else resolve(docs); + + obj.addPlugin = function (pluginConfig) { + return new Promise(function (resolve, reject) { + parent.db.addPlugin({ + 'name': pluginConfig.name, + 'shortName': pluginConfig.shortName, + 'version': pluginConfig.version, + 'description': pluginConfig.description, + 'hasAdminPanel': pluginConfig.hasAdminPanel, + 'homepage': pluginConfig.homepage, + 'changelogUrl': pluginConfig.changelogUrl, + 'configUrl': pluginConfig.configUrl, + 'downloadUrl': pluginConfig.downloadUrl, + 'repository': { + 'type': pluginConfig.repository.type, + 'url': pluginConfig.repository.url + }, + 'meshCentralCompat': pluginConfig.meshCentralCompat, + 'versionHistoryUrl': pluginConfig.versionHistoryUrl, + 'status': 0 // 0: disabled, 1: enabled + }, function () { + parent.db.getPlugins(function (err, docs) { + if (err) reject(err); + else resolve(docs); }); }); }); }; - - obj.installPlugin = function(id, version_only, force_url, func) { - parent.db.getPlugin(id, function(err, docs){ + + obj.installPlugin = function (id, version_only, force_url, func) { + parent.db.getPlugin(id, function (err, docs) { // the "id" would probably suffice, but is probably an sanitary issue, generate a random instead var randId = Math.random().toString(32).replace('0.', ''); - var fileName = obj.parent.path.join(require('os').tmpdir(), 'Plugin_'+randId+'.zip'); + var fileName = obj.parent.path.join(require('os').tmpdir(), 'Plugin_' + randId + '.zip'); var plugin = docs[0]; - if (plugin.repository.type == 'git') { + if (plugin.repository.type == 'git') { const file = obj.fs.createWriteStream(fileName); var dl_url = plugin.downloadUrl; if (version_only != null && version_only != false) dl_url = version_only.url; @@ -339,7 +340,7 @@ module.exports.pluginHandler = function (parent) { var q = url.parse(dl_url, true); var http = (q.protocol == "http") ? require('http') : require('https'); var opts = { - path: q.pathname, + path: q.pathname, host: q.hostname, port: q.port, headers: { @@ -348,12 +349,16 @@ module.exports.pluginHandler = function (parent) { followRedirects: true, method: 'GET' }; - var request = http.get(opts, function(response) { + if (typeof parent.config.settings.plugins.proxy == 'string') { // Proxy support + const HttpsProxyAgent = require('https-proxy-agent'); + opts.agent = new HttpsProxyAgent(require('url').parse(parent.config.settings.plugins.proxy)); + } + var request = http.get(opts, function (response) { // handle redirections with grace if (response.headers.location) return obj.installPlugin(id, version_only, response.headers.location, func); response.pipe(file); - file.on('finish', function() { - file.close(function(){ + file.on('finish', function () { + file.close(function () { var yauzl = require("yauzl"); if (!obj.fs.existsSync(obj.pluginPath)) { obj.fs.mkdirSync(obj.pluginPath); @@ -364,12 +369,12 @@ module.exports.pluginHandler = function (parent) { yauzl.open(fileName, { lazyEntries: true }, function (err, zipfile) { if (err) throw err; zipfile.readEntry(); - zipfile.on("entry", function (entry) { + zipfile.on('entry', function (entry) { let pluginPath = obj.parent.path.join(obj.pluginPath, plugin.shortName); let pathReg = new RegExp(/(.*?\/)/); - if (process.platform == 'win32') pathReg = new RegExp(/(.*?\\/); + //if (process.platform == 'win32') { pathReg = new RegExp(/(.*?\\/); } let filePath = obj.parent.path.join(pluginPath, entry.fileName.replace(pathReg, '')); // remove top level dir - + if (/\/$/.test(entry.fileName)) { // dir if (!obj.fs.existsSync(filePath)) obj.fs.mkdirSync(filePath); @@ -377,50 +382,48 @@ module.exports.pluginHandler = function (parent) { } else { // file zipfile.openReadStream(entry, function (err, readStream) { if (err) throw err; - readStream.on("end", function () { zipfile.readEntry(); }); + readStream.on('end', function () { zipfile.readEntry(); }); readStream.pipe(obj.fs.createWriteStream(filePath)); }); } }); - zipfile.on("end", function () { setTimeout(function () { - obj.fs.unlinkSync(fileName); - if (version_only == null || version_only === false) { - parent.db.setPluginStatus(id, 1, func); - } else { - parent.db.updatePlugin(id, { status: 1, version: version_only.name }, func); - } - obj.plugins[plugin.shortName] = require(obj.pluginPath + '/' + plugin.shortName + '/' + plugin.shortName + '.js')[plugin.shortName](obj); - obj.exports[plugin.shortName] = obj.plugins[plugin.shortName].exports; - if (typeof obj.plugins[plugin.shortName].server_startup == 'function') obj.plugins[plugin.shortName].server_startup(); - var plugin_config = obj.fs.readFileSync(obj.pluginPath + '/' + plugin.shortName + '/config.json'); - plugin_config = JSON.parse(plugin_config); - parent.db.updatePlugin(plugin._id, plugin_config); - parent.updateMeshCore(); - }); }); + zipfile.on('end', function () { + setTimeout(function () { + obj.fs.unlinkSync(fileName); + if (version_only == null || version_only === false) { + parent.db.setPluginStatus(id, 1, func); + } else { + parent.db.updatePlugin(id, { status: 1, version: version_only.name }, func); + } + obj.plugins[plugin.shortName] = require(obj.pluginPath + '/' + plugin.shortName + '/' + plugin.shortName + '.js')[plugin.shortName](obj); + obj.exports[plugin.shortName] = obj.plugins[plugin.shortName].exports; + if (typeof obj.plugins[plugin.shortName].server_startup == 'function') obj.plugins[plugin.shortName].server_startup(); + var plugin_config = obj.fs.readFileSync(obj.pluginPath + '/' + plugin.shortName + '/config.json'); + plugin_config = JSON.parse(plugin_config); + parent.db.updatePlugin(plugin._id, plugin_config); + parent.updateMeshCore(); + }); + }); }); }); }); }); - } else if (plugin.repository.type == 'npm') { + } else if (plugin.repository.type == 'npm') { // @TODO npm support? (need a test plugin) } - - }); - - }; - - obj.getPluginVersions = function(id) { - return new Promise(function(resolve, reject) { - parent.db.getPlugin(id, function(err, docs) { + + obj.getPluginVersions = function (id) { + return new Promise(function (resolve, reject) { + parent.db.getPlugin(id, function (err, docs) { var plugin = docs[0]; - if (plugin.versionHistoryUrl == null) reject('No version history available for this plugin.'); + if (plugin.versionHistoryUrl == null) reject("No version history available for this plugin."); var url = require('url'); var q = url.parse(plugin.versionHistoryUrl, true); - var http = (q.protocol == "http") ? require('http') : require('https'); + var http = (q.protocol == 'http') ? require('http') : require('https'); var opts = { - path: q.pathname, + path: q.pathname, host: q.hostname, port: q.port, headers: { @@ -428,47 +431,51 @@ module.exports.pluginHandler = function (parent) { 'Accept': 'application/vnd.github.v3+json' } }; - http.get(opts, function(res) { + if (typeof parent.config.settings.plugins.proxy == 'string') { // Proxy support + const HttpsProxyAgent = require('https-proxy-agent'); + options.agent = new HttpsProxyAgent(require('url').parse(parent.config.settings.plugins.proxy)); + } + http.get(opts, function (res) { var versStr = ''; - res.on('data', function(chunk){ + res.on('data', function (chunk) { versStr += chunk; }); - res.on('end', function(){ + res.on('end', function () { if (versStr[0] == '{' || versStr[0] == '[') { // let's be sure we're JSON try { var vers = JSON.parse(versStr); var vList = []; var s = require('semver'); vers.forEach((v) => { - if (s.lt(v.name, plugin.version)) vList.push(v); + if (s.lt(v.name, plugin.version)) vList.push(v); }); - if (vers.length == 0) reject('No previous versions available.'); + if (vers.length == 0) reject("No previous versions available."); resolve({ 'id': plugin._id, 'name': plugin.name, versionList: vList }); - } catch (e) { reject('Version history problem.'); } + } catch (e) { reject("Version history problem."); } } else { - reject('Version history appears to be malformed.'+versStr); + reject("Version history appears to be malformed." + versStr); } }); - }).on('error', function(e) { + }).on('error', function (e) { reject("Error getting plugin versions: " + e.message); - }); + }); }); }); }; - - obj.disablePlugin = function(id, func) { - parent.db.getPlugin(id, function(err, docs){ + + obj.disablePlugin = function (id, func) { + parent.db.getPlugin(id, function (err, docs) { var plugin = docs[0]; parent.db.setPluginStatus(id, 0, func); delete obj.plugins[plugin.shortName]; delete obj.exports[plugin.shortName]; }); }; - - obj.removePlugin = function(id, func) { - parent.db.getPlugin(id, function(err, docs){ + + obj.removePlugin = function (id, func) { + parent.db.getPlugin(id, function (err, docs) { var plugin = docs[0]; - var rimraf = require("rimraf"); + var rimraf = require('rimraf'); let pluginPath = obj.parent.path.join(obj.pluginPath, plugin.shortName); rimraf.sync(pluginPath); parent.db.deletePlugin(id, func); @@ -476,25 +483,23 @@ module.exports.pluginHandler = function (parent) { obj.parent.updateMeshCore(); }); }; - + obj.handleAdminReq = function (req, res, user, serv) { var path = obj.path.join(obj.pluginPath, req.query.pin, 'views'); serv.app.set('views', path); if (obj.plugins[req.query.pin] != null && typeof obj.plugins[req.query.pin].handleAdminReq == 'function') { obj.plugins[req.query.pin].handleAdminReq(req, res, user); - } - else { + } else { res.sendStatus(401); } } - - obj.handleAdminPostReq = function(req, res, user, serv) { + + obj.handleAdminPostReq = function (req, res, user, serv) { var path = obj.path.join(obj.pluginPath, req.query.pin, 'views'); serv.app.set('views', path); if (obj.plugins[req.query.pin] != null && typeof obj.plugins[req.query.pin].handleAdminPostReq == 'function') { obj.plugins[req.query.pin].handleAdminPostReq(req, res, user); - } - else { + } else { res.sendStatus(401); } } diff --git a/public/images/leftbar-64.png b/public/images/leftbar-64.png index ef07b5450d5da52e766043c263ae42dc612a01c7..1299fed8763ca8654034eae133574fc01b1b91f9 100644 GIT binary patch literal 45169 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 diff --git a/public/images/plugin.png b/public/images/plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..7f3963838ecaa5f30e1db1f394faf5afc6ed8d22 GIT binary patch literal 5391 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 literal 0 HcmV?d00001 diff --git a/public/images/plus32.png b/public/images/plus32.png deleted file mode 100644 index f2e17cce77962f316452e75ad7bc4c2f5202ab7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 656 zcmV;B0&o3^P)AwEHl7?B>$6k4hY1KJjukd+g?3 z8HkIaxlEM$bufqiSD&WKq^94}K3{=K0sXcGZW%lg*K-7_ z(Se{IF_mboz!Rz_r^b1l!*2CvS7c-veV4Hbs_J6c9VC0i4`X`q{lDeIR68vNVp qZ~~1f>zCfDir{}PPP2@vJpTiH%i)aF0IlQz0000{{{title}}}
{{{title}}}
{{{title2}}}

{{{logoutControl}}}

 

{{{title}}}
{{{title}}}
{{{title2}}}

{{{logoutControl}}}

 

diff --git a/views/translations/default-min_fr.handlebars b/views/translations/default-min_fr.handlebars index dfe91c1a..0fee842c 100644 --- a/views/translations/default-min_fr.handlebars +++ b/views/translations/default-min_fr.handlebars @@ -1,4 +1,4 @@ -{{{title}}}
{{{title}}}
{{{title2}}}

{{{logoutControl}}}

♦
 

{{{title}}}
{{{title}}}
{{{title2}}}

{{{logoutControl}}}

♦
 

diff --git a/webserver.js b/webserver.js index fb2b311f..0bf4c874 100644 --- a/webserver.js +++ b/webserver.js @@ -3214,35 +3214,38 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { } }); } - - obj.handlePluginAdminReq = function(req, res) { - const domain = checkUserIpAddress(req, res); - if (domain == null) { res.sendStatus(404); return; } - if ((!req.session) || (req.session == null) || (!req.session.userid)) { res.sendStatus(401); return; } - var user = obj.users[req.session.userid]; - if (user == null) { res.sendStatus(401); return; } - - parent.pluginHandler.handleAdminReq(req, res, user, obj); - } - - obj.handlePluginAdminPostReq = function(req, res) { - const domain = checkUserIpAddress(req, res); - if (domain == null) { res.sendStatus(404); return; } - if ((!req.session) || (req.session == null) || (!req.session.userid)) { res.sendStatus(401); return; } - var user = obj.users[req.session.userid]; - if (user == null) { res.sendStatus(401); return; } - - parent.pluginHandler.handleAdminPostReq(req, res, user, obj); - } - - obj.handlePluginJS = function(req, res) { - const domain = checkUserIpAddress(req, res); - if (domain == null) { res.sendStatus(404); return; } - if ((!req.session) || (req.session == null) || (!req.session.userid)) { res.sendStatus(401); return; } - var user = obj.users[req.session.userid]; - if (user == null) { res.sendStatus(401); return; } - - parent.pluginHandler.refreshJS(req, res); + + if (parent.pluginHandler != null) { + // Handle a plugin admin request + obj.handlePluginAdminReq = function (req, res) { + const domain = checkUserIpAddress(req, res); + if (domain == null) { res.sendStatus(404); return; } + if ((!req.session) || (req.session == null) || (!req.session.userid)) { res.sendStatus(401); return; } + var user = obj.users[req.session.userid]; + if (user == null) { res.sendStatus(401); return; } + + parent.pluginHandler.handleAdminReq(req, res, user, obj); + } + + obj.handlePluginAdminPostReq = function (req, res) { + const domain = checkUserIpAddress(req, res); + if (domain == null) { res.sendStatus(404); return; } + if ((!req.session) || (req.session == null) || (!req.session.userid)) { res.sendStatus(401); return; } + var user = obj.users[req.session.userid]; + if (user == null) { res.sendStatus(401); return; } + + parent.pluginHandler.handleAdminPostReq(req, res, user, obj); + } + + obj.handlePluginJS = function (req, res) { + const domain = checkUserIpAddress(req, res); + if (domain == null) { res.sendStatus(404); return; } + if ((!req.session) || (req.session == null) || (!req.session.userid)) { res.sendStatus(401); return; } + var user = obj.users[req.session.userid]; + if (user == null) { res.sendStatus(401); return; } + + parent.pluginHandler.refreshJS(req, res); + } } // Starts the HTTPS server, this should be called after the user/mesh tables are loaded diff --git a/x.txt b/x.txt new file mode 100644 index 00000000..535b0541 --- /dev/null +++ b/x.txt @@ -0,0 +1,9735 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{{title}}} + + + + + + + + +
+ +
+
{{{title}}}
+
{{{title2}}}
+
+ +
+

{{{logoutControl}}}

+
+
+
+
+
+
+
+
+
+
+
+
+ + + + +
+
+
+
+
+ ♦ + +
+ + + + + + + + + + + + + + + + + +
+ + +
 
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ +
+ + +