Mount ksHookIR and change how fervidex permission mounting works.

This commit is contained in:
zkldi
2021-11-05 05:09:39 +00:00
parent 8d6b050d1b
commit 5cdbea3d3b
3 changed files with 75 additions and 55 deletions
+64 -50
View File
@@ -22,6 +22,8 @@ export const AllPermissions: Record<APIPermissions, true> = {
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<APIPermissions, true> = {
*
* 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.
@@ -0,0 +1,5 @@
import { Router } from "express";
const router: Router = Router({ mergeParams: true });
export default router;
+6 -5
View File
@@ -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;