Add password management and tests

This commit is contained in:
Hamcha 2019-09-06 14:23:12 +02:00
parent d573566126
commit 6f8fac89aa
Signed by: hamcha
GPG key ID: 44AD3571EB09A39E
2 changed files with 36 additions and 1 deletions

View file

@ -1,4 +1,4 @@
import { PeerMetadata, NetworkMessage } from "./types"; import { PeerMetadata, NetworkMessage, PasswordResponse } from "./types";
import EventEmitter from "eventemitter3"; import EventEmitter from "eventemitter3";
export abstract class Client extends EventEmitter { export abstract class Client extends EventEmitter {
@ -48,12 +48,21 @@ export abstract class Client extends EventEmitter {
break; break;
} }
this.players.splice(idx, 1); this.players.splice(idx, 1);
case "password-req":
this.emit("password-required");
default: default:
// For most cases, we can just use the kind as event type // For most cases, we can just use the kind as event type
this.emit(data.kind, data); this.emit(data.kind, data);
} }
} }
public password(password: string) {
this.send<PasswordResponse>({
kind: "password-resp",
password
});
}
public get name(): string { public get name(): string {
return this.metadata.name; return this.metadata.name;
} }

View file

@ -58,6 +58,32 @@ describe("network/PeerServer", () => {
client.connect("test-server"); client.connect("test-server");
await hook.expect("local-joined", 1000); await hook.expect("local-joined", 1000);
}); });
test("Server enforces password protection", async () => {
const mox = new MockHelper();
const hook = new EventHook();
const room = sampleRoom();
const roomPassword = "test-pwd";
room.password = roomPassword;
const server = mox.createServer(room, "test-server");
// This client will try the right password
const client1 = mox.createClient();
hook.hookEmitter(client1, "data", "client1-data");
client1.connect("test-server");
await hook.expect("client1-data", 1000, messageKind("password-req"));
client1.password(roomPassword);
await hook.expect("client1-data", 1000, messageKind("room-info"));
await hook.expect("client1-data", 1000, messageKind("player-joined"));
// This client will try an incorrect password
const client2 = mox.createClient("test-client2", "another-client");
hook.hookEmitter(client2, "data", "client2-data");
client2.connect("test-server");
await hook.expect("client2-data", 1000, messageKind("password-req"));
client2.password("not the right password");
await hook.expect("client2-data", 1000, messageKind("error"));
});
}); });
describe("network/PeerClient", () => { describe("network/PeerClient", () => {