add Permissions#set

This avoids constructing a Permissions just to reset it, when we can just set it to nothing

Also contains some var->let or var->const work
This commit is contained in:
modeco80 2024-03-12 03:02:02 -04:00
parent acd2b949b8
commit 7691b84073
4 changed files with 40 additions and 36 deletions

View File

@ -75,7 +75,7 @@ interface KeyCodeKeysyms {
[key: number]: number[] | null; [key: number]: number[] | null;
} }
var keycodeKeysyms: KeyCodeKeysyms = { const keycodeKeysyms: KeyCodeKeysyms = {
8: [0xff08], // backspace 8: [0xff08], // backspace
9: [0xff09], // tab 9: [0xff09], // tab
12: [0xff0b, 0xff0b, 0xff0b, 0xffb5], // clear / KP 5 12: [0xff0b, 0xff0b, 0xff0b, 0xffb5], // clear / KP 5
@ -132,7 +132,7 @@ var keycodeKeysyms: KeyCodeKeysyms = {
225: [0xfe03] // altgraph (iso_level3_shift) 225: [0xfe03] // altgraph (iso_level3_shift)
}; };
var keyidentifier_keysym: KeyIdentifierKeysym = { const keyidentifier_keysym: KeyIdentifierKeysym = {
Again: [0xff66], Again: [0xff66],
AllCandidates: [0xff3d], AllCandidates: [0xff3d],
Alphanumeric: [0xff30], Alphanumeric: [0xff30],

View File

@ -395,7 +395,7 @@ function closeVM() {
users.splice(0, users.length); users.splice(0, users.length);
elements.userlist.innerHTML = ''; elements.userlist.innerHTML = '';
rank = Rank.Unregistered; rank = Rank.Unregistered;
perms = new Permissions(0); perms.set(0);
w.VMName = null; w.VMName = null;
// Reset admin and vote panels // Reset admin and vote panels
elements.staffbtns.style.display = 'none'; elements.staffbtns.style.display = 'none';

View File

@ -129,7 +129,7 @@ export default class CollabVMClient {
(e: KeyboardEvent) => { (e: KeyboardEvent) => {
e.preventDefault(); e.preventDefault();
if (this.users.find((u) => u.username === this.username)?.turn === -1 && this.rank !== Rank.Admin) return; if (this.users.find((u) => u.username === this.username)?.turn === -1 && this.rank !== Rank.Admin) return;
var keysym = GetKeysym(e.keyCode, e.key, e.location); let keysym = GetKeysym(e.keyCode, e.key, e.location);
if (keysym === null) return; if (keysym === null) return;
this.key(keysym, true); this.key(keysym, true);
}, },
@ -143,7 +143,7 @@ export default class CollabVMClient {
(e: KeyboardEvent) => { (e: KeyboardEvent) => {
e.preventDefault(); e.preventDefault();
if (this.users.find((u) => u.username === this.username)?.turn === -1 && this.rank !== Rank.Admin) return; if (this.users.find((u) => u.username === this.username)?.turn === -1 && this.rank !== Rank.Admin) return;
var keysym = GetKeysym(e.keyCode, e.key, e.location); let keysym = GetKeysym(e.keyCode, e.key, e.location);
if (keysym === null) return; if (keysym === null) return;
this.key(keysym, false); this.key(keysym, false);
}, },
@ -188,7 +188,7 @@ export default class CollabVMClient {
// Fires on WebSocket message // Fires on WebSocket message
private onMessage(event: MessageEvent) { private onMessage(event: MessageEvent) {
var msgArr: string[]; let msgArr: string[];
try { try {
msgArr = Guacutils.decode(event.data); msgArr = Guacutils.decode(event.data);
} catch (e) { } catch (e) {
@ -220,7 +220,7 @@ export default class CollabVMClient {
} }
case 'png': { case 'png': {
// Despite the opcode name, this is actually JPEG, because old versions of the server used PNG and yknow backwards compatibility // Despite the opcode name, this is actually JPEG, because old versions of the server used PNG and yknow backwards compatibility
var img = new Image(); let img = new Image();
img.addEventListener('load', () => { img.addEventListener('load', () => {
this.ctx.drawImage(img, parseInt(msgArr[3]), parseInt(msgArr[4])); this.ctx.drawImage(img, parseInt(msgArr[3]), parseInt(msgArr[4]));
}); });
@ -228,14 +228,14 @@ export default class CollabVMClient {
break; break;
} }
case 'chat': { case 'chat': {
for (var i = 1; i < msgArr.length; i += 2) { for (let i = 1; i < msgArr.length; i += 2) {
this.publicEmitter.emit('chat', msgArr[i], msgArr[i + 1]); this.publicEmitter.emit('chat', msgArr[i], msgArr[i + 1]);
} }
break; break;
} }
case 'adduser': { case 'adduser': {
for (var i = 2; i < msgArr.length; i += 2) { for (let i = 2; i < msgArr.length; i += 2) {
var _user = this.users.find((u) => u.username === msgArr[i]); let _user = this.users.find((u) => u.username === msgArr[i]);
if (_user !== undefined) { if (_user !== undefined) {
_user.rank = parseInt(msgArr[i + 1]); _user.rank = parseInt(msgArr[i + 1]);
} else { } else {
@ -247,16 +247,16 @@ export default class CollabVMClient {
break; break;
} }
case 'remuser': { case 'remuser': {
for (var i = 2; i < msgArr.length; i++) { for (let i = 2; i < msgArr.length; i++) {
var _user = this.users.find((u) => u.username === msgArr[i]); let _user = this.users.find((u) => u.username === msgArr[i]);
if (_user === undefined) continue; if (_user === undefined) continue;
this.users.splice(this.users.indexOf(_user), 1); this.users.splice(this.users.indexOf(_user), 1);
this.publicEmitter.emit('remuser', _user); this.publicEmitter.emit('remuser', _user);
} }
} }
case 'rename': { case 'rename': {
var selfrename = false; let selfrename = false;
var oldusername: string | null = null; let oldusername: string | null = null;
// We've been renamed // We've been renamed
if (msgArr[1] === '0') { if (msgArr[1] === '0') {
selfrename = true; selfrename = true;
@ -279,7 +279,7 @@ export default class CollabVMClient {
} }
this.username = msgArr[3]; this.username = msgArr[3];
} else oldusername = msgArr[2]; } else oldusername = msgArr[2];
var _user = this.users.find((u) => u.username === oldusername); let _user = this.users.find((u) => u.username === oldusername);
if (_user) { if (_user) {
_user.username = msgArr[3]; _user.username = msgArr[3];
} }
@ -288,8 +288,8 @@ export default class CollabVMClient {
} }
case 'turn': { case 'turn': {
// Reset all turn data // Reset all turn data
for (var user of this.users) user.turn = -1; for (let user of this.users) user.turn = -1;
var queuedUsers = parseInt(msgArr[2]); let queuedUsers = parseInt(msgArr[2]);
if (queuedUsers === 0) { if (queuedUsers === 0) {
this.publicEmitter.emit('turn', { this.publicEmitter.emit('turn', {
user: null, user: null,
@ -299,12 +299,12 @@ export default class CollabVMClient {
}); });
return; return;
} }
var currentTurn = this.users.find((u) => u.username === msgArr[3])!; let currentTurn = this.users.find((u) => u.username === msgArr[3])!;
currentTurn.turn = 0; currentTurn.turn = 0;
var queue: User[] = []; let queue: User[] = [];
if (queuedUsers > 1) { if (queuedUsers > 1) {
for (var i = 1; i < queuedUsers; i++) { for (let i = 1; i < queuedUsers; i++) {
var user = this.users.find((u) => u.username === msgArr[i + 3])!; let user = this.users.find((u) => u.username === msgArr[i + 3])!;
queue.push(user); queue.push(user);
user.turn = i; user.turn = i;
} }
@ -323,9 +323,9 @@ export default class CollabVMClient {
// Vote started // Vote started
case '1': case '1':
// Vote updated // Vote updated
var timeToEnd = parseInt(msgArr[2]); let timeToEnd = parseInt(msgArr[2]);
var yesVotes = parseInt(msgArr[3]); let yesVotes = parseInt(msgArr[3]);
var noVotes = parseInt(msgArr[4]); let noVotes = parseInt(msgArr[4]);
// Some server implementations dont send data for status 0, and some do // Some server implementations dont send data for status 0, and some do
if (Number.isNaN(timeToEnd) || Number.isNaN(yesVotes) || Number.isNaN(noVotes)) return; if (Number.isNaN(timeToEnd) || Number.isNaN(yesVotes) || Number.isNaN(noVotes)) return;
this.voteStatus = { this.voteStatus = {
@ -355,11 +355,11 @@ export default class CollabVMClient {
this.publicEmitter.emit('badpw'); this.publicEmitter.emit('badpw');
return; return;
case '1': case '1':
this.perms = new Permissions(65535); this.perms.set(65535);
this.rank = Rank.Admin; this.rank = Rank.Admin;
break; break;
case '3': case '3':
this.perms = new Permissions(parseInt(msgArr[3])); this.perms.set(parseInt(msgArr[3]));
this.rank = Rank.Moderator; this.rank = Rank.Moderator;
break; break;
} }
@ -395,11 +395,11 @@ export default class CollabVMClient {
// Get a list of all VMs // Get a list of all VMs
list(): Promise<VM[]> { list(): Promise<VM[]> {
return new Promise((res, rej) => { return new Promise((res, rej) => {
var u = this.onInternal('list', (list: string[]) => { let u = this.onInternal('list', (list: string[]) => {
u(); u();
var vms: VM[] = []; let vms: VM[] = [];
for (var i = 0; i < list.length; i += 3) { for (let i = 0; i < list.length; i += 3) {
var th = new Image(); let th = new Image();
th.src = 'data:image/jpeg;base64,' + list[i + 2]; th.src = 'data:image/jpeg;base64,' + list[i + 2];
vms.push({ vms.push({
url: this.url, url: this.url,
@ -417,7 +417,7 @@ export default class CollabVMClient {
// Connect to a node // Connect to a node
connect(id: string, username: string | null = null): Promise<boolean> { connect(id: string, username: string | null = null): Promise<boolean> {
return new Promise((res) => { return new Promise((res) => {
var u = this.onInternal('connect', (success: boolean) => { let u = this.onInternal('connect', (success: boolean) => {
u(); u();
res(success); res(success);
}); });
@ -535,9 +535,9 @@ export default class CollabVMClient {
getip(user: string) { getip(user: string) {
if (this.users.find((u) => u.username === user) === undefined) return false; if (this.users.find((u) => u.username === user) === undefined) return false;
return new Promise<string>((res) => { return new Promise<string>((res) => {
var u = this.onInternal('ip', (username: string, ip: string) => { let unsubscribe = this.onInternal('ip', (username: string, ip: string) => {
if (username !== user) return; if (username !== user) return;
u(); unsubscribe();
res(ip); res(ip);
}); });
this.send('admin', AdminOpcode.GetIP, user); this.send('admin', AdminOpcode.GetIP, user);
@ -547,8 +547,8 @@ export default class CollabVMClient {
// QEMU Monitor // QEMU Monitor
qemuMonitor(cmd: string) { qemuMonitor(cmd: string) {
return new Promise<string>((res) => { return new Promise<string>((res) => {
var u = this.onInternal('qemu', (output) => { let unsubscribe = this.onInternal('qemu', (output) => {
u(); unsubscribe();
res(output); res(output);
}); });
this.send('admin', AdminOpcode.MonitorCommand, this.node!, cmd); this.send('admin', AdminOpcode.MonitorCommand, this.node!, cmd);

View File

@ -11,6 +11,10 @@ export class Permissions {
xss: boolean = false; xss: boolean = false;
constructor(mask: number) { constructor(mask: number) {
this.set(mask);
}
set(mask: number) {
this.restore = (mask & 1) !== 0; this.restore = (mask & 1) !== 0;
this.reboot = (mask & 2) !== 0; this.reboot = (mask & 2) !== 0;
this.ban = (mask & 4) !== 0; this.ban = (mask & 4) !== 0;
@ -21,7 +25,7 @@ export class Permissions {
this.rename = (mask & 128) !== 0; this.rename = (mask & 128) !== 0;
this.grabip = (mask & 256) !== 0; this.grabip = (mask & 256) !== 0;
this.xss = (mask & 512) !== 0; this.xss = (mask & 512) !== 0;
} }
} }
export enum Rank { export enum Rank {