Wire native Dosh auth runtime
This commit is contained in:
@@ -7,6 +7,7 @@ use std::time::Duration;
|
||||
use dosh::auth::{build_bootstrap, load_or_create_server_secret};
|
||||
use dosh::config::load_server_config;
|
||||
use dosh::crypto;
|
||||
use dosh::native::{host_public_key, load_or_create_host_key, trust_host};
|
||||
use dosh::protocol::{
|
||||
self, AttachOk, AttachReject, BootstrapAttachRequest, CLIENT_TO_SERVER, Frame, Input,
|
||||
PacketKind, Resize, ResumeRequest, SERVER_TO_CLIENT,
|
||||
@@ -47,9 +48,13 @@ create_on_attach = true
|
||||
shell = "/bin/sh"
|
||||
sessions_dir = "{sessions}"
|
||||
secret_path = "{secret}"
|
||||
host_key = "{host_key}"
|
||||
authorized_keys = ["{authorized_keys}"]
|
||||
"#,
|
||||
sessions = dir.path().join("sessions").display(),
|
||||
secret = dir.path().join("secret").display(),
|
||||
host_key = dir.path().join("host_key").display(),
|
||||
authorized_keys = dir.path().join("authorized_keys").display(),
|
||||
),
|
||||
)
|
||||
.unwrap();
|
||||
@@ -89,6 +94,54 @@ fn attach_once(dir: &tempfile::TempDir, port: u16, cache: bool) -> std::process:
|
||||
cmd.output().unwrap()
|
||||
}
|
||||
|
||||
fn native_attach_once(dir: &tempfile::TempDir, port: u16) -> std::process::Output {
|
||||
let client = env!("CARGO_BIN_EXE_dosh-client");
|
||||
Command::new(client)
|
||||
.arg("--auth")
|
||||
.arg("native")
|
||||
.arg("--attach-only")
|
||||
.arg("-v")
|
||||
.arg("--session")
|
||||
.arg("default")
|
||||
.arg("--dosh-host")
|
||||
.arg("127.0.0.1")
|
||||
.arg("--dosh-port")
|
||||
.arg(port.to_string())
|
||||
.arg("local")
|
||||
.env("HOME", dir.path())
|
||||
.output()
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
fn write_native_client_auth(dir: &tempfile::TempDir, config_path: &std::path::Path) {
|
||||
let ssh_dir = dir.path().join(".ssh");
|
||||
fs::create_dir_all(&ssh_dir).unwrap();
|
||||
let signing = ed25519_dalek::SigningKey::from_bytes(&[42u8; 32]);
|
||||
let keypair = ssh_key::private::Ed25519Keypair::from(&signing);
|
||||
let private =
|
||||
ssh_key::PrivateKey::new(ssh_key::private::KeypairData::from(keypair), "test").unwrap();
|
||||
private
|
||||
.write_openssh_file(&ssh_dir.join("id_ed25519"), ssh_key::LineEnding::LF)
|
||||
.unwrap();
|
||||
fs::write(
|
||||
dir.path().join("authorized_keys"),
|
||||
format!("{}\n", private.public_key().to_openssh().unwrap()),
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let config = load_server_config(Some(config_path.to_path_buf())).unwrap();
|
||||
let host_signing = load_or_create_host_key(&config).unwrap();
|
||||
let known_hosts = dir.path().join(".config/dosh/known_hosts");
|
||||
trust_host(
|
||||
&known_hosts,
|
||||
"local",
|
||||
&host_public_key(&host_signing),
|
||||
"test",
|
||||
false,
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
fn direct_attach(
|
||||
config: &std::path::Path,
|
||||
port: u16,
|
||||
@@ -275,6 +328,22 @@ fn local_attach_only_smoke() {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn native_attach_only_smoke() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
let port = free_udp_port();
|
||||
let config = write_server_config(&dir, port);
|
||||
write_native_client_auth(&dir, &config);
|
||||
let mut server = start_server(&dir, &config);
|
||||
let output = native_attach_once(&dir, port);
|
||||
let _ = server.kill();
|
||||
let _ = server.wait();
|
||||
let stderr = String::from_utf8_lossy(&output.stderr);
|
||||
assert!(output.status.success(), "stderr={stderr}");
|
||||
assert!(stderr.contains("native_auth"), "stderr={stderr}");
|
||||
assert!(stderr.contains("terminal_ready"), "stderr={stderr}");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ticket_attach_after_server_restart_smoke() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
|
||||
Reference in New Issue
Block a user