diff --git a/async/src/cmdline_client.rs b/async/src/cmdline_client.rs index 32e4763d68879cd10500c48a9944494417f9f98f..a7e0f786edffecc6fbd12bf6455af77c5c53f952 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 ff52045474e9fbd7b4d1a0c86dbc567c75816240..84929505438d6550b154ccfc39792ea82edb5a16 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 c696b8d21f37decf993ceca6f0f11e88304fd9ed..e8b102fdb3e578067f6d5242ab94b070b43a3cec 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 650e58916411d2bc5c9f067976d405bafd4a1063..9dff28a32085150e38881d1ebfd1506dce3e9eca 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 3f173dca8c9cb389b2bcb6972dfb88f4635b45ef..ccbac1a6980bf9b62abc356d7a6b0c0e8b4c69f4 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 3138710a4cafb3c18e71abbb8bf56a2b1a095060..facfccee95785385af14d9f5548ceb28faa2e3f9 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})") }