Skip to content

refactor(linux): finish remediation steps 40 to 45 - #3413

Merged
datlechin merged 132 commits into
linuxfrom
refactor/linux-group2
Oct 14, 2026
Merged

datlechin merged 132 commits into
linuxfrom
refactor/linux-group2

Conversation

@datlechin

Copy link
Copy Markdown
Member

Why

Steps 40 to 45 of linux/docs/plan-2026-09-14-audit-remediation.md. The app had one Relm4 window for every connection, no prompt for secrets the keyring lacked, no way past a rejected host key, and SQLite schema changes it could not make.

Change

  • One window per connection on a TableProApplication: New Window, a quit through every close flow, windows reopened on launch, files opened from Files and the command line.
  • Prompts for passwords, passphrases and SSH questions; host-key review from the banner; reachability and resume handling; connection deletion that removes secrets first.
  • SQLite table rebuilds, network-share and moved-file handling, destructive change review, live index and foreign key dialogs.
  • Grid keyboard navigation, exact editors, rendering from display text, one owner per page; history opt-out that never records credentials.

Verified

fmt, both clippy runs, unit, widget and app integration tests in the ubuntu:26.04 image; docker suites per engine for DDL and saves.

Not in this PR

TrackerEdit::DeleteRows replaces Delete and DiscardDraft and is one undo
step. TrackerDelta lists inserted and removed drafts for the one store path.
Delete is tab.delete-rows, enabled from the selection and the delta.
relm4's ComponentSender::input and FactorySender::input expect on a
closed channel, so a read or save that answered after its window closed
aborted the whole process. Both are now banned in favour of deliver.
Ctrl+Shift+N becomes the application's New Window, and GTK runs
application accelerators before a focused grid sees the key.
Drafts hold CellInput, so a cell left to the server is not a NULL, and
InsertDraft seeds Default where the server fills. The grid parses each
commit against its column and sends a TrackerEdit; untouched text is no edit.
An adw::Application subclass replaces RelmApp and the flock gate: a
second launch hands over to the running instance on D-Bus, and
--new-window opens a window there. Quit asks each window through its
close prompts and never calls g_application_quit, so the process ends
only once every close and save hold has dropped.
A copied draft keeps the cells it leaves to the server instead of
writing NULL there. One Ctrl+Z removes every copy, past the 50-step
history limit too.
GtkCalendar emits day-selected only when the date changes, so a click
or Space on the selected day, such as today on a NULL cell, picked
nothing.
begin_edit flipped the check box, so the auto-edit after Insert Row
would write TRUE into a new row once its cells take focus.
GTK takes C strings: the cell drew such a value cut at the NUL, or
aborted in a debug build, and an editor would save the cut text.
A new row is dropped at once with its undo history, so the prompt no
longer tells it to wait for Save.
The Delete button takes its icon from the template. A preset for a
column the tab lacks is logged and dropped instead of reading as a
missing value.
- A view or trigger whose SQL cannot be replayed is named as itself, not as a column.
- new.x and old.x in a trigger on another table no longer block dropping column x.
- The Structure tab hides Add Foreign Key and foreign key removal there.
- The CREATE TABLE read for capabilities is kept per thread, so a wide table is read once, not once per column.
The table definition also reads the CREATE statement once, not again for its foreign keys.
# Conflicts:
#	linux/CHANGELOG.md
# Conflicts:
#	linux/CHANGELOG.md
#	linux/crates/app/src/services/mod.rs
#	linux/crates/app/src/ui/connection_row.rs
#	linux/crates/app/src/ui/session_window/imp.rs
#	linux/crates/app/src/ui/session_window/mod.rs
#	linux/crates/app/src/ui/session_window/session_window_command.rs
#	linux/crates/app/src/ui/session_window/session_window_input.rs
#	linux/crates/app/src/ui/session_window/tests.rs
#	linux/po/POTFILES.in
# Conflicts:
#	linux/CHANGELOG.md
#	linux/crates/app/src/workspace/mod.rs
# Conflicts:
#	linux/CHANGELOG.md
#	linux/crates/app/Cargo.toml
#	linux/crates/app/src/application/app_services.rs
#	linux/crates/app/src/application/imp.rs
#	linux/crates/app/src/ui/session_window/mod.rs
#	linux/crates/app/src/ui/session_window/session_window_input.rs
#	linux/crates/app/src/workspace/workspace_store.rs
AdwAlertDialog closes itself before it emits a response, so a second
close found it gone and logged a critical when animations were off.
Rows are still keyed in the identity the save path binds (the primary
key in column order); RowKeyBuilder takes the page's identity range once
saves plan with the page identity.
AdwAlertDialog emits closed before the response a click chose, and the
closed handler answered Cancel first. Answer through workspace::respond,
which defers its close response to an idle callback.
@datlechin
datlechin merged commit 9497897 into linux Oct 14, 2026
10 checks passed
@datlechin
datlechin deleted the refactor/linux-group2 branch October 14, 2026 09:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant