返回提交历史
Modified
src/controllers/api/loginController.ts
+12
-3
Added
src/controllers/custom/ircDroppedController.ts
+9
-0
Modified
src/models/loginModel.ts
+1
-0
Modified
src/routes/custom.ts
+2
-0
Modified
src/services/loginService.ts
+5
-14
Modified
src/types/loginTypes.ts
+2
-0
XFEstudio/SpaceNinjaServer
feat: login conflict (#1127)
Closes #1076 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1127
f6513420
代码差异
6 个文件
+31
-17
@@ -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();
@@ -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
};
@@ -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
},
@@ -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);
@@ -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 => {
@@ -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 {