hrr_rb_ssh 0.4.0.pre1 → 0.4.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +16 -8
- data/demo/client.rb +1 -3
- data/demo/echo_server.rb +1 -3
- data/demo/more_flexible_auth.rb +1 -3
- data/demo/multi_step_auth.rb +1 -3
- data/demo/server.rb +1 -3
- data/demo/subsystem_echo_server.rb +1 -3
- data/hrr_rb_ssh.gemspec +1 -1
- data/lib/hrr_rb_ssh/algorithm/publickey/ecdsa_sha2.rb +12 -9
- data/lib/hrr_rb_ssh/algorithm/publickey/ssh_dss.rb +10 -7
- data/lib/hrr_rb_ssh/algorithm/publickey/ssh_rsa.rb +9 -6
- data/lib/hrr_rb_ssh/authentication/method/keyboard_interactive/context.rb +9 -8
- data/lib/hrr_rb_ssh/authentication/method/keyboard_interactive/info_request.rb +6 -5
- data/lib/hrr_rb_ssh/authentication/method/keyboard_interactive/info_response.rb +5 -2
- data/lib/hrr_rb_ssh/authentication/method/keyboard_interactive.rb +12 -10
- data/lib/hrr_rb_ssh/authentication/method/none/context.rb +7 -6
- data/lib/hrr_rb_ssh/authentication/method/none.rb +10 -8
- data/lib/hrr_rb_ssh/authentication/method/password/context.rb +7 -6
- data/lib/hrr_rb_ssh/authentication/method/password.rb +10 -8
- data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/functionable.rb +13 -11
- data/lib/hrr_rb_ssh/authentication/method/publickey/context.rb +5 -2
- data/lib/hrr_rb_ssh/authentication/method/publickey.rb +16 -14
- data/lib/hrr_rb_ssh/authentication.rb +28 -27
- data/lib/hrr_rb_ssh/client.rb +58 -56
- data/lib/hrr_rb_ssh/codable.rb +20 -10
- data/lib/hrr_rb_ssh/connection/channel/channel_type/direct_tcpip.rb +20 -18
- data/lib/hrr_rb_ssh/connection/channel/channel_type/forwarded_tcpip.rb +20 -18
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/proc_chain/chain_context.rb +0 -3
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/proc_chain.rb +0 -2
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/env/context.rb +5 -4
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/env.rb +2 -5
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/exec/context.rb +5 -4
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/exec.rb +2 -5
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/pty_req/context.rb +5 -4
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/pty_req.rb +2 -5
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/shell/context.rb +5 -4
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/shell.rb +2 -5
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/subsystem/context.rb +5 -4
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/subsystem.rb +2 -5
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/window_change/context.rb +5 -4
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/window_change.rb +2 -5
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session.rb +14 -12
- data/lib/hrr_rb_ssh/connection/channel.rb +73 -71
- data/lib/hrr_rb_ssh/connection/global_request_handler.rb +14 -12
- data/lib/hrr_rb_ssh/connection/request_handler/reference_env_request_handler.rb +0 -2
- data/lib/hrr_rb_ssh/connection/request_handler/reference_exec_request_handler.rb +4 -6
- data/lib/hrr_rb_ssh/connection/request_handler/reference_pty_req_request_handler.rb +10 -12
- data/lib/hrr_rb_ssh/connection/request_handler/reference_shell_request_handler.rb +4 -6
- data/lib/hrr_rb_ssh/connection/request_handler/reference_window_change_request_handler.rb +0 -2
- data/lib/hrr_rb_ssh/connection/request_handler.rb +1 -3
- data/lib/hrr_rb_ssh/connection.rb +53 -53
- data/lib/hrr_rb_ssh/loggable.rb +42 -0
- data/lib/hrr_rb_ssh/server.rb +11 -9
- data/lib/hrr_rb_ssh/transport/compression_algorithm/functionable.rb +5 -3
- data/lib/hrr_rb_ssh/transport/compression_algorithm/unfunctionable.rb +5 -3
- data/lib/hrr_rb_ssh/transport/encryption_algorithm/functionable.rb +5 -3
- data/lib/hrr_rb_ssh/transport/encryption_algorithm/unfunctionable.rb +5 -3
- data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb +9 -8
- data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange.rb +13 -12
- data/lib/hrr_rb_ssh/transport/kex_algorithm/elliptic_curve_diffie_hellman.rb +9 -8
- data/lib/hrr_rb_ssh/transport/mac_algorithm/functionable.rb +5 -3
- data/lib/hrr_rb_ssh/transport/mac_algorithm/unfunctionable.rb +5 -3
- data/lib/hrr_rb_ssh/transport/receiver.rb +8 -7
- data/lib/hrr_rb_ssh/transport/sender.rb +5 -3
- data/lib/hrr_rb_ssh/transport/sequence_number.rb +0 -4
- data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/functionable.rb +5 -3
- data/lib/hrr_rb_ssh/transport.rb +41 -40
- data/lib/hrr_rb_ssh/version.rb +1 -1
- data/lib/hrr_rb_ssh.rb +0 -1
- metadata +6 -6
- data/lib/hrr_rb_ssh/logger.rb +0 -56
@@ -2,7 +2,7 @@
|
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
4
|
require 'openssl'
|
5
|
-
require 'hrr_rb_ssh/
|
5
|
+
require 'hrr_rb_ssh/loggable'
|
6
6
|
require 'hrr_rb_ssh/data_type'
|
7
7
|
require 'hrr_rb_ssh/transport/kex_algorithm/iv_computable'
|
8
8
|
|
@@ -10,10 +10,11 @@ module HrrRbSsh
|
|
10
10
|
class Transport
|
11
11
|
class KexAlgorithm
|
12
12
|
module DiffieHellman
|
13
|
+
include Loggable
|
13
14
|
include IvComputable
|
14
15
|
|
15
|
-
def initialize
|
16
|
-
|
16
|
+
def initialize logger: nil
|
17
|
+
self.logger = logger
|
17
18
|
@dh = OpenSSL::PKey::DH.new
|
18
19
|
if @dh.respond_to?(:set_pqg)
|
19
20
|
@dh.set_pqg OpenSSL::BN.new(self.class::P, 16), nil, OpenSSL::BN.new(self.class::G)
|
@@ -59,7 +60,7 @@ module HrrRbSsh
|
|
59
60
|
:'f' => @f,
|
60
61
|
:'k' => @shared_secret,
|
61
62
|
}
|
62
|
-
h0 = H0.encode h0_payload
|
63
|
+
h0 = H0.encode h0_payload, logger: logger
|
63
64
|
h = OpenSSL::Digest.digest self.class::DIGEST, h0
|
64
65
|
end
|
65
66
|
|
@@ -69,7 +70,7 @@ module HrrRbSsh
|
|
69
70
|
end
|
70
71
|
|
71
72
|
def receive_kexdh_init payload
|
72
|
-
Message::SSH_MSG_KEXDH_INIT.decode payload
|
73
|
+
Message::SSH_MSG_KEXDH_INIT.decode payload, logger: logger
|
73
74
|
end
|
74
75
|
|
75
76
|
def send_kexdh_reply transport
|
@@ -79,7 +80,7 @@ module HrrRbSsh
|
|
79
80
|
:'f' => @f,
|
80
81
|
:'signature of H' => sign(transport),
|
81
82
|
}
|
82
|
-
payload = Message::SSH_MSG_KEXDH_REPLY.encode message
|
83
|
+
payload = Message::SSH_MSG_KEXDH_REPLY.encode message, logger: logger
|
83
84
|
transport.send payload
|
84
85
|
end
|
85
86
|
|
@@ -88,12 +89,12 @@ module HrrRbSsh
|
|
88
89
|
:'message number' => Message::SSH_MSG_KEXDH_INIT::VALUE,
|
89
90
|
:'e' => @e,
|
90
91
|
}
|
91
|
-
payload = Message::SSH_MSG_KEXDH_INIT.encode message
|
92
|
+
payload = Message::SSH_MSG_KEXDH_INIT.encode message, logger: logger
|
92
93
|
transport.send payload
|
93
94
|
end
|
94
95
|
|
95
96
|
def receive_kexdh_reply payload
|
96
|
-
Message::SSH_MSG_KEXDH_REPLY.decode payload
|
97
|
+
Message::SSH_MSG_KEXDH_REPLY.decode payload, logger: logger
|
97
98
|
end
|
98
99
|
end
|
99
100
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
4
|
require 'openssl'
|
5
|
-
require 'hrr_rb_ssh/
|
5
|
+
require 'hrr_rb_ssh/loggable'
|
6
6
|
require 'hrr_rb_ssh/data_type'
|
7
7
|
require 'hrr_rb_ssh/transport/kex_algorithm/iv_computable'
|
8
8
|
|
@@ -10,10 +10,11 @@ module HrrRbSsh
|
|
10
10
|
class Transport
|
11
11
|
class KexAlgorithm
|
12
12
|
module DiffieHellmanGroupExchange
|
13
|
+
include Loggable
|
13
14
|
include IvComputable
|
14
15
|
|
15
|
-
def initialize
|
16
|
-
|
16
|
+
def initialize logger: nil
|
17
|
+
self.logger = logger
|
17
18
|
end
|
18
19
|
|
19
20
|
def start transport
|
@@ -91,7 +92,7 @@ module HrrRbSsh
|
|
91
92
|
:'f' => @f,
|
92
93
|
:'k' => @shared_secret,
|
93
94
|
}
|
94
|
-
h0 = H0.encode h0_payload
|
95
|
+
h0 = H0.encode h0_payload, logger: logger
|
95
96
|
h = OpenSSL::Digest.digest self.class::DIGEST, h0
|
96
97
|
end
|
97
98
|
|
@@ -101,7 +102,7 @@ module HrrRbSsh
|
|
101
102
|
end
|
102
103
|
|
103
104
|
def receive_kex_dh_gex_request payload
|
104
|
-
Message::SSH_MSG_KEX_DH_GEX_REQUEST.decode payload
|
105
|
+
Message::SSH_MSG_KEX_DH_GEX_REQUEST.decode payload, logger: logger
|
105
106
|
end
|
106
107
|
|
107
108
|
def send_kex_dh_gex_group transport
|
@@ -110,12 +111,12 @@ module HrrRbSsh
|
|
110
111
|
:'p' => @p,
|
111
112
|
:'g' => @g,
|
112
113
|
}
|
113
|
-
payload = Message::SSH_MSG_KEX_DH_GEX_GROUP.encode message
|
114
|
+
payload = Message::SSH_MSG_KEX_DH_GEX_GROUP.encode message, logger: logger
|
114
115
|
transport.send payload
|
115
116
|
end
|
116
117
|
|
117
118
|
def receive_kex_dh_gex_init payload
|
118
|
-
Message::SSH_MSG_KEX_DH_GEX_INIT.decode payload
|
119
|
+
Message::SSH_MSG_KEX_DH_GEX_INIT.decode payload, logger: logger
|
119
120
|
end
|
120
121
|
|
121
122
|
def send_kex_dh_gex_reply transport
|
@@ -125,7 +126,7 @@ module HrrRbSsh
|
|
125
126
|
:'f' => @f,
|
126
127
|
:'signature of H' => sign(transport),
|
127
128
|
}
|
128
|
-
payload = Message::SSH_MSG_KEX_DH_GEX_REPLY.encode message
|
129
|
+
payload = Message::SSH_MSG_KEX_DH_GEX_REPLY.encode message, logger: logger
|
129
130
|
transport.send payload
|
130
131
|
end
|
131
132
|
|
@@ -136,12 +137,12 @@ module HrrRbSsh
|
|
136
137
|
:'n' => @n,
|
137
138
|
:'max' => @max,
|
138
139
|
}
|
139
|
-
payload = Message::SSH_MSG_KEX_DH_GEX_REQUEST.encode message
|
140
|
+
payload = Message::SSH_MSG_KEX_DH_GEX_REQUEST.encode message, logger: logger
|
140
141
|
transport.send payload
|
141
142
|
end
|
142
143
|
|
143
144
|
def receive_kex_dh_gex_group payload
|
144
|
-
Message::SSH_MSG_KEX_DH_GEX_GROUP.decode payload
|
145
|
+
Message::SSH_MSG_KEX_DH_GEX_GROUP.decode payload, logger: logger
|
145
146
|
end
|
146
147
|
|
147
148
|
def send_kex_dh_gex_init transport
|
@@ -149,12 +150,12 @@ module HrrRbSsh
|
|
149
150
|
:'message number' => Message::SSH_MSG_KEX_DH_GEX_INIT::VALUE,
|
150
151
|
:'e' => @e,
|
151
152
|
}
|
152
|
-
payload = Message::SSH_MSG_KEX_DH_GEX_INIT.encode message
|
153
|
+
payload = Message::SSH_MSG_KEX_DH_GEX_INIT.encode message, logger: logger
|
153
154
|
transport.send payload
|
154
155
|
end
|
155
156
|
|
156
157
|
def receive_kex_dh_gex_reply payload
|
157
|
-
Message::SSH_MSG_KEX_DH_GEX_REPLY.decode payload
|
158
|
+
Message::SSH_MSG_KEX_DH_GEX_REPLY.decode payload, logger: logger
|
158
159
|
end
|
159
160
|
end
|
160
161
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
4
|
require 'openssl'
|
5
|
-
require 'hrr_rb_ssh/
|
5
|
+
require 'hrr_rb_ssh/loggable'
|
6
6
|
require 'hrr_rb_ssh/data_type'
|
7
7
|
require 'hrr_rb_ssh/transport/kex_algorithm/iv_computable'
|
8
8
|
|
@@ -10,10 +10,11 @@ module HrrRbSsh
|
|
10
10
|
class Transport
|
11
11
|
class KexAlgorithm
|
12
12
|
module EllipticCurveDiffieHellman
|
13
|
+
include Loggable
|
13
14
|
include IvComputable
|
14
15
|
|
15
|
-
def initialize
|
16
|
-
|
16
|
+
def initialize logger: nil
|
17
|
+
self.logger = logger
|
17
18
|
@dh = OpenSSL::PKey::EC.new(self.class::CURVE_NAME)
|
18
19
|
@dh.generate_key
|
19
20
|
@public_key = @dh.public_key.to_bn.to_i
|
@@ -53,7 +54,7 @@ module HrrRbSsh
|
|
53
54
|
:'Q_S' => @q_s,
|
54
55
|
:'K' => @shared_secret,
|
55
56
|
}
|
56
|
-
h0 = H0.encode h0_payload
|
57
|
+
h0 = H0.encode h0_payload, logger: logger
|
57
58
|
h = OpenSSL::Digest.digest self.class::DIGEST, h0
|
58
59
|
end
|
59
60
|
|
@@ -63,7 +64,7 @@ module HrrRbSsh
|
|
63
64
|
end
|
64
65
|
|
65
66
|
def receive_kexecdh_init payload
|
66
|
-
Message::SSH_MSG_KEXECDH_INIT.decode payload
|
67
|
+
Message::SSH_MSG_KEXECDH_INIT.decode payload, logger: logger
|
67
68
|
end
|
68
69
|
|
69
70
|
def send_kexecdh_reply transport
|
@@ -73,7 +74,7 @@ module HrrRbSsh
|
|
73
74
|
:'Q_S' => @q_s,
|
74
75
|
:'signature of H' => sign(transport),
|
75
76
|
}
|
76
|
-
payload = Message::SSH_MSG_KEXECDH_REPLY.encode message
|
77
|
+
payload = Message::SSH_MSG_KEXECDH_REPLY.encode message, logger: logger
|
77
78
|
transport.send payload
|
78
79
|
end
|
79
80
|
|
@@ -82,12 +83,12 @@ module HrrRbSsh
|
|
82
83
|
:'message number' => Message::SSH_MSG_KEXECDH_INIT::VALUE,
|
83
84
|
:'Q_C' => @q_c,
|
84
85
|
}
|
85
|
-
payload = Message::SSH_MSG_KEXECDH_INIT.encode message
|
86
|
+
payload = Message::SSH_MSG_KEXECDH_INIT.encode message, logger: logger
|
86
87
|
transport.send payload
|
87
88
|
end
|
88
89
|
|
89
90
|
def receive_kexecdh_reply payload
|
90
|
-
Message::SSH_MSG_KEXECDH_REPLY.decode payload
|
91
|
+
Message::SSH_MSG_KEXECDH_REPLY.decode payload, logger: logger
|
91
92
|
end
|
92
93
|
end
|
93
94
|
end
|
@@ -1,14 +1,16 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
|
-
require 'hrr_rb_ssh/
|
4
|
+
require 'hrr_rb_ssh/loggable'
|
5
5
|
|
6
6
|
module HrrRbSsh
|
7
7
|
class Transport
|
8
8
|
class MacAlgorithm
|
9
9
|
module Functionable
|
10
|
-
|
11
|
-
|
10
|
+
include Loggable
|
11
|
+
|
12
|
+
def initialize key, logger: nil
|
13
|
+
self.logger = logger
|
12
14
|
@key = key
|
13
15
|
end
|
14
16
|
|
@@ -1,14 +1,16 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
|
-
require 'hrr_rb_ssh/
|
4
|
+
require 'hrr_rb_ssh/loggable'
|
5
5
|
|
6
6
|
module HrrRbSsh
|
7
7
|
class Transport
|
8
8
|
class MacAlgorithm
|
9
9
|
module Unfunctionable
|
10
|
-
|
11
|
-
|
10
|
+
include Loggable
|
11
|
+
|
12
|
+
def initialize key=nil, logger: nil
|
13
|
+
self.logger = logger
|
12
14
|
end
|
13
15
|
|
14
16
|
def digest_length
|
@@ -1,14 +1,15 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
|
-
require 'hrr_rb_ssh/
|
5
|
-
#require 'hrr_rb_ssh/transport/packet'
|
4
|
+
require 'hrr_rb_ssh/loggable'
|
6
5
|
|
7
6
|
module HrrRbSsh
|
8
7
|
class Transport
|
9
8
|
class Receiver
|
10
|
-
|
11
|
-
|
9
|
+
include Loggable
|
10
|
+
|
11
|
+
def initialize logger: nil
|
12
|
+
self.logger = logger
|
12
13
|
end
|
13
14
|
|
14
15
|
def depacketize transport, packet
|
@@ -34,7 +35,7 @@ module HrrRbSsh
|
|
34
35
|
block_size = [transport.incoming_encryption_algorithm.block_size, minimum_block_size].max
|
35
36
|
encrypted_packet.push transport.io.read(block_size)
|
36
37
|
if (encrypted_packet.last == nil) || (encrypted_packet.last.length != block_size)
|
37
|
-
|
38
|
+
log_warn { "IO is EOF" }
|
38
39
|
raise EOFError
|
39
40
|
end
|
40
41
|
unencrypted_packet.push transport.incoming_encryption_algorithm.decrypt(encrypted_packet.last)
|
@@ -43,7 +44,7 @@ module HrrRbSsh
|
|
43
44
|
following_packet_length = packet_length_field_length + packet_length - block_size
|
44
45
|
encrypted_packet.push transport.io.read(following_packet_length)
|
45
46
|
if (encrypted_packet.last == nil) || (encrypted_packet.last.length != following_packet_length)
|
46
|
-
|
47
|
+
log_warn { "IO is EOF" }
|
47
48
|
raise EOFError
|
48
49
|
end
|
49
50
|
unencrypted_packet.push transport.incoming_encryption_algorithm.decrypt(encrypted_packet.last)
|
@@ -55,7 +56,7 @@ module HrrRbSsh
|
|
55
56
|
mac_length = transport.incoming_mac_algorithm.digest_length
|
56
57
|
mac = transport.io.read mac_length
|
57
58
|
if (mac == nil) || (mac.length != mac_length)
|
58
|
-
|
59
|
+
log_warn { "IO is EOF" }
|
59
60
|
raise EOFError
|
60
61
|
end
|
61
62
|
mac
|
@@ -1,13 +1,15 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
|
-
require 'hrr_rb_ssh/
|
4
|
+
require 'hrr_rb_ssh/loggable'
|
5
5
|
|
6
6
|
module HrrRbSsh
|
7
7
|
class Transport
|
8
8
|
class Sender
|
9
|
-
|
10
|
-
|
9
|
+
include Loggable
|
10
|
+
|
11
|
+
def initialize logger: nil
|
12
|
+
self.logger = logger
|
11
13
|
end
|
12
14
|
|
13
15
|
def packetize transport, payload
|
@@ -1,8 +1,6 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
|
-
require 'hrr_rb_ssh/logger'
|
5
|
-
|
6
4
|
module HrrRbSsh
|
7
5
|
class Transport
|
8
6
|
class SequenceNumber
|
@@ -10,8 +8,6 @@ module HrrRbSsh
|
|
10
8
|
|
11
9
|
def initialize
|
12
10
|
@sequence_number = 0
|
13
|
-
|
14
|
-
@logger = Logger.new self.class.name
|
15
11
|
end
|
16
12
|
|
17
13
|
def increment
|
@@ -1,14 +1,16 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
|
-
require 'hrr_rb_ssh/
|
4
|
+
require 'hrr_rb_ssh/loggable'
|
5
5
|
|
6
6
|
module HrrRbSsh
|
7
7
|
class Transport
|
8
8
|
class ServerHostKeyAlgorithm
|
9
9
|
module Functionable
|
10
|
-
|
11
|
-
|
10
|
+
include Loggable
|
11
|
+
|
12
|
+
def initialize secret_key=nil, logger: nil
|
13
|
+
self.logger = logger
|
12
14
|
@publickey = Algorithm::Publickey[self.class::NAME].new (secret_key || self.class::SECRET_KEY)
|
13
15
|
end
|
14
16
|
|
data/lib/hrr_rb_ssh/transport.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
require 'monitor'
|
5
5
|
require 'hrr_rb_ssh/version'
|
6
|
-
require 'hrr_rb_ssh/
|
6
|
+
require 'hrr_rb_ssh/loggable'
|
7
7
|
require 'hrr_rb_ssh/data_type'
|
8
8
|
require 'hrr_rb_ssh/message'
|
9
9
|
require 'hrr_rb_ssh/error/closed_transport'
|
@@ -20,6 +20,7 @@ require 'hrr_rb_ssh/transport/compression_algorithm'
|
|
20
20
|
|
21
21
|
module HrrRbSsh
|
22
22
|
class Transport
|
23
|
+
include Loggable
|
23
24
|
include Constant
|
24
25
|
|
25
26
|
attr_reader \
|
@@ -50,20 +51,20 @@ module HrrRbSsh
|
|
50
51
|
:i_s,
|
51
52
|
:session_id
|
52
53
|
|
53
|
-
def initialize io, mode, options={}
|
54
|
+
def initialize io, mode, options={}, logger: nil
|
55
|
+
self.logger = logger
|
56
|
+
|
54
57
|
@io = io
|
55
58
|
@mode = mode
|
56
59
|
@options = options
|
57
60
|
|
58
|
-
@logger = Logger.new self.class.name
|
59
|
-
|
60
61
|
@closed = nil
|
61
62
|
@disconnected = nil
|
62
63
|
|
63
64
|
@in_kex = false
|
64
65
|
|
65
|
-
@sender = Sender.new
|
66
|
-
@receiver = Receiver.new
|
66
|
+
@sender = Sender.new logger: logger
|
67
|
+
@receiver = Receiver.new logger: logger
|
67
68
|
|
68
69
|
@sender_monitor = Monitor.new
|
69
70
|
@receiver_monitor = Monitor.new
|
@@ -91,11 +92,11 @@ module HrrRbSsh
|
|
91
92
|
begin
|
92
93
|
@sender.send self, payload
|
93
94
|
rescue Errno::EPIPE => e
|
94
|
-
|
95
|
+
log_warn { "IO is Broken PIPE" }
|
95
96
|
close
|
96
97
|
raise Error::ClosedTransport
|
97
98
|
rescue => e
|
98
|
-
|
99
|
+
log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
|
99
100
|
close
|
100
101
|
raise Error::ClosedTransport
|
101
102
|
end
|
@@ -109,25 +110,25 @@ module HrrRbSsh
|
|
109
110
|
payload = @receiver.receive self
|
110
111
|
case payload[0,1].unpack("C")[0]
|
111
112
|
when Message::SSH_MSG_DISCONNECT::VALUE
|
112
|
-
message = Message::SSH_MSG_DISCONNECT.decode payload
|
113
|
-
|
113
|
+
message = Message::SSH_MSG_DISCONNECT.decode payload, logger: logger
|
114
|
+
log_debug { "received disconnect message: #{message.inspect}" }
|
114
115
|
@disconnected = true
|
115
116
|
close
|
116
117
|
raise Error::ClosedTransport
|
117
118
|
when Message::SSH_MSG_IGNORE::VALUE
|
118
|
-
message = Message::SSH_MSG_IGNORE.decode payload
|
119
|
-
|
119
|
+
message = Message::SSH_MSG_IGNORE.decode payload, logger: logger
|
120
|
+
log_debug { "received ignore message: #{message.inspect}" }
|
120
121
|
receive
|
121
122
|
when Message::SSH_MSG_UNIMPLEMENTED::VALUE
|
122
|
-
message = Message::SSH_MSG_UNIMPLEMENTED.decode payload
|
123
|
-
|
123
|
+
message = Message::SSH_MSG_UNIMPLEMENTED.decode payload, logger: logger
|
124
|
+
log_debug { "received unimplemented message: #{message.inspect}" }
|
124
125
|
receive
|
125
126
|
when Message::SSH_MSG_DEBUG::VALUE
|
126
|
-
message = Message::SSH_MSG_DEBUG.decode payload
|
127
|
-
|
127
|
+
message = Message::SSH_MSG_DEBUG.decode payload, logger: logger
|
128
|
+
log_debug { "received debug message: #{message.inspect}" }
|
128
129
|
receive
|
129
130
|
when Message::SSH_MSG_KEXINIT::VALUE
|
130
|
-
|
131
|
+
log_debug { "received kexinit message" }
|
131
132
|
if @in_kex
|
132
133
|
payload
|
133
134
|
else
|
@@ -143,15 +144,15 @@ module HrrRbSsh
|
|
143
144
|
close
|
144
145
|
raise Error::ClosedTransport
|
145
146
|
rescue IOError => e
|
146
|
-
|
147
|
+
log_warn { "IO is closed" }
|
147
148
|
close
|
148
149
|
raise Error::ClosedTransport
|
149
150
|
rescue Errno::ECONNRESET => e
|
150
|
-
|
151
|
+
log_warn { "IO is RESET" }
|
151
152
|
close
|
152
153
|
raise Error::ClosedTransport
|
153
154
|
rescue => e
|
154
|
-
|
155
|
+
log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
|
155
156
|
close
|
156
157
|
raise Error::ClosedTransport
|
157
158
|
end
|
@@ -159,7 +160,7 @@ module HrrRbSsh
|
|
159
160
|
end
|
160
161
|
|
161
162
|
def start
|
162
|
-
|
163
|
+
log_info { "start transport" }
|
163
164
|
|
164
165
|
begin
|
165
166
|
exchange_version
|
@@ -176,21 +177,21 @@ module HrrRbSsh
|
|
176
177
|
rescue EOFError => e
|
177
178
|
close
|
178
179
|
rescue => e
|
179
|
-
|
180
|
+
log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
|
180
181
|
close
|
181
182
|
else
|
182
|
-
|
183
|
+
log_info { "transport started" }
|
183
184
|
end
|
184
185
|
end
|
185
186
|
|
186
187
|
def close
|
187
188
|
return if @closed
|
188
|
-
|
189
|
+
log_info { "close transport" }
|
189
190
|
@closed = true
|
190
191
|
disconnect
|
191
192
|
@incoming_compression_algorithm.close
|
192
193
|
@outgoing_compression_algorithm.close
|
193
|
-
|
194
|
+
log_info { "transport closed" }
|
194
195
|
end
|
195
196
|
|
196
197
|
def closed?
|
@@ -199,16 +200,16 @@ module HrrRbSsh
|
|
199
200
|
|
200
201
|
def disconnect
|
201
202
|
return if @disconnected
|
202
|
-
|
203
|
+
log_info { "disconnect transport" }
|
203
204
|
@disconnected = true
|
204
205
|
begin
|
205
206
|
send_disconnect
|
206
207
|
rescue IOError
|
207
|
-
|
208
|
+
log_warn { "IO is closed" }
|
208
209
|
rescue => e
|
209
|
-
|
210
|
+
log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
|
210
211
|
end
|
211
|
-
|
212
|
+
log_info { "transport disconnected" }
|
212
213
|
end
|
213
214
|
|
214
215
|
def exchange_version
|
@@ -317,10 +318,10 @@ module HrrRbSsh
|
|
317
318
|
if str_io.string[-2..-1] == "#{CR}#{LF}"
|
318
319
|
if str_io.string[0..3] == "SSH-"
|
319
320
|
@remote_version = str_io.string[0..-3]
|
320
|
-
|
321
|
+
log_info { "received remote version string: #{@remote_version}" }
|
321
322
|
break
|
322
323
|
else
|
323
|
-
|
324
|
+
log_info { "received message before remote version string: #{str_io.string}" }
|
324
325
|
str_io.rewind
|
325
326
|
str_io.truncate(0)
|
326
327
|
end
|
@@ -346,7 +347,7 @@ module HrrRbSsh
|
|
346
347
|
:'description' => "disconnected by user",
|
347
348
|
:'language tag' => ""
|
348
349
|
}
|
349
|
-
payload = Message::SSH_MSG_DISCONNECT.encode message
|
350
|
+
payload = Message::SSH_MSG_DISCONNECT.encode message, logger: logger
|
350
351
|
send payload
|
351
352
|
end
|
352
353
|
|
@@ -367,7 +368,7 @@ module HrrRbSsh
|
|
367
368
|
:'first_kex_packet_follows' => false,
|
368
369
|
:'0 (reserved for future extension)' => 0,
|
369
370
|
}
|
370
|
-
payload = Message::SSH_MSG_KEXINIT.encode message
|
371
|
+
payload = Message::SSH_MSG_KEXINIT.encode message, logger: logger
|
371
372
|
send payload
|
372
373
|
|
373
374
|
case @mode
|
@@ -385,7 +386,7 @@ module HrrRbSsh
|
|
385
386
|
when Mode::CLIENT
|
386
387
|
@i_s = payload
|
387
388
|
end
|
388
|
-
message = Message::SSH_MSG_KEXINIT.decode payload
|
389
|
+
message = Message::SSH_MSG_KEXINIT.decode payload, logger: logger
|
389
390
|
update_remote_algorithms message
|
390
391
|
end
|
391
392
|
|
@@ -393,12 +394,12 @@ module HrrRbSsh
|
|
393
394
|
message = {
|
394
395
|
:'message number' => Message::SSH_MSG_NEWKEYS::VALUE,
|
395
396
|
}
|
396
|
-
payload = Message::SSH_MSG_NEWKEYS.encode message
|
397
|
+
payload = Message::SSH_MSG_NEWKEYS.encode message, logger: logger
|
397
398
|
send payload
|
398
399
|
end
|
399
400
|
|
400
401
|
def receive_newkeys payload
|
401
|
-
message = Message::SSH_MSG_NEWKEYS.decode payload
|
402
|
+
message = Message::SSH_MSG_NEWKEYS.decode payload, logger: logger
|
402
403
|
end
|
403
404
|
|
404
405
|
def send_service_request
|
@@ -406,16 +407,16 @@ module HrrRbSsh
|
|
406
407
|
:'message number' => Message::SSH_MSG_SERVICE_REQUEST::VALUE,
|
407
408
|
:'service name' => 'ssh-userauth',
|
408
409
|
}
|
409
|
-
payload = Message::SSH_MSG_SERVICE_REQUEST.encode message
|
410
|
+
payload = Message::SSH_MSG_SERVICE_REQUEST.encode message, logger: logger
|
410
411
|
send payload
|
411
412
|
|
412
413
|
payload = @receiver.receive self
|
413
|
-
message = Message::SSH_MSG_SERVICE_ACCEPT.decode payload
|
414
|
+
message = Message::SSH_MSG_SERVICE_ACCEPT.decode payload, logger: logger
|
414
415
|
end
|
415
416
|
|
416
417
|
def receive_service_request
|
417
418
|
payload = @receiver.receive self
|
418
|
-
message = Message::SSH_MSG_SERVICE_REQUEST.decode payload
|
419
|
+
message = Message::SSH_MSG_SERVICE_REQUEST.decode payload, logger: logger
|
419
420
|
|
420
421
|
message
|
421
422
|
end
|
@@ -425,7 +426,7 @@ module HrrRbSsh
|
|
425
426
|
:'message number' => Message::SSH_MSG_SERVICE_ACCEPT::VALUE,
|
426
427
|
:'service name' => service_name,
|
427
428
|
}
|
428
|
-
payload = Message::SSH_MSG_SERVICE_ACCEPT.encode message
|
429
|
+
payload = Message::SSH_MSG_SERVICE_ACCEPT.encode message, logger: logger
|
429
430
|
send payload
|
430
431
|
end
|
431
432
|
|
data/lib/hrr_rb_ssh/version.rb
CHANGED
data/lib/hrr_rb_ssh.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hrr_rb_ssh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.0.
|
4
|
+
version: 0.4.0.pre2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hirura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '12.0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '12.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -162,7 +162,7 @@ files:
|
|
162
162
|
- lib/hrr_rb_ssh/error/closed_authentication.rb
|
163
163
|
- lib/hrr_rb_ssh/error/closed_connection.rb
|
164
164
|
- lib/hrr_rb_ssh/error/closed_transport.rb
|
165
|
-
- lib/hrr_rb_ssh/
|
165
|
+
- lib/hrr_rb_ssh/loggable.rb
|
166
166
|
- lib/hrr_rb_ssh/message.rb
|
167
167
|
- lib/hrr_rb_ssh/message/001_ssh_msg_disconnect.rb
|
168
168
|
- lib/hrr_rb_ssh/message/002_ssh_msg_ignore.rb
|
@@ -288,7 +288,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
288
288
|
- !ruby/object:Gem::Version
|
289
289
|
version: 1.3.1
|
290
290
|
requirements: []
|
291
|
-
rubygems_version: 3.
|
291
|
+
rubygems_version: 3.1.2
|
292
292
|
signing_key:
|
293
293
|
specification_version: 4
|
294
294
|
summary: Pure Ruby SSH 2.0 server and client implementation
|