1#![no_std]
2
3extern crate alloc;
4
5use alloc::vec::Vec;
6
7pub use ssh_core::{
8 AuthProvider, ChannelStream, ConnectionState, CoreDirective, ExecSessionProvider,
9 ExecSessionWiring, HostKeyProvider, ParsedPacket, Result, SshBackend, SshCore, SshCoreError,
10 Transport,
11};
12
13pub struct Server<B, A, H, S>
14where
15 B: SshBackend,
16 A: AuthProvider,
17 H: HostKeyProvider,
18 S: ExecSessionProvider,
19{
20 core: SshCore<B, A, H, S>,
21}
22
23impl<B, A, H, S> Server<B, A, H, S>
24where
25 B: SshBackend,
26 A: AuthProvider,
27 H: HostKeyProvider,
28 S: ExecSessionProvider,
29{
30 pub fn new(core: SshCore<B, A, H, S>) -> Self {
32 Self { core }
33 }
34
35 pub fn state(&self) -> ConnectionState {
37 self.core.state()
38 }
39
40 pub fn ingest_packet(&mut self, packet: &[u8]) -> Result<Vec<CoreDirective>> {
42 self.core.ingest_packet(packet)
43 }
44
45 pub fn core_mut(&mut self) -> &mut SshCore<B, A, H, S> {
47 &mut self.core
48 }
49}
50
51pub struct SessionPump<T>
52where
53 T: Transport,
54{
55 transport: T,
56}
57
58impl<T> SessionPump<T>
59where
60 T: Transport,
61{
62 pub fn new(transport: T) -> Self {
64 Self { transport }
65 }
66
67 pub fn pump_once<B, A, H, S>(
68 &mut self,
69 server: &mut Server<B, A, H, S>,
70 rx_buf: &mut [u8],
71 ) -> Result<Vec<CoreDirective>>
72 where
73 B: SshBackend,
74 A: AuthProvider,
75 H: HostKeyProvider,
76 S: ExecSessionProvider,
77 {
78 let n = self.transport.recv(rx_buf)?;
79 if n == 0 {
80 return Ok(Vec::new());
81 }
82
83 let directives = server.ingest_packet(&rx_buf[..n])?;
84 for directive in directives.iter() {
85 if let CoreDirective::SendPacket(pkt) = directive {
86 let _ = self.transport.send(pkt)?;
87 }
88 }
89
90 Ok(directives)
91 }
92
93 pub fn transport_mut(&mut self) -> &mut T {
95 &mut self.transport
96 }
97}