Commit b270f10
feat: SSH certificate authentication support (#327)
* feat: add SSH certificate authentication support
Adds support for SSH certificate-based authentication with automatic
fallback to key-based auth when certificates are invalid or expired.
- Auto-detect companion certificate files (e.g., id_ed25519-cert.pub)
- Validate certificate timing (expiry, not-yet-valid)
- Emit warning events for certificate issues while allowing connection
- Show toast notifications for certificate problems
- Document known limitation: agent-held certificates not supported
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: add SSH certificate configuration UI and validation
- Add certificate config UI (path/paste modes) to SSH settings modal
- Improve certificate validation with expiry/not-yet-valid warnings
- Add integration tests for certificate authentication
- Update Docker test infrastructure with CA key generation
- Fix toast overflow for long messages
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor: use time crate for SystemTime formatting
Replace 50-line manual calendar math with OffsetDateTime::from().to_string()
from the time crate (already a dependency).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor: extract try_publickey_auth helper for cert fallbacks
De-duplicate the 3-line publickey auth pattern that was repeated
in each certificate validation fallback path.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor: flatten certificate config matching with early returns
Replace nested match statements with if-let early returns for
clearer control flow in key_auth_from_content_with_cert and
key_auth_with_cert_config.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: handle WorkspaceError variants without message field
Some WorkspaceError variants (WorkspaceNotWatched, RunbookNotFound, etc.)
don't have a message field. Use type guard to safely access it.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* format
* clippy
* fix: emit SSH certificate warnings for command execution
Certificate authentication warnings were being emitted for PTY sessions
but not for command execution (exec). This caused an inconsistency where
users running commands wouldn't see certificate warnings, but interactive
shell users would.
Changes:
- Added warnings_tx channel to Exec message in ssh_pool.rs
- Modified Exec handler to capture and send auth_result.warnings
- Updated script.rs to receive and emit warnings as GC events
- Warnings now flow consistently for both PTY and exec operations
Fixes issue identified in code review where auth_result was discarded
on line 618 during exec connection.
Co-authored-by: Ellie Huxtable <ellie@users.noreply.github.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Ellie Huxtable <ellie@users.noreply.github.com>1 parent bdf7051 commit b270f10
File tree
38 files changed
+1459
-259
lines changed- crates/atuin-desktop-runtime
- bindings
- src
- blocks
- context
- events
- ssh
- docker/ssh-test
- src
- components
- runbooks
- List
- editor/blocks/ssh
- ui
- lib
- events
- notifications
- rs-bindings
38 files changed
+1459
-259
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
3 | 6 | | |
Lines changed: 3 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
3 | 6 | | |
Lines changed: 6 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
6 | 11 | | |
Lines changed: 12 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
Lines changed: 9 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
3 | 2 | | |
4 | 3 | | |
| 4 | + | |
| 5 | + | |
5 | 6 | | |
6 | | - | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
3 | 6 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
6 | 9 | | |
7 | | - | |
| 10 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
3 | 6 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
3 | 6 | | |
0 commit comments