Skip to content

Commit c0f3458

Browse files
committed
added Server::handle_session_error and session closure logging
1 parent c66f4b0 commit c0f3458

File tree

4 files changed

+43
-8
lines changed

4 files changed

+43
-8
lines changed

russh/src/client/encrypted.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,6 @@ impl Session {
306306
// write responses
307307
enc.client_send_auth_response(&responses)?;
308308
return Ok((client, self));
309-
} else {
310309
}
311310

312311
// continue with userauth_pk_ok

russh/src/server/encrypted.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ impl Session {
190190
handler,
191191
&mut enc.write,
192192
auth,
193-
&mut self.common.auth_user,
193+
&self.common.auth_user,
194194
buf,
195195
)
196196
.await?;
@@ -530,7 +530,7 @@ async fn read_userauth_info_response<H: Handler + Send>(
530530
mut handler: H,
531531
write: &mut CryptoVec,
532532
auth_request: &mut AuthRequest,
533-
user: &mut str,
533+
user: &str,
534534
b: &[u8],
535535
) -> Result<(H, bool), H::Error> {
536536
if let Some(CurrentRequest::KeyboardInteractive { ref submethods }) = auth_request.current {

russh/src/server/kex.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ impl KexInit {
4444
session_id: self.session_id,
4545
})
4646
} else {
47+
debug!("unknown key {:?}", algo.key);
4748
return Err(Error::UnknownKey);
4849
};
4950

russh/src/server/mod.rs

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ use std::task::{Context, Poll};
118118

119119
use async_trait::async_trait;
120120
use futures::future::Future;
121-
use log::error;
121+
use log::{debug, error};
122122
use russh_keys::key;
123123
use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt};
124124
use tokio::net::{TcpListener, ToSocketAddrs};
@@ -619,6 +619,8 @@ pub trait Server {
619619
type Handler: Handler + Send;
620620
/// Called when a new client connects.
621621
fn new_client(&mut self, peer_addr: Option<std::net::SocketAddr>) -> Self::Handler;
622+
/// Called when an active connection fails.
623+
fn handle_session_error(&mut self, _error: <Self::Handler as Handler>::Error) {}
622624
}
623625

624626
/// Run a server.
@@ -636,11 +638,44 @@ pub async fn run<H: Server + Send + 'static, A: ToSocketAddrs>(
636638
config.maximum_packet_size
637639
);
638640
}
639-
while let Ok((socket, _)) = socket.accept().await {
640-
let config = config.clone();
641-
let server = server.new_client(socket.peer_addr().ok());
642-
tokio::spawn(run_stream(config, socket, server));
641+
642+
let (error_tx, mut error_rx) = tokio::sync::mpsc::unbounded_channel();
643+
644+
loop {
645+
tokio::select! {
646+
accept_result = socket.accept() => {
647+
match accept_result {
648+
Ok((socket, _)) => {
649+
let config = config.clone();
650+
let handler = server.new_client(socket.peer_addr().ok());
651+
let error_tx = error_tx.clone();
652+
tokio::spawn(async move {
653+
let session = match run_stream(config, socket, handler).await {
654+
Ok(s) => s,
655+
Err(e) => {
656+
debug!("Connection setup failed");
657+
let _ = error_tx.send(e);
658+
return
659+
}
660+
};
661+
match session.await {
662+
Ok(_) => debug!("Connection closed"),
663+
Err(e) => {
664+
debug!("Connection closed with error");
665+
let _ = error_tx.send(e);
666+
}
667+
}
668+
});
669+
}
670+
_ => break,
671+
}
672+
},
673+
Some(error) = error_rx.recv() => {
674+
server.handle_session_error(error);
675+
}
676+
}
643677
}
678+
644679
Ok(())
645680
}
646681

0 commit comments

Comments
 (0)