use redis store in rate limiters

This commit is contained in:
miloschwartz 2025-06-22 19:55:05 -04:00
parent 0e87b6e48b
commit fb5010a2b5
No known key found for this signature in database
3 changed files with 17 additions and 28 deletions

View file

@ -214,21 +214,6 @@ export const configSchema = z
no_reply: z.string().email().optional() no_reply: z.string().email().optional()
}) })
.optional(), .optional(),
users: z.object({
server_admin: z.object({
email: z
.string()
.email()
.optional()
.transform(getEnvOrYaml("USERS_SERVERADMIN_EMAIL"))
.pipe(z.string().email())
.transform((v) => v.toLowerCase()),
password: passwordSchema
.optional()
.transform(getEnvOrYaml("USERS_SERVERADMIN_PASSWORD"))
.pipe(passwordSchema)
})
}),
flags: z flags: z
.object({ .object({
require_email_verification: z.boolean().optional(), require_email_verification: z.boolean().optional(),

View file

@ -7,13 +7,16 @@ import config from "@server/lib/config";
import { RedisStore } from "rate-limit-redis"; import { RedisStore } from "rate-limit-redis";
import redisManager from "@server/db/redis"; import redisManager from "@server/db/redis";
export let rateLimitStore: Store = new MemoryStore(); export function createStore(): Store {
if (config.getRawConfig().flags?.enable_redis) { let rateLimitStore: Store = new MemoryStore();
const client = redisManager.client!; if (config.getRawConfig().flags?.enable_redis) {
rateLimitStore = new RedisStore({ const client = redisManager.client!;
sendCommand: async (command: string, ...args: string[]) => rateLimitStore = new RedisStore({
(await client.call(command, args)) as any sendCommand: async (command: string, ...args: string[]) =>
}); (await client.call(command, args)) as any
});
}
return rateLimitStore;
} }
export function rateLimitMiddleware({ export function rateLimitMiddleware({
@ -44,7 +47,7 @@ export function rateLimitMiddleware({
createHttpError(HttpCode.TOO_MANY_REQUESTS, message) createHttpError(HttpCode.TOO_MANY_REQUESTS, message)
); );
}, },
store: rateLimitStore store: createStore()
}); });
} else { } else {
return rateLimit({ return rateLimit({
@ -57,7 +60,8 @@ export function rateLimitMiddleware({
return next( return next(
createHttpError(HttpCode.TOO_MANY_REQUESTS, message) createHttpError(HttpCode.TOO_MANY_REQUESTS, message)
); );
} },
store: createStore()
}); });
} }
} }

View file

@ -32,7 +32,7 @@ import {
verifyIsLoggedInUser, verifyIsLoggedInUser,
verifyClientAccess, verifyClientAccess,
verifyApiKeyAccess, verifyApiKeyAccess,
rateLimitStore, createStore,
} from "@server/middlewares"; } from "@server/middlewares";
import { verifyUserHasAction } from "../middlewares/verifyUserHasAction"; import { verifyUserHasAction } from "../middlewares/verifyUserHasAction";
import { ActionsEnum } from "@server/auth/actions"; import { ActionsEnum } from "@server/auth/actions";
@ -784,7 +784,7 @@ authRouter.post(
const message = `You can only request an email verification code ${3} times every ${15} minutes. Please try again later.`; const message = `You can only request an email verification code ${3} times every ${15} minutes. Please try again later.`;
return next(createHttpError(HttpCode.TOO_MANY_REQUESTS, message)); return next(createHttpError(HttpCode.TOO_MANY_REQUESTS, message));
}, },
store: rateLimitStore store: createStore()
}), }),
auth.requestEmailVerificationCode auth.requestEmailVerificationCode
); );
@ -805,7 +805,7 @@ authRouter.post(
const message = `You can only request a password reset ${3} times every ${15} minutes. Please try again later.`; const message = `You can only request a password reset ${3} times every ${15} minutes. Please try again later.`;
return next(createHttpError(HttpCode.TOO_MANY_REQUESTS, message)); return next(createHttpError(HttpCode.TOO_MANY_REQUESTS, message));
}, },
store: rateLimitStore store: createStore()
}), }),
auth.requestPasswordReset auth.requestPasswordReset
); );
@ -825,7 +825,7 @@ authRouter.post(
const message = `You can only request an email OTP ${10} times every ${15} minutes. Please try again later.`; const message = `You can only request an email OTP ${10} times every ${15} minutes. Please try again later.`;
return next(createHttpError(HttpCode.TOO_MANY_REQUESTS, message)); return next(createHttpError(HttpCode.TOO_MANY_REQUESTS, message));
}, },
store: rateLimitStore store: createStore()
}), }),
resource.authWithWhitelist resource.authWithWhitelist
); );