Skip to content

Commit 235ff3c

Browse files
committed
feat: add validating session token on enet-server
1 parent 498f433 commit 235ff3c

8 files changed

Lines changed: 100 additions & 35 deletions

File tree

apps/enet-server/src/core/Base.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,16 @@ export class Base {
2020
}
2121

2222
public async init() {
23+
await this.database.setup();
24+
2325
await this.manager.commands.init();
2426
await this.manager.events.init();
2527

2628
for (const [i, s] of this.servers.entries()) {
27-
s.server.on("connect", (netID) => this.manager.events.data.get("connect")?.execute(i, netID));
28-
s.server.on("ready", () => this.manager.events.data.get("ready")?.execute(i, s.port));
29-
s.server.on("raw", (netID, channelID, data) => this.manager.events.data.get("raw")?.execute(i, netID, channelID, data));
30-
s.server.on("disconnect", (netID) => this.manager.events.data.get("disconnect")?.execute(i, netID));
29+
s.server.on("connect", (netID) => this.manager.events.data.get("connect")?.execute(i, s, this.database, netID));
30+
s.server.on("ready", () => this.manager.events.data.get("ready")?.execute(i, s, this.database));
31+
s.server.on("raw", (netID, channelID, data) => this.manager.events.data.get("raw")?.execute(i, s, this.database, netID, channelID, data));
32+
s.server.on("disconnect", (netID) => this.manager.events.data.get("disconnect")?.execute(i, s, this.database, netID));
3133

3234
s.server.listen();
3335
}

apps/enet-server/src/core/Peer.ts

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,26 @@
1-
// import {
2-
// Peer as OldPeer,
3-
// TankPacket,
4-
// TextPacket,
5-
// Variant,
6-
// VariantOptions,
7-
// } from "growtopia.js";
8-
// import { PeerData } from "@growserver/types";
9-
// import { Name } from "@/network/player/Name";
10-
// import { Base } from "./Base";
1+
import { Name } from "@/network/player/Name";
2+
import { PeerData } from "@growserver/types";
3+
import {
4+
Peer as OldPeer
5+
} from "growtopia.js";
6+
import { Server } from "./Server";
117

12-
// export class Peer extends OldPeer<PeerData> {
13-
// constructor(public base: Base, public netID: number, public channelID: number) {
14-
// super(base.server, netID, channelID);
15-
// }
8+
export class Peer extends OldPeer<PeerData> {
9+
constructor(public server: Server, public netID: number, public channelID?: number) {
10+
super(server.server, netID, channelID);
11+
}
1612

1713

18-
// /**
19-
// * It should be 'data' but it seems it wont overriden, so named into 'player' instead
20-
// */
21-
// public get player() {
22-
// return this.base.state.getPlayer(this.netID);
23-
// }
14+
/**
15+
* It should be 'data' but it seems it wont overriden, so named into 'player' instead
16+
*/
17+
public get player() {
18+
return this.server.data.getPeer(this.netID);
19+
}
2420

2521

26-
// public get name() {
27-
// return this.player ? new Name(this.player) : "";
28-
// }
22+
public get name() {
23+
return this.player ? new Name(this.player) : "";
24+
}
2925

30-
// }
26+
}

apps/enet-server/src/network/events/Connect.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import { IEvent } from "@/abstracts/IEvent";
2+
import { Peer } from "@/core/Peer";
3+
import type { Server } from "@/core/Server";
24
import { Debug, ThrowError } from "@/decorators";
5+
import type { Database } from "@growserver/db";
36
import logger from "@growserver/logger";
7+
import { TextPacket } from "growtopia.js";
48

59
export default class EventConnect extends IEvent {
610
public name: string = "connect";
@@ -10,7 +14,16 @@ export default class EventConnect extends IEvent {
1014

1115
@Debug()
1216
@ThrowError("Failed to call Connect event")
13-
public async execute(serverID: number, netID: number) {
17+
public async execute(serverID: number, server: Server, database: Database, netID: number) {
1418
logger.info(`[S-${serverID}] Connected netID: ${netID}`);
19+
20+
const peer = new Peer(server, netID);
21+
this.sendHelloPacket(peer);
22+
}
23+
24+
@Debug()
25+
@ThrowError("Failed to send HelloPacket to client")
26+
private async sendHelloPacket(peer: Peer) {
27+
return peer.send(TextPacket.from(0x1));
1528
}
1629
}

apps/enet-server/src/network/events/Disconnect.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { IEvent } from "@/abstracts/IEvent";
2+
import type { Server } from "@/core/Server";
23
import { Debug, ThrowError } from "@/decorators";
4+
import type { Database } from "@growserver/db";
35
import logger from "@growserver/logger";
46

57
export default class EventDisconnect extends IEvent {
@@ -10,7 +12,7 @@ export default class EventDisconnect extends IEvent {
1012

1113
@Debug()
1214
@ThrowError("Failed to call Disconnect event")
13-
public async execute(serverID: number, netID: number) {
15+
public async execute(serverID: number, server: Server, database: Database, netID: number) {
1416
logger.info(`[S-${serverID}] Disconnected netID: ${netID}`);
1517
}
1618
}

apps/enet-server/src/network/events/Raw.ts

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import { IEvent } from "@/abstracts/IEvent";
2+
import type { Server } from "@/core/Server";
23
import { Debug, ThrowError } from "@/decorators";
4+
import { config } from "@growserver/config";
5+
import { PacketTypes } from "@growserver/const";
6+
import type { Database } from "@growserver/db";
37
import logger from "@growserver/logger";
8+
import { ExtendBuffer, parseAction } from "@growserver/utils";
49

510
export default class EventRaw extends IEvent {
611
public name: string = "raw";
@@ -10,7 +15,53 @@ export default class EventRaw extends IEvent {
1015

1116
@Debug()
1217
@ThrowError("Failed to call Raw event")
13-
public async execute(serverID: number, netID: number, channelID: number, data: Buffer) {
18+
public async execute(serverID: number, server: Server, database: Database, netID: number, channelID: number, data: Buffer) {
1419
logger.info(`[S-${serverID}] client sending data:\n${data.toString("hex").match(/../g)?.join(" ")}`);
20+
21+
const buf = new ExtendBuffer(0);
22+
buf.data = data;
23+
24+
const type = buf.readU32();
25+
26+
switch (type) {
27+
case PacketTypes.TEXT: {
28+
const text: Record<string, string> = parseAction(buf.data);
29+
30+
const ltoken = text.ltoken;
31+
const session = await this.validateToken(ltoken, database);
32+
33+
logger.info({session, ltoken});
34+
35+
break;
36+
}
37+
}
38+
}
39+
40+
@Debug()
41+
@ThrowError("Failed to validating ltoken")
42+
public async validateToken(token: string, database: Database) {
43+
const sessionData = await database.models.Session.findOne({ token })
44+
.populate({
45+
path: 'userId',
46+
model: 'User',
47+
populate: {
48+
path: 'playerId',
49+
model: 'Player'
50+
}
51+
});
52+
53+
if (!sessionData) {
54+
return null;
55+
}
56+
57+
// Check if session is expired
58+
if (new Date(sessionData.expiresAt) < new Date()) {
59+
return null;
60+
}
61+
62+
const user = sessionData.userId as Record<string, string>;
63+
const player = user?.playerId || null;
64+
65+
return { session: sessionData, user, player };
1566
}
1667
}

apps/enet-server/src/network/events/Ready.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { IEvent } from "@/abstracts/IEvent";
2+
import type { Server } from "@/core/Server";
23
import { Debug, ThrowError } from "@/decorators";
4+
import type { Database } from "@growserver/db";
35
import logger from "@growserver/logger";
46

57
export default class EventReady extends IEvent {
@@ -10,7 +12,7 @@ export default class EventReady extends IEvent {
1012

1113
@Debug()
1214
@ThrowError("Failed to call Ready event")
13-
public async execute(serverID: number, port: number) {
14-
logger.info(`[S-${serverID}] Ready with port ${port}`);
15+
public async execute(serverID: number, server: Server, database: Database) {
16+
logger.info(`[S-${serverID}] Ready with port ${server.port}`);
1517
}
1618
}

apps/web/src/pages/player/growid/login/validate.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ export const GET: APIRoute = async ({ request, cookies }) => {
1212
headers: request.headers
1313
});
1414

15-
console.log({ session });
1615

1716
if (!session?.session || !session?.user) {
1817
return new Response(

packages/const/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export enum ServerState {
1313

1414
export enum PacketTypes {
1515
HELLO = 1,
16-
STR = 2,
16+
TEXT = 2,
1717
ACTION = 3,
1818
TANK = 4,
1919
};

0 commit comments

Comments
 (0)