From 3569d42f2deae8215d0cf872413810400177b547 Mon Sep 17 00:00:00 2001 From: MinusGix Date: Thu, 5 Mar 2020 10:48:33 -0600 Subject: Add UAC info file with levels and minor utility functions --- server/src/commands/utility/UAC/info.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 server/src/commands/utility/UAC/info.js (limited to 'server/src/commands') diff --git a/server/src/commands/utility/UAC/info.js b/server/src/commands/utility/UAC/info.js new file mode 100644 index 0000000..220e14d --- /dev/null +++ b/server/src/commands/utility/UAC/info.js @@ -0,0 +1,32 @@ +export const levels = { + admin : 9999999, + moderator : 999999, + + channelOwner : 99999, + channelModerator : 9999, + + user : 100, +}; + +export function isAdmin (level) { + return level >= levels.admin; +} + +export function isModerator (level) { + return level >= levels.moderator; +} + +export function isChannelOwner (level) { + return level >= levels.channelOwner; +} + +export function isChannelModerator (level) { + return level >= levels.channelModerator; +} + +export async function run (core, server, socket, data) {} + +export const info = { + name: 'uac_info', + description: 'This module contains information about UAC levels, and minor utility functions.', +}; \ No newline at end of file -- cgit v1.2.1 From 2fd054a31ed0b98b8ff6538d55ce9b1caa1b5a70 Mon Sep 17 00:00:00 2001 From: MinusGix Date: Thu, 5 Mar 2020 10:48:58 -0600 Subject: Make join apply UAC levels to sockets and userInfo --- server/src/commands/core/join.js | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'server/src/commands') diff --git a/server/src/commands/core/join.js b/server/src/commands/core/join.js index 644470e..eccac6e 100644 --- a/server/src/commands/core/join.js +++ b/server/src/commands/core/join.js @@ -2,6 +2,8 @@ Description: Initial entry point, applies `channel` and `nick` to the calling socket */ +import * as UAC from "../utility/UAC/info"; + // module support functions const crypto = require('crypto'); @@ -20,6 +22,7 @@ export function parseNickname(core, data) { nick: '', uType: 'user', trip: null, + level: UAC.levels.user, }; // seperate nick from password @@ -36,6 +39,7 @@ export function parseNickname(core, data) { if (hash(password + core.config.tripSalt) === core.config.adminTrip) { userInfo.uType = 'admin'; userInfo.trip = 'Admin'; + userInfo.level = UAC.levels.admin; } else if (userInfo.nick.toLowerCase() === core.config.adminName.toLowerCase()) { // they've got the main-admin name while not being an admin return 'You are not the admin, liar!'; @@ -48,6 +52,7 @@ export function parseNickname(core, data) { core.config.mods.forEach((mod) => { if (userInfo.trip === mod.trip) { userInfo.uType = 'mod'; + userInfo.level = UAC.levels.moderator; } }); @@ -113,6 +118,7 @@ export async function run(core, server, socket, data) { nick: userInfo.nick, trip: userInfo.trip || 'null', hash: userInfo.userHash, + level: userInfo.level, }; // send join announcement and prep online set @@ -126,6 +132,7 @@ export async function run(core, server, socket, data) { socket.nick = userInfo.nick; socket.channel = data.channel; socket.hash = userInfo.userHash; + socket.level = userInfo.level; if (userInfo.trip !== null) socket.trip = userInfo.trip; nicks.push(socket.nick); -- cgit v1.2.1 From 50737bc0d9c1ae806610e76be013eeddca1bf102 Mon Sep 17 00:00:00 2001 From: MinusGix Date: Thu, 5 Mar 2020 10:49:25 -0600 Subject: Move most uses of uType filtering to use UAC levels --- server/src/commands/admin/addmod.js | 7 +++++-- server/src/commands/admin/listusers.js | 4 +++- server/src/commands/admin/reload.js | 14 +++++--------- server/src/commands/admin/removemod.js | 7 +++++-- server/src/commands/admin/saveconfig.js | 14 +++++--------- server/src/commands/admin/shout.js | 4 +++- server/src/commands/core/chat.js | 7 +++++-- server/src/commands/mod/ban.js | 10 ++++++---- server/src/commands/mod/dumb.js | 8 +++++--- server/src/commands/mod/kick.js | 10 ++++++---- server/src/commands/mod/moveuser.js | 6 ++++-- server/src/commands/mod/speak.js | 6 ++++-- server/src/commands/mod/unban.js | 6 ++++-- server/src/commands/mod/unbanall.js | 6 ++++-- 14 files changed, 64 insertions(+), 45 deletions(-) (limited to 'server/src/commands') diff --git a/server/src/commands/admin/addmod.js b/server/src/commands/admin/addmod.js index 26cec40..e5d8495 100644 --- a/server/src/commands/admin/addmod.js +++ b/server/src/commands/admin/addmod.js @@ -2,10 +2,12 @@ Description: Adds the target trip to the mod list then elevates the uType */ +import * as UAC from "../utility/UAC/info"; + // module main export async function run(core, server, socket, data) { // increase rate limit chance and ignore if not admin - if (socket.uType !== 'admin') { + if (!UAC.isAdmin(socket.level)) { return server.police.frisk(socket.address, 20); } @@ -18,6 +20,7 @@ export async function run(core, server, socket, data) { for (let i = 0, l = newMod.length; i < l; i += 1) { // upgrade privilages newMod[i].uType = 'mod'; + newMod[i].level = UAC.levels.moderator; // inform new mod server.send({ @@ -37,7 +40,7 @@ export async function run(core, server, socket, data) { server.broadcast({ cmd: 'info', text: `Added mod: ${data.trip}`, - }, { uType: 'mod' }); + }, { level: UAC.isModerator }); return true; } diff --git a/server/src/commands/admin/listusers.js b/server/src/commands/admin/listusers.js index 0b0199f..3ab6811 100644 --- a/server/src/commands/admin/listusers.js +++ b/server/src/commands/admin/listusers.js @@ -2,10 +2,12 @@ Description: Outputs all current channels and their user nicks */ +import * as UAC from "../utility/UAC/info"; + // module main export async function run(core, server, socket) { // increase rate limit chance and ignore if not admin - if (socket.uType !== 'admin') { + if (!UAC.isAdmin(socket.level)) { return server.police.frisk(socket.address, 20); } diff --git a/server/src/commands/admin/reload.js b/server/src/commands/admin/reload.js index 206e2ca..ccab805 100644 --- a/server/src/commands/admin/reload.js +++ b/server/src/commands/admin/reload.js @@ -2,10 +2,12 @@ Description: Clears and resets the command modules, outputting any errors */ +import * as UAC from "../utility/UAC/info"; + // module main export async function run(core, server, socket, data) { // increase rate limit chance and ignore if not admin - if (socket.uType !== 'admin') { + if (!UAC.isAdmin(socket.level)) { return server.police.frisk(socket.address, 20); } @@ -28,17 +30,11 @@ export async function run(core, server, socket, data) { loadResult += `\nReason: ${data.reason}`; } - // reply with results + // send results to moderators (which the user using this command is higher than) server.reply({ cmd: 'info', text: loadResult, - }, socket); - - // notify mods of reload #transparency - server.broadcast({ - cmd: 'info', - text: loadResult, - }, { uType: 'mod' }); + }, { level: UAC.isModerator }); return true; } diff --git a/server/src/commands/admin/removemod.js b/server/src/commands/admin/removemod.js index 9190dd6..48e65fb 100644 --- a/server/src/commands/admin/removemod.js +++ b/server/src/commands/admin/removemod.js @@ -2,10 +2,12 @@ Description: Removes target trip from the config as a mod and downgrades the socket type */ +import * as UAC from "../utility/UAC/info"; + // module main export async function run(core, server, socket, data) { // increase rate limit chance and ignore if not admin - if (socket.uType !== 'admin') { + if (!UAC.isAdmin(socket.level)) { return server.police.frisk(socket.address, 20); } @@ -18,6 +20,7 @@ export async function run(core, server, socket, data) { for (let i = 0, l = targetMod.length; i < l; i += 1) { // downgrade privilages targetMod[i].uType = 'user'; + targetMod[i].level = UAC.levels.user; // inform ex-mod server.send({ @@ -39,7 +42,7 @@ export async function run(core, server, socket, data) { server.broadcast({ cmd: 'info', text: `Removed mod: ${data.trip}`, - }, { uType: 'mod' }); + }, { level: UAC.isModerator }); return true; } diff --git a/server/src/commands/admin/saveconfig.js b/server/src/commands/admin/saveconfig.js index 6c713b4..708f406 100644 --- a/server/src/commands/admin/saveconfig.js +++ b/server/src/commands/admin/saveconfig.js @@ -2,10 +2,12 @@ Description: Writes the current config to disk */ +import * as UAC from "../utility/UAC/info"; + // module main export async function run(core, server, socket) { // increase rate limit chance and ignore if not admin - if (socket.uType !== 'admin') { + if (!UAC.isAdmin(socket.level)) { return server.police.frisk(socket.address, 20); } @@ -17,17 +19,11 @@ export async function run(core, server, socket) { }, socket); } - // return success message + // return success message to moderators and admins server.reply({ cmd: 'info', text: 'Config saved!', - }, socket); - - // notify mods #transparency - server.broadcast({ - cmd: 'info', - text: 'Config saved!', - }, { uType: 'mod' }); + }, { level: UAC.isModerator }); return true; } diff --git a/server/src/commands/admin/shout.js b/server/src/commands/admin/shout.js index 73b0734..ee81e58 100644 --- a/server/src/commands/admin/shout.js +++ b/server/src/commands/admin/shout.js @@ -2,10 +2,12 @@ Description: Emmits a server-wide message as `info` */ +import * as UAC from "../utility/UAC/info"; + // module main export async function run(core, server, socket, data) { // increase rate limit chance and ignore if not admin - if (socket.uType !== 'admin') { + if (!UAC.isAdmin(socket.level)) { return server.police.frisk(socket.address, 20); } diff --git a/server/src/commands/core/chat.js b/server/src/commands/core/chat.js index 6c491b1..01ee256 100644 --- a/server/src/commands/core/chat.js +++ b/server/src/commands/core/chat.js @@ -2,6 +2,8 @@ Description: Rebroadcasts any `text` to all clients in a `channel` */ +import * as UAC from "../utility/UAC/info"; + // module support functions const parseText = (text) => { // verifies user input is text @@ -43,11 +45,12 @@ export async function run(core, server, socket, data) { cmd: 'chat', nick: socket.nick, text, + level: socket.level }; - if (socket.uType === 'admin') { + if (UAC.isAdmin(socket.level)) { payload.admin = true; - } else if (socket.uType === 'mod') { + } else if (UAC.isModerator(socket.level)) { payload.mod = true; } diff --git a/server/src/commands/mod/ban.js b/server/src/commands/mod/ban.js index dd5f01e..982c380 100644 --- a/server/src/commands/mod/ban.js +++ b/server/src/commands/mod/ban.js @@ -2,10 +2,12 @@ Description: Adds the target socket's ip to the ratelimiter */ +import * as UAC from "../utility/UAC/info"; + // module main export async function run(core, server, socket, data) { // increase rate limit chance and ignore if not admin or mod - if (socket.uType === 'user') { + if (!UAC.isModerator(socket.level)) { return server.police.frisk(socket.address, 10); } @@ -28,7 +30,7 @@ export async function run(core, server, socket, data) { [badClient] = badClient; // i guess banning mods or admins isn't the best idea? - if (badClient.uType !== 'user') { + if (badClient.level >= socket.level) { return server.reply({ cmd: 'warn', text: 'Cannot ban other mods, how rude', @@ -44,13 +46,13 @@ export async function run(core, server, socket, data) { server.broadcast({ cmd: 'info', text: `Banned ${targetNick}`, - }, { channel: socket.channel, uType: 'user' }); + }, { channel: socket.channel, level: (level) => level < UAC.levels.moderator }); // notify mods server.broadcast({ cmd: 'info', text: `${socket.nick} banned ${targetNick} in ${socket.channel}, userhash: ${badClient.hash}`, - }, { uType: 'mod' }); + }, { level: UAC.isModerator }); // force connection closed badClient.terminate(); diff --git a/server/src/commands/mod/dumb.js b/server/src/commands/mod/dumb.js index 89aad4b..5693df2 100644 --- a/server/src/commands/mod/dumb.js +++ b/server/src/commands/mod/dumb.js @@ -3,6 +3,8 @@ * Author: simple */ +import * as UAC from "../utility/UAC/info"; + // module constructor export function init(core) { if (typeof core.muzzledHashes === 'undefined') { @@ -13,7 +15,7 @@ export function init(core) { // module main export async function run(core, server, socket, data) { // increase rate limit chance and ignore if not admin or mod - if (socket.uType === 'user') { + if (!UAC.isModerator(socket.level)) { return server.police.frisk(socket.address, 10); } @@ -35,7 +37,7 @@ export async function run(core, server, socket, data) { [badClient] = badClient; // likely dont need this, muting mods and admins is fine - if (badClient.uType !== 'user') { + if (badClient.level >= socket.level) { return server.reply({ cmd: 'warn', text: 'This trick wont work on mods and admin', @@ -56,7 +58,7 @@ export async function run(core, server, socket, data) { server.broadcast({ cmd: 'info', text: `${socket.nick} muzzled ${data.nick} in ${socket.channel}, userhash: ${badClient.hash}`, - }, { uType: 'mod' }); + }, { level: UAC.isModerator }); return true; } diff --git a/server/src/commands/mod/kick.js b/server/src/commands/mod/kick.js index 3ba2f5c..0a94c6d 100644 --- a/server/src/commands/mod/kick.js +++ b/server/src/commands/mod/kick.js @@ -2,10 +2,12 @@ Description: Forces a change on the target(s) socket's channel, then broadcasts event */ +import * as UAC from "../utility/UAC/info"; + // module main export async function run(core, server, socket, data) { // increase rate limit chance and ignore if not admin or mod - if (socket.uType === 'user') { + if (!UAC.isModerator(socket.level)) { return server.police.frisk(socket.address, 10); } @@ -36,7 +38,7 @@ export async function run(core, server, socket, data) { // check if found targets are kickable, add them to the list if they are const kicked = []; for (let i = 0, j = badClients.length; i < j; i += 1) { - if (badClients[i].uType !== 'user') { + if (badClients[i].level >= socket.level) { server.reply({ cmd: 'warn', text: 'Cannot kick other mods, how rude', @@ -68,7 +70,7 @@ export async function run(core, server, socket, data) { server.broadcast({ cmd: 'info', text: `${kicked[i].nick} was banished to ?${destChannel}`, - }, { channel: socket.channel, uType: 'mod' }); + }, { channel: socket.channel, level: UAC.isModerator }); console.log(`${socket.nick} [${socket.trip}] kicked ${kicked[i].nick} in ${socket.channel} to ${destChannel} `); } @@ -86,7 +88,7 @@ export async function run(core, server, socket, data) { server.broadcast({ cmd: 'info', text: `Kicked ${kicked.map(k => k.nick).join(', ')}`, - }, { channel: socket.channel, uType: 'user' }); + }, { channel: socket.channel, level: (level) => level < UAC.levels.moderator }); // stats are fun core.stats.increment('users-kicked', kicked.length); diff --git a/server/src/commands/mod/moveuser.js b/server/src/commands/mod/moveuser.js index b55c207..7eb6d83 100644 --- a/server/src/commands/mod/moveuser.js +++ b/server/src/commands/mod/moveuser.js @@ -2,10 +2,12 @@ Description: Removes the target socket from the current channel and forces a join event in another */ +import * as UAC from "../utility/UAC/info"; + // module main export async function run(core, server, socket, data) { // increase rate limit chance and ignore if not admin or mod - if (socket.uType === 'user') { + if (!UAC.isModerator(socket.level)) { return server.police.frisk(socket.address, 10); } @@ -30,7 +32,7 @@ export async function run(core, server, socket, data) { const badClient = badClients[0]; - if (badClient.uType !== 'user') { + if (badClient.level >= socket.level) { return server.reply({ cmd: 'warn', text: 'Cannot move other mods, how rude', diff --git a/server/src/commands/mod/speak.js b/server/src/commands/mod/speak.js index 5514545..48d38c6 100644 --- a/server/src/commands/mod/speak.js +++ b/server/src/commands/mod/speak.js @@ -3,6 +3,8 @@ * Author: simple */ +import * as UAC from "../utility/UAC/info"; + // module constructor export function init(core) { if (typeof core.muzzledHashes === 'undefined') { @@ -13,7 +15,7 @@ export function init(core) { // module main export async function run(core, server, socket, data) { // increase rate limit chance and ignore if not admin or mod - if (socket.uType === 'user') { + if (!UAC.isModerator(socket.level)) { return server.police.frisk(socket.address, 10); } @@ -39,7 +41,7 @@ export async function run(core, server, socket, data) { server.broadcast({ cmd: 'info', text: `${socket.nick} unmuzzled : ${target}`, - }, { uType: 'mod' }); + }, { level: UAC.isModerator }); return true; } diff --git a/server/src/commands/mod/unban.js b/server/src/commands/mod/unban.js index 0d1e469..b8506f3 100644 --- a/server/src/commands/mod/unban.js +++ b/server/src/commands/mod/unban.js @@ -2,10 +2,12 @@ Description: Removes a target ip from the ratelimiter */ +import * as UAC from "../utility/UAC/info"; + // module main export async function run(core, server, socket, data) { // increase rate limit chance and ignore if not admin or mod - if (socket.uType === 'user') { + if (!UAC.isModerator(socket.level)) { return server.police.frisk(socket.address, 10); } @@ -47,7 +49,7 @@ export async function run(core, server, socket, data) { server.broadcast({ cmd: 'info', text: `${socket.nick} unbanned: ${target}`, - }, { uType: 'mod' }); + }, { level: UAC.isModerator }); // stats are fun core.stats.decrement('users-banned'); diff --git a/server/src/commands/mod/unbanall.js b/server/src/commands/mod/unbanall.js index 49eeee5..e6affc4 100644 --- a/server/src/commands/mod/unbanall.js +++ b/server/src/commands/mod/unbanall.js @@ -2,10 +2,12 @@ Description: Clears all bans and ratelimits */ +import * as UAC from "../utility/UAC/info"; + // module main export async function run(core, server, socket) { // increase rate limit chance and ignore if not admin or mod - if (socket.uType === 'user') { + if (!UAC.isModerator(socket.level)) { return server.police.frisk(socket.address, 10); } @@ -24,7 +26,7 @@ export async function run(core, server, socket) { server.broadcast({ cmd: 'info', text: `${socket.nick} unbanned all ip addresses`, - }, { uType: 'mod' }); + }, { level: UAC.isModerator }); return true; } -- cgit v1.2.1