ssh-commander-core 0.2.2

Async Rust domain layer for SSH, SFTP, FTP/FTPS, PostgreSQL, and connection management — the engine behind midnight-ssh.
Documentation
[package]
name = "ssh-commander-core"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
authors.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
description = "Async Rust domain layer for SSH, SFTP, FTP/FTPS, PostgreSQL, and connection management — the engine behind midnight-ssh."
documentation = "https://docs.rs/ssh-commander-core"
readme = "../../README.md"
keywords = ["ssh", "sftp", "ftp", "postgres", "tunnel"]
categories = ["network-programming", "database", "asynchronous", "authentication"]

[features]
# Everything on by default — existing consumers see no change.
default = ["ssh", "sftp", "ftp", "desktop", "tools", "postgres"]
# SSH: interactive shell, exec, host-key TOFU, and the tunnel forwarder.
# Pulls in russh + vendored OpenSSL (a heavy C build).
ssh = ["dep:russh", "dep:russh-sftp"]
# Standalone SFTP builds on the SSH transport, so it implies `ssh`.
sftp = ["ssh"]
# FTP / FTPS. Pulls in suppaftp + async-std.
ftp = ["dep:suppaftp", "dep:async-std"]
# Remote desktop (RDP / VNC) protocol scaffolding.
desktop = []
# Network diagnostic tools (DNS, listening ports, tcpdump, git status).
# Several run over an SSH session, so this builds on the SSH transport.
tools = ["ssh"]
# PostgreSQL explorer. Pulls in the ssh-commander-pg crate
# (tokio-postgres + rustls). Tunneling a pg connection through SSH
# additionally requires the `ssh` feature.
postgres = ["dep:ssh-commander-pg"]

[dependencies]
# Shared Keychain leaf crate — always present so core can re-export the
# credential API under `ssh_commander_core::keychain` regardless of which
# protocol features are enabled.
ssh-commander-keychain = { path = "../keychain", version = "0.2.2" }
# PostgreSQL layer — optional, behind the `postgres` feature. It already
# depends on ssh-commander-keychain itself.
ssh-commander-pg = { path = "../pg", version = "0.2.2", optional = true }

serde = { version = "1", features = ["derive"] }
serde_json = "1"
tokio = { version = "1", features = ["full"] }
async-trait = "0.1"
russh = { version = "0.61", optional = true }
russh-sftp = { version = "2", optional = true }
anyhow = "1"
thiserror = "2"
tracing = "0.1"
tokio-util = "0.7"
futures = "0.3"
suppaftp = { version = "6", features = ["async-native-tls"], optional = true }
async-std = { version = "1", optional = true }
dirs = "5"
rand = "0.8"
chrono = { version = "0.4", default-features = false, features = ["clock"] }

[dev-dependencies]
proptest = "1"
tempfile = "3"