You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.6 KiB
72 lines
1.6 KiB
var authcommon = require('./common'),
|
|
caps = require('../server/caps'),
|
|
common= require('../common'),
|
|
okyaku = require('../server/okyaku'),
|
|
STATE = require('../server/state');
|
|
|
|
require('./panel');
|
|
|
|
function connect() {
|
|
return global.redis;
|
|
}
|
|
|
|
function ban(m, mod, ip, key, type) {
|
|
if (type == 'unban') {
|
|
// unban from every type of suspension
|
|
authcommon.suspensionKeys.forEach(function (suffix) {
|
|
m.srem('hot:' + suffix, key);
|
|
});
|
|
m.hdel('ip:' + key, 'ban');
|
|
}
|
|
else {
|
|
// need to validate that this is a valid ban type
|
|
// TODO: elaborate
|
|
if (type != 'timeout')
|
|
return false;
|
|
|
|
m.sadd('hot:' + type + 's', key);
|
|
m.hset('ip:' + key, 'ban', type);
|
|
}
|
|
var now = Date.now();
|
|
var info = {ip: key, type: type, time: now};
|
|
if (key !== ip)
|
|
info.realip = ip;
|
|
if (mod.ident.email)
|
|
info.email = mod.ident.email;
|
|
m.rpush('auditLog', JSON.stringify(info));
|
|
|
|
// trigger reload
|
|
m.publish('reloadHot', 'caps');
|
|
|
|
return true;
|
|
}
|
|
|
|
okyaku.dispatcher[authcommon.BAN] = function (msg, client) {
|
|
if (!caps.can_administrate(client.ident))
|
|
return false;
|
|
var ip = msg[0];
|
|
var type = msg[1];
|
|
if (!authcommon.is_valid_ip(ip))
|
|
return false;
|
|
var key = authcommon.ip_key(ip);
|
|
|
|
var m = connect().multi();
|
|
if (!ban(m, client, ip, key, type))
|
|
return false;
|
|
|
|
m.exec(function (err) {
|
|
if (err)
|
|
return client.kotowaru(err);
|
|
var wasBanned = type != 'unban';
|
|
|
|
/* XXX not DRY */
|
|
var ADDRS = authcommon.modCache.addresses;
|
|
if (ADDRS[key])
|
|
ADDRS[key].ban = wasBanned;
|
|
|
|
var a = {ban: wasBanned};
|
|
client.send([0, common.MODEL_SET, ['addrs', key], a]);
|
|
});
|
|
return true;
|
|
};
|