mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-15 21:40:31 +00:00
55 lines
1.8 KiB
TypeScript
55 lines
1.8 KiB
TypeScript
import net from "net";
|
|
import { NextFunction, Request, Response } from "express";
|
|
import { UnauthorizedRequestError } from "../utils/errors";
|
|
import { extractIPDetails } from "../utils/ip";
|
|
import { ActorType, TrustedIP } from "../ee/models";
|
|
|
|
type req = "params" | "body" | "query";
|
|
|
|
/**
|
|
* Validate if workspace with [workspaceId] has E2EE off/disabled
|
|
* @param {Object} obj
|
|
* @param {String} obj.locationWorkspaceId - location of [workspaceId] on request (e.g. params, body) for parsing
|
|
* @returns
|
|
*/
|
|
const requireIPAllowlistCheck = ({
|
|
locationWorkspaceId
|
|
}: {
|
|
locationWorkspaceId: req;
|
|
}) => {
|
|
return async (req: Request, _: Response, next: NextFunction) => {
|
|
const workspaceId = req[locationWorkspaceId]?.workspaceId;
|
|
|
|
if (req.authData.actor.type === ActorType.SERVICE) {
|
|
const trustedIps = await TrustedIP.find({
|
|
workspace: workspaceId
|
|
});
|
|
|
|
if (trustedIps.length > 0) {
|
|
// case: check the IP address of the inbound request against trusted IPs
|
|
|
|
const blockList = new net.BlockList();
|
|
|
|
for (const trustedIp of trustedIps) {
|
|
if (trustedIp.prefix !== undefined) {
|
|
blockList.addSubnet(trustedIp.ipAddress, trustedIp.prefix, trustedIp.type);
|
|
} else {
|
|
blockList.addAddress(trustedIp.ipAddress, trustedIp.type);
|
|
}
|
|
}
|
|
|
|
const { type } = extractIPDetails(req.authData.ipAddress);
|
|
const check = blockList.check(req.authData.ipAddress, type);
|
|
|
|
if (!check)
|
|
throw UnauthorizedRequestError({
|
|
message: "Failed workspace authorization"
|
|
});
|
|
}
|
|
}
|
|
|
|
return next();
|
|
}
|
|
}
|
|
|
|
export default requireIPAllowlistCheck; |