summaryrefslogtreecommitdiff
path: root/src/node/hooks/express/adminplugins.js
blob: 7e221cf1e321b9979e19f671aee7bb05f78920da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
var path = require('path');
var eejs = require('ep_etherpad-lite/node/eejs');
var installer = require('ep_etherpad-lite/static/js/pluginfw/installer');
var plugins = require('ep_etherpad-lite/static/js/pluginfw/plugins');
var _ = require('underscore');
var semver = require('semver');
var async = require('async');

exports.expressCreateServer = function (hook_name, args, cb) {
  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: [],
    };

    res.send( eejs.require("ep_etherpad-lite/templates/admin/plugins.html", render_args) );
  });
  args.app.get('/admin/plugins/info', function(req, res) {
    res.send( eejs.require("ep_etherpad-lite/templates/admin/plugins-info.html", {}) );
  });
}

exports.socketio = function (hook_name, args, cb) {
  var io = args.io.of("/pluginfw/installer");
  io.on('connection', function (socket) {
    if (!socket.handshake.session.user || !socket.handshake.session.user.is_admin) return;

    socket.on("load", function (query) {
      // send currently installed plugins
      socket.emit("installed-results", {results: plugins.plugins});
      socket.emit("progress", {progress:1});
    });
    
    socket.on("checkUpdates", function() {
      socket.emit("progress", {progress:0, message:'Checking for plugin updates...'});
      // Check plugins for updates
      installer.search({offset: 0, pattern: '', limit: 500}, /*useCache:*/true, function(data) { // hacky
        if (!data.results) return;
        var updatable = _(plugins.plugins).keys().filter(function(plugin) {
          if(!data.results[plugin]) return false;
          var latestVersion = data.results[plugin]['dist-tags'].latest
          var currentVersion = plugins.plugins[plugin].package.version
          return semver.gt(latestVersion, currentVersion)
        });
        socket.emit("updatable", {updatable: updatable});
        socket.emit("progress", {progress:1});
      });
    })

    socket.on("search", function (query) {
      socket.emit("progress", {progress:0, message:'Fetching results...'});
        installer.search(query, true, function (progress) {
        if (progress.results)
          socket.emit("search-result", progress);
        socket.emit("progress", progress);
      });
    });

    socket.on("install", function (plugin_name) {
      socket.emit("progress", {progress:0, message:'Downloading and installing ' + plugin_name + "..."});
      installer.install(plugin_name, function (progress) {
        socket.emit("progress", progress);
      });
    });

    socket.on("uninstall", function (plugin_name) {
      socket.emit("progress", {progress:0, message:'Uninstalling ' + plugin_name + "..."});
      installer.uninstall(plugin_name, function (progress) {
        socket.emit("progress", progress);
      });
    });
  });
}