net-ssh 3.1.1 → 3.2.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +2 -1
- data.tar.gz.sig +0 -0
- data/CHANGES.txt +6 -0
- data/lib/net/ssh/connection/session.rb +16 -0
- data/lib/net/ssh/test/socket.rb +1 -1
- data/lib/net/ssh/transport/algorithms.rb +6 -0
- data/lib/net/ssh/transport/session.rb +1 -0
- data/lib/net/ssh/version.rb +3 -3
- data/net-ssh.gemspec +5 -5
- data/test/common.rb +16 -0
- data/test/connection/test_session.rb +1 -0
- data/test/integration/test_forward.rb +107 -2
- data/test/transport/test_session.rb +1 -1
- metadata +5 -5
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1477e274c366e8b51cf9112399b5c6b7854df2bd
|
4
|
+
data.tar.gz: 7e5884773d502b4dcde4013810e4be0369a77e9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f28aa655c03f370327c4a016652f8c48b535b6a7649d401763e28183e7718620eee881dfb4e0f40f1cda6d57954cd31ecd741be281bb2aa066fd8debd2d6637
|
7
|
+
data.tar.gz: 1b46532ef715789b9a81e2128a11cebcf332b7c413514b0ae3657b4ecafe2f519b90a10f20837ac217e60f7d3344b8b995df46de83e47c44fbdb8fa677ee43bc
|
checksums.yaml.gz.sig
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
?O���.-2~��}h��T�(����E1�JZ3���`�۷4RR�[k����G>,}r�o
|
2
|
+
;�|(��j���ã�:,nF����˶zn�XK�x�8^)1���Ȏo�q�ۃ�,�?��5���乨� '��٬�7�4������v�)�h�C�����ܰ\�%�!���1����7|�J�dmbˠ��~S̠�ˍV�-�Z�\]<�~��ܦ���J�4h�� ��f��������s �?lE�fT��
|
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGES.txt
CHANGED
@@ -210,6 +210,9 @@ module Net; module SSH; module Connection
|
|
210
210
|
readers, writers, = Net::SSH::Compat.io_select(r, w, nil, io_select_wait(wait))
|
211
211
|
|
212
212
|
postprocess(readers, writers)
|
213
|
+
rescue
|
214
|
+
force_channel_cleanup_on_close if closed?
|
215
|
+
raise
|
213
216
|
end
|
214
217
|
|
215
218
|
# This is called internally as part of #process. It dispatches any
|
@@ -475,6 +478,9 @@ module Net; module SSH; module Connection
|
|
475
478
|
|
476
479
|
send(MAP[packet.type], packet)
|
477
480
|
end
|
481
|
+
rescue
|
482
|
+
force_channel_cleanup_on_close if closed?
|
483
|
+
raise
|
478
484
|
end
|
479
485
|
|
480
486
|
# Returns the next available channel id to be assigned, and increments
|
@@ -483,6 +489,16 @@ module Net; module SSH; module Connection
|
|
483
489
|
@channel_id_counter += 1
|
484
490
|
end
|
485
491
|
|
492
|
+
def force_channel_cleanup_on_close
|
493
|
+
channels.each do |id, channel|
|
494
|
+
channel.remote_closed!
|
495
|
+
channel.close
|
496
|
+
|
497
|
+
cleanup_channel(channel)
|
498
|
+
channel.do_close
|
499
|
+
end
|
500
|
+
end
|
501
|
+
|
486
502
|
# Invoked when a global request is received. The registered global
|
487
503
|
# request callback will be invoked, if one exists, and the necessary
|
488
504
|
# reply returned.
|
data/lib/net/ssh/test/socket.rb
CHANGED
@@ -25,8 +25,8 @@ module Net; module SSH; module Test
|
|
25
25
|
|
26
26
|
@script = Script.new
|
27
27
|
|
28
|
-
script.gets(:kexinit, 1, 2, 3, 4, "test", "ssh-rsa", "none", "none", "none", "none", "none", "none", "", "", false)
|
29
28
|
script.sends(:kexinit)
|
29
|
+
script.gets(:kexinit, 1, 2, 3, 4, "test", "ssh-rsa", "none", "none", "none", "none", "none", "none", "", "", false)
|
30
30
|
script.sends(:newkeys)
|
31
31
|
script.gets(:newkeys)
|
32
32
|
end
|
@@ -124,6 +124,12 @@ module Net; module SSH; module Transport
|
|
124
124
|
prepare_preferred_algorithms!
|
125
125
|
end
|
126
126
|
|
127
|
+
# Start the algorithm negotation
|
128
|
+
def start
|
129
|
+
raise ArgumentError, "Cannot call start if it's negoitation started or done" if @pending || @initialized
|
130
|
+
send_kexinit
|
131
|
+
end
|
132
|
+
|
127
133
|
# Request a rekey operation. This will return immediately, and does not
|
128
134
|
# actually perform the rekey operation. It does cause the session to change
|
129
135
|
# state, however--until the key exchange finishes, no new packets will be
|
@@ -84,6 +84,7 @@ module Net; module SSH; module Transport
|
|
84
84
|
@server_version = ServerVersion.new(socket, logger, options[:timeout])
|
85
85
|
|
86
86
|
@algorithms = Algorithms.new(self, options)
|
87
|
+
@algorithms.start
|
87
88
|
wait { algorithms.initialized? }
|
88
89
|
rescue Errno::ETIMEDOUT
|
89
90
|
raise Net::SSH::ConnectionTimeout
|
data/lib/net/ssh/version.rb
CHANGED
@@ -48,14 +48,14 @@ module Net; module SSH
|
|
48
48
|
MAJOR = 3
|
49
49
|
|
50
50
|
# The minor component of this version of the Net::SSH library
|
51
|
-
MINOR =
|
51
|
+
MINOR = 2
|
52
52
|
|
53
53
|
# The tiny component of this version of the Net::SSH library
|
54
|
-
TINY =
|
54
|
+
TINY = 0
|
55
55
|
|
56
56
|
# The prerelease component of this version of the Net::SSH library
|
57
57
|
# nil allowed
|
58
|
-
PRE =
|
58
|
+
PRE = "rc1"
|
59
59
|
|
60
60
|
# The current version of the Net::SSH library as a Version instance
|
61
61
|
CURRENT = new(*[MAJOR, MINOR, TINY, PRE].compact)
|
data/net-ssh.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: net-ssh 3.
|
5
|
+
# stub: net-ssh 3.2.0.rc1 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "net-ssh"
|
9
|
-
s.version = "3.
|
9
|
+
s.version = "3.2.0.rc1"
|
10
10
|
|
11
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Jamis Buck", "Delano Mandelbaum", "Mikl\u{f3}s Fazekas"]
|
14
14
|
s.cert_chain = ["net-ssh-public_cert.pem"]
|
15
|
-
s.date = "2016-
|
15
|
+
s.date = "2016-05-27"
|
16
16
|
s.description = "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol. It allows you to write programs that invoke and interact with processes on remote servers, via SSH2."
|
17
17
|
s.email = "net-ssh@solutious.com"
|
18
18
|
s.extra_rdoc_files = [
|
@@ -191,7 +191,7 @@ Gem::Specification.new do |s|
|
|
191
191
|
s.licenses = ["MIT"]
|
192
192
|
s.required_ruby_version = Gem::Requirement.new(">= 2.0")
|
193
193
|
s.rubyforge_project = "net-ssh"
|
194
|
-
s.rubygems_version = "2.4.
|
194
|
+
s.rubygems_version = "2.4.3"
|
195
195
|
s.signing_key = "/mnt/gem/net-ssh-private_key.pem"
|
196
196
|
s.summary = "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol."
|
197
197
|
|
data/test/common.rb
CHANGED
@@ -15,6 +15,18 @@ require 'ostruct'
|
|
15
15
|
$original_config_default_files = Net::SSH::Config.default_files.dup
|
16
16
|
Net::SSH::Config.default_files.clear
|
17
17
|
|
18
|
+
def with_restored_default_files(&block)
|
19
|
+
act_default_files = Net::SSH::Config.default_files.dup
|
20
|
+
begin
|
21
|
+
Net::SSH::Config.default_files.clear
|
22
|
+
Net::SSH::Config.default_files.concat($_original_config_default_files) # rubocop:disable Style/GlobalVars
|
23
|
+
yield
|
24
|
+
ensure
|
25
|
+
Net::SSH::Config.default_files.clear
|
26
|
+
Net::SSH::Config.default_files.concat(act_default_files)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
18
30
|
def P(*args)
|
19
31
|
Net::SSH::Packet.new(Net::SSH::Buffer.from(*args))
|
20
32
|
end
|
@@ -71,6 +83,10 @@ class MockTransport < Net::SSH::Transport::Session
|
|
71
83
|
end
|
72
84
|
end
|
73
85
|
|
86
|
+
def closed?
|
87
|
+
false
|
88
|
+
end
|
89
|
+
|
74
90
|
def poll_message
|
75
91
|
@queue.shift
|
76
92
|
end
|
@@ -182,6 +182,7 @@ module Connection
|
|
182
182
|
end
|
183
183
|
|
184
184
|
def test_global_request_handler_returning_other_value_should_raise_error
|
185
|
+
transport.expects(:closed?).at_least_once.returns(false)
|
185
186
|
session.on_global_request("testing") { "bug" }
|
186
187
|
transport.return(GLOBAL_REQUEST, :string, "testing", :bool, true)
|
187
188
|
assert_raises(RuntimeError) { process_times(2) }
|
@@ -17,6 +17,7 @@
|
|
17
17
|
require_relative './common'
|
18
18
|
require 'net/ssh/buffer'
|
19
19
|
require 'net/ssh'
|
20
|
+
require 'net/ssh/proxy/command'
|
20
21
|
require 'timeout'
|
21
22
|
require 'tempfile'
|
22
23
|
|
@@ -31,8 +32,8 @@ class TestForward < Test::Unit::TestCase
|
|
31
32
|
'net_ssh_1'
|
32
33
|
end
|
33
34
|
|
34
|
-
def ssh_start_params
|
35
|
-
[localhost ,user , {:keys => @key_id_rsa
|
35
|
+
def ssh_start_params(options = {})
|
36
|
+
[localhost ,user , {:keys => @key_id_rsa}.merge(options)]
|
36
37
|
end
|
37
38
|
|
38
39
|
def setup_ssh_env(&block)
|
@@ -338,6 +339,110 @@ class TestForward < Test::Unit::TestCase
|
|
338
339
|
end
|
339
340
|
end
|
340
341
|
|
342
|
+
class TCPProxy
|
343
|
+
def initialize()
|
344
|
+
@sockets = []
|
345
|
+
end
|
346
|
+
attr_reader :sockets
|
347
|
+
|
348
|
+
def open(host, port, connection_options = nil)
|
349
|
+
socket = TCPSocket.new(host,port)
|
350
|
+
@sockets << socket
|
351
|
+
socket
|
352
|
+
end
|
353
|
+
|
354
|
+
def close_all
|
355
|
+
sockets.each do |socket|
|
356
|
+
socket.close
|
357
|
+
end
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
361
|
+
def test_transport_close_should_closes_channels_with_tcps
|
362
|
+
setup_ssh_env do
|
363
|
+
server = start_server do |client|
|
364
|
+
client.puts "Hello"
|
365
|
+
sleep(100)
|
366
|
+
client.puts "Hallo"
|
367
|
+
end
|
368
|
+
proxy = TCPProxy.new()
|
369
|
+
session = Net::SSH.start(*ssh_start_params(proxy: proxy))
|
370
|
+
remote_port = server.addr[1]
|
371
|
+
local_port = session.forward.local(0, localhost, remote_port)
|
372
|
+
|
373
|
+
# read on forwarded port
|
374
|
+
client_done = Queue.new
|
375
|
+
Thread.start do
|
376
|
+
begin
|
377
|
+
client = TCPSocket.new(localhost, local_port)
|
378
|
+
client.read(6)
|
379
|
+
proxy.close_all
|
380
|
+
client.read(7)
|
381
|
+
client.close
|
382
|
+
client_done << true
|
383
|
+
rescue
|
384
|
+
client_done << $!
|
385
|
+
end
|
386
|
+
end
|
387
|
+
Timeout.timeout(5) do
|
388
|
+
begin
|
389
|
+
session.loop(0.1) { true }
|
390
|
+
rescue EOFError, IOError
|
391
|
+
#puts "Error: #{$!} #{$!.backtrace.join("\n")}"
|
392
|
+
end
|
393
|
+
end
|
394
|
+
begin
|
395
|
+
Timeout.timeout(5) do
|
396
|
+
assert_equal true, client_done.pop
|
397
|
+
end
|
398
|
+
rescue
|
399
|
+
puts "Server error: #{server_error.class} #{server_error} bt:#{server_error.backtrace.join("\n")}"
|
400
|
+
raise
|
401
|
+
end
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
def todo_test_transport_close_should_closes_channels_with_proxy
|
406
|
+
setup_ssh_env do
|
407
|
+
server = start_server do |client|
|
408
|
+
client.puts "Hello"
|
409
|
+
sleep(100)
|
410
|
+
client.puts "Hallo"
|
411
|
+
end
|
412
|
+
proxy = Net::SSH::Proxy::Command.new("/bin/nc localhost 22")
|
413
|
+
session = Net::SSH.start(*ssh_start_params(proxy: proxy))
|
414
|
+
remote_port = server.addr[1]
|
415
|
+
local_port = session.forward.local(0, localhost, remote_port)
|
416
|
+
|
417
|
+
# read on forwarded port
|
418
|
+
client_done = Queue.new
|
419
|
+
Thread.start do
|
420
|
+
begin
|
421
|
+
client = TCPSocket.new(localhost, local_port)
|
422
|
+
client.read(6)
|
423
|
+
system("killall /bin/nc")
|
424
|
+
client.read(7)
|
425
|
+
client.close
|
426
|
+
client_done << true
|
427
|
+
rescue
|
428
|
+
client_done << $!
|
429
|
+
end
|
430
|
+
end
|
431
|
+
Timeout.timeout(5) do
|
432
|
+
begin
|
433
|
+
session.loop(0.1) { true }
|
434
|
+
rescue EOFError
|
435
|
+
begin
|
436
|
+
session.close
|
437
|
+
rescue
|
438
|
+
end
|
439
|
+
#puts "Error: #{$!} #{$!.backtrace.join("\n")}"
|
440
|
+
end
|
441
|
+
assert_equal true, client_done.pop
|
442
|
+
end
|
443
|
+
end
|
444
|
+
end
|
445
|
+
|
341
446
|
def test_client_close_should_be_handled
|
342
447
|
setup_ssh_env do
|
343
448
|
message = "This is a small message!"*1000
|
@@ -309,7 +309,7 @@ module Transport
|
|
309
309
|
end
|
310
310
|
|
311
311
|
def algorithms
|
312
|
-
@algorithms ||= stub("algorithms", :initialized? => true, :allow? => true)
|
312
|
+
@algorithms ||= stub("algorithms", :initialized? => true, :allow? => true, :start => true)
|
313
313
|
end
|
314
314
|
|
315
315
|
def session(options={})
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: net-ssh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.2.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamis Buck
|
@@ -31,7 +31,7 @@ cert_chain:
|
|
31
31
|
s/ZUKye79ELwFYKJOhjW5g725OL3hy+llhEleytwKRwgXFQBPTC4f5UkdxZVVWGH
|
32
32
|
e2C9M1m/2odPZo8h
|
33
33
|
-----END CERTIFICATE-----
|
34
|
-
date: 2016-
|
34
|
+
date: 2016-05-27 00:00:00.000000000 Z
|
35
35
|
dependencies:
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: test-unit
|
@@ -252,12 +252,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
252
252
|
version: '2.0'
|
253
253
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
254
254
|
requirements:
|
255
|
-
- - "
|
255
|
+
- - ">"
|
256
256
|
- !ruby/object:Gem::Version
|
257
|
-
version:
|
257
|
+
version: 1.3.1
|
258
258
|
requirements: []
|
259
259
|
rubyforge_project: net-ssh
|
260
|
-
rubygems_version: 2.4.
|
260
|
+
rubygems_version: 2.4.3
|
261
261
|
signing_key:
|
262
262
|
specification_version: 4
|
263
263
|
summary: 'Net::SSH: a pure-Ruby implementation of the SSH2 client protocol.'
|
metadata.gz.sig
CHANGED
Binary file
|