diff --git a/public/src/forum/admin/index.js b/public/src/forum/admin/index.js
index 92bfbe2f2c..d35712c215 100644
--- a/public/src/forum/admin/index.js
+++ b/public/src/forum/admin/index.js
@@ -2,25 +2,11 @@ define(function() {
var Admin = {};
Admin.init = function() {
- ajaxify.register_events(['api:get_all_rooms']);
+ ajaxify.register_events(['api:meta.rooms.getAll']);
app.enterRoom('admin');
- socket.emit('api:meta.rooms.getAll', function(data) {
-
- var active_users = document.getElementById('active_users'),
- total = 0;
- active_users.innerHTML = '';
-
- for (var room in data) {
- if (room !== '') {
- var count = data[room].length;
- total += count;
- active_users.innerHTML = active_users.innerHTML + "
" + room + " " + count + " active user" + (count > 1 ? "s" : "") + "
";
- }
- }
-
- document.getElementById('connections').innerHTML = total;
- });
+ socket.emit('api:meta.rooms.getAll', Admin.updateRoomUsage);
+ socket.on('event:meta.rooms.update', Admin.updateRoomUsage);
$('#logout-link').on('click', function() {
$.post(RELATIVE_PATH + '/logout', {
@@ -31,5 +17,22 @@ define(function() {
})
};
+ Admin.updateRoomUsage = function(data) {
+ console.log('room usage updating', data);
+ var active_users = document.getElementById('active_users'),
+ total = 0;
+ active_users.innerHTML = '';
+
+ for (var room in data) {
+ if (room !== '') {
+ var count = data[room].length;
+ total += count;
+ active_users.innerHTML = active_users.innerHTML + "" + room + " " + count + " active user" + (count > 1 ? "s" : "") + "
";
+ }
+ }
+
+ document.getElementById('connections').innerHTML = total;
+ };
+
return Admin;
});
diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js
index 90924d8b01..86d4e46ce5 100644
--- a/src/socket.io/admin.js
+++ b/src/socket.io/admin.js
@@ -10,9 +10,21 @@ var groups = require('../groups'),
},
async = require('async'),
+ winston = require('winston'),
SocketAdmin = {};
+SocketAdmin.before = function(sessionData, next) {
+ // Verify administrative privileges
+ user.isAdministrator(sessionData.uid, function(err, isAdmin) {
+ if (isAdmin) {
+ next();
+ } else {
+ winston.warn('[socket.io] Call to admin method blocked (accessed by uid ' + sessionData.uid + ')');
+ }
+ });
+};
+
/* Topics */
SocketAdmin.topics = {};
diff --git a/src/socket.io/index.js b/src/socket.io/index.js
index a4a9625d30..e17c3acd34 100644
--- a/src/socket.io/index.js
+++ b/src/socket.io/index.js
@@ -130,6 +130,7 @@ Sockets.init = function() {
} else {
// Deconstruct the message
var parts = payload.name.slice(4).split('.'),
+ namespace = parts.slice(0, 1),
methodToCall = parts.reduce(function(prev, cur) {
if (prev !== null && prev[cur]) {
return prev[cur];
@@ -157,8 +158,15 @@ Sockets.init = function() {
}
socketArgs.push(sessionData);
+ // Call the requested method
+ if (Namespaces[namespace].before) {
+ Namespaces[namespace].before(sessionData, function() {
+ methodToCall.apply(Namespaces, socketArgs);
+ });
+ } else {
+ methodToCall.apply(Namespaces, socketArgs);
+ }
// winston.info('[socket.io] Executing: ' + payload.name);
- methodToCall.apply(Namespaces, socketArgs);
} else {
winston.warn('[socket.io] Unrecognized message: ' + payload.name);
}
diff --git a/src/socket.io/meta.js b/src/socket.io/meta.js
index ee48554579..e46de7d83a 100644
--- a/src/socket.io/meta.js
+++ b/src/socket.io/meta.js
@@ -88,7 +88,7 @@ SocketMeta.rooms.enter = function(data, sessionData) {
module.parent.exports.updateRoomBrowsingText(data.enter);
if (data.enter != 'admin') {
- sessionData.server.sockets.in('admin').emit('api:get_all_rooms', sessionData.server.sockets.manager.rooms);
+ sessionData.server.sockets.in('admin').emit('event:meta.rooms.update', sessionData.server.sockets.manager.rooms);
}
};