From 8efb24f2c78945dfeace9a7a738d249ce3867165 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E4=B8=AB=E8=AE=B2=E6=A2=B5?= Date: Mon, 14 Sep 2026 12:41:01 +0800 Subject: [PATCH] feat(redis): persist dangerous command interception setting --- apps/desktop/src/App.vue | 5 ++++- .../src/components/layout/EditorToolbar.vue | 2 ++ .../src/components/redis/RedisKeyBrowser.vue | 22 +++++++++++++++---- apps/desktop/src/stores/settingsStore.ts | 5 +++++ 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/apps/desktop/src/App.vue b/apps/desktop/src/App.vue index bab9a33721..b0ef033e49 100644 --- a/apps/desktop/src/App.vue +++ b/apps/desktop/src/App.vue @@ -789,7 +789,10 @@ async function resolveActiveExecutableSql(snapshot?: SqlExecutionSnapshot, execu }); } -const blockDangerousRedisCommands = ref(true); +const blockDangerousRedisCommands = computed({ + get: () => settingsStore.editorSettings.blockDangerousRedisCommands, + set: (value: boolean) => settingsStore.updateEditorSettings({ blockDangerousRedisCommands: value }), +}); const databaseRequiredSignal = ref(0); const databaseRequiredTabId = ref(null); const pendingToolbarExecutionSnapshot = ref(); diff --git a/apps/desktop/src/components/layout/EditorToolbar.vue b/apps/desktop/src/components/layout/EditorToolbar.vue index dfb16b77fb..7ba9450aaa 100644 --- a/apps/desktop/src/components/layout/EditorToolbar.vue +++ b/apps/desktop/src/components/layout/EditorToolbar.vue @@ -520,6 +520,8 @@ async function changeCatalog(selectedCatalog: string) { size="icon" class="h-6 w-6" :class="blockDangerousRedisCommands !== false ? 'text-orange-600 bg-orange-100 dark:text-orange-300 dark:bg-orange-900/30' : 'text-muted-foreground/50'" + :aria-label="t('toolbar.blockDangerousRedisCommands')" + :aria-pressed="blockDangerousRedisCommands !== false" @click="emit('update:blockDangerousRedisCommands', blockDangerousRedisCommands === false)" > diff --git a/apps/desktop/src/components/redis/RedisKeyBrowser.vue b/apps/desktop/src/components/redis/RedisKeyBrowser.vue index 52941f9960..14d70e6fbd 100644 --- a/apps/desktop/src/components/redis/RedisKeyBrowser.vue +++ b/apps/desktop/src/components/redis/RedisKeyBrowser.vue @@ -2,7 +2,7 @@ import { computed, markRaw, nextTick, ref, shallowRef, onMounted, onUnmounted, onActivated, onDeactivated, watch } from "vue"; import type { CalendarDateTime } from "@internationalized/date"; import { useI18n } from "vue-i18n"; -import { Search, RefreshCw, Loader2, ChevronRight, ChevronDown, FolderClosed, FolderOpen, Trash2, Plus, KeyRound, TerminalSquare, Asterisk, History, Radio, Clock, Copy, X } from "@lucide/vue"; +import { Search, RefreshCw, Loader2, ChevronRight, ChevronDown, FolderClosed, FolderOpen, Trash2, Plus, KeyRound, TerminalSquare, Asterisk, Radio, Clock, Copy, X, Shield } from "@lucide/vue"; import { RecycleScroller } from "vue-virtual-scroller"; import "vue-virtual-scroller/dist/vue-virtual-scroller.css"; import { Splitpanes, Pane } from "splitpanes"; @@ -3470,9 +3470,23 @@ defineExpose({ focusSearch, insertCommand, executeCommand: executeAiCommand }); {{ t("redis.slowlog") }} - +
+ + +
diff --git a/apps/desktop/src/stores/settingsStore.ts b/apps/desktop/src/stores/settingsStore.ts index de0f1642d2..1ac55150f3 100644 --- a/apps/desktop/src/stores/settingsStore.ts +++ b/apps/desktop/src/stores/settingsStore.ts @@ -754,6 +754,8 @@ export interface EditorSettings { executeMode: "all" | "current"; executeModeDefaultVersion: number; executeAllOnBlankLine: boolean; + /** Whether DBX blocks Redis commands classified as high risk. */ + blockDangerousRedisCommands: boolean; globalConnectTimeoutSecs: number; connectTimeoutInheritConnectionIds: string[]; globalQueryTimeoutSecs: number; @@ -995,6 +997,7 @@ export const DEFAULT_EDITOR_SETTINGS: EditorSettings = { executeMode: "current", executeModeDefaultVersion: EXECUTE_MODE_CURRENT_DEFAULT_VERSION, executeAllOnBlankLine: false, + blockDangerousRedisCommands: true, globalConnectTimeoutSecs: 10, connectTimeoutInheritConnectionIds: [], globalQueryTimeoutSecs: DEFAULT_QUERY_TIMEOUT_SECS, @@ -1450,6 +1453,7 @@ export function normalizeEditorSettings(settings: Partial, exist executeMode: hasCurrentExecuteModeDefault && (settings.executeMode === "all" || settings.executeMode === "current") ? settings.executeMode : DEFAULT_EDITOR_SETTINGS.executeMode, executeModeDefaultVersion, executeAllOnBlankLine: settings.executeAllOnBlankLine === true, + blockDangerousRedisCommands: typeof settings.blockDangerousRedisCommands === "boolean" ? settings.blockDangerousRedisCommands : DEFAULT_EDITOR_SETTINGS.blockDangerousRedisCommands, globalConnectTimeoutSecs: normalizeGlobalConnectTimeoutSecs(settings.globalConnectTimeoutSecs), connectTimeoutInheritConnectionIds: Array.isArray(settings.connectTimeoutInheritConnectionIds) ? [...new Set(settings.connectTimeoutInheritConnectionIds.filter((id): id is string => typeof id === "string" && id.trim().length > 0).map((id) => id.trim()))] : [], globalQueryTimeoutSecs: normalizeGlobalQueryTimeoutSecs(settings.globalQueryTimeoutSecs ?? legacyTimeoutSettings.queryTimeoutSecs), @@ -2200,6 +2204,7 @@ export const useSettingsStore = defineStore("settings", () => { } if (partial.executeMode !== undefined) editorSettings.value.executeMode = partial.executeMode; if (partial.executeAllOnBlankLine !== undefined) editorSettings.value.executeAllOnBlankLine = partial.executeAllOnBlankLine === true; + if (partial.blockDangerousRedisCommands !== undefined) editorSettings.value.blockDangerousRedisCommands = partial.blockDangerousRedisCommands === true; if (partial.globalConnectTimeoutSecs !== undefined) editorSettings.value.globalConnectTimeoutSecs = normalizeGlobalConnectTimeoutSecs(partial.globalConnectTimeoutSecs); if (partial.connectTimeoutInheritConnectionIds !== undefined) { editorSettings.value.connectTimeoutInheritConnectionIds = [...new Set(partial.connectTimeoutInheritConnectionIds.filter((id): id is string => typeof id === "string" && id.trim().length > 0).map((id) => id.trim()))];