add adminfunctions
This commit is contained in:
parent
a5d25a8217
commit
be8f94b368
|
@ -114,7 +114,7 @@ function Admintools() {
|
||||||
selectIPAction(sel.options[sel.selectedIndex].value);
|
selectIPAction(sel.options[sel.selectedIndex].value);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{['ban', 'unban', 'whitelist', 'unwhitelist', 'iidtoip']
|
{['iidtoip']
|
||||||
.map((opt) => (
|
.map((opt) => (
|
||||||
<option
|
<option
|
||||||
value={opt}
|
value={opt}
|
||||||
|
|
|
@ -7,14 +7,26 @@
|
||||||
|
|
||||||
import sharp from 'sharp';
|
import sharp from 'sharp';
|
||||||
import Sequelize from 'sequelize';
|
import Sequelize from 'sequelize';
|
||||||
import redis from '../data/redis/client';
|
|
||||||
|
|
||||||
import { getIPv6Subnet } from '../utils/ip';
|
import isIPAllowed from './isAllowed';
|
||||||
import { validateCoorRange } from '../utils/validation';
|
import { validateCoorRange } from '../utils/validation';
|
||||||
import CanvasCleaner from './CanvasCleaner';
|
import CanvasCleaner from './CanvasCleaner';
|
||||||
import { Whitelist, RegUser } from '../data/sql';
|
import { RegUser } from '../data/sql';
|
||||||
import { getIPofIID } from '../data/sql/IPInfo';
|
import {
|
||||||
|
cleanCacheForIP,
|
||||||
|
} from '../data/redis/isAllowedCache';
|
||||||
import { forceCaptcha } from '../data/redis/captcha';
|
import { forceCaptcha } from '../data/redis/captcha';
|
||||||
|
import {
|
||||||
|
isWhitelisted,
|
||||||
|
whitelistIP,
|
||||||
|
unwhitelistIP,
|
||||||
|
} from '../data/sql/Whitelist';
|
||||||
|
import {
|
||||||
|
getBanInfo,
|
||||||
|
banIP,
|
||||||
|
unbanIP,
|
||||||
|
} from '../data/sql/Ban';
|
||||||
|
import { getInfoToIp, getIPofIID } from '../data/sql/IPInfo';
|
||||||
// eslint-disable-next-line import/no-unresolved
|
// eslint-disable-next-line import/no-unresolved
|
||||||
import canvases from './canvases.json';
|
import canvases from './canvases.json';
|
||||||
import {
|
import {
|
||||||
|
@ -56,29 +68,12 @@ export async function executeIPAction(action, ips, logger = null) {
|
||||||
out += `Couln't parse ${action} ${ip}\n`;
|
out += `Couln't parse ${action} ${ip}\n`;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const ipKey = getIPv6Subnet(ip);
|
|
||||||
const key = `isprox:${ipKey}`;
|
|
||||||
|
|
||||||
if (logger) logger(`${action} ${ip}`);
|
if (logger) logger(`${action} ${ip}`);
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case 'whitelist':
|
|
||||||
await Whitelist.findOrCreate({
|
|
||||||
where: { ip: ipKey },
|
|
||||||
});
|
|
||||||
await redis.set(key, 'n', {
|
|
||||||
EX: 24 * 3600,
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case 'unwhitelist':
|
|
||||||
await Whitelist.destroy({
|
|
||||||
where: { ip: ipKey },
|
|
||||||
});
|
|
||||||
await redis.del(key);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
out += `Failed to ${action} ${ip}\n`;
|
return `Failed to ${action} ${ip}\n`;
|
||||||
}
|
}
|
||||||
out += `Succseefully did ${action} ${ip}\n`;
|
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
@ -89,7 +84,14 @@ export async function executeIPAction(action, ips, logger = null) {
|
||||||
* @param iid already sanizized iid
|
* @param iid already sanizized iid
|
||||||
* @return text of success
|
* @return text of success
|
||||||
*/
|
*/
|
||||||
export async function executeIIDAction(action, iid, logger = null) {
|
export async function executeIIDAction(
|
||||||
|
action,
|
||||||
|
iid,
|
||||||
|
reason,
|
||||||
|
expire,
|
||||||
|
muid,
|
||||||
|
logger = null,
|
||||||
|
) {
|
||||||
const ip = await getIPofIID(iid);
|
const ip = await getIPofIID(iid);
|
||||||
if (!ip) {
|
if (!ip) {
|
||||||
return `Could not resolve ${iid}`;
|
return `Could not resolve ${iid}`;
|
||||||
|
@ -97,6 +99,36 @@ export async function executeIIDAction(action, iid, logger = null) {
|
||||||
const iidPart = iid.slice(0, iid.indexOf('-'));
|
const iidPart = iid.slice(0, iid.indexOf('-'));
|
||||||
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
|
case 'status': {
|
||||||
|
const allowed = await isIPAllowed(ip, true);
|
||||||
|
let out = `Allowed to place: ${allowed.allowed}`;
|
||||||
|
const info = await getInfoToIp(ip);
|
||||||
|
out += `Country: ${info.country}\n`
|
||||||
|
+ `CIDR: ${info.cidr}\n`
|
||||||
|
+ `org: ${info.org || 'N/A'}\n`
|
||||||
|
+ `desc: ${info.descr || 'N/A'}\n`
|
||||||
|
+ `asn: ${info.asn}\n`
|
||||||
|
+ `proxy: ${info.isProxy}\n`;
|
||||||
|
if (info.pcheck) {
|
||||||
|
const { pcheck } = info;
|
||||||
|
out += `pc: ${pcheck.slice(0, pcheck.indexOf(','))}\n`;
|
||||||
|
}
|
||||||
|
const whitelisted = await isWhitelisted(ip);
|
||||||
|
out += `whitelisted: ${whitelisted}\n`;
|
||||||
|
const ban = await getBanInfo(ip);
|
||||||
|
if (!ban) {
|
||||||
|
out += 'banned: false\n';
|
||||||
|
} else {
|
||||||
|
out += `reason: ${ban.reason}\n`;
|
||||||
|
if (ban.expires) {
|
||||||
|
out += `expires: ${ban.expires.toLocaleString()}\n`;
|
||||||
|
}
|
||||||
|
if (ban.mod) {
|
||||||
|
out += `by: @[${ban.mod.name}](${ban.mod.id})\n`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
case 'givecaptcha': {
|
case 'givecaptcha': {
|
||||||
const succ = await forceCaptcha(ip);
|
const succ = await forceCaptcha(ip);
|
||||||
if (succ === null) {
|
if (succ === null) {
|
||||||
|
@ -107,10 +139,44 @@ export async function executeIIDAction(action, iid, logger = null) {
|
||||||
}
|
}
|
||||||
return `${iidPart} would have gotten captcha anyway`;
|
return `${iidPart} would have gotten captcha anyway`;
|
||||||
}
|
}
|
||||||
case 'ban':
|
case 'ban': {
|
||||||
case 'unban':
|
if (expire && expire < Date.now()) {
|
||||||
case 'Whitelist':
|
return 'No valid expiration time';
|
||||||
case 'unwhitelist':
|
}
|
||||||
|
if (!reason) {
|
||||||
|
return 'No reason specified';
|
||||||
|
}
|
||||||
|
const ret = await banIP(ip, reason, expire || null, muid);
|
||||||
|
if (ret) {
|
||||||
|
await cleanCacheForIP(ip);
|
||||||
|
return 'Successfully banned user';
|
||||||
|
}
|
||||||
|
return 'User is already banned';
|
||||||
|
}
|
||||||
|
case 'unban': {
|
||||||
|
const ret = await unbanIP(ip);
|
||||||
|
if (ret) {
|
||||||
|
await cleanCacheForIP(ip);
|
||||||
|
return 'Successfully unbanned user';
|
||||||
|
}
|
||||||
|
return 'User is not banned';
|
||||||
|
}
|
||||||
|
case 'Whitelist': {
|
||||||
|
const ret = await whitelistIP(ip);
|
||||||
|
if (ret) {
|
||||||
|
await cleanCacheForIP(ip);
|
||||||
|
return 'Successfully whitelisted user';
|
||||||
|
}
|
||||||
|
return 'User is already whitelisted';
|
||||||
|
}
|
||||||
|
case 'unwhitelist': {
|
||||||
|
const ret = await unwhitelistIP(ip);
|
||||||
|
if (ret) {
|
||||||
|
await cleanCacheForIP(ip);
|
||||||
|
return 'Successfully removed user from whitelist';
|
||||||
|
}
|
||||||
|
return 'User is not on whitelist';
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return `Failed to ${action} ${iid}`;
|
return `Failed to ${action} ${iid}`;
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,7 +115,7 @@ async function saveIPInfo(ip, whoisRet, isProxy, info) {
|
||||||
* @param ip IP to check
|
* @param ip IP to check
|
||||||
* @return true if proxy or blacklisted, false if not or whitelisted
|
* @return true if proxy or blacklisted, false if not or whitelisted
|
||||||
*/
|
*/
|
||||||
export async function withoutCache(f, ip) {
|
async function withoutCache(f, ip) {
|
||||||
const ipKey = getIPv6Subnet(ip);
|
const ipKey = getIPv6Subnet(ip);
|
||||||
let allowed = true;
|
let allowed = true;
|
||||||
let status = -2;
|
let status = -2;
|
||||||
|
|
|
@ -37,6 +37,7 @@ const IPInfo = sequelize.define('IPInfo', {
|
||||||
|
|
||||||
asn: {
|
asn: {
|
||||||
type: DataTypes.CHAR(12),
|
type: DataTypes.CHAR(12),
|
||||||
|
defaultValue: 'N/A',
|
||||||
allowNull: false,
|
allowNull: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -55,7 +56,7 @@ const IPInfo = sequelize.define('IPInfo', {
|
||||||
}, {
|
}, {
|
||||||
getterMethods: {
|
getterMethods: {
|
||||||
isProxy() {
|
isProxy() {
|
||||||
return !!this.proxy;
|
return (this.proxy === 1);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -128,6 +129,10 @@ export async function getIdsToIps(ips) {
|
||||||
return ipToIdMap;
|
return ipToIdMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getInfoToIp(ip) {
|
||||||
|
return IPInfo.findByPk(ip);
|
||||||
|
}
|
||||||
|
|
||||||
export async function getInfoToIps(ips) {
|
export async function getInfoToIps(ips) {
|
||||||
const ipToIdMap = new Map();
|
const ipToIdMap = new Map();
|
||||||
if (!ips.length || ips.length > 300) {
|
if (!ips.length || ips.length > 300) {
|
||||||
|
|
|
@ -89,107 +89,103 @@ router.post('/', upload.single('image'), async (req, res, next) => {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
if (req.body.cleanerstat) {
|
||||||
if (req.body.cleanerstat) {
|
const ret = CanvasCleaner.reportStatus();
|
||||||
const ret = CanvasCleaner.reportStatus();
|
res.status(200);
|
||||||
res.status(200);
|
res.json(ret);
|
||||||
res.json(ret);
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (req.body.cleanercancel) {
|
|
||||||
const ret = CanvasCleaner.stop();
|
|
||||||
res.status(200).send(ret);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (req.body.watchaction) {
|
|
||||||
const {
|
|
||||||
watchaction, ulcoor, brcoor, time, iid, canvasid,
|
|
||||||
} = req.body;
|
|
||||||
const ret = await executeWatchAction(
|
|
||||||
watchaction,
|
|
||||||
ulcoor,
|
|
||||||
brcoor,
|
|
||||||
time,
|
|
||||||
iid,
|
|
||||||
canvasid,
|
|
||||||
);
|
|
||||||
res.status(200).json(ret);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (req.body.iidaction) {
|
|
||||||
const {
|
|
||||||
iidaction, iid, reason, time,
|
|
||||||
} = req.body;
|
|
||||||
const ret = await executeIIDAction(
|
|
||||||
iidaction,
|
|
||||||
iid,
|
|
||||||
reason,
|
|
||||||
time,
|
|
||||||
);
|
|
||||||
res.status(200).send(ret);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (req.body.cleaneraction) {
|
|
||||||
const {
|
|
||||||
cleaneraction, ulcoor, brcoor, canvasid,
|
|
||||||
} = req.body;
|
|
||||||
const [ret, msg] = await executeCleanerAction(
|
|
||||||
cleaneraction,
|
|
||||||
ulcoor,
|
|
||||||
brcoor,
|
|
||||||
canvasid,
|
|
||||||
aLogger,
|
|
||||||
);
|
|
||||||
res.status(ret).send(msg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (req.body.imageaction) {
|
|
||||||
const { imageaction, coords, canvasid } = req.body;
|
|
||||||
const [ret, msg] = await executeImageAction(
|
|
||||||
imageaction,
|
|
||||||
req.file,
|
|
||||||
coords,
|
|
||||||
canvasid,
|
|
||||||
aLogger,
|
|
||||||
);
|
|
||||||
res.status(ret).send(msg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (req.body.protaction) {
|
|
||||||
const {
|
|
||||||
protaction, ulcoor, brcoor, canvasid,
|
|
||||||
} = req.body;
|
|
||||||
const [ret, msg] = await executeProtAction(
|
|
||||||
protaction,
|
|
||||||
ulcoor,
|
|
||||||
brcoor,
|
|
||||||
canvasid,
|
|
||||||
aLogger,
|
|
||||||
);
|
|
||||||
res.status(ret).send(msg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (req.body.rollback) {
|
|
||||||
// rollback is date as YYYYMMdd
|
|
||||||
const {
|
|
||||||
rollback, ulcoor, brcoor, canvasid,
|
|
||||||
} = req.body;
|
|
||||||
const [ret, msg] = await executeRollback(
|
|
||||||
rollback,
|
|
||||||
ulcoor,
|
|
||||||
brcoor,
|
|
||||||
canvasid,
|
|
||||||
aLogger,
|
|
||||||
(req.user.userlvl === 1),
|
|
||||||
);
|
|
||||||
res.status(ret).send(msg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
next();
|
|
||||||
} catch (error) {
|
|
||||||
next(error);
|
|
||||||
}
|
}
|
||||||
|
if (req.body.cleanercancel) {
|
||||||
|
const ret = CanvasCleaner.stop();
|
||||||
|
res.status(200).send(ret);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (req.body.watchaction) {
|
||||||
|
const {
|
||||||
|
watchaction, ulcoor, brcoor, time, iid, canvasid,
|
||||||
|
} = req.body;
|
||||||
|
const ret = await executeWatchAction(
|
||||||
|
watchaction,
|
||||||
|
ulcoor,
|
||||||
|
brcoor,
|
||||||
|
time,
|
||||||
|
iid,
|
||||||
|
canvasid,
|
||||||
|
);
|
||||||
|
res.status(200).json(ret);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (req.body.iidaction) {
|
||||||
|
const {
|
||||||
|
iidaction, iid, reason, time,
|
||||||
|
} = req.body;
|
||||||
|
const ret = await executeIIDAction(
|
||||||
|
iidaction,
|
||||||
|
iid,
|
||||||
|
reason,
|
||||||
|
time,
|
||||||
|
req.user.id,
|
||||||
|
);
|
||||||
|
res.status(200).send(ret);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (req.body.cleaneraction) {
|
||||||
|
const {
|
||||||
|
cleaneraction, ulcoor, brcoor, canvasid,
|
||||||
|
} = req.body;
|
||||||
|
const [ret, msg] = await executeCleanerAction(
|
||||||
|
cleaneraction,
|
||||||
|
ulcoor,
|
||||||
|
brcoor,
|
||||||
|
canvasid,
|
||||||
|
aLogger,
|
||||||
|
);
|
||||||
|
res.status(ret).send(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (req.body.imageaction) {
|
||||||
|
const { imageaction, coords, canvasid } = req.body;
|
||||||
|
const [ret, msg] = await executeImageAction(
|
||||||
|
imageaction,
|
||||||
|
req.file,
|
||||||
|
coords,
|
||||||
|
canvasid,
|
||||||
|
aLogger,
|
||||||
|
);
|
||||||
|
res.status(ret).send(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (req.body.protaction) {
|
||||||
|
const {
|
||||||
|
protaction, ulcoor, brcoor, canvasid,
|
||||||
|
} = req.body;
|
||||||
|
const [ret, msg] = await executeProtAction(
|
||||||
|
protaction,
|
||||||
|
ulcoor,
|
||||||
|
brcoor,
|
||||||
|
canvasid,
|
||||||
|
aLogger,
|
||||||
|
);
|
||||||
|
res.status(ret).send(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (req.body.rollback) {
|
||||||
|
// rollback is date as YYYYMMdd
|
||||||
|
const {
|
||||||
|
rollback, ulcoor, brcoor, canvasid,
|
||||||
|
} = req.body;
|
||||||
|
const [ret, msg] = await executeRollback(
|
||||||
|
rollback,
|
||||||
|
ulcoor,
|
||||||
|
brcoor,
|
||||||
|
canvasid,
|
||||||
|
aLogger,
|
||||||
|
(req.user.userlvl === 1),
|
||||||
|
);
|
||||||
|
res.status(ret).send(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
next();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
@ -213,51 +209,42 @@ router.post('/', async (req, res, next) => {
|
||||||
logger.info(`ADMIN> ${req.user.regUser.name}[${req.user.id}]> ${text}`);
|
logger.info(`ADMIN> ${req.user.regUser.name}[${req.user.id}]> ${text}`);
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
if (req.body.ipaction) {
|
||||||
if (req.body.ipaction) {
|
const ret = await executeIPAction(
|
||||||
const ret = await executeIPAction(
|
req.body.ipaction,
|
||||||
req.body.ipaction,
|
req.body.ip,
|
||||||
req.body.ip,
|
aLogger,
|
||||||
aLogger,
|
);
|
||||||
);
|
res.status(200).send(ret);
|
||||||
res.status(200).send(ret);
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (req.body.modlist) {
|
|
||||||
const ret = await getModList();
|
|
||||||
res.status(200);
|
|
||||||
res.json(ret);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (req.body.remmod) {
|
|
||||||
try {
|
|
||||||
const ret = await removeMod(req.body.remmod);
|
|
||||||
res.status(200).send(ret);
|
|
||||||
} catch (e) {
|
|
||||||
res.status(400).send(e.message);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (req.body.makemod) {
|
|
||||||
try {
|
|
||||||
const ret = await makeMod(req.body.makemod);
|
|
||||||
res.status(200);
|
|
||||||
res.json(ret);
|
|
||||||
} catch (e) {
|
|
||||||
res.status(400).send(e.message);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
next();
|
|
||||||
} catch (error) {
|
|
||||||
next(error);
|
|
||||||
}
|
}
|
||||||
|
if (req.body.modlist) {
|
||||||
|
const ret = await getModList();
|
||||||
|
res.status(200);
|
||||||
|
res.json(ret);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (req.body.remmod) {
|
||||||
|
const ret = await removeMod(req.body.remmod);
|
||||||
|
res.status(200).send(ret);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (req.body.makemod) {
|
||||||
|
const ret = await makeMod(req.body.makemod);
|
||||||
|
res.status(200);
|
||||||
|
res.json(ret);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
next();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
router.use(async (req, res) => {
|
router.use(async (req, res) => {
|
||||||
res.status(400).send('Invalid request');
|
res.status(400).send('Invalid request');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
router.use((err, req, res, next) => {
|
||||||
|
res.status(400).send(err.message);
|
||||||
|
});
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user