2017-02-18 01:56:23 -07:00
|
|
|
'use strict';
|
2014-01-13 12:05:13 -05:00
|
|
|
|
2019-09-13 18:24:21 -04:00
|
|
|
const winston = require('winston');
|
|
|
|
|
|
|
|
|
|
const meta = require('../meta');
|
|
|
|
|
const user = require('../user');
|
|
|
|
|
const events = require('../events');
|
|
|
|
|
const db = require('../database');
|
2020-06-05 15:26:51 -04:00
|
|
|
const privileges = require('../privileges');
|
2020-04-01 21:57:28 -04:00
|
|
|
const websockets = require('./index');
|
2019-09-13 18:24:21 -04:00
|
|
|
const index = require('./index');
|
|
|
|
|
const getAdminSearchDict = require('../admin/search').getDictionary;
|
|
|
|
|
|
|
|
|
|
const SocketAdmin = module.exports;
|
|
|
|
|
SocketAdmin.user = require('./admin/user');
|
|
|
|
|
SocketAdmin.categories = require('./admin/categories');
|
2020-03-03 16:33:13 -05:00
|
|
|
SocketAdmin.settings = require('./admin/settings');
|
2019-09-13 18:24:21 -04:00
|
|
|
SocketAdmin.groups = require('./admin/groups');
|
|
|
|
|
SocketAdmin.tags = require('./admin/tags');
|
|
|
|
|
SocketAdmin.rewards = require('./admin/rewards');
|
|
|
|
|
SocketAdmin.navigation = require('./admin/navigation');
|
|
|
|
|
SocketAdmin.rooms = require('./admin/rooms');
|
|
|
|
|
SocketAdmin.social = require('./admin/social');
|
2020-03-03 16:33:13 -05:00
|
|
|
SocketAdmin.themes = require('./admin/themes');
|
|
|
|
|
SocketAdmin.plugins = require('./admin/plugins');
|
|
|
|
|
SocketAdmin.widgets = require('./admin/widgets');
|
|
|
|
|
SocketAdmin.config = require('./admin/config');
|
|
|
|
|
SocketAdmin.settings = require('./admin/settings');
|
|
|
|
|
SocketAdmin.email = require('./admin/email');
|
|
|
|
|
SocketAdmin.analytics = require('./admin/analytics');
|
|
|
|
|
SocketAdmin.logs = require('./admin/logs');
|
|
|
|
|
SocketAdmin.errors = require('./admin/errors');
|
|
|
|
|
SocketAdmin.uploads = require('./admin/uploads');
|
|
|
|
|
SocketAdmin.digest = require('./admin/digest');
|
2020-07-29 12:50:18 -04:00
|
|
|
SocketAdmin.cache = require('./admin/cache');
|
2014-01-10 16:00:03 -05:00
|
|
|
|
2019-10-02 22:51:02 -04:00
|
|
|
SocketAdmin.before = async function (socket, method) {
|
|
|
|
|
const isAdmin = await user.isAdministrator(socket.uid);
|
|
|
|
|
if (isAdmin) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2020-06-05 15:26:51 -04:00
|
|
|
|
|
|
|
|
// Check admin privileges mapping (if not in mapping, deny access)
|
2020-12-23 17:48:54 -05:00
|
|
|
const privilegeSet = privileges.admin.socketMap.hasOwnProperty(method) ? privileges.admin.socketMap[method].split(';') : [];
|
2021-02-04 02:07:29 -07:00
|
|
|
const hasPrivilege = (await Promise.all(privilegeSet.map(
|
|
|
|
|
async privilege => privileges.admin.can(privilege, socket.uid)
|
|
|
|
|
))).some(Boolean);
|
2020-12-23 13:07:41 -05:00
|
|
|
if (privilegeSet.length && hasPrivilege) {
|
2020-06-05 15:26:51 -04:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-03 23:59:08 -07:00
|
|
|
winston.warn(`[socket.io] Call to admin method ( ${method} ) blocked (accessed by uid ${socket.uid})`);
|
2019-10-02 22:51:02 -04:00
|
|
|
throw new Error('[[error:no-privileges]]');
|
2014-01-13 12:01:42 -05:00
|
|
|
};
|
|
|
|
|
|
2021-02-09 23:03:02 -05:00
|
|
|
SocketAdmin.restart = async function (socket) {
|
|
|
|
|
await logRestart(socket);
|
2018-05-02 13:38:15 -04:00
|
|
|
meta.restart();
|
|
|
|
|
};
|
|
|
|
|
|
2021-02-09 23:03:02 -05:00
|
|
|
async function logRestart(socket) {
|
|
|
|
|
await events.log({
|
2015-02-01 19:11:58 -05:00
|
|
|
type: 'restart',
|
|
|
|
|
uid: socket.uid,
|
2017-02-17 19:31:21 -07:00
|
|
|
ip: socket.ip,
|
2015-02-01 19:11:58 -05:00
|
|
|
});
|
2021-02-09 23:03:02 -05:00
|
|
|
await db.setObject('lastrestart', {
|
2018-05-02 13:38:15 -04:00
|
|
|
uid: socket.uid,
|
|
|
|
|
ip: socket.ip,
|
|
|
|
|
timestamp: Date.now(),
|
|
|
|
|
});
|
|
|
|
|
}
|
2016-11-18 12:53:26 -05:00
|
|
|
|
2019-09-13 18:24:21 -04:00
|
|
|
SocketAdmin.reload = async function (socket) {
|
|
|
|
|
await require('../meta/build').buildAll();
|
|
|
|
|
await events.log({
|
|
|
|
|
type: 'build',
|
|
|
|
|
uid: socket.uid,
|
|
|
|
|
ip: socket.ip,
|
|
|
|
|
});
|
|
|
|
|
|
2021-02-09 23:03:02 -05:00
|
|
|
await logRestart(socket);
|
2019-09-13 18:24:21 -04:00
|
|
|
meta.restart();
|
2016-11-18 12:53:26 -05:00
|
|
|
};
|
2016-09-26 11:45:32 -07:00
|
|
|
|
2016-10-13 11:43:39 +02:00
|
|
|
SocketAdmin.fireEvent = function (socket, data, callback) {
|
2015-09-25 16:16:07 -04:00
|
|
|
index.server.emit(data.name, data.payload || {});
|
2016-03-09 19:13:36 +02:00
|
|
|
callback();
|
2014-03-17 11:36:30 -04:00
|
|
|
};
|
2014-02-28 17:19:42 -05:00
|
|
|
|
2020-06-05 12:56:20 -04:00
|
|
|
SocketAdmin.deleteEvents = function (socket, eids, callback) {
|
|
|
|
|
events.deleteEvents(eids, callback);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
SocketAdmin.deleteAllEvents = function (socket, data, callback) {
|
|
|
|
|
events.deleteAll(callback);
|
|
|
|
|
};
|
|
|
|
|
|
2019-09-13 18:24:21 -04:00
|
|
|
SocketAdmin.getSearchDict = async function (socket) {
|
|
|
|
|
const settings = await user.getSettings(socket.uid);
|
2019-10-09 22:04:25 -04:00
|
|
|
const lang = settings.userLang || meta.config.defaultLang || 'en-GB';
|
2019-09-13 18:24:21 -04:00
|
|
|
return await getAdminSearchDict(lang);
|
2016-11-28 12:52:26 -07:00
|
|
|
};
|
|
|
|
|
|
2016-12-15 14:47:42 +03:00
|
|
|
SocketAdmin.deleteAllSessions = function (socket, data, callback) {
|
|
|
|
|
user.auth.deleteAllSessions(callback);
|
|
|
|
|
};
|
|
|
|
|
|
2017-05-25 15:16:55 -04:00
|
|
|
SocketAdmin.reloadAllSessions = function (socket, data, callback) {
|
2021-02-03 23:59:08 -07:00
|
|
|
websockets.in(`uid_${socket.uid}`).emit('event:livereload');
|
2017-05-25 15:16:55 -04:00
|
|
|
callback();
|
|
|
|
|
};
|
2014-10-07 16:21:12 -04:00
|
|
|
|
2020-11-24 16:30:16 -05:00
|
|
|
SocketAdmin.getServerTime = function (socket, data, callback) {
|
|
|
|
|
const now = new Date();
|
|
|
|
|
|
|
|
|
|
callback(null, {
|
|
|
|
|
timestamp: now.getTime(),
|
|
|
|
|
offset: now.getTimezoneOffset(),
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
2019-08-14 19:17:43 -04:00
|
|
|
require('../promisify')(SocketAdmin);
|