58 lines
1.9 KiB
TypeScript
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();
|
|
};
|