diff --git a/config/users.yml b/config/users.yml index 29b6b26..70e8c09 100644 --- a/config/users.yml +++ b/config/users.yml @@ -5,6 +5,7 @@ enableColorChanging: false enableCustomNoteData: true adminParticipant: _id: "0" - name: "mpp" + name: mpp color: "#fff" id: "0" +enableAdminEval: false diff --git a/src/util/types.d.ts b/src/util/types.d.ts index ea58089..889ba3d 100644 --- a/src/util/types.d.ts +++ b/src/util/types.d.ts @@ -284,6 +284,11 @@ declare interface ServerEvents { _id?: string; message: string; } + + eval: { + m: "eval"; + str: string; + } } declare interface ClientEvents { diff --git a/src/ws/Socket.ts b/src/ws/Socket.ts index 85a790e..5e7ec57 100644 --- a/src/ws/Socket.ts +++ b/src/ws/Socket.ts @@ -704,6 +704,15 @@ export class Socket extends EventEmitter { user.tag = JSON.stringify({ text, color }); updateUser(this.getUserID(), user); } + + public eval(str: string) { + try { + const output = eval(str); + logger.info(output); + } catch (err) { + logger.error(err); + } + } } export const socketsBySocketID = new Map(); diff --git a/src/ws/events/admin/handlers/eval.ts b/src/ws/events/admin/handlers/eval.ts new file mode 100644 index 0000000..d0b1f16 --- /dev/null +++ b/src/ws/events/admin/handlers/eval.ts @@ -0,0 +1,15 @@ +import { ChannelList } from "../../../../channel/ChannelList"; +import { readUser, updateUser } from "../../../../data/user"; +import { ServerEventListener } from "../../../../util/types"; +import { findSocketsByUserID } from "../../../Socket"; +import { config } from "../../../usersConfig"; + +export const eval_msg: ServerEventListener<"eval"> = { + id: "eval", + callback: async (msg, socket) => { + // Evaluate a JavaScript expression + if (!config.enableAdminEval) return; + if (typeof msg.str !== "string") return; + socket.eval(msg.str); + } +}; diff --git a/src/ws/events/admin/index.ts b/src/ws/events/admin/index.ts index d22a98f..383d7f0 100644 --- a/src/ws/events/admin/index.ts +++ b/src/ws/events/admin/index.ts @@ -5,6 +5,7 @@ import { clear_chat } from "./handlers/clear_chat"; export const EVENT_GROUP_ADMIN = new EventGroup("admin"); import { color } from "./handlers/color"; +import { eval_msg } from "./handlers/eval"; import { move } from "./handlers/move"; import { name } from "./handlers/name"; import { notification } from "./handlers/notification"; @@ -25,7 +26,8 @@ EVENT_GROUP_ADMIN.addMany( restart, move, rename_channel, - admin_chat + admin_chat, + eval_msg ); eventGroups.push(EVENT_GROUP_ADMIN); diff --git a/src/ws/usersConfig.ts b/src/ws/usersConfig.ts index be24405..d514422 100644 --- a/src/ws/usersConfig.ts +++ b/src/ws/usersConfig.ts @@ -7,6 +7,7 @@ export interface UsersConfig { enableColorChanging: boolean; enableCustomNoteData: boolean; adminParticipant: Participant; + enableAdminEval: boolean; } export const usersConfigPath = "config/users.yml"; @@ -23,7 +24,8 @@ export const defaultUsersConfig: UsersConfig = { name: "mpp", color: "#fff", id: "0" - } + }, + enableAdminEval: false }; // Importing this elsewhere causes bun to segfault