fix: resolve feedback + new endpoint + new write rate limit

This commit is contained in:
ShubhamPalriwala
2024-06-10 07:59:59 +05:30
parent 6c0ab43c97
commit 0e86d5573a
5 changed files with 27 additions and 11 deletions
+8 -1
View File
@@ -69,8 +69,15 @@ export const creationLimit: RateLimitOptions = {
// Public endpoints to avoid brute force attacks // Public endpoints to avoid brute force attacks
export const publicEndpointLimit: RateLimitOptions = { export const publicEndpointLimit: RateLimitOptions = {
// Shared Secrets // Read Shared Secrets
timeWindow: 60 * 1000, timeWindow: 60 * 1000,
max: 30, max: 30,
keyGenerator: (req) => req.realIp keyGenerator: (req) => req.realIp
}; };
export const publicSecretShareCreationLimit: RateLimitOptions = {
// Create Shared Secrets
timeWindow: 60 * 1000,
max: 5,
keyGenerator: (req) => req.realIp
};
@@ -1,7 +1,12 @@
import { z } from "zod"; import { z } from "zod";
import { SecretSharingSchema } from "@app/db/schemas"; import { SecretSharingSchema } from "@app/db/schemas";
import { publicEndpointLimit, readLimit, writeLimit } from "@app/server/config/rateLimiter"; import {
publicEndpointLimit,
publicSecretShareCreationLimit,
readLimit,
writeLimit
} from "@app/server/config/rateLimiter";
import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth";
import { AuthMode } from "@app/services/auth/auth-type"; import { AuthMode } from "@app/services/auth/auth-type";
@@ -82,9 +87,7 @@ export const registerSecretSharingRouter = async (server: FastifyZodProvider) =>
iv: z.string(), iv: z.string(),
tag: z.string(), tag: z.string(),
hashedHex: z.string(), hashedHex: z.string(),
expiresAt: z expiresAt: z.string(),
.string()
.refine((date) => date === undefined || new Date(date) > new Date(), "Expires at should be a future date"),
expiresAfterViews: z.number() expiresAfterViews: z.number()
}), }),
response: { response: {
@@ -111,7 +114,7 @@ export const registerSecretSharingRouter = async (server: FastifyZodProvider) =>
method: "POST", method: "POST",
url: "/", url: "/",
config: { config: {
rateLimit: writeLimit rateLimit: publicSecretShareCreationLimit
}, },
schema: { schema: {
body: z.object({ body: z.object({
@@ -119,9 +122,7 @@ export const registerSecretSharingRouter = async (server: FastifyZodProvider) =>
iv: z.string(), iv: z.string(),
tag: z.string(), tag: z.string(),
hashedHex: z.string(), hashedHex: z.string(),
expiresAt: z expiresAt: z.string(),
.string()
.refine((date) => date === undefined || new Date(date) > new Date(), "Expires at should be a future date"),
expiresAfterViews: z.number() expiresAfterViews: z.number()
}), }),
response: { response: {
@@ -1,5 +1,5 @@
import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service"; import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service";
import { UnauthorizedError } from "@app/lib/errors"; import { BadRequestError, UnauthorizedError } from "@app/lib/errors";
import { TSecretSharingDALFactory } from "./secret-sharing-dal"; import { TSecretSharingDALFactory } from "./secret-sharing-dal";
import { import {
@@ -36,6 +36,10 @@ export const secretSharingServiceFactory = ({
} = createSharedSecretInput; } = createSharedSecretInput;
const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId); const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId);
if (!permission) throw new UnauthorizedError({ name: "User not in org" }); if (!permission) throw new UnauthorizedError({ name: "User not in org" });
if (new Date(expiresAt) < new Date()) {
throw new BadRequestError({ message: "Expiration date cannot be in the past" });
}
const newSharedSecret = await secretSharingDAL.create({ const newSharedSecret = await secretSharingDAL.create({
encryptedValue, encryptedValue,
iv, iv,
@@ -51,6 +55,10 @@ export const secretSharingServiceFactory = ({
const createPublicSharedSecret = async (createSharedSecretInput: TCreatePublicSharedSecretDTO) => { const createPublicSharedSecret = async (createSharedSecretInput: TCreatePublicSharedSecretDTO) => {
const { encryptedValue, iv, tag, hashedHex, expiresAt, expiresAfterViews } = createSharedSecretInput; const { encryptedValue, iv, tag, hashedHex, expiresAt, expiresAfterViews } = createSharedSecretInput;
if (new Date(expiresAt) < new Date()) {
throw new BadRequestError({ message: "Expiration date cannot be in the past" });
}
const newSharedSecret = await secretSharingDAL.create({ const newSharedSecret = await secretSharingDAL.create({
encryptedValue, encryptedValue,
iv, iv,
+1 -1
View File
@@ -25,7 +25,7 @@ export const publicPaths = [
"/login/sso", "/login/sso",
"/admin/signup", "/admin/signup",
"/shared/secret/[id]", "/shared/secret/[id]",
"/shared/secret" "/share-secret"
]; ];
export const languageMap = { export const languageMap = {