mirror of
https://github.com/t8y2/dbx.git
synced 2026-10-23 07:08:16 +00:00
## Background Add a read-only toggle for database connections that blocks all write operations (INSERT, UPDATE, DELETE, DROP, etc.) when enabled, allowing only read queries (SELECT, SHOW, EXPLAIN, etc.). Closes #889. ## Changes ### Data Model - Added `read_only: bool` field to ConnectionConfig (Rust struct, TS interfaces, and ConnectionConfigData deserialization layer) - Used `#[serde(default, skip_serializing_if = "is_false")]` for backward/forward compatibility with existing configs ### Frontend UI - Added "Read Only" checkbox in connection dialog - 7-language i18n support (en/es/it/pt-BR/zh-CN/zh-TW) ### SQL Classification (query_execution_sql.rs) - Added `is_write_sql()` with two-layer defense: - Layer 1: First-keyword check (must start with known read keyword) - Layer 2: Embedded dangerous keyword detection (catches CTE-wrapped writes like `WITH ... AS (DELETE FROM ...)`) - `FROM` keyword supported as DuckDB SELECT-less syntax indicator - Added `check_read_only()` returning descriptive error with connection name - Added 16 unit tests covering: pure reads/writes, CTE, case insensitivity, string literal masking, comment stripping, stored procedure calls, edge cases ### SQL Execution Guards (query.rs / transfer.rs) - Added `check_read_only_for_connection()` and `_multi()` helper functions with lazy name clone (only allocates when read_only is true) - 6 interception points: `do_execute`, MySQL batch, SQL Server batch, DuckDB batch, transaction execution, transfer execution ### Non-SQL Write Guards — Tauri Commands - Added `ensure_connection_writable()` helper (connection.rs) - Mongo: 6 write entry points (insert/update/delete, single + batch) - Redis: 15 write entry points (SET, DEL, HSET, HDEL, LPUSH, LSET, LREM, SADD, SREM, ZADD, ZREM, EXPIRE, FLUSHDB, delete_keys, execute_command) - execute_command uses RedisCommandSafety classification to allow safe read commands through raw command interface - etcd: 2 write entry points (put, delete) - sql_file: SQL file execution guarded - MCP Bridge: 4 write entry points (Insert/Update/Delete/SQL query) ### Non-SQL Write Guards — Web API - Local `ensure_writable()` helper in each route module - Redis: 12 write endpoints including classified execute_command - Mongo: 6 write endpoints - etcd: 2 write endpoints - sql_file, table_import, transfer: early rejection ### Test Updates - Updated ConnectionConfig construction in 7 test files with `read_only: false` initialization ## Defense-in-Depth - Layer 1: Command/Route-level early rejection (saves resources) - Layer 2: Core SQL classifier (`is_write_sql` — first keyword + embedded scan) - Layer 3: Core execution-time interception (do_execute/transfer/transaction)
63 lines
708 B
Plaintext
63 lines
708 B
Plaintext
# Dependencies
|
|
node_modules/
|
|
.claude/
|
|
.codex/
|
|
.superpowers/
|
|
.trellis/
|
|
.worktrees/
|
|
openspec/
|
|
.mcp.json
|
|
AGENTS.md
|
|
|
|
# Build output
|
|
dist/
|
|
coverage/
|
|
/target/
|
|
plugins/jdbc/target/
|
|
plugins/jdbc/dependency-reduced-pom.xml
|
|
plugins/jdbc/lib/*.jar
|
|
plugins/jdbc/dist/
|
|
docs/.next/
|
|
docs/out/
|
|
docs/.source/
|
|
docs/superpowers/
|
|
src-tauri/*.dylib
|
|
|
|
# OS files
|
|
.DS_Store
|
|
Thumbs.db
|
|
|
|
# Editor
|
|
*.swp
|
|
*.swo
|
|
*~
|
|
.vscode/
|
|
.idea/
|
|
|
|
# GitHub (keep workflows)
|
|
.github/*
|
|
!.github/workflows/
|
|
!.github/scripts/
|
|
!.github/ISSUE_TEMPLATE/
|
|
|
|
# Env
|
|
.env
|
|
.env.*
|
|
!.env.example
|
|
|
|
# Temp
|
|
tmp/
|
|
|
|
# Logs
|
|
*.log
|
|
|
|
# Agent JDBC driver JARs
|
|
agents/*/libs/*.jar
|
|
|
|
# Generated changelog data
|
|
releases-*.json
|
|
|
|
test.pdb
|
|
portable/
|
|
DBX_*_x64-portable.zip
|
|
.agents/skills |