net-ssh 3.2.1.beta1 → 3.3.0.beta1

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: 2b70a2425fdf49f8f1e6353496a73a40c9652fae
4
- data.tar.gz: 818db2812acacebc41e27025eeff31465ecb3fef
3
+ metadata.gz: b4ac524bacb278642fe098d34f8f85d1a4f0579f
4
+ data.tar.gz: b6725236e2cae6de59f5994602cf3ead0c39bd8d
5
5
  SHA512:
6
- metadata.gz: dc0f9d07cf95a5ec2a80664027fe4b86f780b3cdba4ec8bdbf4127dfed157c3f0b335dfb7305929605ef4faa9868451e246fde3c5e255a1933c5cefc4cc43389
7
- data.tar.gz: 00362b48e089f72fedf9ef432c7bc04b91ad81d09fd773683c752e4953ac8e3cd89492a559ef492b9400f7d216bf5c01e3fc0fdd32a4f936e02fed8932bc1c2d
6
+ metadata.gz: d3e76a59cde72ff7dba71135482a0409b295e6b624a5b7c870bb8fd87d55af9c3cc446237dd8ffa3e53da453fbda52e3d96979e83d032c22177b7dfb62ebeca2
7
+ data.tar.gz: adcd1157982585d306d5bed0fcf5b64e9c001674d511054b683a4fee1ac0a75aa023fb462ff02f335570717fc6d011dc14bd6bc7273d2b2cf80437909f7d88f4
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/.travis.yml CHANGED
@@ -7,7 +7,6 @@ rvm:
7
7
  - 2.3.0
8
8
  - jruby-head
9
9
  - jruby-19mode
10
- - rbx-2
11
10
 
12
11
  install: gem install test-unit mocha
13
12
 
data/CHANGES.txt CHANGED
@@ -1,3 +1,7 @@
1
+ === 3.3.0 beta 1
2
+
3
+ * UTF-8 buffer building encoding fixes [Ethan J. Brown, #434]
4
+
1
5
  === 3.2.1 beta 1
2
6
 
3
7
  * Fix pageant/windows [Elconas, #385]
@@ -147,7 +147,7 @@ module Net
147
147
 
148
148
  if info[:key]
149
149
  return Net::SSH::Buffer.from(:string, identity.ssh_type,
150
- :string, info[:key].ssh_do_sign(data.to_s)).to_s
150
+ :mstring, info[:key].ssh_do_sign(data.to_s)).to_s
151
151
  end
152
152
 
153
153
  if info[:from] == :agent
@@ -34,6 +34,7 @@ module Net; module SSH
34
34
  # * :long => write a 4-byte integer (#write_long)
35
35
  # * :byte => write a single byte (#write_byte)
36
36
  # * :string => write a 4-byte length followed by character data (#write_string)
37
+ # * :mstring => same as string, but caller cannot resuse the string, avoids potential duplication (#write_moved)
37
38
  # * :bool => write a single byte, interpreted as a boolean (#write_bool)
38
39
  # * :bignum => write an SSH-encoded bignum (#write_bignum)
39
40
  # * :key => write an SSH-encoded key value (#write_key)
@@ -182,7 +183,7 @@ module Net; module SSH
182
183
  consume!
183
184
  data
184
185
  end
185
-
186
+
186
187
  # Return the next 8 bytes as a 64-bit integer (in network byte order).
187
188
  # Returns nil if there are less than 8 bytes remaining to be read in the
188
189
  # buffer.
@@ -281,7 +282,14 @@ module Net; module SSH
281
282
  # Writes the given data literally into the string. Does not alter the
282
283
  # read position. Returns the buffer object.
283
284
  def write(*data)
284
- data.each { |datum| @content << datum }
285
+ data.each { |datum| @content << datum.dup.force_encoding('BINARY') }
286
+ self
287
+ end
288
+
289
+ # Optimized version of write where the caller gives up ownership of string
290
+ # to the method. This way we can mutate the string.
291
+ def write_moved(string)
292
+ @content << string.force_encoding('BINARY')
285
293
  self
286
294
  end
287
295
 
@@ -324,6 +332,19 @@ module Net; module SSH
324
332
  self
325
333
  end
326
334
 
335
+ # Writes each argument to the buffer as an SSH2-encoded string. Each
336
+ # string is prefixed by its length, encoded as a 4-byte long integer.
337
+ # Does not alter the read position. Returns the buffer object.
338
+ # Might alter arguments see write_moved
339
+ def write_mstring(*text)
340
+ text.each do |string|
341
+ s = string.to_s
342
+ write_long(s.bytesize)
343
+ write_moved(s)
344
+ end
345
+ self
346
+ end
347
+
327
348
  # Writes each argument to the buffer as a (C-style) boolean, with 1
328
349
  # meaning true, and 0 meaning false. Does not alter the read position.
329
350
  # Returns the buffer object.
@@ -368,6 +368,7 @@ module Net; module SSH; module Connection
368
368
  channel.wait
369
369
 
370
370
  channel[:result] ||= "" unless block
371
+ channel[:result] &&= channel[:result].force_encoding("UTF-8") unless block
371
372
 
372
373
  return channel[:result]
373
374
  end
@@ -295,8 +295,8 @@ module Net; module SSH; module Transport
295
295
 
296
296
  Net::SSH::Buffer.from(:byte, KEXINIT,
297
297
  :long, [rand(0xFFFFFFFF), rand(0xFFFFFFFF), rand(0xFFFFFFFF), rand(0xFFFFFFFF)],
298
- :string, [kex, host_key, encryption, encryption, hmac, hmac],
299
- :string, [compression, compression, language, language],
298
+ :mstring, [kex, host_key, encryption, encryption, hmac, hmac],
299
+ :mstring, [compression, compression, language, language],
300
300
  :bool, false, :long, 0)
301
301
  end
302
302
 
@@ -57,7 +57,7 @@ module Net; module SSH; module Transport; module Kex
57
57
  # send the KEXECDH_INIT message
58
58
  ## byte SSH_MSG_KEX_ECDH_INIT
59
59
  ## string Q_C, client's ephemeral public key octet string
60
- buffer = Net::SSH::Buffer.from(:byte, init, :string, ecdh.public_key.to_bn.to_s(2))
60
+ buffer = Net::SSH::Buffer.from(:byte, init, :mstring, ecdh.public_key.to_bn.to_s(2))
61
61
  connection.send_message(buffer)
62
62
 
63
63
  # expect the following KEXECDH_REPLY message
@@ -185,7 +185,7 @@ module OpenSSL
185
185
  def to_blob
186
186
  @blob ||= Net::SSH::Buffer.from(:string, ssh_type,
187
187
  :string, CurveNameAliasInv[self.group.curve_name],
188
- :string, self.public_key.to_bn.to_s(2)).to_s
188
+ :mstring, self.public_key.to_bn.to_s(2)).to_s
189
189
  @blob
190
190
  end
191
191
 
@@ -48,10 +48,10 @@ 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 = 2
51
+ MINOR = 3
52
52
 
53
53
  # The tiny component of this version of the Net::SSH library
54
- TINY = 1
54
+ TINY = 0
55
55
 
56
56
  # The prerelease component of this version of the Net::SSH library
57
57
  # nil allowed
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.2.1.beta1 ruby lib
5
+ # stub: net-ssh 3.3.0.beta1 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "net-ssh"
9
- s.version = "3.2.1.beta1"
9
+ s.version = "3.3.0.beta1"
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-08-10"
15
+ s.date = "2016-11-09"
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 = [
@@ -144,6 +144,7 @@ Gem::Specification.new do |s|
144
144
  "test/integration/Vagrantfile",
145
145
  "test/integration/common.rb",
146
146
  "test/integration/playbook.yml",
147
+ "test/integration/test_encoding.rb",
147
148
  "test/integration/test_forward.rb",
148
149
  "test/integration/test_id_rsa_keys.rb",
149
150
  "test/integration/test_proxy.rb",
@@ -191,7 +192,7 @@ Gem::Specification.new do |s|
191
192
  s.licenses = ["MIT"]
192
193
  s.required_ruby_version = Gem::Requirement.new(">= 2.0")
193
194
  s.rubyforge_project = "net-ssh"
194
- s.rubygems_version = "2.4.6"
195
+ s.rubygems_version = "2.5.1"
195
196
  s.signing_key = "/mnt/gem/net-ssh-private_key.pem"
196
197
  s.summary = "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol."
197
198
 
@@ -0,0 +1,23 @@
1
+ require_relative 'common'
2
+ require 'fileutils'
3
+ require 'tmpdir'
4
+
5
+ require 'net/ssh'
6
+
7
+ class TestEncoding < NetSSHTest
8
+ def test_unicode_character
9
+ ret = Net::SSH.start("localhost", "net_ssh_1", password: 'foopwd') do |ssh|
10
+ ssh.exec! "echo \"hello from:$USER\" \u2603"
11
+ end
12
+ assert_equal ret, "hello from:net_ssh_1 \u2603\n"
13
+ end
14
+
15
+ def test_long_command_with_unicode_in_it
16
+ string = "eeeeeeeeeeeeeeeeeeeeeeeeeewwowowowìeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
17
+ command = "echo \"#{string}\""
18
+ ret = Net::SSH.start("localhost", "net_ssh_1", password: 'foopwd') do |ssh|
19
+ ssh.exec! command
20
+ end
21
+ assert_equal ret, "#{string}\n"
22
+ end
23
+ end
data/test/test_buffer.rb CHANGED
@@ -26,6 +26,34 @@ class TestBuffer < Test::Unit::TestCase
26
26
  assert_equal "\1\0\0\0\2\0\0\0\0\0\0\0\3\0\0\0\0014\1\0\000\000\000\004I\226\002\322something", buffer.to_s
27
27
  end
28
28
 
29
+ def test_from_should_build_new_buffer_that_includes_utf8_string_128_characters
30
+ length = 128
31
+ # letter A has a 1 byte UTF8 representation
32
+ buffer = Net::SSH::Buffer.from(:long, 2, :string, 'A' * length)
33
+ # long of 2 + length 128 as network endian + 128 A's
34
+ expected = "\x00\x00\x00\x02" + [length].pack('N*') + ("\x41" * length)
35
+ assert_equal expected, buffer.to_s
36
+ end
37
+
38
+ def test_from_should_build_new_buffer_with_frozen_strings
39
+ foo = 'foo'.freeze
40
+ buffer = Net::SSH::Buffer.from(:string, foo)
41
+ assert_equal "\0\0\0\3foo", buffer.to_s
42
+ end
43
+
44
+ def test_from_should_build_new_buffer_with_utf8_frozen_strings
45
+ foo = "\u2603".freeze
46
+ buffer = Net::SSH::Buffer.from(:string, foo)
47
+ assert_equal "\0\0\0\3\u2603".force_encoding('BINARY'), buffer.to_s
48
+ end
49
+
50
+ def test_from_should_not_change_regular_paramaters
51
+ foo = "\u2603"
52
+ buffer = Net::SSH::Buffer.from(:string, foo)
53
+ assert_equal "\0\0\0\3\u2603".force_encoding('BINARY'), buffer.to_s
54
+ assert_equal foo.encoding.to_s, "UTF-8"
55
+ end
56
+
29
57
  def test_from_with_array_argument_should_write_multiple_of_the_given_type
30
58
  buffer = Net::SSH::Buffer.from(:byte, [1,2,3,4,5])
31
59
  assert_equal "\1\2\3\4\5", buffer.to_s
@@ -33,7 +61,7 @@ class TestBuffer < Test::Unit::TestCase
33
61
 
34
62
  def test_from_should_measure_bytesize_of_utf_8_string_correctly
35
63
  buffer = Net::SSH::Buffer.from(:string, "\u2603") # Snowman is 3 bytes
36
- assert_equal "\0\0\0\3\u2603", buffer.to_s
64
+ assert_equal "\0\0\0\3\u2603".force_encoding('BINARY'), buffer.to_s
37
65
  end
38
66
 
39
67
  def test_read_without_argument_should_read_to_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.2.1.beta1
4
+ version: 3.3.0.beta1
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-08-10 00:00:00.000000000 Z
34
+ date: 2016-11-09 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: test-unit
@@ -195,6 +195,7 @@ files:
195
195
  - test/integration/Vagrantfile
196
196
  - test/integration/common.rb
197
197
  - test/integration/playbook.yml
198
+ - test/integration/test_encoding.rb
198
199
  - test/integration/test_forward.rb
199
200
  - test/integration/test_id_rsa_keys.rb
200
201
  - test/integration/test_proxy.rb
@@ -257,7 +258,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
257
258
  version: 1.3.1
258
259
  requirements: []
259
260
  rubyforge_project: net-ssh
260
- rubygems_version: 2.4.6
261
+ rubygems_version: 2.5.1
261
262
  signing_key:
262
263
  specification_version: 4
263
264
  summary: 'Net::SSH: a pure-Ruby implementation of the SSH2 client protocol.'
metadata.gz.sig CHANGED
@@ -1,3 +1 @@
1
- B[�����|�a}-X8q��N���u]K-��Z�[��(�%�!
2
- ���
3
- srU��Qh���5����� �ȡ/�m ���CE"G=����R�^�8��O��@`8�W�Y��o���!�k�G~�o�bP��"�w��$��I7^��V��i V�'l�;t
1
+ �������v��qD�8�6��� ��6(k�M�Q^�:gI�}I����Օ����6|�A��޲�c��#_���>H��'�K��֡�?\�c'��{��}�KXm/Eu��9�(�d�s ����2���_UӔ}��!ܪ�a�w@���G��:\>�!Ӛ`lŖ`��G�\�r<а���П�t���W�zБ��v�;�Zָ��{4���Hĝ^�b���7m*&Rn��<' ӟ( �����p�[t���7