fosrl.pangolin/server/routers/external.ts

425 lines
11 KiB
TypeScript
Raw Normal View History

2024-09-27 21:39:03 -04:00
import { Router } from "express";
import * as site from "./site";
import * as org from "./org";
import * as resource from "./resource";
import * as target from "./target";
import * as user from "./user";
import * as auth from "./auth";
2024-10-12 21:36:14 -04:00
import * as role from "./role";
import HttpCode from "@server/types/HttpCode";
2024-10-04 23:14:40 -04:00
import {
rateLimitMiddleware,
verifySessionMiddleware,
verifySessionUserMiddleware,
verifyOrgAccess,
verifySiteAccess,
verifyResourceAccess,
verifyTargetAccess,
2024-10-12 21:36:14 -04:00
verifyRoleAccess,
2024-11-16 22:48:10 -05:00
verifySetResourceUsers,
verifyUserAccess,
2024-12-16 22:40:42 -05:00
getUserOrgs
2024-11-16 22:48:10 -05:00
} from "@server/middlewares";
import { verifyUserHasAction } from "../middlewares/verifyUserHasAction";
import { ActionsEnum } from "@server/auth/actions";
2024-11-16 22:48:10 -05:00
import { verifyUserIsOrgOwner } from "../middlewares/verifyUserIsOrgOwner";
import { createNewt, getToken } from "./newt";
2024-09-27 21:39:03 -04:00
// Root routes
export const unauthenticated = Router();
2024-09-27 21:39:03 -04:00
unauthenticated.get("/", (_, res) => {
res.status(HttpCode.OK).json({ message: "Healthy" });
2024-09-27 21:39:03 -04:00
});
// Authenticated Root routes
export const authenticated = Router();
2024-10-04 23:14:40 -04:00
authenticated.use(verifySessionUserMiddleware);
2024-09-28 12:14:44 -04:00
2024-10-14 19:30:38 -04:00
authenticated.get("/org/checkId", org.checkId);
2024-10-03 22:31:20 -04:00
authenticated.put("/org", getUserOrgs, org.createOrg);
authenticated.get("/orgs", getUserOrgs, org.listOrgs); // TODO we need to check the orgs here
authenticated.get(
"/org/:orgId",
verifyOrgAccess,
verifyUserHasAction(ActionsEnum.getOrg),
2024-12-16 22:40:42 -05:00
org.getOrg
);
authenticated.post(
"/org/:orgId",
verifyOrgAccess,
verifyUserHasAction(ActionsEnum.updateOrg),
2024-12-16 22:40:42 -05:00
org.updateOrg
);
authenticated.delete(
"/org/:orgId",
verifyOrgAccess,
verifyUserIsOrgOwner,
2024-12-16 22:40:42 -05:00
org.deleteOrg
);
authenticated.put(
"/org/:orgId/site",
verifyOrgAccess,
verifyUserHasAction(ActionsEnum.createSite),
2024-12-16 22:40:42 -05:00
site.createSite
);
authenticated.get(
"/org/:orgId/sites",
verifyOrgAccess,
verifyUserHasAction(ActionsEnum.listSites),
2024-12-16 22:40:42 -05:00
site.listSites
);
authenticated.get(
"/org/:orgId/site/:niceId",
verifyOrgAccess,
verifyUserHasAction(ActionsEnum.getSite),
2024-12-16 22:40:42 -05:00
site.getSite
);
2024-10-14 22:26:32 -04:00
authenticated.get(
"/org/:orgId/pick-site-defaults",
verifyOrgAccess,
verifyUserHasAction(ActionsEnum.createSite),
2024-12-16 22:40:42 -05:00
site.pickSiteDefaults
);
authenticated.get(
"/site/:siteId",
verifySiteAccess,
verifyUserHasAction(ActionsEnum.getSite),
2024-12-16 22:40:42 -05:00
site.getSite
);
// authenticated.get(
// "/site/:siteId/roles",
// verifySiteAccess,
// verifyUserHasAction(ActionsEnum.listSiteRoles),
// site.listSiteRoles
// );
authenticated.post(
"/site/:siteId",
verifySiteAccess,
verifyUserHasAction(ActionsEnum.updateSite),
2024-12-16 22:40:42 -05:00
site.updateSite
);
authenticated.delete(
"/site/:siteId",
verifySiteAccess,
verifyUserHasAction(ActionsEnum.deleteSite),
2024-12-16 22:40:42 -05:00
site.deleteSite
);
2024-10-02 22:05:21 -04:00
2024-10-04 23:14:40 -04:00
authenticated.put(
"/org/:orgId/site/:siteId/resource",
verifyOrgAccess,
verifyUserHasAction(ActionsEnum.createResource),
2024-12-16 22:40:42 -05:00
resource.createResource
2024-10-04 23:14:40 -04:00
);
authenticated.get(
"/site/:siteId/resources",
verifyUserHasAction(ActionsEnum.listResources),
2024-12-16 22:40:42 -05:00
resource.listResources
);
2024-10-04 23:14:40 -04:00
authenticated.get(
"/org/:orgId/resources",
verifyOrgAccess,
verifyUserHasAction(ActionsEnum.listResources),
2024-12-16 22:40:42 -05:00
resource.listResources
);
authenticated.post(
"/org/:orgId/create-invite",
verifyOrgAccess,
verifyUserHasAction(ActionsEnum.inviteUser),
2024-12-16 22:40:42 -05:00
user.inviteUser
2024-11-02 23:46:08 -04:00
); // maybe make this /invite/create instead
authenticated.post("/invite/accept", user.acceptInvite);
authenticated.get(
"/resource/:resourceId/roles",
verifyResourceAccess,
verifyUserHasAction(ActionsEnum.listResourceRoles),
2024-12-16 22:40:42 -05:00
resource.listResourceRoles
);
2024-11-15 23:38:08 -05:00
authenticated.get(
"/resource/:resourceId/users",
verifyResourceAccess,
verifyUserHasAction(ActionsEnum.listResourceUsers),
2024-12-16 22:40:42 -05:00
resource.listResourceUsers
2024-11-15 23:38:08 -05:00
);
2024-10-04 23:14:40 -04:00
authenticated.get(
"/resource/:resourceId",
verifyResourceAccess,
verifyUserHasAction(ActionsEnum.getResource),
2024-12-16 22:40:42 -05:00
resource.getResource
2024-10-04 23:14:40 -04:00
);
authenticated.post(
"/resource/:resourceId",
verifyResourceAccess,
verifyUserHasAction(ActionsEnum.updateResource),
2024-12-16 22:40:42 -05:00
resource.updateResource
2024-10-04 23:14:40 -04:00
);
authenticated.delete(
"/resource/:resourceId",
verifyResourceAccess,
verifyUserHasAction(ActionsEnum.deleteResource),
2024-12-16 22:40:42 -05:00
resource.deleteResource
2024-10-04 23:14:40 -04:00
);
2024-10-03 22:31:20 -04:00
2024-10-04 23:14:40 -04:00
authenticated.put(
"/resource/:resourceId/target",
verifyResourceAccess,
verifyUserHasAction(ActionsEnum.createTarget),
2024-12-16 22:40:42 -05:00
target.createTarget
2024-10-04 23:14:40 -04:00
);
authenticated.get(
"/resource/:resourceId/targets",
verifyResourceAccess,
verifyUserHasAction(ActionsEnum.listTargets),
2024-12-16 22:40:42 -05:00
target.listTargets
2024-10-04 23:14:40 -04:00
);
authenticated.get(
"/target/:targetId",
verifyTargetAccess,
verifyUserHasAction(ActionsEnum.getTarget),
2024-12-16 22:40:42 -05:00
target.getTarget
);
2024-10-04 23:14:40 -04:00
authenticated.post(
"/target/:targetId",
verifyTargetAccess,
verifyUserHasAction(ActionsEnum.updateTarget),
2024-12-16 22:40:42 -05:00
target.updateTarget
2024-10-04 23:14:40 -04:00
);
authenticated.delete(
"/target/:targetId",
verifyTargetAccess,
verifyUserHasAction(ActionsEnum.deleteTarget),
2024-12-16 22:40:42 -05:00
target.deleteTarget
2024-10-04 23:14:40 -04:00
);
authenticated.put(
"/org/:orgId/role",
verifyOrgAccess,
verifyUserHasAction(ActionsEnum.createRole),
2024-12-16 22:40:42 -05:00
role.createRole
);
authenticated.get(
"/org/:orgId/roles",
verifyOrgAccess,
verifyUserHasAction(ActionsEnum.listRoles),
2024-12-16 22:40:42 -05:00
role.listRoles
);
2024-11-03 17:28:12 -05:00
// authenticated.get(
// "/role/:roleId",
// verifyRoleAccess,
// verifyUserInRole,
// verifyUserHasAction(ActionsEnum.getRole),
2024-11-03 17:28:12 -05:00
// role.getRole
// );
// authenticated.post(
// "/role/:roleId",
// verifyRoleAccess,
// verifyUserHasAction(ActionsEnum.updateRole),
// role.updateRole
// );
2024-11-09 23:59:19 -05:00
authenticated.delete(
"/role/:roleId",
verifyRoleAccess,
verifyUserHasAction(ActionsEnum.deleteRole),
2024-12-16 22:40:42 -05:00
role.deleteRole
2024-11-09 23:59:19 -05:00
);
authenticated.post(
"/role/:roleId/add/:userId",
verifyRoleAccess,
verifyUserAccess,
verifyUserHasAction(ActionsEnum.addUserRole),
2024-12-16 22:40:42 -05:00
user.addUserRole
2024-11-09 23:59:19 -05:00
);
2024-10-12 21:36:14 -04:00
2024-11-03 17:28:12 -05:00
// authenticated.put(
// "/role/:roleId/site",
// verifyRoleAccess,
// verifyUserInRole,
// verifyUserHasAction(ActionsEnum.addRoleSite),
2024-11-03 17:28:12 -05:00
// role.addRoleSite
// );
// authenticated.delete(
// "/role/:roleId/site",
// verifyRoleAccess,
// verifyUserInRole,
// verifyUserHasAction(ActionsEnum.removeRoleSite),
2024-11-03 17:28:12 -05:00
// role.removeRoleSite
// );
// authenticated.get(
// "/role/:roleId/sites",
// verifyRoleAccess,
// verifyUserInRole,
// verifyUserHasAction(ActionsEnum.listRoleSites),
2024-11-03 17:28:12 -05:00
// role.listRoleSites
// );
authenticated.post(
"/resource/:resourceId/roles",
verifyResourceAccess,
verifyRoleAccess,
verifyUserHasAction(ActionsEnum.setResourceRoles),
2024-12-16 22:40:42 -05:00
resource.setResourceRoles
2024-11-15 23:38:08 -05:00
);
authenticated.post(
"/resource/:resourceId/users",
verifyResourceAccess,
verifySetResourceUsers,
verifyUserHasAction(ActionsEnum.setResourceUsers),
2024-12-16 22:40:42 -05:00
resource.setResourceUsers
);
authenticated.post(
`/resource/:resourceId/password`,
verifyResourceAccess,
2024-12-16 22:40:42 -05:00
verifyUserHasAction(ActionsEnum.updateResource), // REVIEW: group all resource related updates under update resource?
resource.setResourcePassword
);
2024-11-23 20:08:56 -05:00
authenticated.post(
`/resource/:resourceId/pincode`,
verifyResourceAccess,
2024-12-16 22:40:42 -05:00
verifyUserHasAction(ActionsEnum.updateResource),
resource.setResourcePincode
);
authenticated.post(
`/resource/:resourceId/whitelist`,
verifyResourceAccess,
verifyUserHasAction(ActionsEnum.updateResource),
resource.setResourceWhitelist
);
authenticated.get(
`/resource/:resourceId/whitelist`,
verifyResourceAccess,
verifyUserHasAction(ActionsEnum.getResource),
resource.getResourceWhitelist
2024-11-23 20:08:56 -05:00
);
2024-11-17 23:24:30 -05:00
unauthenticated.get("/resource/:resourceId/auth", resource.getResourceAuthInfo);
2024-11-03 17:28:12 -05:00
// authenticated.get(
// "/role/:roleId/resources",
// verifyRoleAccess,
// verifyUserInRole,
// verifyUserHasAction(ActionsEnum.listRoleResources),
2024-11-03 17:28:12 -05:00
// role.listRoleResources
// );
// authenticated.put(
// "/role/:roleId/action",
// verifyRoleAccess,
// verifyUserInRole,
// verifyUserHasAction(ActionsEnum.addRoleAction),
2024-11-03 17:28:12 -05:00
// role.addRoleAction
// );
// authenticated.delete(
// "/role/:roleId/action",
// verifyRoleAccess,
// verifyUserInRole,
// verifyUserHasAction(ActionsEnum.removeRoleAction),
2024-11-03 17:28:12 -05:00
// role.removeRoleAction
// );
// authenticated.get(
// "/role/:roleId/actions",
// verifyRoleAccess,
// verifyUserInRole,
// verifyUserHasAction(ActionsEnum.listRoleActions),
2024-11-03 17:28:12 -05:00
// role.listRoleActions
// );
2024-10-12 21:36:14 -04:00
2024-10-13 15:05:52 -04:00
unauthenticated.get("/user", verifySessionMiddleware, user.getUser);
2024-11-09 23:59:19 -05:00
authenticated.get("/org/:orgId/user/:userId", verifyOrgAccess, user.getOrgUser);
authenticated.get(
"/org/:orgId/users",
verifyOrgAccess,
verifyUserHasAction(ActionsEnum.listUsers),
2024-12-16 22:40:42 -05:00
user.listUsers
);
authenticated.delete(
"/org/:orgId/user/:userId",
verifyOrgAccess,
verifyUserAccess,
verifyUserHasAction(ActionsEnum.removeUser),
2024-12-16 22:40:42 -05:00
user.removeUserOrg
);
2024-10-12 22:31:24 -04:00
2024-11-03 17:28:12 -05:00
// authenticated.put(
// "/user/:userId/site",
// verifySiteAccess,
// verifyUserAccess,
// verifyUserHasAction(ActionsEnum.addRoleSite),
2024-11-03 17:28:12 -05:00
// role.addRoleSite
// );
// authenticated.delete(
// "/user/:userId/site",
// verifySiteAccess,
// verifyUserAccess,
// verifyUserHasAction(ActionsEnum.removeRoleSite),
2024-11-03 17:28:12 -05:00
// role.removeRoleSite
// );
// authenticated.put(
// "/org/:orgId/user/:userId/action",
// verifyOrgAccess,
// verifyUserAccess,
// verifyUserHasAction(ActionsEnum.addRoleAction),
2024-11-03 17:28:12 -05:00
// role.addRoleAction
// );
// authenticated.delete(
// "/org/:orgId/user/:userId/action",
// verifyOrgAccess,
// verifyUserAccess,
// verifyUserHasAction(ActionsEnum.removeRoleAction),
2024-11-03 17:28:12 -05:00
// role.removeRoleAction
// );
authenticated.put("/newt", createNewt);
// Auth routes
2024-10-05 15:11:51 -04:00
export const authRouter = Router();
unauthenticated.use("/auth", authRouter);
authRouter.use(
rateLimitMiddleware({
windowMin: 10,
2024-11-24 11:27:43 -05:00
max: 75,
2024-12-16 22:40:42 -05:00
type: "IP_AND_PATH"
})
2024-10-05 15:11:51 -04:00
);
authRouter.put("/signup", auth.signup);
authRouter.post("/login", auth.login);
authRouter.post("/logout", auth.logout);
authRouter.post("/newt/get-token", getToken);
2024-10-05 17:01:49 -04:00
authRouter.post("/2fa/enable", verifySessionUserMiddleware, auth.verifyTotp);
2024-10-05 15:11:51 -04:00
authRouter.post(
2024-10-05 17:01:49 -04:00
"/2fa/request",
2024-10-05 15:11:51 -04:00
verifySessionUserMiddleware,
2024-12-16 22:40:42 -05:00
auth.requestTotpSecret
2024-10-04 23:14:40 -04:00
);
2024-10-05 15:48:19 -04:00
authRouter.post("/2fa/disable", verifySessionUserMiddleware, auth.disable2fa);
2024-10-05 15:11:51 -04:00
authRouter.post("/verify-email", verifySessionMiddleware, auth.verifyEmail);
authRouter.post(
2024-10-05 17:01:49 -04:00
"/verify-email/request",
2024-10-04 23:14:40 -04:00
verifySessionMiddleware,
2024-12-16 22:40:42 -05:00
auth.requestEmailVerificationCode
2024-10-04 23:14:40 -04:00
);
2024-10-05 15:11:51 -04:00
authRouter.post(
"/change-password",
verifySessionUserMiddleware,
2024-12-16 22:40:42 -05:00
auth.changePassword
2024-10-05 15:11:51 -04:00
);
2024-10-05 17:01:49 -04:00
authRouter.post("/reset-password/request", auth.requestPasswordReset);
authRouter.post("/reset-password/", auth.resetPassword);
2024-11-24 11:27:43 -05:00
authRouter.post("/resource/:resourceId/password", resource.authWithPassword);
authRouter.post("/resource/:resourceId/pincode", resource.authWithPincode);
2024-12-16 22:40:42 -05:00
authRouter.post("/resource/:resourceId/whitelist", resource.authWithWhitelist);