diff options
author | Michal Cichra <michal@o2h.cz> | 2014-07-31 10:17:57 +0200 |
---|---|---|
committer | Michal Cichra <michal@o2h.cz> | 2014-07-31 10:17:57 +0200 |
commit | c53b40366b04e16c42e7f3022f343432619f3530 (patch) | |
tree | caf5c76f73758fe46dd41c8feee4b1361b4e777a | |
parent | 441d07882645114b5acc764d2b0b83930c6cacd7 (diff) | |
download | net-ssh-c53b40366b04e16c42e7f3022f343432619f3530.tar.gz |
Fix duplicating entries in known_hosts when using proxy command
Fixes #107
OpenSSH does not store ip address when using proxy command like:
server.example.com ssh-rsa AAAAA.......
net-ssh was storing it like:
server.example.com,<no hostip for proxy command> ssh-rsa AAAA.....
-rw-r--r-- | lib/net/ssh/transport/packet_stream.rb | 4 | ||||
-rw-r--r-- | lib/net/ssh/transport/session.rb | 9 | ||||
-rw-r--r-- | test/transport/test_packet_stream.rb | 6 | ||||
-rw-r--r-- | test/transport/test_session.rb | 12 |
4 files changed, 28 insertions, 3 deletions
diff --git a/lib/net/ssh/transport/packet_stream.rb b/lib/net/ssh/transport/packet_stream.rb index 7d5fcab..8e9ffe5 100644 --- a/lib/net/ssh/transport/packet_stream.rb +++ b/lib/net/ssh/transport/packet_stream.rb @@ -14,6 +14,8 @@ module Net; module SSH; module Transport # per the SSH2 protocol. It also adds an abstraction for polling packets, # to allow for both blocking and non-blocking reads. module PacketStream + PROXY_COMMAND_HOST_IP = '<no hostip for proxy command>'.freeze + include BufferedIo def self.extended(object) @@ -64,7 +66,7 @@ module Net; module SSH; module Transport addr = getpeername Socket.getnameinfo(addr, Socket::NI_NUMERICHOST | Socket::NI_NUMERICSERV).first else - "<no hostip for proxy command>" + PROXY_COMMAND_HOST_IP end end diff --git a/lib/net/ssh/transport/session.rb b/lib/net/ssh/transport/session.rb index 05253c9..76dd18b 100644 --- a/lib/net/ssh/transport/session.rb +++ b/lib/net/ssh/transport/session.rb @@ -93,11 +93,16 @@ module Net; module SSH; module Transport @host_as_string ||= begin string = "#{host}" string = "[#{string}]:#{port}" if port != DEFAULT_PORT - if socket.peer_ip != host - string2 = socket.peer_ip + + peer_ip = socket.peer_ip + + if peer_ip != Net::SSH::Transport::PacketStream::PROXY_COMMAND_HOST_IP && + peer_ip != host + string2 = peer_ip string2 = "[#{string2}]:#{port}" if port != DEFAULT_PORT string << "," << string2 end + string end end diff --git a/test/transport/test_packet_stream.rb b/test/transport/test_packet_stream.rb index c83d9b0..0c3c5bf 100644 --- a/test/transport/test_packet_stream.rb +++ b/test/transport/test_packet_stream.rb @@ -45,6 +45,12 @@ module Transport assert_equal "1.2.3.4", stream.peer_ip end + def test_peer_ip_should_return_no_hostip_when_socket_has_no_peername + assert_equal false, stream.respond_to?(:getpeername) + assert_equal Net::SSH::Transport::PacketStream::PROXY_COMMAND_HOST_IP, stream.peer_ip + assert_equal '<no hostip for proxy command>', stream.peer_ip + end + def test_available_for_read_should_return_nontrue_when_select_fails IO.expects(:select).returns(nil) assert !stream.available_for_read? diff --git a/test/transport/test_session.rb b/test/transport/test_session.rb index 02176da..88e8402 100644 --- a/test/transport/test_session.rb +++ b/test/transport/test_session.rb @@ -69,6 +69,18 @@ module Transport assert_equal "[1.2.3.4]:1234", session.host_as_string end + def test_host_as_string_should_return_only_host_when_proxy_command_is_set + session!(:host => "1.2.3.4") + socket.stubs(:peer_ip).returns(Net::SSH::Transport::PacketStream::PROXY_COMMAND_HOST_IP) + assert_equal "1.2.3.4", session.host_as_string + end + + def test_host_as_string_should_return_only_host_and_port_when_host_is_ip_and_port_is_not_default_and_proxy_command_is_set + session!(:host => "1.2.3.4", :port => 1234) + socket.stubs(:peer_ip).returns(Net::SSH::Transport::PacketStream::PROXY_COMMAND_HOST_IP) + assert_equal "[1.2.3.4]:1234", session.host_as_string + end + def test_close_should_cleanup_and_close_socket session! socket.expects(:cleanup) |