diff --git a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/new/client.tsx b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/new/client.tsx index e8102431b..7e9a9a474 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/new/client.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/new/client.tsx @@ -77,6 +77,7 @@ const formSchema = z.object({ }, ) .optional(), + recoverEnabled: z.boolean().default(false), limitEnabled: z.boolean().default(false), limit: z .object({ @@ -145,9 +146,10 @@ const formSchema = z.object({ type Props = { apiId: string; keyAuthId: string; + checkStoreEncryptedKeys: boolean; }; -export const CreateKey: React.FC = ({ apiId, keyAuthId }) => { +export const CreateKey: React.FC = ({ apiId, keyAuthId, checkStoreEncryptedKeys }) => { const router = useRouter(); const form = useForm>({ @@ -162,6 +164,7 @@ export const CreateKey: React.FC = ({ apiId, keyAuthId }) => { expireEnabled: false, limitEnabled: false, metaEnabled: false, + recoverEnabled: false, ratelimitEnabled: false, }, }); @@ -201,6 +204,7 @@ export const CreateKey: React.FC = ({ apiId, keyAuthId }) => { expires: values.expires?.getTime() ?? undefined, ownerId: values.ownerId ?? undefined, remaining: values.limit?.remaining ?? undefined, + recoverEnabled: values.recoverEnabled, enabled: true, }); @@ -295,6 +299,7 @@ export const CreateKey: React.FC = ({ apiId, keyAuthId }) => { form.setValue("expireEnabled", false); form.setValue("ratelimitEnabled", false); form.setValue("metaEnabled", false); + form.setValue("recoverEnabled", false); form.setValue("limitEnabled", false); router.refresh(); }} @@ -809,6 +814,56 @@ export const CreateKey: React.FC = ({ apiId, keyAuthId }) => { ) : null} + {checkStoreEncryptedKeys && ( + + +
+ Recoverable + + ( + + Recoverable + + { + field.onChange(e); + if (field.value === false) { + resetLimited(); + } + }} + /> + + + )} + /> +
+ + {form.watch("recoverEnabled") ? ( + <> + {form.formState.errors.ratelimit && ( +

+ {form.formState.errors.ratelimit.message} +

+ )} + + ) : null} +

+ You can choose to recover and display plaintext keys later, though it's + not recommended. Recoverable keys are securely stored in an encrypted + vault. For more, visit{" "} + + unkey.com/docs/security/recovering-keys. + +

+
+
+ )}