From bae17c6a52b05662ce81809ec8e163175105f40e Mon Sep 17 00:00:00 2001 From: Elijah Date: Mon, 5 Jun 2023 21:59:37 -0400 Subject: [PATCH] add turn whitelist and password support --- config.example.toml | 4 ++++ src/IConfig.ts | 2 ++ src/User.ts | 2 ++ src/WSServer.ts | 7 +++++-- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/config.example.toml b/config.example.toml index 40ad536..65f2fea 100644 --- a/config.example.toml +++ b/config.example.toml @@ -47,6 +47,10 @@ voteCooldown = 180 # Example hash is hunter2 and hunter3 adminpass = "f52fbd32b2b3b86ff88ef6c490628285f482af15ddcb29541f94bcf526a3f6c7" modpass = "fb8c2e2b85ca81eb4350199faddd983cb26af3064614e737ea9f479621cfa57a" +# Whether a password is required to take a turn +turnwhitelist = false +# SHA256 sum for the password to take a turn. Only takes effect if turnwhitelist == true. If set to an empty string or not provided, only admins and mods can take turns +turnpass = "" [collabvm.moderatorPermissions] # What a moderator can and can't do restore = true diff --git a/src/IConfig.ts b/src/IConfig.ts index 59aa0cb..72babd4 100644 --- a/src/IConfig.ts +++ b/src/IConfig.ts @@ -35,6 +35,8 @@ export default interface IConfig { voteCooldown: number; adminpass : string; modpass : string; + turnwhitelist : boolean; + turnpass : string; moderatorPermissions : Permissions; }; }; diff --git a/src/User.ts b/src/User.ts index 56a4363..adfb4a4 100644 --- a/src/User.ts +++ b/src/User.ts @@ -119,4 +119,6 @@ export enum Rank { Unregistered = 0, Admin = 2, Moderator = 3, + // Giving a good gap between server only internal ranks just in case + Turn = 10, } diff --git a/src/WSServer.ts b/src/WSServer.ts index 7d2497f..b01f1cc 100644 --- a/src/WSServer.ts +++ b/src/WSServer.ts @@ -276,7 +276,7 @@ export default class WSServer { client.onMsgSent(); break; case "turn": - if (!this.turnsAllowed && client.rank !== Rank.Admin && client.rank !== Rank.Moderator) return; + if ((!this.turnsAllowed || this.Config.collabvm.turnwhitelist) && client.rank !== Rank.Admin && client.rank !== Rank.Moderator && client.rank !== Rank.Turn) return; if (!client.TurnRateLimit.request()) return; if (!client.connectedToNode) return; if (msgArr.length > 2) return; @@ -333,7 +333,7 @@ export default class WSServer { break; case "vote": if (!this.Config.vm.snapshots) return; - if (!this.turnsAllowed) return; + if ((!this.turnsAllowed || this.Config.collabvm.turnwhitelist) && client.rank !== Rank.Admin && client.rank !== Rank.Moderator && client.rank !== Rank.Turn) return; if (!client.connectedToNode) return; if (msgArr.length !== 2) return; if (!client.VoteRateLimit.request()) return; @@ -377,6 +377,9 @@ export default class WSServer { } else if (this.Config.collabvm.moderatorEnabled && pwdHash === this.Config.collabvm.modpass) { client.rank = Rank.Moderator; client.sendMsg(guacutils.encode("admin", "0", "3", this.ModPerms.toString())); + } else if (this.Config.collabvm.turnwhitelist && pwdHash === this.Config.collabvm.turnpass) { + client.rank = Rank.Turn; + client.sendMsg(guacutils.encode("chat", "", "You may now take turns.")); } else { client.sendMsg(guacutils.encode("admin", "0", "0")); return;