fix: Adding encryption of the settings.

This commit is contained in:
charlesgauthereau
2026-02-12 20:18:26 +01:00
parent 2426166676
commit d87782d180
10 changed files with 2392 additions and 22 deletions
@@ -41,7 +41,7 @@ export const SettingsTabs = ({settings, storageChannels}: SettingsTabsProps) =>
)
},
{
name: 'Default Storage',
name: 'Storage',
value: 'storage',
icon: Save,
content: (
@@ -4,7 +4,7 @@ import {Info} from "lucide-react";
import {ButtonWithLoading} from "@/components/wrappers/common/button/button-with-loading";
import {useRouter} from "next/navigation";
import {Setting} from "@/db/schema/01_setting";
import {Form, FormField, FormItem, useZodForm} from "@/components/ui/form";
import {Form, FormControl, FormField, FormItem, FormLabel, FormMessage, useZodForm} from "@/components/ui/form";
import {StorageChannelWith} from "@/db/schema/12_storage-channel";
import {Select, SelectContent, SelectItem, SelectTrigger, SelectValue} from "@/components/ui/select";
import {useMutation} from "@tanstack/react-query";
@@ -17,6 +17,7 @@ import {
updateStorageSettingsAction
} from "@/components/wrappers/dashboard/admin/settings/storage/settings-storage.action";
import {toast} from "sonner";
import {Switch} from "@/components/ui/switch";
export type SettingsStorageSectionProps = {
settings: Setting;
@@ -29,7 +30,8 @@ export const SettingsStorageSection = ({settings, storageChannels}: SettingsStor
const form = useZodForm({
schema: DefaultStorageSchema,
defaultValues: {
storageChannelId: settings.defaultStorageChannelId ?? undefined
storageChannelId: settings.defaultStorageChannelId ?? undefined,
encryption: settings.encryption ?? false
}
});
@@ -59,6 +61,7 @@ export const SettingsStorageSection = ({settings, storageChannels}: SettingsStor
</Alert>
<div className="flex flex-col h-full py-4 ">
<Form
className="space-y-4"
form={form}
onSubmit={async (values) => {
await mutation.mutateAsync(values);
@@ -68,11 +71,12 @@ export const SettingsStorageSection = ({settings, storageChannels}: SettingsStor
<FormField
control={form.control}
name="storageChannelId"
render={({ field }) => (
render={({field}) => (
<FormItem className="flex-grow min-w-[200px] sm:flex-grow-0 sm:w-64">
<FormLabel>Default Storage Provider</FormLabel>
<Select value={field.value} onValueChange={field.onChange}>
<SelectTrigger className="w-full h-full mb-0">
<SelectValue placeholder="Select a default storage channel" />
<SelectValue placeholder="Select a default storage channel"/>
</SelectTrigger>
<SelectContent>
{storageChannels.map((channel) => (
@@ -80,9 +84,10 @@ export const SettingsStorageSection = ({settings, storageChannels}: SettingsStor
<div className="flex items-center gap-2">
{getChannelIcon(channel.provider)}
<span className="font-medium">{channel.name}</span>
<span className="text-[9px] uppercase bg-secondary px-1.5 py-0.5 rounded">
{channel.provider}
</span>
<span
className="text-[9px] uppercase bg-secondary px-1.5 py-0.5 rounded">
{channel.provider}
</span>
</div>
</SelectItem>
))}
@@ -91,11 +96,29 @@ export const SettingsStorageSection = ({settings, storageChannels}: SettingsStor
</FormItem>
)}
/>
<ButtonWithLoading className="flex-shrink-0 w-full sm:w-auto" type="submit">
Confirm
</ButtonWithLoading>
<FormField
control={form.control}
name="encryption"
render={({field}) => (
<FormItem>
<FormLabel>Backups Encryption</FormLabel>
<FormControl>
<Switch
checked={field.value}
onCheckedChange={field.onChange}
/>
</FormControl>
<FormMessage/>
</FormItem>
)}
/>
</div>
<ButtonWithLoading className="flex-shrink-0 w-full sm:w-auto" type="submit">
Confirm
</ButtonWithLoading>
</Form>
</div>
</div>
@@ -20,11 +20,11 @@ export const updateStorageSettingsAction = userAction
const {name, data} = parsedInput;
try {
const [updatedSettings] = await db
.update(drizzleDb.schemas.setting)
.set({
defaultStorageChannelId: data.storageChannelId,
encryption: data.encryption,
})
.where(eq(drizzleDb.schemas.setting.name, name))
.returning();
@@ -1,7 +1,8 @@
import { z } from "zod";
import {z} from "zod";
export const DefaultStorageSchema = z.object({
storageChannelId: z.string(),
encryption: z.boolean(),
});
export type DefaultStorageType = z.infer<typeof DefaultStorageSchema>;
@@ -0,0 +1 @@
ALTER TABLE "settings" ADD COLUMN "encryption" boolean DEFAULT false;
File diff suppressed because it is too large Load Diff
+7
View File
@@ -232,6 +232,13 @@
"when": 1769203863305,
"tag": "0032_sparkling_thunderbolt_ross",
"breakpoints": true
},
{
"idx": 33,
"version": "7",
"when": 1770923665015,
"tag": "0033_handy_valeria_richards",
"breakpoints": true
}
]
}
+2 -6
View File
@@ -1,15 +1,10 @@
import {boolean, pgTable, timestamp, uuid, varchar} from "drizzle-orm/pg-core";
import {typeStorageEnum} from "./types";
import {createSelectSchema} from "drizzle-zod";
import {z} from "zod";
import {timestamps} from "@/db/schema/00_common";
import {storageChannel} from "@/db/schema/12_storage-channel";
import {relations} from "drizzle-orm";
import {agent} from "@/db/schema/08_agent";
import {project} from "@/db/schema/06_project";
import {alertPolicy} from "@/db/schema/10_alert-policy";
import {storagePolicy} from "@/db/schema/13_storage-policy";
import {backup, database, restoration, retentionPolicy} from "@/db/schema/07_database";
export const setting = pgTable("settings", {
id: uuid("id").primaryKey().defaultRandom(),
@@ -22,6 +17,7 @@ export const setting = pgTable("settings", {
smtpSecure: boolean("smtp_secure"),
defaultStorageChannelId: uuid('default_storage_channel_id')
.references(() => storageChannel.id, {onDelete: "set null"}),
encryption: boolean("encryption").default(false),
...timestamps
});