net-ssh 3.1.0.beta2 → 3.1.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8014163f04248cb8c0d06a2b0f9eb99650c4ca1f
4
- data.tar.gz: 4a3a4ffd2cc73052808781409b6be9bdf7a336a8
3
+ metadata.gz: e9170e4ec18254639ebeab82be271d685637f44f
4
+ data.tar.gz: 02f77daa8e46de9274ee27a9c2a432a3283df456
5
5
  SHA512:
6
- metadata.gz: e70e296ef1844a744fcbb69304203e8e758f5eaf2e5ab89ec3a4352c6fefd12a59395800aecf3efc4ba34b3dfed3ae6f0a729542da1c48173b88c5b0b4d15884
7
- data.tar.gz: 4c10b1d730425a42f606fc0119080894de291d6d7949854246b71bfe1a62d7056d59edce2e789ca7ef8355e4c6d2ff1c2a0158089f4213d8b8516e08f2dc4c23
6
+ metadata.gz: b5c05d3ed42d10f531f644c6eed5d57e481a5c67f0948f17b2e410371e447bcf472293c3821cc66c54eaff6be4d144184e6be92a264402003b552417f6fe7853
7
+ data.tar.gz: 2014b67019c22d96d73248e90a0c086d90b0824c77b6fe23786dd6a33c38264b60d135f1aacd06087319668d59327c62fc7b9861ec873b8f8d120a14e9e27e5d
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,4 +1,9 @@
1
- === 3.1.0.beta1
1
+ === 3.1.0.beta3
2
+
3
+ * forward/on_open_failed should stop listning closed socket otherwise it locks #269 [Miklos Fazekas,Scott McGillivray]
4
+ * fix incorrect pattern handling in config files #310 [Miklos Fazekas]
5
+
6
+ === 3.1.0.beta2
2
7
 
3
8
  * trying to execute something on a not yet opend channel throws nicer messag [Miklos Fazekas]
4
9
  * calling close on a not opened channel marks the channel for close [Miklos Fazekas]
data/Rakefile CHANGED
@@ -72,6 +72,31 @@ RDoc::Task.new do |rdoc|
72
72
  end
73
73
  end
74
74
 
75
+ namespace :rdoc do
76
+ desc "Update gh-pages branch"
77
+ task :publish do
78
+ # copy/checkout
79
+ rm_rf "/tmp/net-ssh-rdoc"
80
+ rm_rf "/tmp/net-ssh-gh-pages"
81
+ cp_r "./rdoc", "/tmp/net-ssh-rdoc"
82
+ mkdir "/tmp/net-ssh-gh-pages"
83
+ Dir.chdir "/tmp/net-ssh-gh-pages" do
84
+ sh "git clone --branch gh-pages --single-branch https://github.com/net-ssh/net-ssh"
85
+ rm_rf "/tmp/net-ssh-gh-pages/net-ssh/*"
86
+ end
87
+ # update
88
+ sh "cp -rf ./rdoc/* /tmp/net-ssh-gh-pages/net-ssh/"
89
+ Dir.chdir "/tmp/net-ssh-gh-pages/net-ssh" do
90
+ sh "git add -A ."
91
+ sh "git commit -m \"Update docs\""
92
+ end
93
+ # publish
94
+ Dir.chdir "/tmp/net-ssh-gh-pages/net-ssh" do
95
+ sh "git push origin gh-pages"
96
+ end
97
+ end
98
+ end
99
+
75
100
  require 'rake/testtask'
76
101
  Rake::TestTask.new do |t|
77
102
  if ENV['NET_SSH_RUN_INTEGRATION_TESTS']
@@ -69,7 +69,7 @@ module Net; module SSH; module Authentication
69
69
  attempted << name
70
70
 
71
71
  debug { "trying #{name}" }
72
- begin
72
+ begin
73
73
  method = Methods.const_get(name.split(/\W+/).map { |p| p.capitalize }.join).new(self, :key_manager => key_manager)
74
74
  rescue NameError
75
75
  debug{"Mechanism #{name} was requested, but isn't a known type. Ignoring it."}
@@ -242,11 +242,22 @@ module Net; module SSH
242
242
  # Converts an ssh_config pattern into a regex for matching against
243
243
  # host names.
244
244
  def pattern2regex(pattern)
245
- pattern = "^" + pattern.to_s.gsub(/\./, "\\.").
246
- gsub(/\?/, '.').
247
- gsub(/([+\/])/, '\\\\\\0').
248
- gsub(/\*/, '.*') + "$"
249
- Regexp.new(pattern, true)
245
+ tail = pattern
246
+ prefix = ""
247
+ while !tail.empty? do
248
+ head,sep,tail = tail.partition(/[\*\?]/)
249
+ prefix = prefix + Regexp.quote(head)
250
+ case sep
251
+ when '*'
252
+ prefix += '.*'
253
+ when '?'
254
+ prefix += '.'
255
+ when ''
256
+ else
257
+ fail "Unpexpcted sep:#{sep}"
258
+ end
259
+ end
260
+ Regexp.new("^" + prefix + "$", true)
250
261
  end
251
262
 
252
263
  # Converts the given size into an integer number of bytes.
@@ -51,7 +51,7 @@ module Net; module SSH
51
51
  class <<self
52
52
 
53
53
  # Searches all known host files (see KnownHosts.hostfiles) for all keys
54
- # of the given host. Returns an array of keys found.
54
+ # of the given host. Returns an enumerable of keys found.
55
55
  def search_for(host, options={})
56
56
  HostKeys.new(search_in(hostfiles(options), host), host, self, options)
57
57
  end
@@ -91,6 +91,7 @@ module Net; module SSH; module Service
91
91
 
92
92
  channel.on_open_failed do |ch, code, description|
93
93
  channel.error { "could not establish direct channel: #{description} (#{code})" }
94
+ session.stop_listening_to(channel[:socket])
94
95
  channel[:socket].close
95
96
  end
96
97
  end
@@ -273,7 +274,6 @@ module Net; module SSH; module Service
273
274
  ch[:socket].enqueue(data)
274
275
  end
275
276
 
276
- # Handles server close on the sending side by Miklós Fazekas
277
277
  channel.on_eof do |ch|
278
278
  debug { "eof #{type} on #{type} forwarded channel" }
279
279
  begin
@@ -55,7 +55,7 @@ module Net; module SSH
55
55
 
56
56
  # The prerelease component of this version of the Net::SSH library
57
57
  # nil allowed
58
- PRE = "beta2"
58
+ PRE = "beta3"
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)
@@ -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.1.0.beta2 ruby lib
5
+ # stub: net-ssh 3.1.0.beta3 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "net-ssh"
9
- s.version = "3.1.0.beta2"
9
+ s.version = "3.1.0.beta3"
10
10
 
11
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-03-05"
15
+ s.date = "2016-03-07"
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 = [
@@ -287,8 +287,8 @@ class TestForward < Test::Unit::TestCase
287
287
  end
288
288
  end
289
289
 
290
- def start_server
291
- server = TCPServer.open(0)
290
+ def start_server(server = nil, &block)
291
+ server ||= TCPServer.open(0)
292
292
  Thread.start do
293
293
  loop do
294
294
  Thread.start(server.accept) do |client|
@@ -432,4 +432,101 @@ class TestForward < Test::Unit::TestCase
432
432
  end
433
433
  end
434
434
  end
435
+
436
+ def _run_reading_client(client_done, local_port)
437
+ Thread.start do
438
+ begin
439
+ client = TCPSocket.new(localhost, local_port)
440
+ data = client.read(4096)
441
+ client.close
442
+ client_done << data
443
+ rescue
444
+ client_done << $!
445
+ end
446
+ end
447
+ end
448
+
449
+ def test_cannot_open_connection_should_allow_further_connections_on_different_forward
450
+ setup_ssh_env do
451
+ session = Net::SSH.start(*ssh_start_params)
452
+ server = start_server do |client|
453
+ data = client.write "hello"
454
+ client.close
455
+ end
456
+ # Forward to a non existing port
457
+ non_existing_port = 1234
458
+ local_port = session.forward.local(0, localhost, non_existing_port)
459
+ # should return connection refused
460
+ client_done = Queue.new
461
+ _run_reading_client(client_done, local_port)
462
+ timeout(5) do
463
+ session.loop(0.1) { client_done.empty? }
464
+ end
465
+ assert_equal nil, client_done.pop
466
+ assert client_done.empty?
467
+ # Forward to existing port
468
+ remote_port = server.addr[1]
469
+ local_port = session.forward.local(0, localhost, remote_port)
470
+ _run_reading_client(client_done, local_port)
471
+ timeout(5) do
472
+ session.loop(0.1) { client_done.empty? }
473
+ end
474
+ assert_equal "hello", client_done.pop
475
+ assert client_done.empty?
476
+ end
477
+ end
478
+
479
+ def test_cannot_open_connection_should_allow_further_connections_on_same
480
+ setup_ssh_env do
481
+ session = Net::SSH.start(*ssh_start_params)
482
+ server = TCPServer.open(0)
483
+ # Forward to a non existing port
484
+ remote_port = server.addr[1]
485
+ server.close
486
+ local_port = session.forward.local(0, localhost, remote_port)
487
+ # should return connection refused
488
+ client_done = Queue.new
489
+ _run_reading_client(client_done, local_port)
490
+ timeout(5) do
491
+ session.loop(0.1) { client_done.empty? }
492
+ end
493
+ assert_equal nil, client_done.pop
494
+ assert client_done.empty?
495
+ # start server
496
+ server = TCPServer.open(remote_port)
497
+ server = start_server(server) do |client|
498
+ data = client.write "hello"
499
+ client.close
500
+ end
501
+ _run_reading_client(client_done, local_port)
502
+ timeout(5) do
503
+ session.loop(0.1) { client_done.empty? }
504
+ end
505
+ assert_equal "hello", client_done.pop
506
+ assert client_done.empty?
507
+ end
508
+ end
509
+
510
+ def test_cancel_local
511
+ setup_ssh_env do
512
+ session = Net::SSH.start(*ssh_start_params)
513
+ server = start_server(server) do |client|
514
+ data = client.write "hello"
515
+ client.close
516
+ end
517
+ remote_port = server.addr[1]
518
+ local_port = session.forward.local(0, localhost, remote_port)
519
+ # run client
520
+ client_done = Queue.new
521
+ _run_reading_client(client_done, local_port)
522
+ timeout(5) do
523
+ session.loop(0.1) { client_done.empty? }
524
+ end
525
+ assert_equal "hello", client_done.pop
526
+ # cancel
527
+ session.forward.cancel_local(local_port)
528
+ session.loop(0.1)
529
+ assert_equal({}, session.channels)
530
+ end
531
+ end
435
532
  end
@@ -1,6 +1,7 @@
1
1
  require 'common'
2
2
  require 'net/ssh/config'
3
3
  require 'pathname'
4
+ require 'tempfile'
4
5
 
5
6
  class TestConfig < Test::Unit::TestCase
6
7
  def test_home_should_be_absolute_path
@@ -41,6 +42,33 @@ class TestConfig < Test::Unit::TestCase
41
42
  assert !config.key?('compression')
42
43
  end
43
44
 
45
+ def test_load_with_pattern_does_match
46
+ data = %q{
47
+ Host test.*
48
+ Port 1234
49
+ Compression no
50
+ }
51
+ with_config_from_data data do |f|
52
+ config = Net::SSH::Config.load(f, "test.host")
53
+ assert_equal 1234, config['port']
54
+ end
55
+ end
56
+
57
+ def test_load_with_regex_chars
58
+ data = %q{
59
+ Host |
60
+ Port 1234
61
+ Compression no
62
+ }
63
+ with_config_from_data data do |f|
64
+ config = Net::SSH::Config.load(f, "test.host")
65
+ assert_equal nil, config['port']
66
+ config = Net::SSH::Config.load(f, "|")
67
+ assert_equal 1234, config['port']
68
+ end
69
+ end
70
+
71
+
44
72
  def test_for_should_load_all_files_and_translate_to_net_ssh_options
45
73
  config = Net::SSH::Config.for("test.host", [config(:exact_match), config(:wild_cards)])
46
74
  assert_equal 1234, config[:port]
@@ -229,4 +257,12 @@ class TestConfig < Test::Unit::TestCase
229
257
  def config(name)
230
258
  "test/configs/#{name}"
231
259
  end
260
+
261
+ def with_config_from_data(data, &block)
262
+ Tempfile.open('config') do |f|
263
+ f.write(data)
264
+ f.close
265
+ yield(f.path)
266
+ end
267
+ end
232
268
  end
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.1.0.beta2
4
+ version: 3.1.0.beta3
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-03-05 00:00:00.000000000 Z
34
+ date: 2016-03-07 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: test-unit
metadata.gz.sig CHANGED
Binary file