2012-03-15 18:25:06 +01:00
|
|
|
var eejs = require('ep_etherpad-lite/node/eejs');
|
2015-02-11 17:59:05 +00:00
|
|
|
var settings = require('ep_etherpad-lite/node/utils/Settings');
|
2012-03-15 18:25:06 +01:00
|
|
|
var installer = require('ep_etherpad-lite/static/js/pluginfw/installer');
|
2012-03-19 17:16:49 +01:00
|
|
|
var plugins = require('ep_etherpad-lite/static/js/pluginfw/plugins');
|
2013-01-26 22:13:28 +01:00
|
|
|
var _ = require('underscore');
|
|
|
|
var semver = require('semver');
|
2020-06-01 18:57:53 +02:00
|
|
|
const UpdateCheck = require('ep_etherpad-lite/node/utils/UpdateCheck');
|
2012-03-15 18:25:06 +01:00
|
|
|
|
2019-02-08 23:20:57 +01:00
|
|
|
exports.expressCreateServer = function(hook_name, args, cb) {
|
2012-03-15 18:25:06 +01:00
|
|
|
args.app.get('/admin/plugins', function(req, res) {
|
|
|
|
var plugins = require("ep_etherpad-lite/static/js/pluginfw/plugins");
|
|
|
|
var render_args = {
|
|
|
|
plugins: plugins.plugins,
|
|
|
|
search_results: {},
|
|
|
|
errors: [],
|
|
|
|
};
|
2019-02-08 23:20:57 +01:00
|
|
|
|
|
|
|
res.send(eejs.require("ep_etherpad-lite/templates/admin/plugins.html", render_args));
|
2012-03-15 21:07:48 +01:00
|
|
|
});
|
2019-02-08 23:20:57 +01:00
|
|
|
|
2012-06-04 14:33:38 +02:00
|
|
|
args.app.get('/admin/plugins/info', function(req, res) {
|
2015-02-11 17:59:05 +00:00
|
|
|
var gitCommit = settings.getGitCommit();
|
2015-04-11 00:13:04 +02:00
|
|
|
var epVersion = settings.getEpVersion();
|
2019-02-08 23:20:57 +01:00
|
|
|
|
|
|
|
res.send(eejs.require("ep_etherpad-lite/templates/admin/plugins-info.html", {
|
|
|
|
gitCommit: gitCommit,
|
2020-06-01 18:57:53 +02:00
|
|
|
epVersion: epVersion,
|
|
|
|
latestVersion: UpdateCheck.getLatestVersion()
|
2019-02-08 23:20:57 +01:00
|
|
|
}));
|
2012-06-04 14:33:38 +02:00
|
|
|
});
|
2012-03-15 21:07:48 +01:00
|
|
|
}
|
2012-03-15 18:25:06 +01:00
|
|
|
|
2019-02-08 23:20:57 +01:00
|
|
|
exports.socketio = function(hook_name, args, cb) {
|
2012-03-15 21:07:48 +01:00
|
|
|
var io = args.io.of("/pluginfw/installer");
|
2019-02-08 23:20:57 +01:00
|
|
|
io.on('connection', function(socket) {
|
2014-11-23 14:15:03 +00:00
|
|
|
if (!socket.conn.request.session || !socket.conn.request.session.user || !socket.conn.request.session.user.is_admin) return;
|
2012-04-19 14:25:12 +02:00
|
|
|
|
2019-02-08 23:20:57 +01:00
|
|
|
socket.on("getInstalled", function(query) {
|
2013-01-26 22:13:28 +01:00
|
|
|
// send currently installed plugins
|
2013-03-25 17:20:10 +01:00
|
|
|
var installed = Object.keys(plugins.plugins).map(function(plugin) {
|
|
|
|
return plugins.plugins[plugin].package
|
2019-02-08 23:20:57 +01:00
|
|
|
});
|
|
|
|
|
2013-03-25 17:20:10 +01:00
|
|
|
socket.emit("results:installed", {installed: installed});
|
2012-03-19 17:16:49 +01:00
|
|
|
});
|
2019-02-08 23:20:57 +01:00
|
|
|
|
2019-01-23 12:24:53 +00:00
|
|
|
socket.on("checkUpdates", async function() {
|
2013-01-26 22:13:28 +01:00
|
|
|
// Check plugins for updates
|
2019-01-23 12:24:53 +00:00
|
|
|
try {
|
|
|
|
let results = await installer.getAvailablePlugins(/*maxCacheAge:*/ 60 * 10);
|
2019-02-08 23:20:57 +01:00
|
|
|
|
2013-01-26 22:13:28 +01:00
|
|
|
var updatable = _(plugins.plugins).keys().filter(function(plugin) {
|
2019-02-08 23:20:57 +01:00
|
|
|
if (!results[plugin]) return false;
|
|
|
|
|
|
|
|
var latestVersion = results[plugin].version;
|
|
|
|
var currentVersion = plugins.plugins[plugin].package.version;
|
|
|
|
|
|
|
|
return semver.gt(latestVersion, currentVersion);
|
2013-01-26 22:13:28 +01:00
|
|
|
});
|
2019-02-08 23:20:57 +01:00
|
|
|
|
2013-03-25 17:20:10 +01:00
|
|
|
socket.emit("results:updatable", {updatable: updatable});
|
2019-01-23 12:24:53 +00:00
|
|
|
} catch (er) {
|
|
|
|
console.warn(er);
|
2019-02-08 23:20:57 +01:00
|
|
|
|
2019-01-23 12:24:53 +00:00
|
|
|
socket.emit("results:updatable", {updatable: {}});
|
|
|
|
}
|
2013-03-25 17:20:10 +01:00
|
|
|
});
|
2012-03-19 17:16:49 +01:00
|
|
|
|
2019-01-23 12:24:53 +00:00
|
|
|
socket.on("getAvailable", async function(query) {
|
|
|
|
try {
|
|
|
|
let results = await installer.getAvailablePlugins(/*maxCacheAge:*/ false);
|
|
|
|
socket.emit("results:available", results);
|
|
|
|
} catch (er) {
|
|
|
|
console.error(er);
|
|
|
|
socket.emit("results:available", {});
|
|
|
|
}
|
|
|
|
});
|
2019-02-08 23:20:57 +01:00
|
|
|
|
2019-01-23 12:24:53 +00:00
|
|
|
socket.on("search", async function(query) {
|
|
|
|
try {
|
|
|
|
let results = await installer.search(query.searchTerm, /*maxCacheAge:*/ 60 * 10);
|
2013-03-25 17:20:10 +01:00
|
|
|
var res = Object.keys(results)
|
|
|
|
.map(function(pluginName) {
|
2019-02-08 23:20:57 +01:00
|
|
|
return results[pluginName];
|
2013-03-26 11:58:31 +01:00
|
|
|
})
|
|
|
|
.filter(function(plugin) {
|
2019-02-08 23:20:57 +01:00
|
|
|
return !plugins.plugins[plugin.name];
|
2013-03-25 17:20:10 +01:00
|
|
|
});
|
2013-03-25 23:09:03 +01:00
|
|
|
res = sortPluginList(res, query.sortBy, query.sortDir)
|
|
|
|
.slice(query.offset, query.offset+query.limit);
|
2013-03-25 17:20:10 +01:00
|
|
|
socket.emit("results:search", {results: res, query: query});
|
2019-01-23 12:24:53 +00:00
|
|
|
} catch (er) {
|
|
|
|
console.error(er);
|
|
|
|
|
|
|
|
socket.emit("results:search", {results: {}, query: query});
|
|
|
|
}
|
2012-03-15 21:07:48 +01:00
|
|
|
});
|
|
|
|
|
2019-02-08 23:20:57 +01:00
|
|
|
socket.on("install", function(plugin_name) {
|
|
|
|
installer.install(plugin_name, function(er) {
|
|
|
|
if (er) console.warn(er);
|
|
|
|
|
2015-01-25 02:44:10 +00:00
|
|
|
socket.emit("finished:install", {plugin: plugin_name, code: er? er.code : null, error: er? er.message : null});
|
2012-03-17 18:17:10 +01:00
|
|
|
});
|
2012-03-15 21:07:48 +01:00
|
|
|
});
|
|
|
|
|
2019-02-08 23:20:57 +01:00
|
|
|
socket.on("uninstall", function(plugin_name) {
|
|
|
|
installer.uninstall(plugin_name, function(er) {
|
|
|
|
if (er) console.warn(er);
|
|
|
|
|
2013-03-26 15:11:30 +01:00
|
|
|
socket.emit("finished:uninstall", {plugin: plugin_name, error: er? er.message : null});
|
2012-03-17 18:17:10 +01:00
|
|
|
});
|
2012-03-15 21:07:48 +01:00
|
|
|
});
|
2012-03-15 18:25:06 +01:00
|
|
|
});
|
2012-03-15 21:07:48 +01:00
|
|
|
}
|
2013-03-25 23:09:03 +01:00
|
|
|
|
|
|
|
function sortPluginList(plugins, property, /*ASC?*/dir) {
|
|
|
|
return plugins.sort(function(a, b) {
|
2019-02-08 23:20:57 +01:00
|
|
|
if (a[property] < b[property]) {
|
|
|
|
return dir? -1 : 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (a[property] > b[property]) {
|
|
|
|
return dir? 1 : -1;
|
|
|
|
}
|
|
|
|
|
2013-03-25 23:09:03 +01:00
|
|
|
// a must be equal to b
|
|
|
|
return 0;
|
2019-02-08 23:20:57 +01:00
|
|
|
});
|
2014-11-18 14:08:44 +00:00
|
|
|
}
|