hrr_rb_ssh 0.4.0.pre1 → 0.4.0.pre2
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 +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
|