From ea0905d86a7be68e48cae06c850ede18f716893d Mon Sep 17 00:00:00 2001 From: Matt Johnston <matt@ucc.asn.au> Date: Thu, 16 May 2024 00:07:10 +0800 Subject: [PATCH] Fixes for demo server --- async/src/cmdline_client.rs | 1 - embassy/demos/common/src/server.rs | 138 ++++++++++++++--------------- embassy/demos/std/src/main.rs | 8 +- embassy/src/client.rs | 2 - embassy/src/server.rs | 4 +- src/event.rs | 10 --- 6 files changed, 75 insertions(+), 88 deletions(-) diff --git a/async/src/cmdline_client.rs b/async/src/cmdline_client.rs index 32e4763..a7e0f78 100644 --- a/async/src/cmdline_client.rs +++ b/async/src/cmdline_client.rs @@ -320,7 +320,6 @@ impl<'a> CmdlineClient<'a> { // TODO is there a better way launch_chan.send((io.clone().unwrap(), extin.clone(), self.pty_guard.take())).await; } - CliEvent::PollAgain => (), CliEvent::Defunct => { break Ok::<_, Error>(()) } diff --git a/embassy/demos/common/src/server.rs b/embassy/demos/common/src/server.rs index ff52045..8492950 100644 --- a/embassy/demos/common/src/server.rs +++ b/embassy/demos/common/src/server.rs @@ -117,7 +117,7 @@ impl ServerApp { } // Handles most events except for channel open and Defunct - pub fn handle_event(&mut self, event: ServEvent<'_, '_>) -> Result<()> { + pub fn handle_event<'f>(&mut self, event: ServEvent<'_, '_>) -> Result<()> { match event { ServEvent::Hostkeys(h) => h.hostkeys(&[&self.config.hostkey]), ServEvent::AuthMethods(a) => { @@ -132,7 +132,7 @@ impl ServerApp { | ServEvent::PubkeyAuth(_) // should be handled by the caller. | ServEvent::Defunct - => Err(error::BadUsage.fail()), + => error::BadUsage.fail(), } } @@ -152,8 +152,8 @@ impl ServerApp { &self.config.console_pw }; let p = match p { - Ok(u) => u, - Err(_) => return Ok(()), + Some(u) => u, + None => return Ok(()), }; if p.check(password) { @@ -167,15 +167,14 @@ impl ServerApp { } fn handle_authmethods(&self, a: ServAuthMethods) -> Result<()> { - let let Some(username) = match a.username() { - if !self.is_admin(username) && self.config.console_noauth { - info!("Allowing auth for user {}", username.as_str().unwrap_or("bad")); - // self.shell.authed(username.as_str().unwrap_or("")).await; - return a.allow_immediately(); - }; + let username = a.username()?; + if !self.is_admin(username) && self.config.console_noauth { + info!("Allowing auth for user {username}"); + // self.shell.authed(username.as_str().unwrap_or("")).await; + return a.allow_immediately(); }; - a.pubkey().password() + // a.pubkey().password() Ok(()) } @@ -184,64 +183,65 @@ impl ServerApp { } } -impl ServBehaviour for ServerApp { - - fn hostkeys(&mut self) -> BhResult<heapless::Vec<&SignKey, 2>> { - // OK unwrap: only one element - Ok(heapless::Vec::from_slice(&[&self.config.hostkey]).unwrap()) - } - - async fn auth_unchallenged(&mut self, username: TextString<'_>) -> bool { - } - - fn have_auth_password(&self, username: TextString) -> bool { - if self.is_admin(username) { - self.config.admin_pw.is_some() - } else { - self.config.console_pw.is_some() - } - } - - fn have_auth_pubkey(&self, username: TextString) -> bool { - if self.is_admin(username) { - self.config.admin_keys.iter().any(|k| k.is_some()) - } else { - self.config.console_keys.iter().any(|k| k.is_some()) - } - } - - fn open_session(&mut self, chan: ChanHandle) -> ChanOpened { - if self.sess.is_some() { - ChanOpened::Failure((ChanFail::SSH_OPEN_ADMINISTRATIVELY_PROHIBITED, chan)) - } else { - self.sess = Some(chan.num()); - self.handle = Some(chan); - ChanOpened::Success - } - } - - fn sess_shell(&mut self, chan: ChanNum) -> bool { - if self.sess != Some(chan) { - return false - } - - if let Some(handle) = self.handle.take() { - debug_assert_eq!(self.sess, Some(handle.num())); - // self.shell.open_shell(handle); - true - } else { - false - } - } - - fn sess_pty(&mut self, chan: ChanNum, _pty: &Pty) -> bool { - self.sess == Some(chan) - } - - fn disconnected(&mut self, desc: TextString) { - info!("Disconnect by client: {}", desc.as_str().unwrap_or("bad")); - } -} +// impl ServBehaviour for ServerApp { + +// fn hostkeys(&mut self) -> BhResult<heapless::Vec<&SignKey, 2>> { +// // OK unwrap: only one element +// Ok(heapless::Vec::from_slice(&[&self.config.hostkey]).unwrap()) +// } + +// async fn auth_unchallenged(&mut self, username: TextString<'_>) -> bool { +// } + +// fn have_auth_password(&self, username: TextString) -> bool { +// if self.is_admin(username) { +// self.config.admin_pw.is_some() +// } else { +// self.config.console_pw.is_some() +// } +// } + +// fn have_auth_pubkey(&self, username: TextString) -> bool { +// todo!(); +// // if self.is_admin(username) { +// // self.config.admin_keys.iter().any(|k| k.is_some()) +// // } else { +// // self.config.console_keys.iter().any(|k| k.is_some()) +// // } +// } + +// fn open_session(&mut self, chan: ChanHandle) -> ChanOpened { +// if self.sess.is_some() { +// ChanOpened::Failure((ChanFail::SSH_OPEN_ADMINISTRATIVELY_PROHIBITED, chan)) +// } else { +// self.sess = Some(chan.num()); +// self.handle = Some(chan); +// ChanOpened::Success +// } +// } + +// fn sess_shell(&mut self, chan: ChanNum) -> bool { +// if self.sess != Some(chan) { +// return false +// } + +// if let Some(handle) = self.handle.take() { +// debug_assert_eq!(self.sess, Some(handle.num())); +// // self.shell.open_shell(handle); +// true +// } else { +// false +// } +// } + +// fn sess_pty(&mut self, chan: ChanNum, _pty: &Pty) -> bool { +// self.sess == Some(chan) +// } + +// fn disconnected(&mut self, desc: TextString) { +// info!("Disconnect by client: {}", desc.as_str().unwrap_or("bad")); +// } +// } pub trait DemoServer { /// State to be passed to each new connection by the server diff --git a/embassy/demos/std/src/main.rs b/embassy/demos/std/src/main.rs index c696b8d..e8b102f 100644 --- a/embassy/demos/std/src/main.rs +++ b/embassy/demos/std/src/main.rs @@ -17,7 +17,7 @@ use embassy_sync::blocking_mutex::raw::NoopRawMutex; use embassy_net_tuntap::TunTapDevice; use sunset::{event::ServEventId, *}; -use sunset_embassy::{SSHServer, SunsetMutex}; +use sunset_embassy::{SSHServer, SunsetMutex, ProgressHolder}; mod setupmenu; pub(crate) use sunset_demo_embassy_common as demo_common; @@ -93,10 +93,10 @@ impl DemoServer for StdDemo { let prog_loop = async { loop { - let mut ph = serv.progress().await?; - match ph.event()? { + let mut ph = ProgressHolder::new(); + match serv.progress(&mut ph).await? { other => common.handle_event(other)?, - } + }; } // // wait for a shell to start diff --git a/embassy/src/client.rs b/embassy/src/client.rs index 650e589..9dff28a 100644 --- a/embassy/src/client.rs +++ b/embassy/src/client.rs @@ -46,8 +46,6 @@ impl<'a> SSHClient<'a> { -> Result<CliEvent<'f, 'a>> { match self.sunset.progress(ph).await? { Event::Cli(x) => Ok(x), - // workaround, seem comment where Progressed is emitted - Event::Progressed => Ok(CliEvent::PollAgain), _ => Err(Error::bug()), } } diff --git a/embassy/src/server.rs b/embassy/src/server.rs index 3f173dc..ccbac1a 100644 --- a/embassy/src/server.rs +++ b/embassy/src/server.rs @@ -40,8 +40,8 @@ impl<'a> SSHServer<'a> { /// /// Note that the returned `ProgressHolder` holds a mutex over the session, /// so other calls to `SSHServer` may block until it is dropped. - pub async fn progress<'g, 's: 'g>(&'g self, ph: &'g mut ProgressHolder<'g, 'a>) - -> Result<ServEvent<'g, 'a>> { + pub async fn progress<'g, 'f>(&'g self, ph: &'f mut ProgressHolder<'g, 'a>) + -> Result<ServEvent<'f, 'a>> { // poll until we get an actual event to return match self.sunset.progress(ph).await? { diff --git a/src/event.rs b/src/event.rs index 3138710..facfcce 100644 --- a/src/event.rs +++ b/src/event.rs @@ -59,10 +59,6 @@ pub enum CliEvent<'g, 'a> Authenticated, SessionOpened(CliSessionOpener<'g, 'a>), Defunct, - /// Caller should run `.progress()` again. - /// - /// This is a workaround. - PollAgain, // Hostkey { /* todo */ }, } @@ -76,7 +72,6 @@ impl Debug for CliEvent<'_, '_> { Self::Authenticated => "Authenticated", Self::SessionOpened(_) => "SessionOpened", Self::Defunct => "Defunct", - Self::PollAgain => "PollAgain", }; write!(f, "CliEvent({e})") } @@ -184,10 +179,6 @@ pub enum ServEvent<'g, 'a> { PasswordAuth(ServPasswordAuth<'g, 'a>), PubkeyAuth(ServPubkeyAuth<'g, 'a>), Defunct, - /// Caller should run `.progress()` again. - /// - /// This is a workaround. - PollAgain, } impl Debug for ServEvent<'_, '_> { @@ -198,7 +189,6 @@ impl Debug for ServEvent<'_, '_> { Self::PasswordAuth(_) => "PasswordAuth", Self::PubkeyAuth(_) => "PubkeyAuth", Self::Defunct => "Defunct", - Self::PollAgain => "PollAgain", }; write!(f, "ServEvent({e})") } -- GitLab