* fix: Add signup disabled flag check on signup api Signed-off-by: Souptik Datta <souptikdatta2001@gmail.com> * feat: Implement a feature flag check trcp middleware Signed-off-by: Souptik Datta <souptikdatta2001@gmail.com> * Discard changes to packages/trpc/server/middlewares/featureFlagMiddleware.ts * Discard changes to packages/trpc/server/routers/viewer/organizations/_router.tsx --------- Signed-off-by: Souptik Datta <souptikdatta2001@gmail.com> Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com> Co-authored-by: Omar López <zomars@me.com> Co-authored-by: Peer Richelsen <peeroke@gmail.com>
76 lines
2.7 KiB
TypeScript
76 lines
2.7 KiB
TypeScript
import type { NextApiResponse } from "next";
|
|
|
|
import calcomSignupHandler from "@calcom/feature-auth/signup/handlers/calcomHandler";
|
|
import selfHostedSignupHandler from "@calcom/feature-auth/signup/handlers/selfHostedHandler";
|
|
import { type RequestWithUsernameStatus } from "@calcom/features/auth/signup/username";
|
|
import { getFeatureFlag } from "@calcom/features/flags/server/utils";
|
|
import { IS_PREMIUM_USERNAME_ENABLED } from "@calcom/lib/constants";
|
|
import getIP from "@calcom/lib/getIP";
|
|
import { HttpError } from "@calcom/lib/http-error";
|
|
import logger from "@calcom/lib/logger";
|
|
import { checkCfTurnstileToken } from "@calcom/lib/server/checkCfTurnstileToken";
|
|
import { signupSchema } from "@calcom/prisma/zod-utils";
|
|
|
|
async function ensureSignupIsEnabled(req: RequestWithUsernameStatus) {
|
|
const { token } = signupSchema
|
|
.pick({
|
|
token: true,
|
|
})
|
|
.parse(req.body);
|
|
|
|
// Still allow signups if there is a team invite
|
|
if (token) return;
|
|
|
|
const prisma = await import("@calcom/prisma").then((mod) => mod.default);
|
|
const signupDisabled = await getFeatureFlag(prisma, "disable-signup");
|
|
|
|
if (process.env.NEXT_PUBLIC_DISABLE_SIGNUP === "true" || signupDisabled) {
|
|
throw new HttpError({
|
|
statusCode: 403,
|
|
message: "Signup is disabled",
|
|
});
|
|
}
|
|
}
|
|
|
|
function ensureReqIsPost(req: RequestWithUsernameStatus) {
|
|
if (req.method !== "POST") {
|
|
throw new HttpError({
|
|
statusCode: 405,
|
|
message: "Method not allowed",
|
|
});
|
|
}
|
|
}
|
|
|
|
export default async function handler(req: RequestWithUsernameStatus, res: NextApiResponse) {
|
|
const remoteIp = getIP(req);
|
|
// Use a try catch instead of returning res every time
|
|
try {
|
|
await checkCfTurnstileToken({
|
|
token: req.headers["cf-access-token"] as string,
|
|
remoteIp,
|
|
});
|
|
|
|
ensureReqIsPost(req);
|
|
await ensureSignupIsEnabled(req);
|
|
|
|
/**
|
|
* Im not sure its worth merging these two handlers. They are different enough to be separate.
|
|
* Calcom handles things like creating a stripe customer - which we don't need to do for self hosted.
|
|
* It also handles things like premium username.
|
|
* TODO: (SEAN) - Extract a lot of the logic from calcomHandler into a separate file and import it into both handlers.
|
|
* @zomars: We need to be able to test this with E2E. They way it's done RN it will never run on CI.
|
|
*/
|
|
if (IS_PREMIUM_USERNAME_ENABLED) {
|
|
return await calcomSignupHandler(req, res);
|
|
}
|
|
|
|
return await selfHostedSignupHandler(req, res);
|
|
} catch (e) {
|
|
if (e instanceof HttpError) {
|
|
return res.status(e.statusCode).json({ message: e.message });
|
|
}
|
|
logger.error(e);
|
|
return res.status(500).json({ message: "Internal server error" });
|
|
}
|
|
}
|