net-ssh-backports 6.3.0.backports

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 (111) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +93 -0
  3. data/.gitignore +13 -0
  4. data/.rubocop.yml +21 -0
  5. data/.rubocop_todo.yml +1074 -0
  6. data/.travis.yml +51 -0
  7. data/CHANGES.txt +698 -0
  8. data/Gemfile +13 -0
  9. data/Gemfile.noed25519 +12 -0
  10. data/ISSUE_TEMPLATE.md +30 -0
  11. data/LICENSE.txt +19 -0
  12. data/Manifest +132 -0
  13. data/README.md +287 -0
  14. data/Rakefile +105 -0
  15. data/THANKS.txt +110 -0
  16. data/appveyor.yml +58 -0
  17. data/lib/net/ssh/authentication/agent.rb +284 -0
  18. data/lib/net/ssh/authentication/certificate.rb +183 -0
  19. data/lib/net/ssh/authentication/constants.rb +20 -0
  20. data/lib/net/ssh/authentication/ed25519.rb +185 -0
  21. data/lib/net/ssh/authentication/ed25519_loader.rb +31 -0
  22. data/lib/net/ssh/authentication/key_manager.rb +297 -0
  23. data/lib/net/ssh/authentication/methods/abstract.rb +69 -0
  24. data/lib/net/ssh/authentication/methods/hostbased.rb +72 -0
  25. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +77 -0
  26. data/lib/net/ssh/authentication/methods/none.rb +34 -0
  27. data/lib/net/ssh/authentication/methods/password.rb +80 -0
  28. data/lib/net/ssh/authentication/methods/publickey.rb +95 -0
  29. data/lib/net/ssh/authentication/pageant.rb +497 -0
  30. data/lib/net/ssh/authentication/pub_key_fingerprint.rb +43 -0
  31. data/lib/net/ssh/authentication/session.rb +163 -0
  32. data/lib/net/ssh/buffer.rb +434 -0
  33. data/lib/net/ssh/buffered_io.rb +202 -0
  34. data/lib/net/ssh/config.rb +406 -0
  35. data/lib/net/ssh/connection/channel.rb +695 -0
  36. data/lib/net/ssh/connection/constants.rb +33 -0
  37. data/lib/net/ssh/connection/event_loop.rb +123 -0
  38. data/lib/net/ssh/connection/keepalive.rb +59 -0
  39. data/lib/net/ssh/connection/session.rb +712 -0
  40. data/lib/net/ssh/connection/term.rb +180 -0
  41. data/lib/net/ssh/errors.rb +106 -0
  42. data/lib/net/ssh/key_factory.rb +218 -0
  43. data/lib/net/ssh/known_hosts.rb +264 -0
  44. data/lib/net/ssh/loggable.rb +62 -0
  45. data/lib/net/ssh/packet.rb +106 -0
  46. data/lib/net/ssh/prompt.rb +62 -0
  47. data/lib/net/ssh/proxy/command.rb +123 -0
  48. data/lib/net/ssh/proxy/errors.rb +16 -0
  49. data/lib/net/ssh/proxy/http.rb +98 -0
  50. data/lib/net/ssh/proxy/https.rb +50 -0
  51. data/lib/net/ssh/proxy/jump.rb +54 -0
  52. data/lib/net/ssh/proxy/socks4.rb +67 -0
  53. data/lib/net/ssh/proxy/socks5.rb +140 -0
  54. data/lib/net/ssh/service/forward.rb +426 -0
  55. data/lib/net/ssh/test/channel.rb +147 -0
  56. data/lib/net/ssh/test/extensions.rb +173 -0
  57. data/lib/net/ssh/test/kex.rb +46 -0
  58. data/lib/net/ssh/test/local_packet.rb +53 -0
  59. data/lib/net/ssh/test/packet.rb +101 -0
  60. data/lib/net/ssh/test/remote_packet.rb +40 -0
  61. data/lib/net/ssh/test/script.rb +180 -0
  62. data/lib/net/ssh/test/socket.rb +65 -0
  63. data/lib/net/ssh/test.rb +94 -0
  64. data/lib/net/ssh/transport/algorithms.rb +502 -0
  65. data/lib/net/ssh/transport/cipher_factory.rb +103 -0
  66. data/lib/net/ssh/transport/constants.rb +40 -0
  67. data/lib/net/ssh/transport/ctr.rb +115 -0
  68. data/lib/net/ssh/transport/hmac/abstract.rb +97 -0
  69. data/lib/net/ssh/transport/hmac/md5.rb +10 -0
  70. data/lib/net/ssh/transport/hmac/md5_96.rb +9 -0
  71. data/lib/net/ssh/transport/hmac/none.rb +13 -0
  72. data/lib/net/ssh/transport/hmac/ripemd160.rb +11 -0
  73. data/lib/net/ssh/transport/hmac/sha1.rb +11 -0
  74. data/lib/net/ssh/transport/hmac/sha1_96.rb +9 -0
  75. data/lib/net/ssh/transport/hmac/sha2_256.rb +11 -0
  76. data/lib/net/ssh/transport/hmac/sha2_256_96.rb +9 -0
  77. data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
  78. data/lib/net/ssh/transport/hmac/sha2_512.rb +11 -0
  79. data/lib/net/ssh/transport/hmac/sha2_512_96.rb +9 -0
  80. data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
  81. data/lib/net/ssh/transport/hmac.rb +47 -0
  82. data/lib/net/ssh/transport/identity_cipher.rb +57 -0
  83. data/lib/net/ssh/transport/kex/abstract.rb +130 -0
  84. data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
  85. data/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
  86. data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
  87. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +37 -0
  88. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
  89. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +122 -0
  90. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +72 -0
  91. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +11 -0
  92. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +39 -0
  93. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +21 -0
  94. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +21 -0
  95. data/lib/net/ssh/transport/kex.rb +31 -0
  96. data/lib/net/ssh/transport/key_expander.rb +30 -0
  97. data/lib/net/ssh/transport/openssl.rb +253 -0
  98. data/lib/net/ssh/transport/packet_stream.rb +280 -0
  99. data/lib/net/ssh/transport/server_version.rb +77 -0
  100. data/lib/net/ssh/transport/session.rb +354 -0
  101. data/lib/net/ssh/transport/state.rb +208 -0
  102. data/lib/net/ssh/verifiers/accept_new.rb +33 -0
  103. data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +33 -0
  104. data/lib/net/ssh/verifiers/always.rb +58 -0
  105. data/lib/net/ssh/verifiers/never.rb +19 -0
  106. data/lib/net/ssh/version.rb +68 -0
  107. data/lib/net/ssh.rb +330 -0
  108. data/net-ssh-public_cert.pem +20 -0
  109. data/net-ssh.gemspec +44 -0
  110. data/support/ssh_tunnel_bug.rb +65 -0
  111. metadata +271 -0
@@ -0,0 +1,33 @@
1
+ module Net
2
+ module SSH
3
+ module Connection
4
+ # Definitions of constants that are specific to the connection layer of the
5
+ # SSH protocol.
6
+ module Constants
7
+ #--
8
+ # Connection protocol generic messages
9
+ #++
10
+
11
+ GLOBAL_REQUEST = 80
12
+ REQUEST_SUCCESS = 81
13
+ REQUEST_FAILURE = 82
14
+
15
+ #--
16
+ # Channel related messages
17
+ #++
18
+
19
+ CHANNEL_OPEN = 90
20
+ CHANNEL_OPEN_CONFIRMATION = 91
21
+ CHANNEL_OPEN_FAILURE = 92
22
+ CHANNEL_WINDOW_ADJUST = 93
23
+ CHANNEL_DATA = 94
24
+ CHANNEL_EXTENDED_DATA = 95
25
+ CHANNEL_EOF = 96
26
+ CHANNEL_CLOSE = 97
27
+ CHANNEL_REQUEST = 98
28
+ CHANNEL_SUCCESS = 99
29
+ CHANNEL_FAILURE = 100
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,123 @@
1
+ require 'net/ssh/loggable'
2
+
3
+ module Net
4
+ module SSH
5
+ module Connection
6
+ # EventLoop can be shared across multiple sessions
7
+ #
8
+ # one issue is with blocks passed to loop, etc.
9
+ # they should get current session as parameter, but in
10
+ # case you're using multiple sessions in an event loop it doesnt makes sense
11
+ # and we don't pass session.
12
+ class EventLoop
13
+ include Loggable
14
+
15
+ def initialize(logger=nil)
16
+ self.logger = logger
17
+ @sessions = []
18
+ end
19
+
20
+ def register(session)
21
+ @sessions << session
22
+ end
23
+
24
+ # process until timeout
25
+ # if a block is given a session will be removed from loop
26
+ # if block returns false for that session
27
+ def process(wait = nil, &block)
28
+ return false unless ev_preprocess(&block)
29
+
30
+ ev_select_and_postprocess(wait)
31
+ end
32
+
33
+ # process the event loop but only for the sepcified session
34
+ def process_only(session, wait = nil)
35
+ orig_sessions = @sessions
36
+ begin
37
+ @sessions = [session]
38
+ return false unless ev_preprocess
39
+
40
+ ev_select_and_postprocess(wait)
41
+ ensure
42
+ @sessions = orig_sessions
43
+ end
44
+ end
45
+
46
+ # Call preprocess on each session. If block given and that
47
+ # block retuns false then we exit the processing
48
+ def ev_preprocess(&block)
49
+ return false if block_given? && !yield(self)
50
+
51
+ @sessions.each(&:ev_preprocess)
52
+ return false if block_given? && !yield(self)
53
+
54
+ return true
55
+ end
56
+
57
+ def ev_select_and_postprocess(wait)
58
+ owners = {}
59
+ r = []
60
+ w = []
61
+ minwait = nil
62
+ @sessions.each do |session|
63
+ sr,sw,actwait = session.ev_do_calculate_rw_wait(wait)
64
+ minwait = actwait if actwait && (minwait.nil? || actwait < minwait)
65
+ r.push(*sr)
66
+ w.push(*sw)
67
+ sr.each { |ri| owners[ri] = session }
68
+ sw.each { |wi| owners[wi] = session }
69
+ end
70
+
71
+ readers, writers, = IO.select(r, w, nil, minwait)
72
+
73
+ fired_sessions = {}
74
+
75
+ if readers
76
+ readers.each do |reader|
77
+ session = owners[reader]
78
+ (fired_sessions[session] ||= { r: [],w: [] })[:r] << reader
79
+ end
80
+ end
81
+ if writers
82
+ writers.each do |writer|
83
+ session = owners[writer]
84
+ (fired_sessions[session] ||= { r: [],w: [] })[:w] << writer
85
+ end
86
+ end
87
+
88
+ fired_sessions.each do |s,rw|
89
+ s.ev_do_handle_events(rw[:r],rw[:w])
90
+ end
91
+
92
+ @sessions.each { |s| s.ev_do_postprocess(fired_sessions.key?(s)) }
93
+ true
94
+ end
95
+ end
96
+
97
+ # optimized version for a single session
98
+ class SingleSessionEventLoop < EventLoop
99
+ # Compatibility for original single session event loops:
100
+ # we call block with session as argument
101
+ def ev_preprocess(&block)
102
+ return false if block_given? && !yield(@sessions.first)
103
+
104
+ @sessions.each(&:ev_preprocess)
105
+ return false if block_given? && !yield(@sessions.first)
106
+
107
+ return true
108
+ end
109
+
110
+ def ev_select_and_postprocess(wait)
111
+ raise "Only one session expected" unless @sessions.count == 1
112
+
113
+ session = @sessions.first
114
+ sr,sw,actwait = session.ev_do_calculate_rw_wait(wait)
115
+ readers, writers, = IO.select(sr, sw, nil, actwait)
116
+
117
+ session.ev_do_handle_events(readers,writers)
118
+ session.ev_do_postprocess(!((readers.nil? || readers.empty?) && (writers.nil? || writers.empty?)))
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,59 @@
1
+ require 'net/ssh/loggable'
2
+ module Net
3
+ module SSH
4
+ module Connection
5
+ class Keepalive
6
+ include Loggable
7
+
8
+ def initialize(session)
9
+ @last_keepalive_sent_at = nil
10
+ @unresponded_keepalive_count = 0
11
+ @session = session
12
+ self.logger = session.logger
13
+ end
14
+
15
+ def options
16
+ @session.options
17
+ end
18
+
19
+ def enabled?
20
+ options[:keepalive]
21
+ end
22
+
23
+ def interval
24
+ options[:keepalive_interval] || Session::DEFAULT_IO_SELECT_TIMEOUT
25
+ end
26
+
27
+ def should_send?
28
+ return false unless enabled?
29
+ return true unless @last_keepalive_sent_at
30
+
31
+ Time.now - @last_keepalive_sent_at >= interval
32
+ end
33
+
34
+ def keepalive_maxcount
35
+ (options[:keepalive_maxcount] || 3).to_i
36
+ end
37
+
38
+ def send_as_needed(was_events)
39
+ return if was_events
40
+ return unless should_send?
41
+
42
+ info { "sending keepalive #{@unresponded_keepalive_count}" }
43
+
44
+ @unresponded_keepalive_count += 1
45
+ @session.send_global_request("keepalive@openssh.com") { |success, response|
46
+ debug { "keepalive response successful. Missed #{@unresponded_keepalive_count - 1} keepalives" }
47
+ @unresponded_keepalive_count = 0
48
+ }
49
+ @last_keepalive_sent_at = Time.now
50
+ if keepalive_maxcount > 0 && @unresponded_keepalive_count > keepalive_maxcount
51
+ error { "Timeout, server #{@session.host} not responding. Missed #{@unresponded_keepalive_count - 1} timeouts." }
52
+ @unresponded_keepalive_count = 0
53
+ raise Net::SSH::Timeout, "Timeout, server #{@session.host} not responding."
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end