Security
ElyraSQL Client is designed so that your data and credentials stay under your control.
Credentials
- Connection passwords are stored in the OS keychain — macOS Keychain, Windows Credential Manager, or the Linux Secret Service — and are never written to disk in cleartext.
- Removing a connection also deletes its keychain entry.
Where queries run
- Queries execute in the Rust core; the UI (webview) only receives results.
- The core reads credentials from the keychain and opens connections on demand.
How writes are authorized
Every mutating operation goes through a single choke point in the connection broker. A write cannot execute without a write authorization, and obtaining one is the only place the policy is checked:
- read-only connections are refused outright;
- production connections require an explicit confirmation, which the app asks for and then retries with.
Because the authorization is required by the type system, a newly added feature
cannot accidentally bypass the rails — it won't compile without one. Server
commands that don't touch user data (BACKUP TO, KILL) are the only
documented exceptions.
Correct SQL quoting
All SQL is generated through one central, engine-aware quoting layer, so
identifiers and values are escaped per dialect (MySQL/ElyraSQL processes
backslash escapes in strings; SQLite does not). Values are always quoted —
never inlined as bare numbers — so text like 007 cannot be altered in
transit. This layer is unit-tested, including LIKE metacharacter escaping.
Safety rails
- Destructive actions preview their SQL (inline edits, table designer, truncate/drop) and require confirmation before running.
- Read-only connections refuse writes and DDL.
- Production connections require an explicit confirmation for writes and draw a red window frame.
- The client only ever narrows access — the server's own privileges always apply.
Transport
- TLS is used opportunistically and can be required per connection. Require TLS is enabled automatically for any non-local host, so a connection that leaves your machine is encrypted by default (you can still override it).
- The app reports the actual transport state, asked of the server rather than inferred from your settings: an encrypted session shows a 🔒, and a remote connection carrying data in clear text is flagged ⚠ unencrypted in the toolbar and in the Test connection result.
- SQLite connections are local files with no network transport, so they are never flagged.
The AI assistant
Off unless you turn it on, and it needs your own API key — from Anthropic, OpenAI or Google Gemini — stored in the OS keychain like every other credential here. Each provider has its own keychain entry, so one service's key is never sent to another.
When you ask it something, what leaves your machine is the engine and dialect, the database name, the table you are looking at, and — unless you switch it off in Settings → AI Assistant — the table and column names of the open database. No row data is sent: not the grid, not a sample, not a query result. It goes to the provider you selected and only to that one, and the panel shows the scope in force above the transcript.
Nothing it writes is executed on its own. Running a statement it proposed goes through the same confirmation as one you typed, production guard included. See AI Assistant.
Error help
Off unless you add a TypeSafe key, which is stored in the OS keychain like every other credential here.
When a query fails, the error message and the engine's name are sent to TypeSafe to be classified into a cause. Your statement is not sent, nor your schema, nor any row — the server's message already names whatever was missing.
Nothing about this decides anything. The write rails, the production confirmation and the read-only refusal are all enforced in code and stay that way: they have to work when the service does not. A classification only ever adds a suggestion to a failure that has already happened, and the server's own message is always shown alongside it. See SQL Editor.
Licensing privacy
License validation sends only your key, the app name/version and an opaque per-install id to elyracode.com. No database contents are transmitted. See Editions & Licensing.
Reporting a vulnerability
Please report privately — see the repository's SECURITY.md. Do not open a
public issue for security reports.