From 5cdbea3d3b2a9c3f4a227705f1cc8a51d4d9565d Mon Sep 17 00:00:00 2001 From: zkldi Date: Fri, 5 Nov 2021 05:09:39 +0000 Subject: [PATCH] Mount ksHookIR and change how fervidex permission mounting works. --- server/src/server/middleware/auth.ts | 114 +++++++++++-------- server/src/server/router/ir/kshook/router.ts | 5 + server/src/server/router/ir/router.ts | 11 +- 3 files changed, 75 insertions(+), 55 deletions(-) create mode 100644 server/src/server/router/ir/kshook/router.ts diff --git a/server/src/server/middleware/auth.ts b/server/src/server/middleware/auth.ts index 7a1fa8f83..3ec538751 100644 --- a/server/src/server/middleware/auth.ts +++ b/server/src/server/middleware/auth.ts @@ -22,6 +22,8 @@ export const AllPermissions: Record = { delete_score: true, }; +export const SetRequestPermissions: RequestHandler = CreateSetRequestPermissions("description"); + /** * Sets the permissions for this request, alongside the user that is making the request. * @@ -36,61 +38,73 @@ export const AllPermissions: Record = { * * This is set on req[SYMBOL_TachiAPIAuth]. */ -export const SetRequestPermissions: RequestHandler = async (req, res, next) => { - if (req.session?.tachi?.user.id) { +function CreateSetRequestPermissions(errorKeyName: string): RequestHandler { + return async (req, res, next) => { + if (req.session?.tachi?.user.id) { + req[SYMBOL_TachiAPIAuth] = { + userID: req.session.tachi.user.id, + identifier: `Session-Key ${req.session.tachi.user.id}`, + token: null, + permissions: AllPermissions, + }; + return next(); + } + + const header = req.header("Authorization"); + + // if no auth was attempted, default to the guest token. + if (!header) { + req[SYMBOL_TachiAPIAuth] = GuestToken; + return next(); + } + + const { token, type } = SplitAuthorizationHeader(header); + + if (type !== "Bearer") { + return res.status(400).json({ + success: false, + [errorKeyName]: "Invalid Authorization Type - Expected Bearer.", + }); + } + + if (!token) { + return res.status(401).json({ + success: false, + [errorKeyName]: "Invalid token.", + }); + } + + const apiTokenData = await db["api-tokens"].findOne({ + token, + }); + + if (!apiTokenData) { + return res.status(401).json({ + success: false, + [errorKeyName]: + "The provided API token does not correspond with any key in the database.", + }); + } + req[SYMBOL_TachiAPIAuth] = { - userID: req.session.tachi.user.id, - identifier: `Session-Key ${req.session.tachi.user.id}`, - token: null, - permissions: AllPermissions, + userID: apiTokenData.userID, + token, + permissions: apiTokenData.permissions, + identifier: apiTokenData.identifier, }; + return next(); - } - - const header = req.header("Authorization"); - - // if no auth was attempted, default to the guest token. - if (!header) { - req[SYMBOL_TachiAPIAuth] = GuestToken; - return next(); - } - - const { token, type } = SplitAuthorizationHeader(header); - - if (type !== "Bearer") { - return res.status(400).json({ - success: false, - description: "Invalid Authorization Type - Expected Bearer.", - }); - } - - if (!token) { - return res.status(401).json({ - success: false, - description: "Invalid token.", - }); - } - - const apiTokenData = await db["api-tokens"].findOne({ - token, - }); - - if (!apiTokenData) { - return res.status(401).json({ - success: false, - description: "The provided API token does not correspond with any key in the database.", - }); - } - - req[SYMBOL_TachiAPIAuth] = { - userID: apiTokenData.userID, - token, - permissions: apiTokenData.permissions, - identifier: apiTokenData.identifier, }; +} - return next(); -}; +/** + * An identical implementation of SetRequestPermissions, but returns + * fervidex-style errors (error, instead of description). + * + * @see SetRequestPermissions + */ +export const SetFervidexStyleRequestPermissions: RequestHandler = + CreateSetRequestPermissions("error"); /** * Returns a middleware that enforces the request has the necessary permissions. diff --git a/server/src/server/router/ir/kshook/router.ts b/server/src/server/router/ir/kshook/router.ts new file mode 100644 index 000000000..92c73b1eb --- /dev/null +++ b/server/src/server/router/ir/kshook/router.ts @@ -0,0 +1,5 @@ +import { Router } from "express"; + +const router: Router = Router({ mergeParams: true }); + +export default router; diff --git a/server/src/server/router/ir/router.ts b/server/src/server/router/ir/router.ts index a1267669d..d5ac0ab54 100644 --- a/server/src/server/router/ir/router.ts +++ b/server/src/server/router/ir/router.ts @@ -5,14 +5,16 @@ import directManualIR from "./direct-manual/router"; import fervidexIR from "./fervidex/router"; import uscIR from "./usc/router"; import beatorajaIR from "./beatoraja/router"; +import ksHookIR from "./kshook/router"; import { RequireBokutachi, RequireKamaitachi } from "../../middleware/type-require"; -import { SetRequestPermissions } from "../../middleware/auth"; +import { SetFervidexStyleRequestPermissions, SetRequestPermissions } from "../../middleware/auth"; const router: Router = Router({ mergeParams: true }); // Common IRs router.use("/direct-manual", SetRequestPermissions, directManualIR); +router.use("/kshook", SetFervidexStyleRequestPermissions, ksHookIR); // Bokutachi IRs @@ -24,9 +26,8 @@ router.use("/beatoraja", SetRequestPermissions, RequireBokutachi, beatorajaIR); // Kamaitachi IRs -router.use(SetRequestPermissions); -router.use("/barbatos", RequireKamaitachi, barbatosIR); -router.use("/chunitachi", RequireKamaitachi, chunitachiIR); -router.use("/fervidex", RequireKamaitachi, fervidexIR); +router.use("/barbatos", SetRequestPermissions, RequireKamaitachi, barbatosIR); +router.use("/chunitachi", SetRequestPermissions, RequireKamaitachi, chunitachiIR); +router.use("/fervidex", SetFervidexStyleRequestPermissions, RequireKamaitachi, fervidexIR); export default router;