From 5924bc09900997ede798de657ca7028171570190 Mon Sep 17 00:00:00 2001 From: alannnc Date: Tue, 15 Aug 2023 17:27:48 -0700 Subject: [PATCH] fix update profile input metadata (#10791) --- .../loggedInViewer/updateProfile.handler.ts | 37 +++++++++++++++++-- .../loggedInViewer/updateProfile.schema.ts | 7 +++- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/packages/trpc/server/routers/loggedInViewer/updateProfile.handler.ts b/packages/trpc/server/routers/loggedInViewer/updateProfile.handler.ts index 6431557e4a..404e34f189 100644 --- a/packages/trpc/server/routers/loggedInViewer/updateProfile.handler.ts +++ b/packages/trpc/server/routers/loggedInViewer/updateProfile.handler.ts @@ -5,6 +5,7 @@ import stripe from "@calcom/app-store/stripepayment/lib/server"; import { getPremiumPlanProductId } from "@calcom/app-store/stripepayment/lib/utils"; import { passwordResetRequest } from "@calcom/features/auth/lib/passwordResetRequest"; import hasKeyInMetadata from "@calcom/lib/hasKeyInMetadata"; +import logger from "@calcom/lib/logger"; import { getTranslation } from "@calcom/lib/server"; import { checkUsername } from "@calcom/lib/server/checkUsername"; import { resizeBase64Image } from "@calcom/lib/server/resizeBase64Image"; @@ -18,7 +19,7 @@ import type { TrpcSessionUser } from "@calcom/trpc/server/trpc"; import { TRPCError } from "@trpc/server"; -import type { TUpdateProfileInputSchema } from "./updateProfile.schema"; +import { updateUserMetadataAllowedKeys, type TUpdateProfileInputSchema } from "./updateProfile.schema"; type UpdateProfileOptions = { ctx: { @@ -30,9 +31,11 @@ type UpdateProfileOptions = { export const updateProfileHandler = async ({ ctx, input }: UpdateProfileOptions) => { const { user } = ctx; + const { metadata: metadataFromInput } = input; + const cleanMetadata = cleanMetadataAllowedUpdateKeys(metadataFromInput); const data: Prisma.UserUpdateInput = { ...input, - metadata: input.metadata as Prisma.InputJsonValue, + metadata: cleanMetadata, }; // some actions can invalidate a user session. @@ -61,7 +64,23 @@ export const updateProfileHandler = async ({ ctx, input }: UpdateProfileOptions) if (input.avatar) { data.avatar = await resizeBase64Image(input.avatar); } - const metadata = userMetadata.parse(user.metadata); + + const fetchUserCurrentMetadata = await prisma.user.findUnique({ + where: { + id: user.id, + }, + select: { + metadata: true, + }, + }); + + const metadata = userMetadata.parse(fetchUserCurrentMetadata?.metadata); + + // Required so we don't override and delete saved values + data.metadata = { + ...metadata, + cleanMetadata, + }; const isPremium = metadata?.isPremium; if (isPremiumUsername) { @@ -177,3 +196,15 @@ export const updateProfileHandler = async ({ ctx, input }: UpdateProfileOptions) }*/ return { ...input, signOutUser, passwordReset }; }; + +const cleanMetadataAllowedUpdateKeys = (metadata: TUpdateProfileInputSchema["metadata"]) => { + if (!metadata) { + return {} as Prisma.InputJsonValue; + } + const cleanedMetadata = updateUserMetadataAllowedKeys.safeParse(metadata); + if (!cleanedMetadata.success) { + logger.error("Error cleaning metadata", cleanedMetadata.error); + } + + return cleanedMetadata as Prisma.InputJsonValue; +}; diff --git a/packages/trpc/server/routers/loggedInViewer/updateProfile.schema.ts b/packages/trpc/server/routers/loggedInViewer/updateProfile.schema.ts index a7b6d4c7e1..9e79aa14f9 100644 --- a/packages/trpc/server/routers/loggedInViewer/updateProfile.schema.ts +++ b/packages/trpc/server/routers/loggedInViewer/updateProfile.schema.ts @@ -1,7 +1,12 @@ import { z } from "zod"; import { FULL_NAME_LENGTH_MAX_LIMIT } from "@calcom/lib/constants"; -import { userMetadata } from "@calcom/prisma/zod-utils"; +import { bookerLayouts, userMetadata } from "@calcom/prisma/zod-utils"; + +export const updateUserMetadataAllowedKeys = z.object({ + sessionTimeout: z.number().optional(), // Minutes + defaultBookerLayouts: bookerLayouts.optional(), +}); export const ZUpdateProfileInputSchema = z.object({ username: z.string().optional(),