XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

SpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 1 Star 0
返回提交历史

XFEstudio/SpaceNinjaServer

feat: login conflict (#1127)

Closes #1076 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1127

f6513420
Sainan <sainan@calamity.inc>
提交于

代码差异

6 个文件 +31 -17
Modified src/controllers/api/loginController.ts +12 -3
@@ -61,10 +61,19 @@ export const loginController: RequestHandler = async (request, response) => {
61 61 return;
62 62 }
63 63
64 if (account.Nonce == 0 || loginRequest.ClientType != "webui") {
64 if (loginRequest.ClientType == "webui") {
65 if (!account.Nonce) {
66 account.ClientType = "webui";
67 account.Nonce = nonce;
68 }
69 } else {
70 if (account.Nonce && account.ClientType != "webui" && !account.Dropped && !loginRequest.kick) {
71 response.status(400).json({ error: "nonce still set" });
72 return;
73 }
74
75 account.ClientType = loginRequest.ClientType;
65 76 account.Nonce = nonce;
66 }
67 if (loginRequest.ClientType != "webui") {
68 77 account.CountryCode = loginRequest.lang.toUpperCase();
69 78 }
70 79 await account.save();
Added src/controllers/custom/ircDroppedController.ts +9 -0
@@ -0,0 +1,9 @@
1 import { getAccountForRequest } from "@/src/services/loginService";
2 import { RequestHandler } from "express";
3
4 export const ircDroppedController: RequestHandler = async (req, res) => {
5 const account = await getAccountForRequest(req);
6 account.Dropped = true;
7 await account.save();
8 res.end();
9 };
Modified src/models/loginModel.ts +1 -0
@@ -20,6 +20,7 @@ const databaseAccountSchema = new Schema<IDatabaseAccountJson>(
20 20 ConsentNeeded: { type: Boolean, required: true },
21 21 TrackedSettings: { type: [String], default: [] },
22 22 Nonce: { type: Number, default: 0 },
23 Dropped: Boolean,
23 24 LastLoginDay: { type: Number },
24 25 LatestEventMessageDate: { type: Date, default: 0 }
25 26 },
Modified src/routes/custom.ts +2 -0
@@ -7,6 +7,7 @@ import { popArchonCrystalUpgradeController } from "@/src/controllers/custom/popA
7 7 import { deleteAccountController } from "@/src/controllers/custom/deleteAccountController";
8 8 import { getNameController } from "@/src/controllers/custom/getNameController";
9 9 import { renameAccountController } from "@/src/controllers/custom/renameAccountController";
10 import { ircDroppedController } from "@/src/controllers/custom/ircDroppedController";
10 11
11 12 import { createAccountController } from "@/src/controllers/custom/createAccountController";
12 13 import { createMessageController } from "@/src/controllers/custom/createMessageController";
@@ -28,6 +29,7 @@ customRouter.get("/popArchonCrystalUpgrade", popArchonCrystalUpgradeController);
28 29 customRouter.get("/deleteAccount", deleteAccountController);
29 30 customRouter.get("/getName", getNameController);
30 31 customRouter.get("/renameAccount", renameAccountController);
32 customRouter.get("/ircDropped", ircDroppedController);
31 33
32 34 customRouter.post("/createAccount", createAccountController);
33 35 customRouter.post("/createMessage", createMessageController);
Modified src/services/loginService.ts +5 -14
@@ -82,21 +82,12 @@ export const getAccountForRequest = async (req: Request): Promise<TAccountDocume
82 82 };
83 83
84 84 export const getAccountIdForRequest = async (req: Request): Promise<string> => {
85 if (!req.query.accountId) {
86 throw new Error("Request is missing accountId parameter");
87 }
88 if (!req.query.nonce || parseInt(req.query.nonce as string) === 0) {
89 throw new Error("Request is missing nonce parameter");
90 }
91 if (
92 !(await Account.exists({
93 _id: req.query.accountId,
94 Nonce: req.query.nonce
95 }))
96 ) {
97 throw new Error("Invalid accountId-nonce pair");
85 const account = await getAccountForRequest(req);
86 if (account.Dropped && req.query.ct) {
87 account.Dropped = undefined;
88 await account.save();
98 89 }
99 return req.query.accountId as string;
90 return account._id.toString();
100 91 };
101 92
102 93 export const isAdministrator = (account: TAccountDocument): boolean => {
Modified src/types/loginTypes.ts +2 -0
@@ -14,6 +14,7 @@ export interface IAccountAndLoginResponseCommons {
14 14 export interface IDatabaseAccount extends IAccountAndLoginResponseCommons {
15 15 email: string;
16 16 password: string;
17 Dropped?: boolean;
17 18 LastLoginDay?: number;
18 19 LatestEventMessageDate: Date;
19 20 }
@@ -32,6 +33,7 @@ export interface ILoginRequest {
32 33 date: number;
33 34 ClientType: string;
34 35 PS: string;
36 kick?: boolean;
35 37 }
36 38
37 39 export interface ILoginResponse extends IAccountAndLoginResponseCommons {