File tree Expand file tree Collapse file tree 3 files changed +46
-1
lines changed Expand file tree Collapse file tree 3 files changed +46
-1
lines changed Original file line number Diff line number Diff line change @@ -21,6 +21,7 @@ import 'package:dartssh2/src/message/msg_userauth.dart';
21
21
import 'package:dartssh2/src/ssh_message.dart' ;
22
22
import 'package:dartssh2/src/socket/ssh_socket.dart' ;
23
23
import 'package:dartssh2/src/ssh_userauth.dart' ;
24
+ import 'package:meta/meta.dart' ;
24
25
25
26
/// https://datatracker.ietf.org/doc/html/rfc4252#section-8
26
27
typedef SSHPasswordRequestHandler = FutureOr <String ?> Function ();
@@ -486,6 +487,10 @@ class SSHClient {
486
487
}
487
488
}
488
489
490
+ /// Handles a raw SSH packet. This method is only exposed for testing purposes.
491
+ @visibleForTesting
492
+ void handlePacket (Uint8List packet) => _handlePacket (packet);
493
+
489
494
void _sendMessage (SSHMessage message) {
490
495
printTrace? .call ('-> $socket : $message ' );
491
496
_transport.sendPacket (message.encode ());
@@ -792,7 +797,7 @@ class SSHClient {
792
797
printTrace? .call ('<- $socket : $message ' );
793
798
final channel = _channels[message.recipientChannel];
794
799
if (channel != null ) {
795
- channel.close ( );
800
+ channel.handleMessage (message );
796
801
_channels.remove (message.recipientChannel);
797
802
_channelIdAllocator.release (message.recipientChannel);
798
803
}
Original file line number Diff line number Diff line change
1
+ import 'package:dartssh2/dartssh2.dart' ;
2
+ import 'package:test/test.dart' ;
3
+
4
+ import '../../test_utils.dart' ;
5
+
6
+ void main () {
7
+ group ('SSHChannel' , () {
8
+ late SSHClient client;
9
+ late SSHSession session;
10
+
11
+ setUp (() async {
12
+ client = await getTestClient ();
13
+ await client.authenticated;
14
+ session = await client.shell ();
15
+ });
16
+
17
+ tearDown (() {
18
+ client.close ();
19
+ });
20
+
21
+ test ('stdout stream handles remote channel close correctly' , () async {
22
+ final drainFuture = session.stdout.drain <void >();
23
+
24
+ final closeMessage = createChannelCloseMessage (0 );
25
+ client.handlePacket (closeMessage);
26
+
27
+ await drainFuture;
28
+ }, timeout: const Timeout (Duration (seconds: 1 )));
29
+ });
30
+ }
Original file line number Diff line number Diff line change 1
1
import 'dart:io' ;
2
+ import 'dart:typed_data' ;
2
3
3
4
import 'package:dartssh2/dartssh2.dart' ;
5
+ import 'package:dartssh2/src/message/msg_channel.dart' ;
4
6
5
7
/// A honeypot that accepts all passwords and public-keys
6
8
Future <SSHClient > getHoneypotClient () async {
@@ -40,3 +42,11 @@ Future<List<SSHKeyPair>> getTestKeyPairs() async {
40
42
String fixture (String path) {
41
43
return File ('test/fixtures/$path ' ).readAsStringSync ();
42
44
}
45
+
46
+ /// Create a [SSH_Message_Channel_Close] message.
47
+ Uint8List createChannelCloseMessage (int recipientChannel) {
48
+ final message = SSH_Message_Channel_Close (
49
+ recipientChannel: recipientChannel,
50
+ );
51
+ return message.encode ();
52
+ }
You can’t perform that action at this time.
0 commit comments