net-ssh 3.1.0.beta2 → 3.1.0.beta3

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 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