hrr_rb_sftp 0.1.0 → 0.2.0
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 +23 -0
- data/lib/hrr_rb_sftp.rb +79 -1
- data/lib/hrr_rb_sftp/loggable.rb +34 -0
- data/lib/hrr_rb_sftp/protocol.rb +39 -33
- data/lib/hrr_rb_sftp/protocol/common.rb +6 -3
- data/lib/hrr_rb_sftp/protocol/common/data_types.rb +19 -0
- data/lib/hrr_rb_sftp/protocol/common/data_types/byte.rb +40 -0
- data/lib/hrr_rb_sftp/protocol/common/data_types/extension_pair.rb +41 -0
- data/lib/hrr_rb_sftp/protocol/common/data_types/extension_pairs.rb +42 -0
- data/lib/hrr_rb_sftp/protocol/common/data_types/string.rb +42 -0
- data/lib/hrr_rb_sftp/protocol/common/data_types/uint32.rb +40 -0
- data/lib/hrr_rb_sftp/protocol/common/data_types/uint64.rb +40 -0
- data/lib/hrr_rb_sftp/protocol/common/packets.rb +16 -0
- data/lib/hrr_rb_sftp/protocol/common/packets/001_ssh_fxp_init.rb +27 -0
- data/lib/hrr_rb_sftp/protocol/common/packets/002_ssh_fxp_version.rb +28 -0
- data/lib/hrr_rb_sftp/protocol/common/packets/packet.rb +96 -0
- data/lib/hrr_rb_sftp/protocol/version1.rb +11 -3
- data/lib/hrr_rb_sftp/protocol/version1/data_types.rb +15 -0
- data/lib/hrr_rb_sftp/protocol/version1/data_types/attrs.rb +91 -0
- data/lib/hrr_rb_sftp/protocol/version1/packets.rb +72 -0
- data/lib/hrr_rb_sftp/protocol/version1/{packet → packets}/003_ssh_fxp_open.rb +94 -43
- data/lib/hrr_rb_sftp/protocol/version1/packets/004_ssh_fxp_close.rb +61 -0
- data/lib/hrr_rb_sftp/protocol/version1/packets/005_ssh_fxp_read.rb +72 -0
- data/lib/hrr_rb_sftp/protocol/version1/packets/006_ssh_fxp_write.rb +64 -0
- data/lib/hrr_rb_sftp/protocol/version1/{packet → packets}/007_ssh_fxp_lstat.rb +27 -9
- data/lib/hrr_rb_sftp/protocol/version1/{packet → packets}/008_ssh_fxp_fstat.rb +26 -9
- data/lib/hrr_rb_sftp/protocol/version1/packets/009_ssh_fxp_setstat.rb +92 -0
- data/lib/hrr_rb_sftp/protocol/version1/packets/010_ssh_fxp_fsetstat.rb +85 -0
- data/lib/hrr_rb_sftp/protocol/version1/{packet → packets}/011_ssh_fxp_opendir.rb +32 -11
- data/lib/hrr_rb_sftp/protocol/version1/{packet → packets}/012_ssh_fxp_readdir.rb +73 -49
- data/lib/hrr_rb_sftp/protocol/version1/{packet → packets}/013_ssh_fxp_remove.rb +27 -9
- data/lib/hrr_rb_sftp/protocol/version1/{packet → packets}/014_ssh_fxp_mkdir.rb +28 -10
- data/lib/hrr_rb_sftp/protocol/version1/{packet → packets}/015_ssh_fxp_rmdir.rb +32 -12
- data/lib/hrr_rb_sftp/protocol/version1/packets/016_ssh_fxp_realpath.rb +47 -0
- data/lib/hrr_rb_sftp/protocol/version1/{packet → packets}/017_ssh_fxp_stat.rb +27 -9
- data/lib/hrr_rb_sftp/protocol/version1/packets/101_ssh_fxp_status.rb +73 -0
- data/lib/hrr_rb_sftp/protocol/version1/packets/102_ssh_fxp_handle.rb +28 -0
- data/lib/hrr_rb_sftp/protocol/version1/packets/103_ssh_fxp_data.rb +28 -0
- data/lib/hrr_rb_sftp/protocol/version1/packets/104_ssh_fxp_name.rb +48 -0
- data/lib/hrr_rb_sftp/protocol/version1/packets/105_ssh_fxp_attrs.rb +28 -0
- data/lib/hrr_rb_sftp/protocol/version1/packets/packet.rb +57 -0
- data/lib/hrr_rb_sftp/protocol/version2.rb +11 -3
- data/lib/hrr_rb_sftp/protocol/version2/data_types.rb +13 -0
- data/lib/hrr_rb_sftp/protocol/version2/packets.rb +14 -0
- data/lib/hrr_rb_sftp/protocol/version2/packets/018_ssh_fxp_rename.rb +91 -0
- data/lib/hrr_rb_sftp/protocol/version3.rb +12 -3
- data/lib/hrr_rb_sftp/protocol/version3/data_types.rb +13 -0
- data/lib/hrr_rb_sftp/protocol/version3/extensions.rb +94 -0
- data/lib/hrr_rb_sftp/protocol/version3/extensions/extension.rb +58 -0
- data/lib/hrr_rb_sftp/protocol/version3/extensions/fsync_at_openssh_com.rb +59 -0
- data/lib/hrr_rb_sftp/protocol/version3/extensions/hardlink_at_openssh_com.rb +84 -0
- data/lib/hrr_rb_sftp/protocol/version3/extensions/lsetstat_at_openssh_com.rb +132 -0
- data/lib/hrr_rb_sftp/protocol/version3/extensions/posix_rename_at_openssh_com.rb +76 -0
- data/lib/hrr_rb_sftp/protocol/version3/packets.rb +19 -0
- data/lib/hrr_rb_sftp/protocol/version3/packets/014_ssh_fxp_mkdir.rb +75 -0
- data/lib/hrr_rb_sftp/protocol/version3/packets/019_ssh_fxp_readlink.rb +76 -0
- data/lib/hrr_rb_sftp/protocol/version3/packets/020_ssh_fxp_symlink.rb +76 -0
- data/lib/hrr_rb_sftp/protocol/version3/packets/101_ssh_fxp_status.rb +25 -0
- data/lib/hrr_rb_sftp/protocol/version3/packets/200_ssh_fxp_extended.rb +95 -0
- data/lib/hrr_rb_sftp/protocol/version3/packets/201_ssh_fxp_extended_reply.rb +60 -0
- data/lib/hrr_rb_sftp/receiver.rb +17 -2
- data/lib/hrr_rb_sftp/sender.rb +15 -1
- data/lib/hrr_rb_sftp/server.rb +43 -12
- data/lib/hrr_rb_sftp/version.rb +5 -1
- metadata +54 -47
- data/lib/hrr_rb_sftp/protocol/common/data_type.rb +0 -15
- data/lib/hrr_rb_sftp/protocol/common/data_type/byte.rb +0 -22
- data/lib/hrr_rb_sftp/protocol/common/data_type/extension_pair.rb +0 -23
- data/lib/hrr_rb_sftp/protocol/common/data_type/extension_pairs.rb +0 -24
- data/lib/hrr_rb_sftp/protocol/common/data_type/string.rb +0 -24
- data/lib/hrr_rb_sftp/protocol/common/data_type/uint32.rb +0 -22
- data/lib/hrr_rb_sftp/protocol/common/data_type/uint64.rb +0 -22
- data/lib/hrr_rb_sftp/protocol/common/packet.rb +0 -11
- data/lib/hrr_rb_sftp/protocol/common/packet/001_ssh_fxp_init.rb +0 -18
- data/lib/hrr_rb_sftp/protocol/common/packet/002_ssh_fxp_version.rb +0 -19
- data/lib/hrr_rb_sftp/protocol/common/packetable.rb +0 -72
- data/lib/hrr_rb_sftp/protocol/version1/data_type.rb +0 -11
- data/lib/hrr_rb_sftp/protocol/version1/data_type/attrs.rb +0 -54
- data/lib/hrr_rb_sftp/protocol/version1/packet.rb +0 -29
- data/lib/hrr_rb_sftp/protocol/version1/packet/004_ssh_fxp_close.rb +0 -44
- data/lib/hrr_rb_sftp/protocol/version1/packet/005_ssh_fxp_read.rb +0 -53
- data/lib/hrr_rb_sftp/protocol/version1/packet/006_ssh_fxp_write.rb +0 -46
- data/lib/hrr_rb_sftp/protocol/version1/packet/009_ssh_fxp_setstat.rb +0 -63
- data/lib/hrr_rb_sftp/protocol/version1/packet/010_ssh_fxp_fsetstat.rb +0 -48
- data/lib/hrr_rb_sftp/protocol/version1/packet/016_ssh_fxp_realpath.rb +0 -30
- data/lib/hrr_rb_sftp/protocol/version1/packet/101_ssh_fxp_status.rb +0 -29
- data/lib/hrr_rb_sftp/protocol/version1/packet/102_ssh_fxp_handle.rb +0 -19
- data/lib/hrr_rb_sftp/protocol/version1/packet/103_ssh_fxp_data.rb +0 -19
- data/lib/hrr_rb_sftp/protocol/version1/packet/104_ssh_fxp_name.rb +0 -33
- data/lib/hrr_rb_sftp/protocol/version1/packet/105_ssh_fxp_attrs.rb +0 -19
- data/lib/hrr_rb_sftp/protocol/version2/data_type.rb +0 -9
- data/lib/hrr_rb_sftp/protocol/version2/packet.rb +0 -11
- data/lib/hrr_rb_sftp/protocol/version2/packet/018_ssh_fxp_rename.rb +0 -70
- data/lib/hrr_rb_sftp/protocol/version3/data_type.rb +0 -9
- data/lib/hrr_rb_sftp/protocol/version3/packet.rb +0 -16
- data/lib/hrr_rb_sftp/protocol/version3/packet/014_ssh_fxp_mkdir.rb +0 -58
- data/lib/hrr_rb_sftp/protocol/version3/packet/019_ssh_fxp_readlink.rb +0 -57
- data/lib/hrr_rb_sftp/protocol/version3/packet/020_ssh_fxp_symlink.rb +0 -58
- data/lib/hrr_rb_sftp/protocol/version3/packet/101_ssh_fxp_status.rb +0 -31
- data/lib/hrr_rb_sftp/protocol/version3/packet/200_ssh_fxp_extended.rb +0 -34
- data/lib/hrr_rb_sftp/protocol/version3/packet/201_ssh_fxp_extended_reply.rb +0 -23
@@ -0,0 +1,76 @@
|
|
1
|
+
module HrrRbSftp
|
2
|
+
class Protocol
|
3
|
+
module Version3
|
4
|
+
class Packets
|
5
|
+
|
6
|
+
#
|
7
|
+
# This class implements SFTP protocol version 1 SSH_FXP_SYMLINK packet type, format, and responder.
|
8
|
+
#
|
9
|
+
class SSH_FXP_SYMLINK < Packets::Packet
|
10
|
+
|
11
|
+
#
|
12
|
+
# Represents SSH_FXP_SYMLINK packet type.
|
13
|
+
#
|
14
|
+
TYPE = 20
|
15
|
+
|
16
|
+
#
|
17
|
+
# Represents SSH_FXP_SYMLINK packet format.
|
18
|
+
#
|
19
|
+
FORMAT = [
|
20
|
+
[DataTypes::Byte, :"type" ],
|
21
|
+
[DataTypes::Uint32, :"request-id"],
|
22
|
+
[DataTypes::String, :"targetpath"],
|
23
|
+
[DataTypes::String, :"linkpath" ],
|
24
|
+
]
|
25
|
+
|
26
|
+
#
|
27
|
+
# Responds to SSH_FXP_SYMLINK request.
|
28
|
+
#
|
29
|
+
# @param request [Hash{Symbol=>Object}] SSH_FXP_SYMLINK request represented in Hash.
|
30
|
+
# @return [Hash{Symbol=>Object}] Response represented in Hash. Its type is SSH_FXP_STATUS.
|
31
|
+
#
|
32
|
+
def respond_to request
|
33
|
+
begin
|
34
|
+
log_debug { "File.symlink(#{request[:"targetpath"].inspect}, #{request[:"linkpath"].inspect})" }
|
35
|
+
File.symlink request[:"targetpath"], request[:"linkpath"]
|
36
|
+
{
|
37
|
+
:"type" => Packets::SSH_FXP_STATUS::TYPE,
|
38
|
+
:"request-id" => request[:"request-id"],
|
39
|
+
:"code" => Packets::SSH_FXP_STATUS::SSH_FX_OK,
|
40
|
+
:"error message" => "Success",
|
41
|
+
:"language tag" => "",
|
42
|
+
}
|
43
|
+
rescue Errno::EACCES => e
|
44
|
+
log_debug { e.message }
|
45
|
+
{
|
46
|
+
:"type" => Packets::SSH_FXP_STATUS::TYPE,
|
47
|
+
:"request-id" => request[:"request-id"],
|
48
|
+
:"code" => Packets::SSH_FXP_STATUS::SSH_FX_PERMISSION_DENIED,
|
49
|
+
:"error message" => "Permission denied",
|
50
|
+
:"language tag" => "",
|
51
|
+
}
|
52
|
+
rescue Errno::EEXIST => e
|
53
|
+
log_debug { e.message }
|
54
|
+
{
|
55
|
+
:"type" => Packets::SSH_FXP_STATUS::TYPE,
|
56
|
+
:"request-id" => request[:"request-id"],
|
57
|
+
:"code" => Packets::SSH_FXP_STATUS::SSH_FX_FAILURE,
|
58
|
+
:"error message" => "File exists",
|
59
|
+
:"language tag" => "",
|
60
|
+
}
|
61
|
+
rescue => e
|
62
|
+
log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
|
63
|
+
{
|
64
|
+
:"type" => Packets::SSH_FXP_STATUS::TYPE,
|
65
|
+
:"request-id" => request[:"request-id"],
|
66
|
+
:"code" => Packets::SSH_FXP_STATUS::SSH_FX_FAILURE,
|
67
|
+
:"error message" => e.message,
|
68
|
+
:"language tag" => "",
|
69
|
+
}
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module HrrRbSftp
|
2
|
+
class Protocol
|
3
|
+
module Version3
|
4
|
+
class Packets
|
5
|
+
|
6
|
+
#
|
7
|
+
# This class implements SFTP protocol version 3 SSH_FXP_STATUS packet type, format, and responder.
|
8
|
+
#
|
9
|
+
class SSH_FXP_STATUS < Version2::Packets::SSH_FXP_STATUS
|
10
|
+
|
11
|
+
#
|
12
|
+
# Represents SSH_FXP_STATUS packet format.
|
13
|
+
#
|
14
|
+
FORMAT = [
|
15
|
+
[DataTypes::Byte, :"type" ],
|
16
|
+
[DataTypes::Uint32, :"request-id" ],
|
17
|
+
[DataTypes::Uint32, :"code" ],
|
18
|
+
[DataTypes::String, :"error message"],
|
19
|
+
[DataTypes::String, :"language tag" ],
|
20
|
+
]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module HrrRbSftp
|
2
|
+
class Protocol
|
3
|
+
module Version3
|
4
|
+
class Packets
|
5
|
+
|
6
|
+
#
|
7
|
+
# This class implements SFTP protocol version 1 SSH_FXP_EXTENDED packet type, format, and responder.
|
8
|
+
#
|
9
|
+
class SSH_FXP_EXTENDED < Packets::Packet
|
10
|
+
|
11
|
+
#
|
12
|
+
# Represents SSH_FXP_EXTENDED packet type.
|
13
|
+
#
|
14
|
+
TYPE = 200
|
15
|
+
|
16
|
+
#
|
17
|
+
# Represents SSH_FXP_EXTENDED packet format.
|
18
|
+
#
|
19
|
+
FORMAT = [
|
20
|
+
[DataTypes::Byte, :"type" ],
|
21
|
+
[DataTypes::Uint32, :"request-id" ],
|
22
|
+
[DataTypes::String, :"extended-request"],
|
23
|
+
]
|
24
|
+
|
25
|
+
#
|
26
|
+
# Private method #conditional_format is used instead.
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
# {
|
30
|
+
# :"extended-request" => {
|
31
|
+
# "hardlink@openssh.com" => [
|
32
|
+
# [DataTypes::String, :"oldpath"],
|
33
|
+
# [DataTypes::String, :"newpath"],
|
34
|
+
# ],
|
35
|
+
# },
|
36
|
+
# }
|
37
|
+
#
|
38
|
+
#
|
39
|
+
CONDITIONAL_FORMAT = nil
|
40
|
+
|
41
|
+
#
|
42
|
+
# Responds to SSH_FXP_EXTENDED request.
|
43
|
+
#
|
44
|
+
# @param request [Hash{Symbol=>Object}] SSH_FXP_EXTENDED request represented in Hash.
|
45
|
+
# @return [Hash{Symbol=>Object}] Response represented in Hash. Its type is SSH_FXP_STATUS.
|
46
|
+
#
|
47
|
+
def respond_to request
|
48
|
+
begin
|
49
|
+
if extensions.respond_to? request
|
50
|
+
extensions.respond_to request
|
51
|
+
else
|
52
|
+
{
|
53
|
+
:"type" => Packets::SSH_FXP_STATUS::TYPE,
|
54
|
+
:"request-id" => request[:"request-id"],
|
55
|
+
:"code" => Packets::SSH_FXP_STATUS::SSH_FX_OP_UNSUPPORTED,
|
56
|
+
:"error message" => "Unsupported extended-request: #{request[:"extended-request"]}",
|
57
|
+
:"language tag" => "",
|
58
|
+
}
|
59
|
+
end
|
60
|
+
rescue => e
|
61
|
+
log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
|
62
|
+
{
|
63
|
+
:"type" => Packets::SSH_FXP_STATUS::TYPE,
|
64
|
+
:"request-id" => request[:"request-id"],
|
65
|
+
:"code" => Packets::SSH_FXP_STATUS::SSH_FX_FAILURE,
|
66
|
+
:"error message" => e.message,
|
67
|
+
:"language tag" => "",
|
68
|
+
}
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
#
|
75
|
+
# Returns An instance of Extensions.
|
76
|
+
#
|
77
|
+
# @return [Extensions] An instance of Extensions.
|
78
|
+
#
|
79
|
+
def extensions
|
80
|
+
@extensions ||= Protocol.const_get(:"Version#{version}")::Extensions.new(context, logger: logger)
|
81
|
+
end
|
82
|
+
|
83
|
+
#
|
84
|
+
# Overrides Common::Packetable#conditional_format private method and represents SSH_FXP_EXTENDED packet conditional format.
|
85
|
+
#
|
86
|
+
def conditional_format packet
|
87
|
+
packet.inject([]){ |a, (field_name, field_value)|
|
88
|
+
a + ((extensions.conditional_request_format[field_name] || {})[field_value] || [])
|
89
|
+
}
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module HrrRbSftp
|
2
|
+
class Protocol
|
3
|
+
module Version3
|
4
|
+
class Packets
|
5
|
+
|
6
|
+
#
|
7
|
+
# This class implements SFTP protocol version 1 SSH_FXP_EXTENDED_REPLY packet type, format, and responder.
|
8
|
+
#
|
9
|
+
class SSH_FXP_EXTENDED_REPLY < Packets::Packet
|
10
|
+
|
11
|
+
#
|
12
|
+
# Represents SSH_FXP_EXTENDED_REPLY packet type.
|
13
|
+
#
|
14
|
+
TYPE = 201
|
15
|
+
|
16
|
+
#
|
17
|
+
# Represents SSH_FXP_EXTENDED_REPLY packet format.
|
18
|
+
#
|
19
|
+
FORMAT = [
|
20
|
+
[DataTypes::Byte, :"type" ],
|
21
|
+
[DataTypes::Uint32, :"request-id"],
|
22
|
+
]
|
23
|
+
|
24
|
+
#
|
25
|
+
# Private method #conditional_format is used instead.
|
26
|
+
#
|
27
|
+
# @example
|
28
|
+
# {
|
29
|
+
# :"extended-reply" => {
|
30
|
+
# "hardlink@openssh.com" => [
|
31
|
+
# ],
|
32
|
+
# },
|
33
|
+
# }
|
34
|
+
#
|
35
|
+
CONDITIONAL_FORMAT = nil
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
#
|
40
|
+
# Returns An instance of Extensions.
|
41
|
+
#
|
42
|
+
# @return [Extensions] An instance of Extensions.
|
43
|
+
#
|
44
|
+
def extensions
|
45
|
+
@extensions ||= Protocol.const_get(:"Version#{version}")::Extensions.new(context, logger: logger)
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
# Overrides Common::Packetable#conditional_format private method and represents SSH_FXP_EXTENDED_REPLY packet conditional format.
|
50
|
+
#
|
51
|
+
def conditional_format packet
|
52
|
+
packet.inject([]){ |a, (field_name, field_value)|
|
53
|
+
a + ((extensions.conditional_reply_format[field_name] || {})[field_value] || [])
|
54
|
+
}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/hrr_rb_sftp/receiver.rb
CHANGED
@@ -1,17 +1,32 @@
|
|
1
1
|
module HrrRbSftp
|
2
|
+
|
3
|
+
#
|
4
|
+
# This class implements payload receiver.
|
5
|
+
#
|
2
6
|
class Receiver
|
7
|
+
|
8
|
+
#
|
9
|
+
# Instantiates a new payload receiver for the input IO.
|
10
|
+
#
|
11
|
+
# @param io_in [IO] An IO for input.
|
12
|
+
#
|
3
13
|
def initialize io_in
|
4
14
|
@io_in = io_in
|
5
15
|
end
|
6
16
|
|
17
|
+
#
|
18
|
+
# Receives payload_length payload. When input IO is EOF, returns nil.
|
19
|
+
#
|
20
|
+
# @return [String, nil] Received payload. when input IO is EOF, retruns nil.
|
21
|
+
#
|
7
22
|
def receive
|
8
23
|
begin
|
9
|
-
paylaod_length = Protocol::Common::
|
24
|
+
paylaod_length = Protocol::Common::DataTypes::Uint32.decode(@io_in)
|
10
25
|
rescue NoMethodError
|
11
26
|
nil
|
12
27
|
else
|
13
28
|
payload = @io_in.read(paylaod_length)
|
14
|
-
if payload.nil? || payload.
|
29
|
+
if payload.nil? || payload.bytesize != paylaod_length
|
15
30
|
nil
|
16
31
|
else
|
17
32
|
payload
|
data/lib/hrr_rb_sftp/sender.rb
CHANGED
@@ -1,11 +1,25 @@
|
|
1
1
|
module HrrRbSftp
|
2
|
+
|
3
|
+
#
|
4
|
+
# This class implements payload sender.
|
5
|
+
#
|
2
6
|
class Sender
|
7
|
+
|
8
|
+
#
|
9
|
+
# Instantiates a new payload sender for the output IO.
|
10
|
+
#
|
11
|
+
# @param io_out [IO] An IO for output.
|
12
|
+
#
|
3
13
|
def initialize io_out
|
4
14
|
@io_out = io_out
|
5
15
|
end
|
6
16
|
|
17
|
+
#
|
18
|
+
# Sends payload_length then payload.
|
19
|
+
# Flushes output IO once payload is sent.
|
20
|
+
#
|
7
21
|
def send payload
|
8
|
-
@io_out.write(Protocol::Common::
|
22
|
+
@io_out.write(Protocol::Common::DataTypes::Uint32.encode(payload.bytesize))
|
9
23
|
@io_out.write(payload)
|
10
24
|
@io_out.flush
|
11
25
|
end
|
data/lib/hrr_rb_sftp/server.rb
CHANGED
@@ -1,12 +1,37 @@
|
|
1
1
|
module HrrRbSftp
|
2
|
+
|
3
|
+
#
|
4
|
+
# This class implements SFTP server.
|
5
|
+
#
|
6
|
+
# @example
|
7
|
+
# # instantiate a server
|
8
|
+
# server = HrrRbSftp::Server.new(logger: logger)
|
9
|
+
#
|
10
|
+
# # then start the server with IO arguments
|
11
|
+
# server.start(io_in, io_out, io_err)
|
12
|
+
#
|
2
13
|
class Server
|
3
14
|
include Loggable
|
4
15
|
|
16
|
+
#
|
17
|
+
# @param logger [Logger] logger.
|
18
|
+
#
|
5
19
|
def initialize logger: nil
|
6
20
|
self.logger = logger
|
7
21
|
end
|
8
22
|
|
9
|
-
|
23
|
+
#
|
24
|
+
# Starts SFTP server.
|
25
|
+
#
|
26
|
+
# @example
|
27
|
+
# # start a server with IO arguments
|
28
|
+
# server.start(io_in, io_out, io_err)
|
29
|
+
#
|
30
|
+
# @param io_in [IO] An IO for input.
|
31
|
+
# @param io_out [IO] An IO for output.
|
32
|
+
# @param io_err [IO] An IO for debug output.
|
33
|
+
#
|
34
|
+
def start io_in, io_out, io_err=nil
|
10
35
|
log_info { "start server" }
|
11
36
|
|
12
37
|
@io_in = io_in
|
@@ -46,7 +71,10 @@ module HrrRbSftp
|
|
46
71
|
version = [remote_version, local_version].min
|
47
72
|
log_info { "negotiated version: #{version}" }
|
48
73
|
|
49
|
-
|
74
|
+
extension_pairs = Protocol.extension_pairs(version)
|
75
|
+
log_info { "extension-pairs: #{extension_pairs}" }
|
76
|
+
|
77
|
+
send_fxp_version version, extension_pairs
|
50
78
|
|
51
79
|
version
|
52
80
|
end
|
@@ -60,31 +88,34 @@ module HrrRbSftp
|
|
60
88
|
raise "Failed receiving SSH_FXP_INIT"
|
61
89
|
end
|
62
90
|
|
63
|
-
packet = Protocol::Common::
|
91
|
+
packet = Protocol::Common::Packets::SSH_FXP_INIT.new(logger: logger).decode payload
|
64
92
|
packet[:"version"]
|
65
93
|
end
|
66
94
|
|
67
|
-
def send_fxp_version version
|
95
|
+
def send_fxp_version version, extensions
|
68
96
|
log_debug { "start send_fxp_version" }
|
69
97
|
|
70
98
|
packet = {
|
71
|
-
:"type" => Protocol::Common::
|
99
|
+
:"type" => Protocol::Common::Packets::SSH_FXP_VERSION::TYPE,
|
72
100
|
:"version" => version,
|
73
|
-
:"extensions" =>
|
101
|
+
:"extensions" => extensions,
|
74
102
|
}
|
75
|
-
payload = Protocol::Common::
|
103
|
+
payload = Protocol::Common::Packets::SSH_FXP_VERSION.new(logger: logger).encode packet
|
76
104
|
@sender.send payload
|
77
105
|
end
|
78
106
|
|
79
107
|
def respond_to_requests
|
80
108
|
log_info { "start respond_to_requests" }
|
81
109
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
110
|
+
begin
|
111
|
+
log_info { "start request and response loop" }
|
112
|
+
while request = @receiver.receive
|
113
|
+
response = @protocol.respond_to request
|
114
|
+
@sender.send response
|
115
|
+
end
|
116
|
+
ensure
|
117
|
+
log_info { "request and response loop finished" }
|
86
118
|
end
|
87
|
-
log_info { "request and response loop finished" }
|
88
119
|
end
|
89
120
|
|
90
121
|
def close_handles
|
data/lib/hrr_rb_sftp/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hrr_rb_sftp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hirura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-06-
|
11
|
+
date: 2020-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Pure Ruby SFTP server implementation.
|
14
14
|
email:
|
@@ -35,54 +35,61 @@ files:
|
|
35
35
|
- lib/hrr_rb_sftp/loggable.rb
|
36
36
|
- lib/hrr_rb_sftp/protocol.rb
|
37
37
|
- lib/hrr_rb_sftp/protocol/common.rb
|
38
|
-
- lib/hrr_rb_sftp/protocol/common/
|
39
|
-
- lib/hrr_rb_sftp/protocol/common/
|
40
|
-
- lib/hrr_rb_sftp/protocol/common/
|
41
|
-
- lib/hrr_rb_sftp/protocol/common/
|
42
|
-
- lib/hrr_rb_sftp/protocol/common/
|
43
|
-
- lib/hrr_rb_sftp/protocol/common/
|
44
|
-
- lib/hrr_rb_sftp/protocol/common/
|
45
|
-
- lib/hrr_rb_sftp/protocol/common/
|
46
|
-
- lib/hrr_rb_sftp/protocol/common/
|
47
|
-
- lib/hrr_rb_sftp/protocol/common/
|
48
|
-
- lib/hrr_rb_sftp/protocol/common/
|
38
|
+
- lib/hrr_rb_sftp/protocol/common/data_types.rb
|
39
|
+
- lib/hrr_rb_sftp/protocol/common/data_types/byte.rb
|
40
|
+
- lib/hrr_rb_sftp/protocol/common/data_types/extension_pair.rb
|
41
|
+
- lib/hrr_rb_sftp/protocol/common/data_types/extension_pairs.rb
|
42
|
+
- lib/hrr_rb_sftp/protocol/common/data_types/string.rb
|
43
|
+
- lib/hrr_rb_sftp/protocol/common/data_types/uint32.rb
|
44
|
+
- lib/hrr_rb_sftp/protocol/common/data_types/uint64.rb
|
45
|
+
- lib/hrr_rb_sftp/protocol/common/packets.rb
|
46
|
+
- lib/hrr_rb_sftp/protocol/common/packets/001_ssh_fxp_init.rb
|
47
|
+
- lib/hrr_rb_sftp/protocol/common/packets/002_ssh_fxp_version.rb
|
48
|
+
- lib/hrr_rb_sftp/protocol/common/packets/packet.rb
|
49
49
|
- lib/hrr_rb_sftp/protocol/version1.rb
|
50
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
51
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
52
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
53
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
54
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
55
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
56
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
57
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
58
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
59
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
60
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
61
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
62
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
63
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
64
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
65
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
66
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
67
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
68
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
69
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
70
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
71
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
72
|
-
- lib/hrr_rb_sftp/protocol/version1/
|
50
|
+
- lib/hrr_rb_sftp/protocol/version1/data_types.rb
|
51
|
+
- lib/hrr_rb_sftp/protocol/version1/data_types/attrs.rb
|
52
|
+
- lib/hrr_rb_sftp/protocol/version1/packets.rb
|
53
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/003_ssh_fxp_open.rb
|
54
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/004_ssh_fxp_close.rb
|
55
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/005_ssh_fxp_read.rb
|
56
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/006_ssh_fxp_write.rb
|
57
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/007_ssh_fxp_lstat.rb
|
58
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/008_ssh_fxp_fstat.rb
|
59
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/009_ssh_fxp_setstat.rb
|
60
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/010_ssh_fxp_fsetstat.rb
|
61
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/011_ssh_fxp_opendir.rb
|
62
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/012_ssh_fxp_readdir.rb
|
63
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/013_ssh_fxp_remove.rb
|
64
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/014_ssh_fxp_mkdir.rb
|
65
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/015_ssh_fxp_rmdir.rb
|
66
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/016_ssh_fxp_realpath.rb
|
67
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/017_ssh_fxp_stat.rb
|
68
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/101_ssh_fxp_status.rb
|
69
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/102_ssh_fxp_handle.rb
|
70
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/103_ssh_fxp_data.rb
|
71
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/104_ssh_fxp_name.rb
|
72
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/105_ssh_fxp_attrs.rb
|
73
|
+
- lib/hrr_rb_sftp/protocol/version1/packets/packet.rb
|
73
74
|
- lib/hrr_rb_sftp/protocol/version2.rb
|
74
|
-
- lib/hrr_rb_sftp/protocol/version2/
|
75
|
-
- lib/hrr_rb_sftp/protocol/version2/
|
76
|
-
- lib/hrr_rb_sftp/protocol/version2/
|
75
|
+
- lib/hrr_rb_sftp/protocol/version2/data_types.rb
|
76
|
+
- lib/hrr_rb_sftp/protocol/version2/packets.rb
|
77
|
+
- lib/hrr_rb_sftp/protocol/version2/packets/018_ssh_fxp_rename.rb
|
77
78
|
- lib/hrr_rb_sftp/protocol/version3.rb
|
78
|
-
- lib/hrr_rb_sftp/protocol/version3/
|
79
|
-
- lib/hrr_rb_sftp/protocol/version3/
|
80
|
-
- lib/hrr_rb_sftp/protocol/version3/
|
81
|
-
- lib/hrr_rb_sftp/protocol/version3/
|
82
|
-
- lib/hrr_rb_sftp/protocol/version3/
|
83
|
-
- lib/hrr_rb_sftp/protocol/version3/
|
84
|
-
- lib/hrr_rb_sftp/protocol/version3/
|
85
|
-
- lib/hrr_rb_sftp/protocol/version3/
|
79
|
+
- lib/hrr_rb_sftp/protocol/version3/data_types.rb
|
80
|
+
- lib/hrr_rb_sftp/protocol/version3/extensions.rb
|
81
|
+
- lib/hrr_rb_sftp/protocol/version3/extensions/extension.rb
|
82
|
+
- lib/hrr_rb_sftp/protocol/version3/extensions/fsync_at_openssh_com.rb
|
83
|
+
- lib/hrr_rb_sftp/protocol/version3/extensions/hardlink_at_openssh_com.rb
|
84
|
+
- lib/hrr_rb_sftp/protocol/version3/extensions/lsetstat_at_openssh_com.rb
|
85
|
+
- lib/hrr_rb_sftp/protocol/version3/extensions/posix_rename_at_openssh_com.rb
|
86
|
+
- lib/hrr_rb_sftp/protocol/version3/packets.rb
|
87
|
+
- lib/hrr_rb_sftp/protocol/version3/packets/014_ssh_fxp_mkdir.rb
|
88
|
+
- lib/hrr_rb_sftp/protocol/version3/packets/019_ssh_fxp_readlink.rb
|
89
|
+
- lib/hrr_rb_sftp/protocol/version3/packets/020_ssh_fxp_symlink.rb
|
90
|
+
- lib/hrr_rb_sftp/protocol/version3/packets/101_ssh_fxp_status.rb
|
91
|
+
- lib/hrr_rb_sftp/protocol/version3/packets/200_ssh_fxp_extended.rb
|
92
|
+
- lib/hrr_rb_sftp/protocol/version3/packets/201_ssh_fxp_extended_reply.rb
|
86
93
|
- lib/hrr_rb_sftp/receiver.rb
|
87
94
|
- lib/hrr_rb_sftp/sender.rb
|
88
95
|
- lib/hrr_rb_sftp/server.rb
|