From 59dfb8fd2fca223e46691c8acd73a2a19811cf9f Mon Sep 17 00:00:00 2001 From: Hri7566 Date: Tue, 23 Jul 2024 05:55:13 -0400 Subject: [PATCH] insanely long commit --- .env.template | 0 .eslintrc.js | 0 .gitignore | 4 + .gitmodules | 0 .prettierrc | 0 .vscode/settings.json | 0 LICENSE | 0 README.md | 10 +++ bun.lockb | Bin 67487 -> 72469 bytes package.json | 2 + prisma/schema.prisma | 7 ++ src/channel/Channel.ts | 80 ++++++++++-------- src/channel/ChannelList.ts | 0 src/channel/Crown.ts | 2 + src/channel/config.ts | 0 src/channel/forceLoad.ts | 0 src/channel/index.ts | 0 src/channel/settings.ts | 0 src/data/history.ts | 0 src/data/prisma.ts | 0 src/data/user.ts | 0 src/index.ts | 0 src/util/Logger.ts | 0 src/util/config.ts | 0 src/util/env.ts | 0 src/util/helpers.ts | 0 src/util/id.ts | 0 src/util/motd.ts | 0 src/util/readline/Command.ts | 0 src/util/readline/commands.ts | 0 src/util/readline/index.ts | 0 src/util/readline/logger.ts | 0 src/util/token.ts | 53 ++++++++++++ src/util/types.d.ts | 5 ++ src/ws/Gateway.ts | 63 +++++++++++++- src/ws/Socket.ts | 17 ++++ src/ws/events.inc.ts | 0 src/ws/events.ts | 0 src/ws/events/admin/handlers/admin_chat.ts | 0 src/ws/events/admin/handlers/ch_flag.ts | 0 src/ws/events/admin/handlers/clear_chat.ts | 0 src/ws/events/admin/handlers/color.ts | 0 src/ws/events/admin/handlers/eval.ts | 0 src/ws/events/admin/handlers/forceload.ts | 0 src/ws/events/admin/handlers/move.ts | 0 src/ws/events/admin/handlers/name.ts | 0 src/ws/events/admin/handlers/notification.ts | 0 .../events/admin/handlers/rename_channel.ts | 6 +- src/ws/events/admin/handlers/restart.ts | 0 src/ws/events/admin/handlers/tag.ts | 0 src/ws/events/admin/handlers/user_flag.ts | 0 src/ws/events/admin/index.ts | 0 src/ws/events/user/handlers/+ls.ts | 0 src/ws/events/user/handlers/-ls.ts | 0 src/ws/events/user/handlers/a.ts | 0 src/ws/events/user/handlers/admin_message.ts | 0 src/ws/events/user/handlers/b.ts | 8 ++ src/ws/events/user/handlers/bye.ts | 0 src/ws/events/user/handlers/ch.ts | 0 src/ws/events/user/handlers/chown.ts | 0 src/ws/events/user/handlers/chset.ts | 0 src/ws/events/user/handlers/devices.ts | 0 src/ws/events/user/handlers/hi.ts | 24 +++++- src/ws/events/user/handlers/kickban.ts | 0 src/ws/events/user/handlers/m.ts | 0 src/ws/events/user/handlers/n.ts | 0 src/ws/events/user/handlers/t.ts | 0 src/ws/events/user/handlers/unban.ts | 0 src/ws/events/user/handlers/userset.ts | 0 src/ws/events/user/index.ts | 0 src/ws/message.ts | 0 src/ws/ratelimit/NoteQuota.ts | 0 src/ws/ratelimit/RateLimit.ts | 0 src/ws/ratelimit/RateLimitChain.ts | 0 src/ws/ratelimit/config.ts | 0 src/ws/ratelimit/limits/admin.ts | 0 src/ws/ratelimit/limits/crown.ts | 0 src/ws/ratelimit/limits/user.ts | 0 src/ws/server.ts | 0 src/ws/usersConfig.ts | 4 +- tsconfig.json | 0 81 files changed, 240 insertions(+), 45 deletions(-) mode change 100644 => 100755 .env.template mode change 100644 => 100755 .eslintrc.js mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .gitmodules mode change 100644 => 100755 .prettierrc mode change 100644 => 100755 .vscode/settings.json mode change 100644 => 100755 LICENSE mode change 100644 => 100755 README.md mode change 100644 => 100755 package.json mode change 100644 => 100755 prisma/schema.prisma mode change 100644 => 100755 src/channel/Channel.ts mode change 100644 => 100755 src/channel/ChannelList.ts mode change 100644 => 100755 src/channel/Crown.ts mode change 100644 => 100755 src/channel/config.ts mode change 100644 => 100755 src/channel/forceLoad.ts mode change 100644 => 100755 src/channel/index.ts mode change 100644 => 100755 src/channel/settings.ts mode change 100644 => 100755 src/data/history.ts mode change 100644 => 100755 src/data/prisma.ts mode change 100644 => 100755 src/data/user.ts mode change 100644 => 100755 src/index.ts mode change 100644 => 100755 src/util/Logger.ts mode change 100644 => 100755 src/util/config.ts mode change 100644 => 100755 src/util/env.ts mode change 100644 => 100755 src/util/helpers.ts mode change 100644 => 100755 src/util/id.ts mode change 100644 => 100755 src/util/motd.ts mode change 100644 => 100755 src/util/readline/Command.ts mode change 100644 => 100755 src/util/readline/commands.ts mode change 100644 => 100755 src/util/readline/index.ts mode change 100644 => 100755 src/util/readline/logger.ts create mode 100644 src/util/token.ts mode change 100644 => 100755 src/util/types.d.ts mode change 100644 => 100755 src/ws/Gateway.ts mode change 100644 => 100755 src/ws/Socket.ts mode change 100644 => 100755 src/ws/events.inc.ts mode change 100644 => 100755 src/ws/events.ts mode change 100644 => 100755 src/ws/events/admin/handlers/admin_chat.ts mode change 100644 => 100755 src/ws/events/admin/handlers/ch_flag.ts mode change 100644 => 100755 src/ws/events/admin/handlers/clear_chat.ts mode change 100644 => 100755 src/ws/events/admin/handlers/color.ts mode change 100644 => 100755 src/ws/events/admin/handlers/eval.ts mode change 100644 => 100755 src/ws/events/admin/handlers/forceload.ts mode change 100644 => 100755 src/ws/events/admin/handlers/move.ts mode change 100644 => 100755 src/ws/events/admin/handlers/name.ts mode change 100644 => 100755 src/ws/events/admin/handlers/notification.ts mode change 100644 => 100755 src/ws/events/admin/handlers/rename_channel.ts mode change 100644 => 100755 src/ws/events/admin/handlers/restart.ts mode change 100644 => 100755 src/ws/events/admin/handlers/tag.ts mode change 100644 => 100755 src/ws/events/admin/handlers/user_flag.ts mode change 100644 => 100755 src/ws/events/admin/index.ts mode change 100644 => 100755 src/ws/events/user/handlers/+ls.ts mode change 100644 => 100755 src/ws/events/user/handlers/-ls.ts mode change 100644 => 100755 src/ws/events/user/handlers/a.ts mode change 100644 => 100755 src/ws/events/user/handlers/admin_message.ts create mode 100755 src/ws/events/user/handlers/b.ts mode change 100644 => 100755 src/ws/events/user/handlers/bye.ts mode change 100644 => 100755 src/ws/events/user/handlers/ch.ts mode change 100644 => 100755 src/ws/events/user/handlers/chown.ts mode change 100644 => 100755 src/ws/events/user/handlers/chset.ts mode change 100644 => 100755 src/ws/events/user/handlers/devices.ts mode change 100644 => 100755 src/ws/events/user/handlers/hi.ts mode change 100644 => 100755 src/ws/events/user/handlers/kickban.ts mode change 100644 => 100755 src/ws/events/user/handlers/m.ts mode change 100644 => 100755 src/ws/events/user/handlers/n.ts mode change 100644 => 100755 src/ws/events/user/handlers/t.ts mode change 100644 => 100755 src/ws/events/user/handlers/unban.ts mode change 100644 => 100755 src/ws/events/user/handlers/userset.ts mode change 100644 => 100755 src/ws/events/user/index.ts mode change 100644 => 100755 src/ws/message.ts mode change 100644 => 100755 src/ws/ratelimit/NoteQuota.ts mode change 100644 => 100755 src/ws/ratelimit/RateLimit.ts mode change 100644 => 100755 src/ws/ratelimit/RateLimitChain.ts mode change 100644 => 100755 src/ws/ratelimit/config.ts mode change 100644 => 100755 src/ws/ratelimit/limits/admin.ts mode change 100644 => 100755 src/ws/ratelimit/limits/crown.ts mode change 100644 => 100755 src/ws/ratelimit/limits/user.ts mode change 100644 => 100755 src/ws/server.ts mode change 100644 => 100755 src/ws/usersConfig.ts mode change 100644 => 100755 tsconfig.json diff --git a/.env.template b/.env.template old mode 100644 new mode 100755 diff --git a/.eslintrc.js b/.eslintrc.js old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index 6df9596..443bf36 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,7 @@ prisma/*.sqlite # TS build /out + +# JWT token keypair +mppkey +mppkey.pub diff --git a/.gitmodules b/.gitmodules old mode 100644 new mode 100755 diff --git a/.prettierrc b/.prettierrc old mode 100644 new mode 100755 diff --git a/.vscode/settings.json b/.vscode/settings.json old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 3675558..c29d336 --- a/README.md +++ b/README.md @@ -73,6 +73,16 @@ Don't expect these instructions to stay the same. They might not even be up to d 1. Clone the repo and setup Git submodules +This step is subject to change, due to the necessity of testing different frontends, where the frontend may or may not be a git submodule. +This will probably be updated in the near future. Expect a step asking to download the frontend manually. +If you are forking this repository, you can just setup a new submodule for the frontend. +The frontend files go in the `public` folder. + +I am also considering using handlebars or something similar for templating, where the frontend will require completely different code. +The reason behind this decision is that I would like different things to change on the frontend based on the server's config files, +such as enabling the color changing option in the userset modal menu, or sending separate code to server admins/mods/webmasters. + + ``` $ git clone https://git.hri7566.info/Hri7566/mpp-server-dev2 $ cd mpp-server-dev2 diff --git a/bun.lockb b/bun.lockb index 3da27469c56e897ccee2c9c5d21742e87d834ce0..9b184271f5249ec32573c199f0687a84c22785da 100755 GIT binary patch delta 14531 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 delta 11668 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 DgjQyH diff --git a/package.json b/package.json old mode 100644 new mode 100755 index eba0420..ed02b8d --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "date-holidays": "^3.21.5", "events": "^3.3.0", "fancy-text-converter": "^1.0.9", + "jsonwebtoken": "^9.0.2", "keccak": "^2.1.0", "nunjucks": "^3.2.4", "unique-names-generator": "^4.7.1", @@ -22,6 +23,7 @@ }, "devDependencies": { "@types/bun": "latest", + "@types/jsonwebtoken": "^9.0.6", "@types/node": "^20.5.9", "@types/nunjucks": "^3.2.6", "@typescript-eslint/eslint-plugin": "^6.19.1", diff --git a/prisma/schema.prisma b/prisma/schema.prisma old mode 100644 new mode 100755 index 327ed72..ba36a14 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -17,9 +17,16 @@ model User { color String @default("#ffffff") flags String @default("{}") // JSON flags object tag String // JSON tag + tokens String @default("[]") // JSON tokens } model ChatHistory { id String @id @unique @map("_id") messages String @default("[]") // JSON messages } + +model Token { + userId String @id @relation(fields: [userId], references: [id]) + token String + createdAt DateTime @default(now()) +} diff --git a/src/channel/Channel.ts b/src/channel/Channel.ts old mode 100644 new mode 100755 index b5b4cff..4d54a7e --- a/src/channel/Channel.ts +++ b/src/channel/Channel.ts @@ -152,56 +152,61 @@ export class Channel extends EventEmitter { ]; this.on("a", async (msg: ServerEvents["a"], socket: Socket) => { - if (typeof msg.message !== "string") return; - - const userFlags = socket.getUserFlags(); - - if (userFlags) { - if (userFlags.cant_chat) return; - } - - if (!this.settings.chat) return; - - if (msg.message.length > 512) return; - - for (const word of BANNED_WORDS) { - if (msg.message.toLowerCase().split(" ").join("").includes(word.toLowerCase())) { - return; - } - } - - // Sanitize chat message - // Regex originally written by chacha - msg.message = msg.message - .replace(/\p{C}+/gu, "") - .replace(/(\p{Mc}{5})\p{Mc}+/gu, "$1") - .trim(); - - let outgoing: ClientEvents["a"] = { - m: "a", - a: msg.message, - t: Date.now(), - p: socket.getParticipant() as Participant - }; - - this.sendArray([outgoing]); - this.chatHistory.push(outgoing); - await saveChatHistory(this.getID(), this.chatHistory); - try { + if (typeof msg.message !== "string") return; + + const userFlags = socket.getUserFlags(); + + if (userFlags) { + if (userFlags.cant_chat) return; + } + + if (!this.settings.chat) return; + + if (msg.message.length > 512) return; + + for (const word of BANNED_WORDS) { + if (msg.message.toLowerCase().split(" ").join("").includes(word.toLowerCase())) { + return; + } + } + + // Sanitize chat message + // Regex originally written by chacha for Brandon's server + // Used with permission + msg.message = msg.message + .replace(/\p{C}+/gu, "") + .replace(/(\p{Mc}{5})\p{Mc}+/gu, "$1") + .trim(); + + let outgoing: ClientEvents["a"] = { + m: "a", + a: msg.message, + t: Date.now(), + p: socket.getParticipant() as Participant + }; + + this.sendArray([outgoing]); + this.chatHistory.push(outgoing); + await saveChatHistory(this.getID(), this.chatHistory); + if (msg.message.startsWith("/")) { this.emit("command", msg, socket); } } catch (err) { this.logger.error(err); + this.logger.warn("Error whilst processing a chat message from user " + socket.getUserID()); } }); this.on("command", (msg, socket) => { const args = msg.message.split(" "); const cmd = args[0].substring(1); + const ownsChannel = this.hasUser(socket.getUserID()); if (cmd == "help") { + } else if (cmd == "") { + } }); @@ -313,7 +318,8 @@ export class Channel extends EventEmitter { * Set this channel's ID (channel name) **/ public setID(_id: string) { - // probably causes jank + // probably causes jank, but people can just reload their page or whatever + // not sure what to do about the URL situation this._id = _id; this.emit("update", this); } diff --git a/src/channel/ChannelList.ts b/src/channel/ChannelList.ts old mode 100644 new mode 100755 diff --git a/src/channel/Crown.ts b/src/channel/Crown.ts old mode 100644 new mode 100755 index 157aef1..fe0b3c8 --- a/src/channel/Crown.ts +++ b/src/channel/Crown.ts @@ -18,6 +18,8 @@ export class Crown { }; public canBeSetBy(socket: Socket) { + // This code is based on Brandon's crown code + // can claim, drop, or give if... const flags = socket.getUserFlags(); diff --git a/src/channel/config.ts b/src/channel/config.ts old mode 100644 new mode 100755 diff --git a/src/channel/forceLoad.ts b/src/channel/forceLoad.ts old mode 100644 new mode 100755 diff --git a/src/channel/index.ts b/src/channel/index.ts old mode 100644 new mode 100755 diff --git a/src/channel/settings.ts b/src/channel/settings.ts old mode 100644 new mode 100755 diff --git a/src/data/history.ts b/src/data/history.ts old mode 100644 new mode 100755 diff --git a/src/data/prisma.ts b/src/data/prisma.ts old mode 100644 new mode 100755 diff --git a/src/data/user.ts b/src/data/user.ts old mode 100644 new mode 100755 diff --git a/src/index.ts b/src/index.ts old mode 100644 new mode 100755 diff --git a/src/util/Logger.ts b/src/util/Logger.ts old mode 100644 new mode 100755 diff --git a/src/util/config.ts b/src/util/config.ts old mode 100644 new mode 100755 diff --git a/src/util/env.ts b/src/util/env.ts old mode 100644 new mode 100755 diff --git a/src/util/helpers.ts b/src/util/helpers.ts old mode 100644 new mode 100755 diff --git a/src/util/id.ts b/src/util/id.ts old mode 100644 new mode 100755 diff --git a/src/util/motd.ts b/src/util/motd.ts old mode 100644 new mode 100755 diff --git a/src/util/readline/Command.ts b/src/util/readline/Command.ts old mode 100644 new mode 100755 diff --git a/src/util/readline/commands.ts b/src/util/readline/commands.ts old mode 100644 new mode 100755 diff --git a/src/util/readline/index.ts b/src/util/readline/index.ts old mode 100644 new mode 100755 diff --git a/src/util/readline/logger.ts b/src/util/readline/logger.ts old mode 100644 new mode 100755 diff --git a/src/util/token.ts b/src/util/token.ts new file mode 100644 index 0000000..b3fdcb7 --- /dev/null +++ b/src/util/token.ts @@ -0,0 +1,53 @@ +import { config } from "../ws/usersConfig"; +import jsonwebtoken from "jsonwebtoken"; +import env from "./env"; +import { readFileSync } from "fs"; +import { Logger } from "./Logger"; + +let privkey: string; + +if (config.tokenAuth == "jwt") { + privkey = readFileSync("./mppkey").toString(); +} + +const logger = new Logger("TokenGen"); + +export function generateToken(id: string): Promise | undefined { + if (config.tokenAuth == "jwt") { + if (!privkey) throw new Error("Private key not found"); + + logger.info("Generating JWT token for user " + id + "..."); + + return new Promise((resolve, reject) => { + jsonwebtoken.sign({ id }, privkey, { algorithm: "RS256" }, (err, token) => { + if (err || !token) { + logger.warn("Token generation failed for user " + id); + reject(err); + } + + logger.info("Token generation finished for user " + id); + resolve(token); + }); + }); + } else if (config.tokenAuth == "uuid") { + logger.info("Generating UUID token for user " + id + "..."); + + return new Promise((resolve, reject) => { + let token: string | undefined; + + try { + const uuid = crypto.randomUUID(); + token = `${id}.${uuid}`; + } catch (err) { + logger.warn("Token generation failed for user " + id); + reject(err); + } + + if (!token) reject(new Error("Token generation failed for user " + id)); + + logger.info("Token generation finished for user " + id); + + if (token) resolve(token); + }); + } else return undefined; +} diff --git a/src/util/types.d.ts b/src/util/types.d.ts old mode 100644 new mode 100755 index 889ba3d..833d8e6 --- a/src/util/types.d.ts +++ b/src/util/types.d.ts @@ -210,6 +210,11 @@ declare interface ServerEvents { msg: ServerEvents; }; + b: { + m: "b"; + code: string; + }; + // Admin color: { diff --git a/src/ws/Gateway.ts b/src/ws/Gateway.ts old mode 100644 new mode 100755 index b15e103..afb373f --- a/src/ws/Gateway.ts +++ b/src/ws/Gateway.ts @@ -12,7 +12,64 @@ * and IP address instead sometime in the future. */ export class Gateway { - public hasProcessedHi: boolean = false; - public hasSentDevices: boolean = false; - public lastPing: number = Date.now(); + // Whether we have correctly processed this socket's hi message + public hasProcessedHi = false; + + // Whether they have sent the MIDI devices message + public hasSentDevices = false; + + // Whether they have sent a token + public hasSentToken = false; + + // Whether their token is valid + public isTokenValid = false; + + // Their user agent, if sent + public userAgent = ""; + + // Whether they have moved their cursor + public hasCursorMoved = false; + + // Whether they sent a cursor message that contained numbers instead of stringified numbers + public isCursorNotString = false; + + // The last time they sent a ping message + public lastPing = Date.now(); + + // Whether they have joined any channel + public hasJoinedAnyChannel = false; + + // Whether they have joined the lobby + public hasJoinedLobby = false; + + // Whether they have made a regular non-websocket request to the HTTP server + // probably useful for checking if they are actually on the site + // Maybe not useful if cloudflare is being used + // In that scenario, templating wouldn't work, either + public hasConnectedToHTTPServer = false; + + // Various chat message flags + public hasSentChatMessage = false; + public hasSentChatMessageWithCapitalLettersOnly = false; + public hasSentChatMessageWithInvisibleCharacters = false; + public hasSentChatMessageWithEmoji = false; + + // Whehter or not the user has played the piano in this session + public hasPlayedPianoBefore = false; + + // Whether the user has sent a channel list subscription request, a.k.a. opened the channel list + public hasOpenedChannelList = false; + + // Whether the user has changed their name/color this session (not just changed from default) + public hasChangedName = false; + public hasChangedColor = false; + + // Whether the user has sent + public hasSentCustomNoteData = false; + + // Whether they sent an admin message that was invalid (wrong password, etc) + public hasSentInvalidAdminMessage = false; + + // Whether or not they have passed the b message + public hasCompletedBrowserChallenge = false; } diff --git a/src/ws/Socket.ts b/src/ws/Socket.ts old mode 100644 new mode 100755 index 5e7ec57..4d2ad41 --- a/src/ws/Socket.ts +++ b/src/ws/Socket.ts @@ -516,6 +516,19 @@ export class Socket extends EventEmitter { // TODO Permissions let isAdmin = false; let ch = this.getCurrentChannel(); + let hasNoteRateLimitBypass = false; + + try { + const flags = this.getUserFlags(); + + if (flags) { + if (flags["no note rate limit"]) { + hasNoteRateLimitBypass = true; + } + } + } catch (err) { + logger.warn("Unable to get user flags while processing rate limits"); + } if (isAdmin) { this.setRateLimits(adminLimits); @@ -705,6 +718,10 @@ export class Socket extends EventEmitter { updateUser(this.getUserID(), user); } + /** + * Execute code in this socket's context (danger warning) + * @param str JavaScript expression to execute + **/ public eval(str: string) { try { const output = eval(str); diff --git a/src/ws/events.inc.ts b/src/ws/events.inc.ts old mode 100644 new mode 100755 diff --git a/src/ws/events.ts b/src/ws/events.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/admin/handlers/admin_chat.ts b/src/ws/events/admin/handlers/admin_chat.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/admin/handlers/ch_flag.ts b/src/ws/events/admin/handlers/ch_flag.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/admin/handlers/clear_chat.ts b/src/ws/events/admin/handlers/clear_chat.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/admin/handlers/color.ts b/src/ws/events/admin/handlers/color.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/admin/handlers/eval.ts b/src/ws/events/admin/handlers/eval.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/admin/handlers/forceload.ts b/src/ws/events/admin/handlers/forceload.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/admin/handlers/move.ts b/src/ws/events/admin/handlers/move.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/admin/handlers/name.ts b/src/ws/events/admin/handlers/name.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/admin/handlers/notification.ts b/src/ws/events/admin/handlers/notification.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/admin/handlers/rename_channel.ts b/src/ws/events/admin/handlers/rename_channel.ts old mode 100644 new mode 100755 index bba7af0..fbc9c63 --- a/src/ws/events/admin/handlers/rename_channel.ts +++ b/src/ws/events/admin/handlers/rename_channel.ts @@ -33,8 +33,10 @@ export const rename_channel: ServerEventListener<"rename_channel"> = { // Not found, so it's safe to take up that ID ch.setID(msg._id); } else { - // Found, avoid jank by magically disappearing - ch.destroy(); + if (ch.getID() !== msg._id) { + // Found and different, avoid jank by magically disappearing + ch.destroy(); + } } for (const sock of socketsBySocketID.values()) { diff --git a/src/ws/events/admin/handlers/restart.ts b/src/ws/events/admin/handlers/restart.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/admin/handlers/tag.ts b/src/ws/events/admin/handlers/tag.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/admin/handlers/user_flag.ts b/src/ws/events/admin/handlers/user_flag.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/admin/index.ts b/src/ws/events/admin/index.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/handlers/+ls.ts b/src/ws/events/user/handlers/+ls.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/handlers/-ls.ts b/src/ws/events/user/handlers/-ls.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/handlers/a.ts b/src/ws/events/user/handlers/a.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/handlers/admin_message.ts b/src/ws/events/user/handlers/admin_message.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/handlers/b.ts b/src/ws/events/user/handlers/b.ts new file mode 100755 index 0000000..9af7d7c --- /dev/null +++ b/src/ws/events/user/handlers/b.ts @@ -0,0 +1,8 @@ +import { ServerEventListener } from "../../../../util/types"; + +export const hi: ServerEventListener<"b"> = { + id: "b", + callback: (msg, socket) => { + // Antibot message + } +}; diff --git a/src/ws/events/user/handlers/bye.ts b/src/ws/events/user/handlers/bye.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/handlers/ch.ts b/src/ws/events/user/handlers/ch.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/handlers/chown.ts b/src/ws/events/user/handlers/chown.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/handlers/chset.ts b/src/ws/events/user/handlers/chset.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/handlers/devices.ts b/src/ws/events/user/handlers/devices.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/handlers/hi.ts b/src/ws/events/user/handlers/hi.ts old mode 100644 new mode 100755 index c22a3b6..846a62a --- a/src/ws/events/user/handlers/hi.ts +++ b/src/ws/events/user/handlers/hi.ts @@ -1,10 +1,30 @@ +import { generateToken } from "../../../../util/token"; import { ServerEventListener } from "../../../../util/types"; +import { config } from "../../../usersConfig"; export const hi: ServerEventListener<"hi"> = { id: "hi", - callback: (msg, socket) => { + callback: async (msg, socket) => { // Handshake message - // TODO Hi message tokens + + let generatedToken: string | undefined; + + if (config.tokenAuth !== "none") { + if (socket.gateway.hasCompletedBrowserChallenge) { + if (msg.token) { + // Check if they have passed the browser challenge + // Send the token to the authenticator + // TODO + } else { + // Generate a token + generatedToken = await generateToken(socket.getUserID()) as string | undefined; + if (!generatedToken) return; + } + } else { + // TODO Ban the user for logging in without the browser + // TODO config for this + } + } if (socket.rateLimits) if (!socket.rateLimits.normal.hi.attempt()) return; diff --git a/src/ws/events/user/handlers/kickban.ts b/src/ws/events/user/handlers/kickban.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/handlers/m.ts b/src/ws/events/user/handlers/m.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/handlers/n.ts b/src/ws/events/user/handlers/n.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/handlers/t.ts b/src/ws/events/user/handlers/t.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/handlers/unban.ts b/src/ws/events/user/handlers/unban.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/handlers/userset.ts b/src/ws/events/user/handlers/userset.ts old mode 100644 new mode 100755 diff --git a/src/ws/events/user/index.ts b/src/ws/events/user/index.ts old mode 100644 new mode 100755 diff --git a/src/ws/message.ts b/src/ws/message.ts old mode 100644 new mode 100755 diff --git a/src/ws/ratelimit/NoteQuota.ts b/src/ws/ratelimit/NoteQuota.ts old mode 100644 new mode 100755 diff --git a/src/ws/ratelimit/RateLimit.ts b/src/ws/ratelimit/RateLimit.ts old mode 100644 new mode 100755 diff --git a/src/ws/ratelimit/RateLimitChain.ts b/src/ws/ratelimit/RateLimitChain.ts old mode 100644 new mode 100755 diff --git a/src/ws/ratelimit/config.ts b/src/ws/ratelimit/config.ts old mode 100644 new mode 100755 diff --git a/src/ws/ratelimit/limits/admin.ts b/src/ws/ratelimit/limits/admin.ts old mode 100644 new mode 100755 diff --git a/src/ws/ratelimit/limits/crown.ts b/src/ws/ratelimit/limits/crown.ts old mode 100644 new mode 100755 diff --git a/src/ws/ratelimit/limits/user.ts b/src/ws/ratelimit/limits/user.ts old mode 100644 new mode 100755 diff --git a/src/ws/server.ts b/src/ws/server.ts old mode 100644 new mode 100755 diff --git a/src/ws/usersConfig.ts b/src/ws/usersConfig.ts old mode 100644 new mode 100755 index d514422..d902cca --- a/src/ws/usersConfig.ts +++ b/src/ws/usersConfig.ts @@ -8,6 +8,7 @@ export interface UsersConfig { enableCustomNoteData: boolean; adminParticipant: Participant; enableAdminEval: boolean; + tokenAuth: "jwt" | "uuid" | "none"; } export const usersConfigPath = "config/users.yml"; @@ -25,7 +26,8 @@ export const defaultUsersConfig: UsersConfig = { color: "#fff", id: "0" }, - enableAdminEval: false + enableAdminEval: false, + tokenAuth: "none" }; // Importing this elsewhere causes bun to segfault diff --git a/tsconfig.json b/tsconfig.json old mode 100644 new mode 100755