net-ssh 4.2.0 → 7.0.1

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.
Files changed (126) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.dockerignore +6 -0
  4. data/.github/config/rubocop_linter_action.yml +4 -0
  5. data/.github/workflows/ci-with-docker.yml +44 -0
  6. data/.github/workflows/ci.yml +87 -0
  7. data/.github/workflows/rubocop.yml +13 -0
  8. data/.gitignore +7 -0
  9. data/.rubocop.yml +19 -2
  10. data/.rubocop_todo.yml +619 -667
  11. data/CHANGES.txt +110 -1
  12. data/Dockerfile +27 -0
  13. data/Dockerfile.openssl3 +17 -0
  14. data/Gemfile +3 -7
  15. data/{Gemfile.norbnacl → Gemfile.noed25519} +3 -1
  16. data/Manifest +4 -5
  17. data/README.md +293 -0
  18. data/Rakefile +45 -29
  19. data/appveyor.yml +8 -6
  20. data/docker-compose.yml +23 -0
  21. data/lib/net/ssh/authentication/agent.rb +248 -223
  22. data/lib/net/ssh/authentication/certificate.rb +178 -164
  23. data/lib/net/ssh/authentication/constants.rb +17 -15
  24. data/lib/net/ssh/authentication/ed25519.rb +141 -116
  25. data/lib/net/ssh/authentication/ed25519_loader.rb +28 -28
  26. data/lib/net/ssh/authentication/key_manager.rb +79 -36
  27. data/lib/net/ssh/authentication/methods/abstract.rb +62 -47
  28. data/lib/net/ssh/authentication/methods/hostbased.rb +34 -37
  29. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +3 -3
  30. data/lib/net/ssh/authentication/methods/none.rb +16 -19
  31. data/lib/net/ssh/authentication/methods/password.rb +15 -16
  32. data/lib/net/ssh/authentication/methods/publickey.rb +96 -55
  33. data/lib/net/ssh/authentication/pageant.rb +468 -465
  34. data/lib/net/ssh/authentication/pub_key_fingerprint.rb +43 -0
  35. data/lib/net/ssh/authentication/session.rb +131 -122
  36. data/lib/net/ssh/buffer.rb +385 -332
  37. data/lib/net/ssh/buffered_io.rb +150 -151
  38. data/lib/net/ssh/config.rb +316 -239
  39. data/lib/net/ssh/connection/channel.rb +635 -613
  40. data/lib/net/ssh/connection/constants.rb +29 -29
  41. data/lib/net/ssh/connection/event_loop.rb +104 -95
  42. data/lib/net/ssh/connection/keepalive.rb +55 -51
  43. data/lib/net/ssh/connection/session.rb +614 -611
  44. data/lib/net/ssh/connection/term.rb +125 -123
  45. data/lib/net/ssh/errors.rb +101 -99
  46. data/lib/net/ssh/key_factory.rb +194 -108
  47. data/lib/net/ssh/known_hosts.rb +212 -134
  48. data/lib/net/ssh/loggable.rb +50 -49
  49. data/lib/net/ssh/packet.rb +83 -79
  50. data/lib/net/ssh/prompt.rb +51 -51
  51. data/lib/net/ssh/proxy/command.rb +105 -91
  52. data/lib/net/ssh/proxy/errors.rb +12 -10
  53. data/lib/net/ssh/proxy/http.rb +81 -81
  54. data/lib/net/ssh/proxy/https.rb +37 -36
  55. data/lib/net/ssh/proxy/jump.rb +49 -48
  56. data/lib/net/ssh/proxy/socks4.rb +2 -6
  57. data/lib/net/ssh/proxy/socks5.rb +14 -17
  58. data/lib/net/ssh/service/forward.rb +365 -362
  59. data/lib/net/ssh/test/channel.rb +145 -143
  60. data/lib/net/ssh/test/extensions.rb +131 -127
  61. data/lib/net/ssh/test/kex.rb +34 -32
  62. data/lib/net/ssh/test/local_packet.rb +46 -44
  63. data/lib/net/ssh/test/packet.rb +87 -84
  64. data/lib/net/ssh/test/remote_packet.rb +32 -30
  65. data/lib/net/ssh/test/script.rb +155 -155
  66. data/lib/net/ssh/test/socket.rb +49 -48
  67. data/lib/net/ssh/test.rb +82 -80
  68. data/lib/net/ssh/transport/algorithms.rb +433 -364
  69. data/lib/net/ssh/transport/cipher_factory.rb +95 -91
  70. data/lib/net/ssh/transport/constants.rb +32 -24
  71. data/lib/net/ssh/transport/ctr.rb +37 -15
  72. data/lib/net/ssh/transport/hmac/abstract.rb +81 -63
  73. data/lib/net/ssh/transport/hmac/md5.rb +0 -2
  74. data/lib/net/ssh/transport/hmac/md5_96.rb +0 -2
  75. data/lib/net/ssh/transport/hmac/none.rb +0 -2
  76. data/lib/net/ssh/transport/hmac/ripemd160.rb +0 -2
  77. data/lib/net/ssh/transport/hmac/sha1.rb +0 -2
  78. data/lib/net/ssh/transport/hmac/sha1_96.rb +0 -2
  79. data/lib/net/ssh/transport/hmac/sha2_256.rb +7 -11
  80. data/lib/net/ssh/transport/hmac/sha2_256_96.rb +4 -8
  81. data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
  82. data/lib/net/ssh/transport/hmac/sha2_512.rb +6 -9
  83. data/lib/net/ssh/transport/hmac/sha2_512_96.rb +4 -8
  84. data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
  85. data/lib/net/ssh/transport/hmac.rb +14 -12
  86. data/lib/net/ssh/transport/identity_cipher.rb +54 -52
  87. data/lib/net/ssh/transport/kex/abstract.rb +130 -0
  88. data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
  89. data/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
  90. data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
  91. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +33 -40
  92. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
  93. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +112 -217
  94. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +53 -63
  95. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +5 -9
  96. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +36 -90
  97. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +18 -10
  98. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +18 -10
  99. data/lib/net/ssh/transport/kex.rb +15 -12
  100. data/lib/net/ssh/transport/key_expander.rb +24 -21
  101. data/lib/net/ssh/transport/openssl.rb +158 -133
  102. data/lib/net/ssh/transport/packet_stream.rb +223 -191
  103. data/lib/net/ssh/transport/server_version.rb +55 -56
  104. data/lib/net/ssh/transport/session.rb +306 -259
  105. data/lib/net/ssh/transport/state.rb +178 -176
  106. data/lib/net/ssh/verifiers/accept_new.rb +33 -0
  107. data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +33 -0
  108. data/lib/net/ssh/verifiers/always.rb +58 -0
  109. data/lib/net/ssh/verifiers/never.rb +19 -0
  110. data/lib/net/ssh/version.rb +55 -53
  111. data/lib/net/ssh.rb +47 -34
  112. data/net-ssh-public_cert.pem +18 -19
  113. data/net-ssh.gemspec +12 -11
  114. data/support/ssh_tunnel_bug.rb +5 -5
  115. data.tar.gz.sig +0 -0
  116. metadata +78 -73
  117. metadata.gz.sig +0 -0
  118. data/.travis.yml +0 -51
  119. data/Gemfile.norbnacl.lock +0 -41
  120. data/README.rdoc +0 -169
  121. data/lib/net/ssh/ruby_compat.rb +0 -24
  122. data/lib/net/ssh/verifiers/lenient.rb +0 -30
  123. data/lib/net/ssh/verifiers/null.rb +0 -12
  124. data/lib/net/ssh/verifiers/secure.rb +0 -52
  125. data/lib/net/ssh/verifiers/strict.rb +0 -24
  126. data/support/arcfour_check.rb +0 -20
@@ -1,135 +1,135 @@
1
1
  require 'net/ssh/buffer'
2
2
  require 'net/ssh/loggable'
3
- require 'net/ssh/ruby_compat'
4
-
5
- module Net; module SSH
6
-
7
- # This module is used to extend sockets and other IO objects, to allow
8
- # them to be buffered for both read and write. This abstraction makes it
9
- # quite easy to write a select-based event loop
10
- # (see Net::SSH::Connection::Session#listen_to).
11
- #
12
- # The general idea is that instead of calling #read directly on an IO that
13
- # has been extended with this module, you call #fill (to add pending input
14
- # to the internal read buffer), and then #read_available (to read from that
15
- # buffer). Likewise, you don't call #write directly, you call #enqueue to
16
- # add data to the write buffer, and then #send_pending or #wait_for_pending_sends
17
- # to actually send the data across the wire.
18
- #
19
- # In this way you can easily use the object as an argument to IO.select,
20
- # calling #fill when it is available for read, or #send_pending when it is
21
- # available for write, and then call #enqueue and #read_available during
22
- # the idle times.
23
- #
24
- # socket = TCPSocket.new(address, port)
25
- # socket.extend(Net::SSH::BufferedIo)
26
- #
27
- # ssh.listen_to(socket)
28
- #
29
- # ssh.loop do
30
- # if socket.available > 0
31
- # puts socket.read_available
32
- # socket.enqueue("response\n")
33
- # end
34
- # end
35
- #
36
- # Note that this module must be used to extend an instance, and should not
37
- # be included in a class. If you do want to use it via an include, then you
38
- # must make sure to invoke the private #initialize_buffered_io method in
39
- # your class' #initialize method:
40
- #
41
- # class Foo < IO
42
- # include Net::SSH::BufferedIo
43
- #
44
- # def initialize
45
- # initialize_buffered_io
46
- # # ...
47
- # end
48
- # end
49
- module BufferedIo
50
- include Loggable
51
-
52
- # Called when the #extend is called on an object, with this module as the
53
- # argument. It ensures that the modules instance variables are all properly
54
- # initialized.
55
- def self.extended(object) #:nodoc:
56
- # need to use __send__ because #send is overridden in Socket
57
- object.__send__(:initialize_buffered_io)
58
- end
59
3
 
60
- # Tries to read up to +n+ bytes of data from the remote end, and appends
61
- # the data to the input buffer. It returns the number of bytes read, or 0
62
- # if no data was available to be read.
63
- def fill(n=8192)
64
- input.consume!
65
- data = recv(n)
66
- debug { "read #{data.length} bytes" }
67
- input.append(data)
68
- return data.length
69
- rescue EOFError => e
70
- @input_errors << e
71
- return 0
72
- end
4
+ module Net
5
+ module SSH
6
+ # This module is used to extend sockets and other IO objects, to allow
7
+ # them to be buffered for both read and write. This abstraction makes it
8
+ # quite easy to write a select-based event loop
9
+ # (see Net::SSH::Connection::Session#listen_to).
10
+ #
11
+ # The general idea is that instead of calling #read directly on an IO that
12
+ # has been extended with this module, you call #fill (to add pending input
13
+ # to the internal read buffer), and then #read_available (to read from that
14
+ # buffer). Likewise, you don't call #write directly, you call #enqueue to
15
+ # add data to the write buffer, and then #send_pending or #wait_for_pending_sends
16
+ # to actually send the data across the wire.
17
+ #
18
+ # In this way you can easily use the object as an argument to IO.select,
19
+ # calling #fill when it is available for read, or #send_pending when it is
20
+ # available for write, and then call #enqueue and #read_available during
21
+ # the idle times.
22
+ #
23
+ # socket = TCPSocket.new(address, port)
24
+ # socket.extend(Net::SSH::BufferedIo)
25
+ #
26
+ # ssh.listen_to(socket)
27
+ #
28
+ # ssh.loop do
29
+ # if socket.available > 0
30
+ # puts socket.read_available
31
+ # socket.enqueue("response\n")
32
+ # end
33
+ # end
34
+ #
35
+ # Note that this module must be used to extend an instance, and should not
36
+ # be included in a class. If you do want to use it via an include, then you
37
+ # must make sure to invoke the private #initialize_buffered_io method in
38
+ # your class' #initialize method:
39
+ #
40
+ # class Foo < IO
41
+ # include Net::SSH::BufferedIo
42
+ #
43
+ # def initialize
44
+ # initialize_buffered_io
45
+ # # ...
46
+ # end
47
+ # end
48
+ module BufferedIo
49
+ include Loggable
50
+
51
+ # Called when the #extend is called on an object, with this module as the
52
+ # argument. It ensures that the modules instance variables are all properly
53
+ # initialized.
54
+ def self.extended(object) # :nodoc:
55
+ # need to use __send__ because #send is overridden in Socket
56
+ object.__send__(:initialize_buffered_io)
57
+ end
73
58
 
74
- # Read up to +length+ bytes from the input buffer. If +length+ is nil,
75
- # all available data is read from the buffer. (See #available.)
76
- def read_available(length=nil)
77
- input.read(length || available)
78
- end
59
+ # Tries to read up to +n+ bytes of data from the remote end, and appends
60
+ # the data to the input buffer. It returns the number of bytes read, or 0
61
+ # if no data was available to be read.
62
+ def fill(n = 8192)
63
+ input.consume!
64
+ data = recv(n)
65
+ debug { "read #{data.length} bytes" }
66
+ input.append(data)
67
+ return data.length
68
+ rescue EOFError => e
69
+ @input_errors << e
70
+ return 0
71
+ end
79
72
 
80
- # Returns the number of bytes available to be read from the input buffer.
81
- # (See #read_available.)
82
- def available
83
- input.available
84
- end
73
+ # Read up to +length+ bytes from the input buffer. If +length+ is nil,
74
+ # all available data is read from the buffer. (See #available.)
75
+ def read_available(length = nil)
76
+ input.read(length || available)
77
+ end
85
78
 
86
- # Enqueues data in the output buffer, to be written when #send_pending
87
- # is called. Note that the data is _not_ sent immediately by this method!
88
- def enqueue(data)
89
- output.append(data)
90
- end
79
+ # Returns the number of bytes available to be read from the input buffer.
80
+ # (See #read_available.)
81
+ def available
82
+ input.available
83
+ end
91
84
 
92
- # Returns +true+ if there is data waiting in the output buffer, and
93
- # +false+ otherwise.
94
- def pending_write?
95
- output.length > 0
96
- end
85
+ # Enqueues data in the output buffer, to be written when #send_pending
86
+ # is called. Note that the data is _not_ sent immediately by this method!
87
+ def enqueue(data)
88
+ output.append(data)
89
+ end
97
90
 
98
- # Sends as much of the pending output as possible. Returns +true+ if any
99
- # data was sent, and +false+ otherwise.
100
- def send_pending
101
- if output.length > 0
102
- sent = send(output.to_s, 0)
103
- debug { "sent #{sent} bytes" }
104
- output.consume!(sent)
105
- return sent > 0
106
- else
107
- return false
91
+ # Returns +true+ if there is data waiting in the output buffer, and
92
+ # +false+ otherwise.
93
+ def pending_write?
94
+ output.length > 0
108
95
  end
109
- end
110
96
 
111
- # Calls #send_pending repeatedly, if necessary, blocking until the output
112
- # buffer is empty.
113
- def wait_for_pending_sends
114
- send_pending
115
- while output.length > 0
116
- result = Net::SSH::Compat.io_select(nil, [self]) or next
117
- next unless result[1].any?
97
+ # Sends as much of the pending output as possible. Returns +true+ if any
98
+ # data was sent, and +false+ otherwise.
99
+ def send_pending
100
+ if output.length > 0
101
+ sent = send(output.to_s, 0)
102
+ debug { "sent #{sent} bytes" }
103
+ output.consume!(sent)
104
+ return sent > 0
105
+ else
106
+ return false
107
+ end
108
+ end
109
+
110
+ # Calls #send_pending repeatedly, if necessary, blocking until the output
111
+ # buffer is empty.
112
+ def wait_for_pending_sends
118
113
  send_pending
114
+ while output.length > 0
115
+ result = IO.select(nil, [self]) or next
116
+ next unless result[1].any?
117
+
118
+ send_pending
119
+ end
119
120
  end
120
- end
121
121
 
122
- public # these methods are primarily for use in tests
122
+ public # these methods are primarily for use in tests
123
123
 
124
- def write_buffer #:nodoc:
124
+ def write_buffer # :nodoc:
125
125
  output.to_s
126
126
  end
127
127
 
128
- def read_buffer #:nodoc:
128
+ def read_buffer # :nodoc:
129
129
  input.to_s
130
130
  end
131
131
 
132
- private
132
+ private
133
133
 
134
134
  #--
135
135
  # Can't use attr_reader here (after +private+) without incurring the
@@ -137,6 +137,7 @@ module Net; module SSH
137
137
  #++
138
138
 
139
139
  def input; @input; end
140
+
140
141
  def output; @output; end
141
142
 
142
143
  # Initializes the intput and output buffers for this object. This method
@@ -150,54 +151,52 @@ module Net; module SSH
150
151
  @output = Net::SSH::Buffer.new
151
152
  @output_errors = []
152
153
  end
153
- end
154
-
155
-
154
+ end
156
155
 
157
- # Fixes for two issues by Miklós Fazekas:
158
- #
159
- # * if client closes a forwarded connection, but the server is
160
- # reading, net-ssh terminates with IOError socket closed.
161
- # * if client force closes (RST) a forwarded connection, but
162
- # server is reading, net-ssh terminates with [an exception]
163
- #
164
- # See:
165
- #
166
- # http://net-ssh.lighthouseapp.com/projects/36253/tickets/7
167
- # http://github.com/net-ssh/net-ssh/tree/portfwfix
168
- #
169
- module ForwardedBufferedIo
170
- def fill(n=8192)
171
- begin
172
- super(n)
173
- rescue Errno::ECONNRESET => e
174
- debug { "connection was reset => shallowing exception:#{e}" }
175
- return 0
176
- rescue IOError => e
177
- if e.message =~ /closed/ then
156
+ # Fixes for two issues by Miklós Fazekas:
157
+ #
158
+ # * if client closes a forwarded connection, but the server is
159
+ # reading, net-ssh terminates with IOError socket closed.
160
+ # * if client force closes (RST) a forwarded connection, but
161
+ # server is reading, net-ssh terminates with [an exception]
162
+ #
163
+ # See:
164
+ #
165
+ # http://net-ssh.lighthouseapp.com/projects/36253/tickets/7
166
+ # http://github.com/net-ssh/net-ssh/tree/portfwfix
167
+ #
168
+ module ForwardedBufferedIo
169
+ def fill(n = 8192)
170
+ begin
171
+ super(n)
172
+ rescue Errno::ECONNRESET => e
178
173
  debug { "connection was reset => shallowing exception:#{e}" }
179
174
  return 0
180
- else
181
- raise
175
+ rescue IOError => e
176
+ if e.message =~ /closed/ then
177
+ debug { "connection was reset => shallowing exception:#{e}" }
178
+ return 0
179
+ else
180
+ raise
181
+ end
182
182
  end
183
183
  end
184
- end
185
184
 
186
- def send_pending
187
- begin
188
- super
189
- rescue Errno::ECONNRESET => e
190
- debug { "connection was reset => shallowing exception:#{e}" }
191
- return 0
192
- rescue IOError => e
193
- if e.message =~ /closed/ then
185
+ def send_pending
186
+ begin
187
+ super
188
+ rescue Errno::ECONNRESET => e
194
189
  debug { "connection was reset => shallowing exception:#{e}" }
195
190
  return 0
196
- else
197
- raise
191
+ rescue IOError => e
192
+ if e.message =~ /closed/ then
193
+ debug { "connection was reset => shallowing exception:#{e}" }
194
+ return 0
195
+ else
196
+ raise
197
+ end
198
198
  end
199
199
  end
200
200
  end
201
201
  end
202
-
203
- end; end
202
+ end