diff --git a/cvmts/src/CollabVMServer.ts b/cvmts/src/CollabVMServer.ts index 3d1eb2b..9566136 100644 --- a/cvmts/src/CollabVMServer.ts +++ b/cvmts/src/CollabVMServer.ts @@ -355,7 +355,7 @@ export default class CollabVMServer { client.onMsgSent(); break; case 'turn': - if ((!this.turnsAllowed || this.Config.collabvm.turnwhitelist) && client.rank !== Rank.Admin && client.rank !== Rank.Moderator && client.rank !== Rank.Turn) return; + if ((!this.turnsAllowed || this.Config.collabvm.turnwhitelist) && client.rank !== Rank.Admin && client.rank !== Rank.Moderator && !client.turnWhitelist) return; if (this.Config.auth.enabled && client.rank === Rank.Unregistered && !this.Config.auth.guestPermissions.turn) { client.sendMsg(cvm.guacEncode('chat', '', 'You need to login to do that.')); return; @@ -419,7 +419,7 @@ export default class CollabVMServer { break; case 'vote': if (!this.VM.SnapshotsSupported()) return; - if ((!this.turnsAllowed || this.Config.collabvm.turnwhitelist) && client.rank !== Rank.Admin && client.rank !== Rank.Moderator && client.rank !== Rank.Turn) return; + if ((!this.turnsAllowed || this.Config.collabvm.turnwhitelist) && client.rank !== Rank.Admin && client.rank !== Rank.Moderator && !client.turnWhitelist) return; if (!client.connectedToNode) return; if (msgArr.length !== 2) return; if (!client.VoteRateLimit.request()) return; @@ -481,25 +481,31 @@ export default class CollabVMServer { switch (msgArr[1]) { case '2': // Login - if (this.Config.auth.enabled) { - client.sendMsg(cvm.guacEncode('chat', '', 'This server does not support staff passwords. Please log in to become staff.')); - return; - } + if (!client.LoginRateLimit.request() || !client.username) return; if (msgArr.length !== 3) return; var sha256 = createHash('sha256'); sha256.update(msgArr[2]); var pwdHash = sha256.digest('hex'); sha256.destroy(); + + if (this.Config.collabvm.turnwhitelist && pwdHash === this.Config.collabvm.turnpass) { + client.turnWhitelist = true; + client.sendMsg(cvm.guacEncode('chat', '', 'You may now take turns.')); + return; + } + + if (this.Config.auth.enabled) { + client.sendMsg(cvm.guacEncode('chat', '', 'This server does not support staff passwords. Please log in to become staff.')); + return; + } + if (pwdHash === this.Config.collabvm.adminpass) { client.rank = Rank.Admin; client.sendMsg(cvm.guacEncode('admin', '0', '1')); } else if (this.Config.collabvm.moderatorEnabled && pwdHash === this.Config.collabvm.modpass) { client.rank = Rank.Moderator; client.sendMsg(cvm.guacEncode('admin', '0', '3', this.ModPerms.toString())); - } else if (this.Config.collabvm.turnwhitelist && pwdHash === this.Config.collabvm.turnpass) { - client.rank = Rank.Turn; - client.sendMsg(cvm.guacEncode('chat', '', 'You may now take turns.')); } else { client.sendMsg(cvm.guacEncode('admin', '0', '0')); return; diff --git a/cvmts/src/User.ts b/cvmts/src/User.ts index 5c4b35d..264ed1f 100644 --- a/cvmts/src/User.ts +++ b/cvmts/src/User.ts @@ -22,6 +22,7 @@ export class User { Config: IConfig; IP: IPData; Capabilities: CollabVMCapabilities; + turnWhitelist: boolean = false; // Hide flag. Only takes effect if the user is logged in. noFlag: boolean = false; countryCode: string | null = null; @@ -153,6 +154,4 @@ export enum Rank { Registered = 1, Admin = 2, Moderator = 3, - // Giving a good gap between server only internal ranks just in case - Turn = 10 } diff --git a/yarn.lock b/yarn.lock index e65b92c..0271616 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41,14 +41,14 @@ __metadata: languageName: node linkType: hard -"@computernewb/superqemu@npm:^0.2.2": - version: 0.2.2 - resolution: "@computernewb/superqemu@npm:0.2.2" +"@computernewb/superqemu@npm:^0.2.3": + version: 0.2.3 + resolution: "@computernewb/superqemu@npm:0.2.3" dependencies: "@computernewb/nodejs-rfb": "npm:^0.3.0" execa: "npm:^8.0.1" pino: "npm:^9.3.1" - checksum: 10c0/db4bfed554661544028e4fa41f1869adf64292ffe2864a807e8dc0c0f1c3538cfef72292d202a8dad8ab2c066b54b3296c9456e64ea685b07a981fed89d8d6c5 + checksum: 10c0/70d63278f4cdd6e5521a9bf62b9492380c96a94dcbb2e719e7396a4139c4238560ad7deea86ea163af6fc8c526b9f658e7f5e7586391fe4b57f5257467a16eb1 languageName: node linkType: hard @@ -76,7 +76,7 @@ __metadata: resolution: "@cvmts/cvmts@workspace:cvmts" dependencies: "@computernewb/nodejs-rfb": "npm:^0.3.0" - "@computernewb/superqemu": "npm:^0.2.2" + "@computernewb/superqemu": "npm:^0.2.3" "@cvmts/cvm-rs": "npm:*" "@maxmind/geoip2-node": "npm:^5.0.0" "@types/node": "npm:^20.12.5"