diff --git a/backend/src/db/schemas/secret-sharing.ts b/backend/src/db/schemas/secret-sharing.ts index de75fbafc..be5643e2b 100644 --- a/backend/src/db/schemas/secret-sharing.ts +++ b/backend/src/db/schemas/secret-sharing.ts @@ -21,6 +21,7 @@ export const SecretSharingSchema = z.object({ expiresAfterViews: z.number().nullable().optional(), accessType: z.string().default("anyone"), name: z.string().nullable().optional(), + password: z.string().nullable().optional(), lastViewedAt: z.date().nullable().optional() }); diff --git a/backend/src/server/routes/v1/secret-sharing-router.ts b/backend/src/server/routes/v1/secret-sharing-router.ts index de1bfe968..e13107131 100644 --- a/backend/src/server/routes/v1/secret-sharing-router.ts +++ b/backend/src/server/routes/v1/secret-sharing-router.ts @@ -80,7 +80,6 @@ export const registerSecretSharingRouter = async (server: FastifyZodProvider) => orgId: req.permission?.orgId }); - // return undefined if it does not exist, has password set or has no more views allowed. if (!sharedSecret || sharedSecret.password) return undefined; return { diff --git a/backend/src/services/secret-sharing/secret-sharing-service.ts b/backend/src/services/secret-sharing/secret-sharing-service.ts index b37f8a771..80d661b40 100644 --- a/backend/src/services/secret-sharing/secret-sharing-service.ts +++ b/backend/src/services/secret-sharing/secret-sharing-service.ts @@ -1,7 +1,7 @@ import bcrypt from "bcrypt"; import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service"; -import { BadRequestError, ForbiddenRequestError, NotFoundError, UnauthorizedError } from "@app/lib/errors"; +import { BadRequestError, ForbiddenRequestError, InternalServerError, NotFoundError, UnauthorizedError } from "@app/lib/errors"; import { SecretSharingAccessType } from "@app/lib/types"; import { TOrgDALFactory } from "../org/org-dal"; @@ -217,7 +217,12 @@ export const secretSharingServiceFactory = ({ if (accessType === SecretSharingAccessType.Organization && orgId !== sharedSecret.orgId) throw new UnauthorizedError(); - const isMatch = await bcrypt.compare(password, sharedSecret.password); + if (!sharedSecret.password) + throw new InternalServerError({ + message: "Something went wrong" + }); + + const isMatch = await bcrypt.compare(password, sharedSecret.password as string); if (!isMatch) return undefined // we reduce the view count when we are sure the password matches. diff --git a/frontend/src/hooks/api/secretSharing/queries.ts b/frontend/src/hooks/api/secretSharing/queries.ts index acf091e5b..d94ca243d 100644 --- a/frontend/src/hooks/api/secretSharing/queries.ts +++ b/frontend/src/hooks/api/secretSharing/queries.ts @@ -43,32 +43,31 @@ export const useGetActiveSharedSecretById = ({ sharedSecretId: string; hashedHex: string; }) => { - return useQuery({ - enabled: Boolean(sharedSecretId) && Boolean(hashedHex), - queryFn: async () => { - const params = new URLSearchParams({ - hashedHex - }); - + return useQuery( + [`sharedSecret-${sharedSecretId}`], + async () => { + const params = new URLSearchParams({ hashedHex }); const { data } = await apiRequest.get( `/api/v1/secret-sharing/public/${sharedSecretId}`, { params } ); - - if (!data) return null; - + + if (!data) return null + return { encryptedValue: data.encryptedValue, - password: data.password, iv: data.iv, tag: data.tag, accessType: data.accessType, orgName: data.orgName }; + }, + { + enabled: Boolean(sharedSecretId) && Boolean(hashedHex) } - }); + ); }; // returns a secret (secret or undefined if password doesn't match) diff --git a/frontend/src/views/ViewSecretPublicPage/ViewSecretPublicPage.tsx b/frontend/src/views/ViewSecretPublicPage/ViewSecretPublicPage.tsx index 27f1d37bd..78ce15d14 100644 --- a/frontend/src/views/ViewSecretPublicPage/ViewSecretPublicPage.tsx +++ b/frontend/src/views/ViewSecretPublicPage/ViewSecretPublicPage.tsx @@ -10,8 +10,7 @@ import { TViewSharedSecretResponse, useGetActiveSharedSecretById } from "@app/ho import { SecretContainer, SecretErrorContainer, PasswordContainer } from "./components"; export const ViewSecretPublicPage = () => { - const [secret, setSecret] = useState(null) - const [error, setError] = useState(null) + const [secret, setSecret] = useState(null); const router = useRouter(); const { id, key: urlEncodedPublicKey } = router.query; @@ -19,15 +18,14 @@ export const ViewSecretPublicPage = () => { ? urlEncodedPublicKey.toString().split("-") : ["", ""]; - const { data: fetchSecret, error: fetchError, isLoading } = useGetActiveSharedSecretById({ + const { data: fetchSecret, error, isLoading } = useGetActiveSharedSecretById({ sharedSecretId: id as string, hashedHex }); useEffect(() => { if (fetchSecret) setSecret(fetchSecret) - if (fetchError) setError(fetchError) - }, [fetchSecret, fetchError]) + }, [fetchSecret, error]) const handleSecret = useCallback((value: TViewSharedSecretResponse) => { setSecret(value)