hrr_rb_ssh 0.1.9 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +12 -2
  3. data/README.md +11 -9
  4. data/demo/echo_server.rb +50 -42
  5. data/demo/server.rb +81 -62
  6. data/demo/subsystem_echo_server.rb +54 -47
  7. data/lib/hrr_rb_ssh/{transport/server_host_key_algorithm/ecdsa_sha2_nistp521 → algorithm/publickey/ecdsa_sha2}/ecdsa_signature_blob.rb +3 -3
  8. data/lib/hrr_rb_ssh/{transport/server_host_key_algorithm/ecdsa_sha2_nistp256 → algorithm/publickey/ecdsa_sha2}/public_key_blob.rb +5 -6
  9. data/lib/hrr_rb_ssh/{transport/server_host_key_algorithm/ecdsa_sha2_nistp256 → algorithm/publickey/ecdsa_sha2}/signature.rb +5 -5
  10. data/lib/hrr_rb_ssh/algorithm/publickey/ecdsa_sha2.rb +85 -0
  11. data/lib/hrr_rb_ssh/algorithm/publickey/ecdsa_sha2_nistp256.rb +19 -0
  12. data/lib/hrr_rb_ssh/algorithm/publickey/ecdsa_sha2_nistp384.rb +19 -0
  13. data/lib/hrr_rb_ssh/algorithm/publickey/ecdsa_sha2_nistp521.rb +19 -0
  14. data/lib/hrr_rb_ssh/{transport/server_host_key_algorithm → algorithm/publickey}/ssh_dss/public_key_blob.rb +3 -3
  15. data/lib/hrr_rb_ssh/{transport/server_host_key_algorithm → algorithm/publickey}/ssh_dss/signature.rb +4 -4
  16. data/lib/hrr_rb_ssh/algorithm/publickey/ssh_dss.rb +90 -0
  17. data/lib/hrr_rb_ssh/{transport/server_host_key_algorithm → algorithm/publickey}/ssh_rsa/public_key_blob.rb +3 -4
  18. data/lib/hrr_rb_ssh/{transport/server_host_key_algorithm → algorithm/publickey}/ssh_rsa/signature.rb +4 -4
  19. data/lib/hrr_rb_ssh/algorithm/publickey/ssh_rsa.rb +67 -0
  20. data/lib/hrr_rb_ssh/algorithm/publickey.rb +32 -0
  21. data/lib/hrr_rb_ssh/algorithm.rb +9 -0
  22. data/lib/hrr_rb_ssh/authentication/method/none/context.rb +1 -1
  23. data/lib/hrr_rb_ssh/authentication/method/none.rb +1 -1
  24. data/lib/hrr_rb_ssh/authentication/method/password/context.rb +1 -1
  25. data/lib/hrr_rb_ssh/authentication/method/password.rb +1 -1
  26. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp256.rb +2 -65
  27. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp384.rb +2 -65
  28. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp521.rb +2 -65
  29. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/functionable.rb +54 -0
  30. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/signature_blob.rb +31 -0
  31. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss.rb +2 -73
  32. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa.rb +2 -55
  33. data/lib/hrr_rb_ssh/authentication/method/publickey.rb +3 -3
  34. data/lib/hrr_rb_ssh/authentication.rb +15 -15
  35. data/lib/hrr_rb_ssh/codable.rb +1 -1
  36. data/lib/hrr_rb_ssh/compat/openssh/public_key.rb +3 -40
  37. data/lib/hrr_rb_ssh/compat/ruby/array.rb +14 -0
  38. data/lib/hrr_rb_ssh/compat/ruby/openssl/bn.rb +20 -0
  39. data/lib/hrr_rb_ssh/compat/ruby/openssl.rb +4 -0
  40. data/lib/hrr_rb_ssh/compat/ruby/queue.rb +38 -0
  41. data/lib/hrr_rb_ssh/compat/ruby.rb +6 -0
  42. data/lib/hrr_rb_ssh/compat.rb +1 -63
  43. data/lib/hrr_rb_ssh/connection/channel/channel_type/direct_tcpip.rb +1 -1
  44. data/lib/hrr_rb_ssh/connection/channel/channel_type/forwarded_tcpip.rb +1 -1
  45. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/proc_chain/chain_context.rb +1 -1
  46. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/proc_chain.rb +1 -1
  47. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/env/context.rb +1 -1
  48. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/env.rb +1 -1
  49. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/exec/context.rb +1 -1
  50. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/exec.rb +1 -1
  51. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/pty_req/context.rb +1 -1
  52. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/pty_req.rb +1 -1
  53. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/shell/context.rb +1 -1
  54. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/shell.rb +1 -1
  55. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/subsystem/context.rb +1 -1
  56. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/subsystem.rb +1 -1
  57. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/window_change/context.rb +1 -1
  58. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/window_change.rb +1 -1
  59. data/lib/hrr_rb_ssh/connection/channel/channel_type/session.rb +1 -1
  60. data/lib/hrr_rb_ssh/connection/channel.rb +22 -22
  61. data/lib/hrr_rb_ssh/connection/global_request_handler.rb +1 -1
  62. data/lib/hrr_rb_ssh/connection/request_handler/reference_env_request_handler.rb +1 -1
  63. data/lib/hrr_rb_ssh/connection/request_handler/reference_exec_request_handler.rb +3 -56
  64. data/lib/hrr_rb_ssh/connection/request_handler/reference_pty_req_request_handler.rb +50 -13
  65. data/lib/hrr_rb_ssh/connection/request_handler/reference_shell_request_handler.rb +3 -56
  66. data/lib/hrr_rb_ssh/connection/request_handler/reference_window_change_request_handler.rb +1 -1
  67. data/lib/hrr_rb_ssh/connection/request_handler.rb +1 -1
  68. data/lib/hrr_rb_ssh/connection.rb +40 -40
  69. data/lib/hrr_rb_ssh/data_type.rb +0 -3
  70. data/lib/hrr_rb_ssh/error/closed_authentication.rb +9 -0
  71. data/lib/hrr_rb_ssh/{closed_transport_error.rb → error/closed_connection.rb} +3 -1
  72. data/lib/hrr_rb_ssh/{closed_authentication_error.rb → error/closed_transport.rb} +3 -1
  73. data/lib/hrr_rb_ssh/error.rb +11 -0
  74. data/lib/hrr_rb_ssh/{closed_connection_error.rb → mode.rb} +3 -1
  75. data/lib/hrr_rb_ssh/server.rb +23 -0
  76. data/lib/hrr_rb_ssh/transport/compression_algorithm/functionable.rb +1 -1
  77. data/lib/hrr_rb_ssh/transport/compression_algorithm/unfunctionable.rb +1 -1
  78. data/lib/hrr_rb_ssh/transport/encryption_algorithm/functionable.rb +3 -3
  79. data/lib/hrr_rb_ssh/transport/encryption_algorithm/unfunctionable.rb +1 -1
  80. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb +8 -48
  81. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange.rb +11 -51
  82. data/lib/hrr_rb_ssh/transport/kex_algorithm/elliptic_curve_diffie_hellman.rb +8 -48
  83. data/lib/hrr_rb_ssh/transport/kex_algorithm/iv_computable.rb +57 -0
  84. data/lib/hrr_rb_ssh/transport/mac_algorithm/functionable.rb +2 -2
  85. data/lib/hrr_rb_ssh/transport/mac_algorithm/unfunctionable.rb +1 -1
  86. data/lib/hrr_rb_ssh/transport/receiver.rb +1 -1
  87. data/lib/hrr_rb_ssh/transport/sender.rb +1 -1
  88. data/lib/hrr_rb_ssh/transport/sequence_number.rb +1 -1
  89. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp256.rb +2 -56
  90. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp384.rb +2 -56
  91. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp521.rb +2 -56
  92. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/functionable.rb +29 -0
  93. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss.rb +2 -50
  94. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa.rb +2 -31
  95. data/lib/hrr_rb_ssh/transport.rb +83 -81
  96. data/lib/hrr_rb_ssh/version.rb +1 -1
  97. data/lib/hrr_rb_ssh.rb +4 -0
  98. metadata +32 -37
  99. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp256/ecdsa_signature_blob.rb +0 -27
  100. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp256/public_key_blob.rb +0 -28
  101. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp256/signature.rb +0 -27
  102. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp256/signature_blob.rb +0 -33
  103. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp384/ecdsa_signature_blob.rb +0 -27
  104. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp384/public_key_blob.rb +0 -28
  105. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp384/signature.rb +0 -27
  106. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp384/signature_blob.rb +0 -33
  107. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp521/ecdsa_signature_blob.rb +0 -27
  108. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp521/public_key_blob.rb +0 -28
  109. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp521/signature.rb +0 -27
  110. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp521/signature_blob.rb +0 -33
  111. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss/public_key_blob.rb +0 -30
  112. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss/signature.rb +0 -27
  113. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss/signature_blob.rb +0 -33
  114. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa/public_key_blob.rb +0 -28
  115. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa/signature.rb +0 -27
  116. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa/signature_blob.rb +0 -33
  117. data/lib/hrr_rb_ssh/transport/mode.rb +0 -11
  118. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp256/ecdsa_signature_blob.rb +0 -23
  119. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp384/ecdsa_signature_blob.rb +0 -23
  120. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp384/public_key_blob.rb +0 -25
  121. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp384/signature.rb +0 -23
  122. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp521/public_key_blob.rb +0 -25
  123. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp521/signature.rb +0 -23
@@ -25,7 +25,7 @@ module HrrRbSsh
25
25
  :encoded_terminal_modes
26
26
 
27
27
  def initialize proc_chain, username, io, variables, message
28
- @logger = HrrRbSsh::Logger.new self.class.name
28
+ @logger = Logger.new self.class.name
29
29
 
30
30
  @proc_chain = proc_chain
31
31
  @username = username
@@ -14,7 +14,7 @@ module HrrRbSsh
14
14
  NAME = 'pty-req'
15
15
 
16
16
  def self.run proc_chain, username, io, variables, message, options
17
- logger = HrrRbSsh::Logger.new self.class.name
17
+ logger = Logger.new self.class.name
18
18
 
19
19
  context = Context.new proc_chain, username, io, variables, message
20
20
  handler = options.fetch('connection_channel_request_pty_req', RequestHandler.new {})
@@ -19,7 +19,7 @@ module HrrRbSsh
19
19
  :vars
20
20
 
21
21
  def initialize proc_chain, username, io, variables, message
22
- @logger = HrrRbSsh::Logger.new self.class.name
22
+ @logger = Logger.new self.class.name
23
23
 
24
24
  @proc_chain = proc_chain
25
25
  @username = username
@@ -14,7 +14,7 @@ module HrrRbSsh
14
14
  NAME = 'shell'
15
15
 
16
16
  def self.run proc_chain, username, io, variables, message, options
17
- logger = HrrRbSsh::Logger.new self.class.name
17
+ logger = Logger.new self.class.name
18
18
 
19
19
  context = Context.new proc_chain, username, io, variables, message
20
20
  handler = options.fetch('connection_channel_request_shell', RequestHandler.new {})
@@ -20,7 +20,7 @@ module HrrRbSsh
20
20
  :subsystem_name
21
21
 
22
22
  def initialize proc_chain, username, io, variables, message
23
- @logger = HrrRbSsh::Logger.new self.class.name
23
+ @logger = Logger.new self.class.name
24
24
 
25
25
  @proc_chain = proc_chain
26
26
  @username = username
@@ -14,7 +14,7 @@ module HrrRbSsh
14
14
  NAME = 'subsystem'
15
15
 
16
16
  def self.run proc_chain, username, io, variables, message, options
17
- logger = HrrRbSsh::Logger.new self.class.name
17
+ logger = Logger.new self.class.name
18
18
 
19
19
  context = Context.new proc_chain, username, io, variables, message
20
20
  handler = options.fetch('connection_channel_request_subsystem', RequestHandler.new {})
@@ -23,7 +23,7 @@ module HrrRbSsh
23
23
  :terminal_height_pixels
24
24
 
25
25
  def initialize proc_chain, username, io, variables, message
26
- @logger = HrrRbSsh::Logger.new self.class.name
26
+ @logger = Logger.new self.class.name
27
27
 
28
28
  @proc_chain = proc_chain
29
29
  @username = username
@@ -14,7 +14,7 @@ module HrrRbSsh
14
14
  NAME = 'window-change'
15
15
 
16
16
  def self.run proc_chain, username, io, variables, message, options
17
- logger = HrrRbSsh::Logger.new self.class.name
17
+ logger = Logger.new self.class.name
18
18
 
19
19
  context = Context.new proc_chain, username, io, variables, message
20
20
  handler = options.fetch('connection_channel_request_window_change', RequestHandler.new {})
@@ -11,7 +11,7 @@ module HrrRbSsh
11
11
  NAME = 'session'
12
12
 
13
13
  def initialize connection, channel, message, socket=nil
14
- @logger = HrrRbSsh::Logger.new self.class.name
14
+ @logger = Logger.new self.class.name
15
15
  @connection = connection
16
16
  @channel = channel
17
17
  @variables = {}
@@ -22,7 +22,7 @@ module HrrRbSsh
22
22
  :receive_message_queue
23
23
 
24
24
  def initialize connection, message, socket=nil
25
- @logger = HrrRbSsh::Logger.new self.class.name
25
+ @logger = Logger.new self.class.name
26
26
 
27
27
  @connection = connection
28
28
 
@@ -103,7 +103,7 @@ module HrrRbSsh
103
103
  end
104
104
  end
105
105
  send_channel_close
106
- rescue HrrRbSsh::ClosedConnectionError => e
106
+ rescue Error::ClosedConnection => e
107
107
  Thread.pass
108
108
  rescue => e
109
109
  @logger.error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
@@ -127,7 +127,7 @@ module HrrRbSsh
127
127
  break
128
128
  end
129
129
  case message[:'message number']
130
- when HrrRbSsh::Message::SSH_MSG_CHANNEL_REQUEST::VALUE
130
+ when Message::SSH_MSG_CHANNEL_REQUEST::VALUE
131
131
  @logger.info { "received channel request: #{message[:'request type']}" }
132
132
  begin
133
133
  @channel_type_instance.request message
@@ -141,11 +141,11 @@ module HrrRbSsh
141
141
  send_channel_success
142
142
  end
143
143
  end
144
- when HrrRbSsh::Message::SSH_MSG_CHANNEL_DATA::VALUE
144
+ when Message::SSH_MSG_CHANNEL_DATA::VALUE
145
145
  @logger.info { "received channel data" }
146
146
  local_channel = message[:'recipient channel']
147
147
  @receive_data_queue.enq message[:'data']
148
- when HrrRbSsh::Message::SSH_MSG_CHANNEL_WINDOW_ADJUST::VALUE
148
+ when Message::SSH_MSG_CHANNEL_WINDOW_ADJUST::VALUE
149
149
  @logger.debug { "received channel window adjust" }
150
150
  @remote_window_size = [@remote_window_size + message[:'bytes to add'], 0xffff_ffff].min
151
151
  else
@@ -261,80 +261,80 @@ module HrrRbSsh
261
261
 
262
262
  def send_channel_success
263
263
  message = {
264
- :'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_SUCCESS::VALUE,
264
+ :'message number' => Message::SSH_MSG_CHANNEL_SUCCESS::VALUE,
265
265
  :'recipient channel' => @remote_channel,
266
266
  }
267
- payload = HrrRbSsh::Message::SSH_MSG_CHANNEL_SUCCESS.encode message
267
+ payload = Message::SSH_MSG_CHANNEL_SUCCESS.encode message
268
268
  @connection.send payload
269
269
  end
270
270
 
271
271
  def send_channel_failure
272
272
  message = {
273
- :'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_FAILURE::VALUE,
273
+ :'message number' => Message::SSH_MSG_CHANNEL_FAILURE::VALUE,
274
274
  :'recipient channel' => @remote_channel,
275
275
  }
276
- payload = HrrRbSsh::Message::SSH_MSG_CHANNEL_FAILURE.encode message
276
+ payload = Message::SSH_MSG_CHANNEL_FAILURE.encode message
277
277
  @connection.send payload
278
278
  end
279
279
 
280
280
  def send_channel_window_adjust
281
281
  message = {
282
- :'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_WINDOW_ADJUST::VALUE,
282
+ :'message number' => Message::SSH_MSG_CHANNEL_WINDOW_ADJUST::VALUE,
283
283
  :'recipient channel' => @remote_channel,
284
284
  :'bytes to add' => INITIAL_WINDOW_SIZE,
285
285
  }
286
- payload = HrrRbSsh::Message::SSH_MSG_CHANNEL_WINDOW_ADJUST.encode message
286
+ payload = Message::SSH_MSG_CHANNEL_WINDOW_ADJUST.encode message
287
287
  @connection.send payload
288
288
  end
289
289
 
290
290
  def send_channel_data data
291
291
  message = {
292
- :'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_DATA::VALUE,
292
+ :'message number' => Message::SSH_MSG_CHANNEL_DATA::VALUE,
293
293
  :'recipient channel' => @remote_channel,
294
294
  :'data' => data,
295
295
  }
296
- payload = HrrRbSsh::Message::SSH_MSG_CHANNEL_DATA.encode message
296
+ payload = Message::SSH_MSG_CHANNEL_DATA.encode message
297
297
  @connection.send payload
298
298
  end
299
299
 
300
- def send_channel_extended_data data, code=HrrRbSsh::Message::SSH_MSG_CHANNEL_EXTENDED_DATA::DataTypeCode::SSH_EXTENDED_DATA_STDERR
300
+ def send_channel_extended_data data, code=Message::SSH_MSG_CHANNEL_EXTENDED_DATA::DataTypeCode::SSH_EXTENDED_DATA_STDERR
301
301
  message = {
302
- :'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_EXTENDED_DATA::VALUE,
302
+ :'message number' => Message::SSH_MSG_CHANNEL_EXTENDED_DATA::VALUE,
303
303
  :'recipient channel' => @remote_channel,
304
304
  :'data type code' => code,
305
305
  :'data' => data,
306
306
  }
307
- payload = HrrRbSsh::Message::SSH_MSG_CHANNEL_EXTENDED_DATA.encode message
307
+ payload = Message::SSH_MSG_CHANNEL_EXTENDED_DATA.encode message
308
308
  @connection.send payload
309
309
  end
310
310
 
311
311
  def send_channel_request_exit_status exitstatus
312
312
  message = {
313
- :'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_REQUEST::VALUE,
313
+ :'message number' => Message::SSH_MSG_CHANNEL_REQUEST::VALUE,
314
314
  :'recipient channel' => @remote_channel,
315
315
  :'request type' => "exit-status",
316
316
  :'want reply' => false,
317
317
  :'exit status' => exitstatus,
318
318
  }
319
- payload = HrrRbSsh::Message::SSH_MSG_CHANNEL_REQUEST.encode message
319
+ payload = Message::SSH_MSG_CHANNEL_REQUEST.encode message
320
320
  @connection.send payload
321
321
  end
322
322
 
323
323
  def send_channel_eof
324
324
  message = {
325
- :'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_EOF::VALUE,
325
+ :'message number' => Message::SSH_MSG_CHANNEL_EOF::VALUE,
326
326
  :'recipient channel' => @remote_channel,
327
327
  }
328
- payload = HrrRbSsh::Message::SSH_MSG_CHANNEL_EOF.encode message
328
+ payload = Message::SSH_MSG_CHANNEL_EOF.encode message
329
329
  @connection.send payload
330
330
  end
331
331
 
332
332
  def send_channel_close
333
333
  message = {
334
- :'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_CLOSE::VALUE,
334
+ :'message number' => Message::SSH_MSG_CHANNEL_CLOSE::VALUE,
335
335
  :'recipient channel' => @remote_channel,
336
336
  }
337
- payload = HrrRbSsh::Message::SSH_MSG_CHANNEL_CLOSE.encode message
337
+ payload = Message::SSH_MSG_CHANNEL_CLOSE.encode message
338
338
  @connection.send payload
339
339
  end
340
340
  end
@@ -11,7 +11,7 @@ module HrrRbSsh
11
11
  :accepted
12
12
 
13
13
  def initialize connection
14
- @logger = HrrRbSsh::Logger.new self.class.name
14
+ @logger = Logger.new self.class.name
15
15
  @connection = connection
16
16
  @tcpip_forward_servers = Hash.new
17
17
  @tcpip_forward_threads = Hash.new
@@ -9,7 +9,7 @@ module HrrRbSsh
9
9
  class RequestHandler
10
10
  class ReferenceEnvRequestHandler < RequestHandler
11
11
  def initialize
12
- @logger = HrrRbSsh::Logger.new self.class.name
12
+ @logger = Logger.new self.class.name
13
13
  @proc = Proc.new { |context|
14
14
  context.vars[:env] ||= Hash.new
15
15
  context.vars[:env][context.variable_name] = context.variable_value
@@ -10,7 +10,7 @@ module HrrRbSsh
10
10
  class RequestHandler
11
11
  class ReferenceExecRequestHandler < RequestHandler
12
12
  def initialize
13
- @logger = HrrRbSsh::Logger.new self.class.name
13
+ @logger = Logger.new self.class.name
14
14
  @proc = Proc.new { |context|
15
15
  ptm = context.vars[:ptm]
16
16
  pts = context.vars[:pts]
@@ -39,10 +39,8 @@ module HrrRbSsh
39
39
  pid = fork do
40
40
  Process.setsid
41
41
  Dir.chdir passwd.dir
42
- Process.gid = passwd.gid
43
- Process.egid = passwd.gid
44
- Process.uid = passwd.uid
45
- Process.euid = passwd.uid
42
+ Process::GID.change_privilege passwd.gid
43
+ Process::UID.change_privilege passwd.uid
46
44
  if ptm
47
45
  STDIN.reopen pts, 'r'
48
46
  STDOUT.reopen pts, 'w'
@@ -58,45 +56,6 @@ module HrrRbSsh
58
56
  else
59
57
  pts.close
60
58
 
61
- ptm_read_thread = Thread.start {
62
- loop do
63
- begin
64
- context.io[1].write ptm.readpartial(10240)
65
- rescue EOFError => e
66
- context.logger.info { "ptm is EOF in ptm_read_thread" }
67
- break
68
- rescue IOError => e
69
- context.logger.warn { "IO Error in ptm_read_thread" }
70
- break
71
- rescue Errno::EIO => e
72
- context.logger.info { "EIO Error in ptm_read_thread" }
73
- break
74
- rescue => e
75
- context.logger.error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
76
- break
77
- end
78
- end
79
- }
80
- ptm_write_thread = Thread.start {
81
- loop do
82
- begin
83
- ptm.write context.io[0].readpartial(10240)
84
- rescue EOFError => e
85
- context.logger.info { "IO is EOF in ptm_write_thread" }
86
- break
87
- rescue IOError => e
88
- context.logger.warn { "IO Error in ptm_write_thread" }
89
- break
90
- rescue Errno::EIO => e
91
- context.logger.info { "EIO Error in ptm_read_thread" }
92
- break
93
- rescue => e
94
- context.logger.error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
95
- break
96
- end
97
- end
98
- }
99
-
100
59
  begin
101
60
  pid, status = Process.waitpid2 pid
102
61
  context.logger.info { "program exited with status #{status.inspect}" }
@@ -116,18 +75,6 @@ module HrrRbSsh
116
75
  end
117
76
  context.logger.info { "program exited with status #{status.inspect}" }
118
77
  end
119
- begin
120
- ptm_read_thread.join
121
- rescue => e
122
- context.logger.error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
123
- end
124
- begin
125
- ptm_write_thread.exit
126
- ptm_write_thread.join
127
- rescue => e
128
- context.logger.error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
129
- end
130
- context.logger.info { "proc chain finished" }
131
78
  end
132
79
  end
133
80
  }
@@ -13,7 +13,7 @@ module HrrRbSsh
13
13
  class RequestHandler
14
14
  class ReferencePtyReqRequestHandler < RequestHandler
15
15
  def initialize
16
- @logger = HrrRbSsh::Logger.new self.class.name
16
+ @logger = Logger.new self.class.name
17
17
  @proc = Proc.new { |context|
18
18
  begin
19
19
  ptm, pts = PTY.open
@@ -27,27 +27,64 @@ module HrrRbSsh
27
27
  context.vars[:env]['TERM'] = context.term_environment_variable_value
28
28
  context.chain_proc { |chain|
29
29
  begin
30
+ ptm_read_thread = Thread.start {
31
+ loop do
32
+ begin
33
+ context.io[1].write ptm.readpartial(10240)
34
+ rescue EOFError => e
35
+ context.logger.info { "ptm is EOF in ptm_read_thread" }
36
+ break
37
+ rescue IOError => e
38
+ context.logger.warn { "IO Error in ptm_read_thread" }
39
+ break
40
+ rescue Errno::EIO => e
41
+ context.logger.info { "EIO Error in ptm_read_thread" }
42
+ break
43
+ rescue => e
44
+ context.logger.error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
45
+ break
46
+ end
47
+ end
48
+ }
49
+ ptm_write_thread = Thread.start {
50
+ loop do
51
+ begin
52
+ ptm.write context.io[0].readpartial(10240)
53
+ rescue EOFError => e
54
+ context.logger.info { "IO is EOF in ptm_write_thread" }
55
+ break
56
+ rescue IOError => e
57
+ context.logger.warn { "IO Error in ptm_write_thread" }
58
+ break
59
+ rescue Errno::EIO => e
60
+ context.logger.info { "EIO Error in ptm_read_thread" }
61
+ break
62
+ rescue => e
63
+ context.logger.error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
64
+ break
65
+ end
66
+ end
67
+ }
30
68
  chain.call_next
31
69
  ensure
70
+ context.vars[:ptm].close rescue nil
71
+ context.vars[:pts].close rescue nil
32
72
  begin
33
- context.vars[:ptm].close
34
- rescue
73
+ ptm_read_thread.join
74
+ rescue => e
75
+ context.logger.error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
35
76
  end
36
77
  begin
37
- context.vars[:pts].close
38
- rescue
78
+ ptm_write_thread.exit
79
+ ptm_write_thread.join
80
+ rescue => e
81
+ context.logger.error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
39
82
  end
40
83
  end
41
84
  }
42
85
  rescue => e
43
- begin
44
- ptm.close
45
- rescue
46
- end
47
- begin
48
- pts.close
49
- rescue
50
- end
86
+ ptm.close rescue nil
87
+ pts.close rescue nil
51
88
  context.chain_proc{ |chain|
52
89
  exitstatus = 1
53
90
  }
@@ -11,7 +11,7 @@ module HrrRbSsh
11
11
  class RequestHandler
12
12
  class ReferenceShellRequestHandler < RequestHandler
13
13
  def initialize
14
- @logger = HrrRbSsh::Logger.new self.class.name
14
+ @logger = Logger.new self.class.name
15
15
  @proc = Proc.new { |context|
16
16
  ptm = context.vars[:ptm]
17
17
  pts = context.vars[:pts]
@@ -36,10 +36,8 @@ module HrrRbSsh
36
36
  ptm.close
37
37
  Process.setsid
38
38
  Dir.chdir passwd.dir
39
- Process.gid = passwd.gid
40
- Process.egid = passwd.gid
41
- Process.uid = passwd.uid
42
- Process.euid = passwd.uid
39
+ Process::GID.change_privilege passwd.gid
40
+ Process::UID.change_privilege passwd.uid
43
41
  STDIN.reopen pts, 'r'
44
42
  STDOUT.reopen pts, 'w'
45
43
  STDERR.reopen pts, 'w'
@@ -49,45 +47,6 @@ module HrrRbSsh
49
47
 
50
48
  pts.close
51
49
 
52
- ptm_read_thread = Thread.start {
53
- loop do
54
- begin
55
- context.io[1].write ptm.readpartial(10240)
56
- rescue EOFError => e
57
- context.logger.info { "ptm is EOF in ptm_read_thread" }
58
- break
59
- rescue IOError => e
60
- context.logger.warn { "IO Error in ptm_read_thread" }
61
- break
62
- rescue Errno::EIO => e
63
- context.logger.info { "EIO Error in ptm_read_thread" }
64
- break
65
- rescue => e
66
- context.logger.error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
67
- break
68
- end
69
- end
70
- }
71
- ptm_write_thread = Thread.start {
72
- loop do
73
- begin
74
- ptm.write context.io[0].readpartial(10240)
75
- rescue EOFError => e
76
- context.logger.info { "IO is EOF in ptm_write_thread" }
77
- break
78
- rescue IOError => e
79
- context.logger.warn { "IO Error in ptm_write_thread" }
80
- break
81
- rescue Errno::EIO => e
82
- context.logger.info { "EIO Error in ptm_read_thread" }
83
- break
84
- rescue => e
85
- context.logger.error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
86
- break
87
- end
88
- end
89
- }
90
-
91
50
  begin
92
51
  pid, status = Process.waitpid2 pid
93
52
  context.logger.info { "shell exited with status #{status.inspect}" }
@@ -107,18 +66,6 @@ module HrrRbSsh
107
66
  end
108
67
  context.logger.info { "shell exited with status #{status.inspect}" }
109
68
  end
110
- begin
111
- ptm_read_thread.join
112
- rescue => e
113
- context.logger.error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
114
- end
115
- begin
116
- ptm_write_thread.exit
117
- ptm_write_thread.join
118
- rescue => e
119
- context.logger.error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
120
- end
121
- context.logger.info { "proc chain finished" }
122
69
  end
123
70
  }
124
71
  }
@@ -10,7 +10,7 @@ module HrrRbSsh
10
10
  class RequestHandler
11
11
  class ReferenceWindowChangeRequestHandler < RequestHandler
12
12
  def initialize
13
- @logger = HrrRbSsh::Logger.new self.class.name
13
+ @logger = Logger.new self.class.name
14
14
  @proc = Proc.new { |context|
15
15
  context.vars[:ptm].winsize = [context.terminal_height_rows, context.terminal_width_columns, context.terminal_width_pixels, context.terminal_height_pixels]
16
16
  }
@@ -7,7 +7,7 @@ module HrrRbSsh
7
7
  class Connection
8
8
  class RequestHandler
9
9
  def initialize &block
10
- @logger = HrrRbSsh::Logger.new self.class.name
10
+ @logger = Logger.new self.class.name
11
11
  @proc = block
12
12
  end
13
13
  def run context