Skip to main content

libssh_strat9/
lib.rs

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    /// Creates a new instance.
31    pub fn new(core: SshCore<B, A, H, S>) -> Self {
32        Self { core }
33    }
34
35    /// Implements state.
36    pub fn state(&self) -> ConnectionState {
37        self.core.state()
38    }
39
40    /// Implements ingest packet.
41    pub fn ingest_packet(&mut self, packet: &[u8]) -> Result<Vec<CoreDirective>> {
42        self.core.ingest_packet(packet)
43    }
44
45    /// Implements core mut.
46    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    /// Creates a new instance.
63    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    /// Implements transport mut.
94    pub fn transport_mut(&mut self) -> &mut T {
95        &mut self.transport
96    }
97}