feat(ui): added mysql dynamic secret

This commit is contained in:
Akhil Mohan
2024-04-15 19:35:29 +05:30
parent 6410d51033
commit 40a0691ccb
3 changed files with 43 additions and 14 deletions
@@ -20,7 +20,8 @@ export enum DynamicSecretProviders {
} }
export enum SqlProviders { export enum SqlProviders {
Postgres = "postgres" Postgres = "postgres",
MySql = "mysql2"
} }
export type TDynamicSecretProvider = { export type TDynamicSecretProvider = {
@@ -34,7 +35,7 @@ export type TDynamicSecretProvider = {
password: string; password: string;
creationStatement: string; creationStatement: string;
revocationStatement: string; revocationStatement: string;
renewStatement: string; renewStatement?: string;
ca?: string | undefined; ca?: string | undefined;
}; };
}; };
@@ -31,7 +31,7 @@ const formSchema = z.object({
password: z.string().min(1), password: z.string().min(1),
creationStatement: z.string().min(1), creationStatement: z.string().min(1),
revocationStatement: z.string().min(1), revocationStatement: z.string().min(1),
renewStatement: z.string().min(1), renewStatement: z.string().optional(),
ca: z.string().optional() ca: z.string().optional()
}), }),
defaultTTL: z.string().superRefine((val, ctx) => { defaultTTL: z.string().superRefine((val, ctx) => {
@@ -66,6 +66,26 @@ type Props = {
environment: string; 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 = ({ export const SqlDatabaseInputForm = ({
onCompleted, onCompleted,
onCancel, onCancel,
@@ -75,18 +95,13 @@ export const SqlDatabaseInputForm = ({
}: Props) => { }: Props) => {
const { const {
control, control,
setValue,
formState: { isSubmitting }, formState: { isSubmitting },
handleSubmit handleSubmit
} = useForm<TForm>({ } = useForm<TForm>({
resolver: zodResolver(formSchema), resolver: zodResolver(formSchema),
defaultValues: { defaultValues: {
provider: { provider: getSqlStatements(SqlProviders.Postgres)
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}}";'
}
} }
}); });
@@ -182,10 +197,17 @@ export const SqlDatabaseInputForm = ({
<FormControl isError={Boolean(error?.message)} errorText={error?.message}> <FormControl isError={Boolean(error?.message)} errorText={error?.message}>
<Select <Select
value={value} value={value}
onValueChange={(val) => onChange(val)} onValueChange={(val) => {
onChange(val);
const sqlStatment = getSqlStatements(val as SqlProviders);
setValue("provider.creationStatement", sqlStatment.creationStatement);
setValue("provider.renewStatement", sqlStatment.renewStatement);
setValue("provider.revocationStatement", sqlStatment.revocationStatement);
}}
className="w-full border border-mineshaft-500" className="w-full border border-mineshaft-500"
> >
<SelectItem value={SqlProviders.Postgres}>PostgreSQL</SelectItem> <SelectItem value={SqlProviders.Postgres}>PostgreSQL</SelectItem>
<SelectItem value={SqlProviders.MySql}>MySQL</SelectItem>
</Select> </Select>
</FormControl> </FormControl>
)} )}
@@ -32,7 +32,7 @@ const formSchema = z.object({
password: z.string().min(1), password: z.string().min(1),
creationStatement: z.string().min(1), creationStatement: z.string().min(1),
revocationStatement: z.string().min(1), revocationStatement: z.string().min(1),
renewStatement: z.string().min(1), renewStatement: z.string().optional(),
ca: z.string().optional() ca: z.string().optional()
}) })
.partial(), .partial(),
@@ -186,11 +186,13 @@ export const EditDynamicSecretSqlProviderForm = ({
render={({ field: { value, onChange }, fieldState: { error } }) => ( render={({ field: { value, onChange }, fieldState: { error } }) => (
<FormControl isError={Boolean(error?.message)} errorText={error?.message}> <FormControl isError={Boolean(error?.message)} errorText={error?.message}>
<Select <Select
isDisabled
value={value} value={value}
onValueChange={(val) => onChange(val)} onValueChange={(val) => onChange(val)}
className="w-full border border-mineshaft-500" className="w-full border border-mineshaft-500"
> >
<SelectItem value={SqlProviders.Postgres}>PostgreSQL</SelectItem> <SelectItem value={SqlProviders.Postgres}>PostgreSQL</SelectItem>
<SelectItem value={SqlProviders.MySql}>MySQL</SelectItem>
</Select> </Select>
</FormControl> </FormControl>
)} )}
@@ -221,7 +223,11 @@ export const EditDynamicSecretSqlProviderForm = ({
isError={Boolean(error?.message)} isError={Boolean(error?.message)}
errorText={error?.message} errorText={error?.message}
> >
<Input {...field} type="number" onChange={(el) => field.onChange(parseInt(el.target.value, 10))} /> <Input
{...field}
type="number"
onChange={(el) => field.onChange(parseInt(el.target.value, 10))}
/>
</FormControl> </FormControl>
)} )}
/> />