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