ionian/src/permission/permission.ts
2023-06-01 14:18:53 +09:00

58 lines
1.9 KiB
TypeScript

import Koa from "koa";
import { UserState } from "../login";
import { sendError } from "../route/error_handler";
export enum Permission {
// ========
// not implemented
// admin only
/** remove document */
// removeContent = 'removeContent',
/** upload document */
// uploadContent = 'uploadContent',
/** modify document except base path, filename, content_hash. but admin can modify all. */
// modifyContent = 'modifyContent',
/** add tag into document */
// addTagContent = 'addTagContent',
/** remove tag from document */
// removeTagContent = 'removeTagContent',
/** ModifyTagInDoc */
ModifyTag = "ModifyTag",
/** find documents with query */
// findAllContent = 'findAllContent',
/** find one document. */
// findOneContent = 'findOneContent',
/** view content*/
// viewContent = 'viewContent',
QueryContent = "QueryContent",
/** modify description about the one tag. */
modifyTagDesc = "ModifyTagDesc",
}
export const createPermissionCheckMiddleware =
(...permissions: string[]) => async (ctx: Koa.ParameterizedContext<UserState>, next: Koa.Next) => {
const user = ctx.state["user"];
if (user.username === "admin") {
return await next();
}
const user_permission = user.permission;
// if permissions is not subset of user permission
if (!permissions.map(p => user_permission.includes(p)).every(x => x)) {
if (user.username === "") {
return sendError(401, "you are guest. login needed.");
} else return sendError(403, "do not have permission");
}
await next();
};
export const AdminOnlyMiddleware = async (ctx: Koa.ParameterizedContext<UserState>, next: Koa.Next) => {
const user = ctx.state["user"];
if (user.username !== "admin") {
return sendError(403, "admin only");
}
await next();
};