From 40a0691ccb071d4137d5fd857e2c3e5995f4225a Mon Sep 17 00:00:00 2001 From: Akhil Mohan Date: Mon, 15 Apr 2024 19:35:29 +0530 Subject: [PATCH] feat(ui): added mysql dynamic secret --- frontend/src/hooks/api/dynamicSecret/types.ts | 5 ++- .../SqlDatabaseInputForm.tsx | 40 ++++++++++++++----- .../EditDynamicSecretSqlProviderForm.tsx | 12 ++++-- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/frontend/src/hooks/api/dynamicSecret/types.ts b/frontend/src/hooks/api/dynamicSecret/types.ts index b68ad33a1..cab17bda1 100644 --- a/frontend/src/hooks/api/dynamicSecret/types.ts +++ b/frontend/src/hooks/api/dynamicSecret/types.ts @@ -20,7 +20,8 @@ export enum DynamicSecretProviders { } export enum SqlProviders { - Postgres = "postgres" + Postgres = "postgres", + MySql = "mysql2" } export type TDynamicSecretProvider = { @@ -34,7 +35,7 @@ export type TDynamicSecretProvider = { password: string; creationStatement: string; revocationStatement: string; - renewStatement: string; + renewStatement?: string; ca?: string | undefined; }; }; diff --git a/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/SqlDatabaseInputForm.tsx b/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/SqlDatabaseInputForm.tsx index 674b25dd0..1893276b0 100644 --- a/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/SqlDatabaseInputForm.tsx +++ b/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/SqlDatabaseInputForm.tsx @@ -31,7 +31,7 @@ const formSchema = z.object({ password: z.string().min(1), creationStatement: z.string().min(1), revocationStatement: z.string().min(1), - renewStatement: z.string().min(1), + renewStatement: z.string().optional(), ca: z.string().optional() }), defaultTTL: z.string().superRefine((val, ctx) => { @@ -66,6 +66,26 @@ type Props = { environment: string; }; +const getSqlStatements = (provider: SqlProviders) => { + if (provider === SqlProviders.MySql) { + return { + creationStatement: + "CREATE USER \"{{username}}\"@'%' IDENTIFIED BY '{{password}}' PASSWORD EXPIRE;\nGRANT ALL ON \"{{database}}\".* TO \"{{username}}\"@'%';", + renewStatement: "", + revocationStatement: + 'REVOKE ALL PRIVILEGES ON "{{database}}".* FROM "{{username}}"@\'%\';\nDROP USER "{{username}}"@\'%\';' + }; + } + + return { + creationStatement: + "CREATE USER \"{{username}}\" WITH ENCRYPTED PASSWORD '{{password}}' VALID UNTIL '{{expiration}}';\nGRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"{{username}}\";", + renewStatement: "ALTER ROLE \"{{username}}\" VALID UNTIL '{{expiration}}';", + revocationStatement: + 'REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM "{{username}}";\nDROP ROLE "{{username}}";' + }; +}; + export const SqlDatabaseInputForm = ({ onCompleted, onCancel, @@ -75,18 +95,13 @@ export const SqlDatabaseInputForm = ({ }: Props) => { const { control, + setValue, formState: { isSubmitting }, handleSubmit } = useForm({ resolver: zodResolver(formSchema), defaultValues: { - provider: { - creationStatement: - "CREATE USER \"{{username}}\" WITH ENCRYPTED PASSWORD '{{password}}' VALID UNTIL '{{expiration}}';\nGRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"{{username}}\";", - renewStatement: "ALTER ROLE \"{{username}}\" VALID UNTIL '{{expiration}}';", - revocationStatement: - 'REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM "{{username}}";\nDROP ROLE "{{username}}";' - } + provider: getSqlStatements(SqlProviders.Postgres) } }); @@ -182,10 +197,17 @@ export const SqlDatabaseInputForm = ({ )} diff --git a/frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretSqlProviderForm.tsx b/frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretSqlProviderForm.tsx index 691d73779..4b4a2088f 100644 --- a/frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretSqlProviderForm.tsx +++ b/frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretSqlProviderForm.tsx @@ -32,7 +32,7 @@ const formSchema = z.object({ password: z.string().min(1), creationStatement: z.string().min(1), revocationStatement: z.string().min(1), - renewStatement: z.string().min(1), + renewStatement: z.string().optional(), ca: z.string().optional() }) .partial(), @@ -94,7 +94,7 @@ export const EditDynamicSecretSqlProviderForm = ({ } } }); - + const updateDynamicSecret = useUpdateDynamicSecret(); const handleUpdateDynamicSecret = async ({ inputs, maxTTL, defaultTTL, newName }: TForm) => { @@ -186,11 +186,13 @@ export const EditDynamicSecretSqlProviderForm = ({ render={({ field: { value, onChange }, fieldState: { error } }) => ( )} @@ -221,7 +223,11 @@ export const EditDynamicSecretSqlProviderForm = ({ isError={Boolean(error?.message)} errorText={error?.message} > - field.onChange(parseInt(el.target.value, 10))} /> + field.onChange(parseInt(el.target.value, 10))} + /> )} />