Skip to content
This repository was archived by the owner on Dec 2, 2022. It is now read-only.

Commit 1ee4720

Browse files
committed
Enforce username to be unique
1 parent 349619b commit 1ee4720

File tree

4 files changed

+34
-5
lines changed

4 files changed

+34
-5
lines changed

src/client/public/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ $(function onload() {
4343
txtUsername.val('');
4444
chatEmpty();
4545
chatWriteLine(`You are connected! (${s})`);
46+
txtMessage.focus();
4647
} else {
4748
alert(r);
4849
txtUsername.focus();
@@ -128,6 +129,12 @@ $(function onload() {
128129
);
129130
});
130131

132+
txtUsername.on('keypress', (e) => {
133+
if (e.which === 13) {
134+
btnJoin.click();
135+
}
136+
});
137+
131138
txtMessage.on('keypress', (e) => {
132139
if (e.which === 13) {
133140
btnSend.click();

src/server/Configuration.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const UPPERCASE_USERNAMES: boolean = false;

src/server/Connections.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,17 @@ export function FindConnById(pId: string): Promise<Connection | null> {
4141
});
4242
}
4343

44+
export function FindConnByName(pName: string): Promise<Connection | null> {
45+
return new Promise((resolve) => {
46+
for (const [_Id, _Conn] of Connections.entries()) {
47+
if (_Conn.name.toUpperCase() === pName.toUpperCase()) {
48+
return resolve(_Conn);
49+
}
50+
}
51+
resolve(null);
52+
});
53+
}
54+
4455
export function RemoveConnById(pId: string): Promise<Boolean> {
4556
return new Promise((resolve) => {
4657
const deleted = Connections.delete(pId);

src/server/WebSocket.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@ import {
1010
RemoveConnById,
1111
CheckConnById,
1212
ConnInfo,
13+
FindConnByName,
1314
} from './Connections.ts';
1415

16+
import { UPPERCASE_USERNAMES } from './Configuration.ts';
17+
1518
/**
1619
* h: Handler
1720
* s: Sender
@@ -40,14 +43,21 @@ export async function HandleWSConn(pWebSocket: WebSocket): Promise<void> {
4043
const objEvent: WSMessage = JSON.parse(event);
4144
switch (objEvent.h) {
4245
case 'join': {
43-
const _name = objEvent.d;
44-
if (/^[a-zA-Z0-9]+$/i.test(_name)) {
46+
const _name = UPPERCASE_USERNAMES
47+
? objEvent.d.toUpperCase()
48+
: objEvent.d;
49+
if (!/^[a-zA-Z0-9]+$/i.test(_name)) {
50+
await RespondJoin(_connInfo, 'Invalid username');
51+
} else if (await FindConnByName(_name)) {
52+
await RespondJoin(
53+
_connInfo,
54+
'Username already in use'
55+
);
56+
} else {
4557
_conn.state = true;
46-
_conn.name = objEvent.d;
58+
_conn.name = _name;
4759
await BroadcastJoin(_connInfo);
4860
await RespondJoin(_connInfo, 'OK');
49-
} else {
50-
await RespondJoin(_connInfo, 'Invalid username');
5161
}
5262
break;
5363
}

0 commit comments

Comments
 (0)