summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamis Buck <jamis@37signals.com>2007-08-18 14:32:51 +0000
committerJamis Buck <jamis@37signals.com>2007-08-18 14:32:51 +0000
commitf8f0023addadaf05319e7a1cbae497020f022d38 (patch)
tree75ce7e46ae99a92faddeefb025220e0bfdb0aab2
parent51ab0d7998c0d6a785dc59918e9cc215577b2229 (diff)
downloadnet-ssh-f8f0023addadaf05319e7a1cbae497020f022d38.tar.gz
make sure CHANNEL_OPEN_FAILURE is handled
git-svn-id: http://svn.jamisbuck.org/net-ssh/branches/v2@194 1d2a57f2-1ded-0310-ad52-83097a15a5de
-rw-r--r--lib/net/ssh/connection/session.rb6
-rw-r--r--lib/net/ssh/packet.rb39
-rw-r--r--test/connection/test_session.rb7
3 files changed, 33 insertions, 19 deletions
diff --git a/lib/net/ssh/connection/session.rb b/lib/net/ssh/connection/session.rb
index 644d727..16e9338 100644
--- a/lib/net/ssh/connection/session.rb
+++ b/lib/net/ssh/connection/session.rb
@@ -308,6 +308,12 @@ module Net; module SSH; module Connection
channel.do_open_confirmation(packet[:remote_id], packet[:window_size], packet[:packet_size])
end
+ def channel_open_failure(packet)
+ error { "channel_open_failed: #{packet[:local_id]} #{packet[:reason_code]} #{packet[:description]}" }
+ channels.delete(packet[:local_id])
+ raise ChannelOpenFailed.new(packet[:reason_code], packet[:description])
+ end
+
def channel_window_adjust(packet)
trace { "channel_window_adjust: #{packet[:local_id]} +#{packet[:extra_bytes]}" }
channels[packet[:local_id]].do_window_adjust(packet[:extra_bytes])
diff --git a/lib/net/ssh/packet.rb b/lib/net/ssh/packet.rb
index 3177681..cd62d1c 100644
--- a/lib/net/ssh/packet.rb
+++ b/lib/net/ssh/packet.rb
@@ -20,26 +20,27 @@ module Net; module SSH
@@types[type] = pairs
end
- register Transport::Constants::DISCONNECT, [:reason_code, :long], [:description, :string], [:language, :string]
- register Transport::Constants::IGNORE, [:data, :string]
- register Transport::Constants::UNIMPLEMENTED, [:number, :long]
- register Transport::Constants::DEBUG, [:always_display, :bool], [:message, :string], [:language, :string]
- register Transport::Constants::SERVICE_ACCEPT, [:service_name, :string]
+ include Transport::Constants, Authentication::Constants, Connection::Constants
- register Authentication::Constants::USERAUTH_BANNER, [:message, :string], [:language, :string]
- register Authentication::Constants::USERAUTH_FAILURE, [:authentications, :string], [:partial_success, :bool]
-
- register Connection::Constants::GLOBAL_REQUEST, [:request_type, :string], [:want_reply, :bool], [:request_data, :buffer]
- register Connection::Constants::CHANNEL_OPEN, [:channel_type, :string], [:remote_id, :long], [:window_size, :long], [:packet_size, :long]
- register Connection::Constants::CHANNEL_OPEN_CONFIRMATION, [:local_id, :long], [:remote_id, :long], [:window_size, :long], [:packet_size, :long]
- register Connection::Constants::CHANNEL_WINDOW_ADJUST, [:local_id, :long], [:extra_bytes, :long]
- register Connection::Constants::CHANNEL_DATA, [:local_id, :long], [:data, :string]
- register Connection::Constants::CHANNEL_EXTENDED_DATA, [:local_id, :long], [:data_type, :long], [:data, :string]
- register Connection::Constants::CHANNEL_EOF, [:local_id, :long]
- register Connection::Constants::CHANNEL_CLOSE, [:local_id, :long]
- register Connection::Constants::CHANNEL_REQUEST, [:local_id, :long], [:request, :string], [:want_reply, :bool], [:request_data, :buffer]
- register Connection::Constants::CHANNEL_SUCCESS, [:local_id, :long]
- register Connection::Constants::CHANNEL_FAILURE, [:local_id, :long]
+ register DISCONNECT, [:reason_code, :long], [:description, :string], [:language, :string]
+ register IGNORE, [:data, :string]
+ register UNIMPLEMENTED, [:number, :long]
+ register DEBUG, [:always_display, :bool], [:message, :string], [:language, :string]
+ register SERVICE_ACCEPT, [:service_name, :string]
+ register USERAUTH_BANNER, [:message, :string], [:language, :string]
+ register USERAUTH_FAILURE, [:authentications, :string], [:partial_success, :bool]
+ register GLOBAL_REQUEST, [:request_type, :string], [:want_reply, :bool], [:request_data, :buffer]
+ register CHANNEL_OPEN, [:channel_type, :string], [:remote_id, :long], [:window_size, :long], [:packet_size, :long]
+ register CHANNEL_OPEN_CONFIRMATION, [:local_id, :long], [:remote_id, :long], [:window_size, :long], [:packet_size, :long]
+ register CHANNEL_OPEN_FAILURE, [:local_id, :long], [:reason_code, :long], [:description, :string], [:language, :string]
+ register CHANNEL_WINDOW_ADJUST, [:local_id, :long], [:extra_bytes, :long]
+ register CHANNEL_DATA, [:local_id, :long], [:data, :string]
+ register CHANNEL_EXTENDED_DATA, [:local_id, :long], [:data_type, :long], [:data, :string]
+ register CHANNEL_EOF, [:local_id, :long]
+ register CHANNEL_CLOSE, [:local_id, :long]
+ register CHANNEL_REQUEST, [:local_id, :long], [:request, :string], [:want_reply, :bool], [:request_data, :buffer]
+ register CHANNEL_SUCCESS, [:local_id, :long]
+ register CHANNEL_FAILURE, [:local_id, :long]
# The (integer) type of this packet.
attr_reader :type
diff --git a/test/connection/test_session.rb b/test/connection/test_session.rb
index b6921a0..debf920 100644
--- a/test/connection/test_session.rb
+++ b/test/connection/test_session.rb
@@ -255,6 +255,13 @@ module Connection
assert_equal "auth-agent", ch.type
end
+ def test_channel_open_failure_should_remove_channel_raise_exception
+ session.channels[1] = stub("channel")
+ transport.return(CHANNEL_OPEN_FAILURE, :long, 1, :long, 1234, :string, "some reason", :string, "lang tag")
+ assert_raises(Net::SSH::ChannelOpenFailed) { process_times(2) }
+ assert session.channels.empty?
+ end
+
def test_channel_open_confirmation_packet_should_be_routed_to_corresponding_channel
channel_at(14).expects(:do_open_confirmation).with(1234, 0x20001, 0x10001)
transport.return(CHANNEL_OPEN_CONFIRMATION, :long, 14, :long, 1234, :long, 0x20001, :long, 0x10001)