mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-07 09:28:06 +00:00
feat(ui): added mysql dynamic secret
This commit is contained in:
@@ -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
-9
@@ -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>
|
||||||
)}
|
)}
|
||||||
|
|||||||
+8
-2
@@ -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>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user