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.
- checksums.yaml +7 -0
- data/.github/workflows/ci.yml +93 -0
- data/.gitignore +13 -0
- data/.rubocop.yml +21 -0
- data/.rubocop_todo.yml +1074 -0
- data/.travis.yml +51 -0
- data/CHANGES.txt +698 -0
- data/Gemfile +13 -0
- data/Gemfile.noed25519 +12 -0
- data/ISSUE_TEMPLATE.md +30 -0
- data/LICENSE.txt +19 -0
- data/Manifest +132 -0
- data/README.md +287 -0
- data/Rakefile +105 -0
- data/THANKS.txt +110 -0
- data/appveyor.yml +58 -0
- data/lib/net/ssh/authentication/agent.rb +284 -0
- data/lib/net/ssh/authentication/certificate.rb +183 -0
- data/lib/net/ssh/authentication/constants.rb +20 -0
- data/lib/net/ssh/authentication/ed25519.rb +185 -0
- data/lib/net/ssh/authentication/ed25519_loader.rb +31 -0
- data/lib/net/ssh/authentication/key_manager.rb +297 -0
- data/lib/net/ssh/authentication/methods/abstract.rb +69 -0
- data/lib/net/ssh/authentication/methods/hostbased.rb +72 -0
- data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +77 -0
- data/lib/net/ssh/authentication/methods/none.rb +34 -0
- data/lib/net/ssh/authentication/methods/password.rb +80 -0
- data/lib/net/ssh/authentication/methods/publickey.rb +95 -0
- data/lib/net/ssh/authentication/pageant.rb +497 -0
- data/lib/net/ssh/authentication/pub_key_fingerprint.rb +43 -0
- data/lib/net/ssh/authentication/session.rb +163 -0
- data/lib/net/ssh/buffer.rb +434 -0
- data/lib/net/ssh/buffered_io.rb +202 -0
- data/lib/net/ssh/config.rb +406 -0
- data/lib/net/ssh/connection/channel.rb +695 -0
- data/lib/net/ssh/connection/constants.rb +33 -0
- data/lib/net/ssh/connection/event_loop.rb +123 -0
- data/lib/net/ssh/connection/keepalive.rb +59 -0
- data/lib/net/ssh/connection/session.rb +712 -0
- data/lib/net/ssh/connection/term.rb +180 -0
- data/lib/net/ssh/errors.rb +106 -0
- data/lib/net/ssh/key_factory.rb +218 -0
- data/lib/net/ssh/known_hosts.rb +264 -0
- data/lib/net/ssh/loggable.rb +62 -0
- data/lib/net/ssh/packet.rb +106 -0
- data/lib/net/ssh/prompt.rb +62 -0
- data/lib/net/ssh/proxy/command.rb +123 -0
- data/lib/net/ssh/proxy/errors.rb +16 -0
- data/lib/net/ssh/proxy/http.rb +98 -0
- data/lib/net/ssh/proxy/https.rb +50 -0
- data/lib/net/ssh/proxy/jump.rb +54 -0
- data/lib/net/ssh/proxy/socks4.rb +67 -0
- data/lib/net/ssh/proxy/socks5.rb +140 -0
- data/lib/net/ssh/service/forward.rb +426 -0
- data/lib/net/ssh/test/channel.rb +147 -0
- data/lib/net/ssh/test/extensions.rb +173 -0
- data/lib/net/ssh/test/kex.rb +46 -0
- data/lib/net/ssh/test/local_packet.rb +53 -0
- data/lib/net/ssh/test/packet.rb +101 -0
- data/lib/net/ssh/test/remote_packet.rb +40 -0
- data/lib/net/ssh/test/script.rb +180 -0
- data/lib/net/ssh/test/socket.rb +65 -0
- data/lib/net/ssh/test.rb +94 -0
- data/lib/net/ssh/transport/algorithms.rb +502 -0
- data/lib/net/ssh/transport/cipher_factory.rb +103 -0
- data/lib/net/ssh/transport/constants.rb +40 -0
- data/lib/net/ssh/transport/ctr.rb +115 -0
- data/lib/net/ssh/transport/hmac/abstract.rb +97 -0
- data/lib/net/ssh/transport/hmac/md5.rb +10 -0
- data/lib/net/ssh/transport/hmac/md5_96.rb +9 -0
- data/lib/net/ssh/transport/hmac/none.rb +13 -0
- data/lib/net/ssh/transport/hmac/ripemd160.rb +11 -0
- data/lib/net/ssh/transport/hmac/sha1.rb +11 -0
- data/lib/net/ssh/transport/hmac/sha1_96.rb +9 -0
- data/lib/net/ssh/transport/hmac/sha2_256.rb +11 -0
- data/lib/net/ssh/transport/hmac/sha2_256_96.rb +9 -0
- data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
- data/lib/net/ssh/transport/hmac/sha2_512.rb +11 -0
- data/lib/net/ssh/transport/hmac/sha2_512_96.rb +9 -0
- data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
- data/lib/net/ssh/transport/hmac.rb +47 -0
- data/lib/net/ssh/transport/identity_cipher.rb +57 -0
- data/lib/net/ssh/transport/kex/abstract.rb +130 -0
- data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
- data/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
- data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +37 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +122 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +72 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +11 -0
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +39 -0
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +21 -0
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +21 -0
- data/lib/net/ssh/transport/kex.rb +31 -0
- data/lib/net/ssh/transport/key_expander.rb +30 -0
- data/lib/net/ssh/transport/openssl.rb +253 -0
- data/lib/net/ssh/transport/packet_stream.rb +280 -0
- data/lib/net/ssh/transport/server_version.rb +77 -0
- data/lib/net/ssh/transport/session.rb +354 -0
- data/lib/net/ssh/transport/state.rb +208 -0
- data/lib/net/ssh/verifiers/accept_new.rb +33 -0
- data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +33 -0
- data/lib/net/ssh/verifiers/always.rb +58 -0
- data/lib/net/ssh/verifiers/never.rb +19 -0
- data/lib/net/ssh/version.rb +68 -0
- data/lib/net/ssh.rb +330 -0
- data/net-ssh-public_cert.pem +20 -0
- data/net-ssh.gemspec +44 -0
- data/support/ssh_tunnel_bug.rb +65 -0
- 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
|