ftpfxp 0.0.1 → 0.0.2
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.
- data/lib/ftpfxp.rb +8 -9
- data/lib/ftpfxp/ftpfxp.rb +71 -22
- data/lib/ftpfxp/ftpfxptls.rb +104 -24
- metadata +3 -3
data/lib/ftpfxp.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
=end
|
1
|
+
#
|
2
|
+
# = ftpfxp.rb - FXP enhancements to the basic FTP Client Library.
|
3
|
+
#
|
4
|
+
# Written by Alex Lee <alexeen@gmail.com>.
|
5
|
+
#
|
6
|
+
# This library is distributed under the terms of the Ruby license.
|
7
|
+
# You can freely distribute/modify this library.
|
8
|
+
#
|
10
9
|
require 'ftpfxp/ftpfxp'
|
11
10
|
require 'ftpfxp/ftpfxptls'
|
data/lib/ftpfxp/ftpfxp.rb
CHANGED
@@ -1,19 +1,47 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
=end
|
1
|
+
#
|
2
|
+
# = ftpfxp.rb - FXP enhancements to the basic FTP Client Library.
|
3
|
+
#
|
4
|
+
# Written by Alex Lee <alexeen@gmail.com>.
|
5
|
+
#
|
6
|
+
# This library is distributed under the terms of the Ruby license.
|
7
|
+
# You can freely distribute/modify this library.
|
8
|
+
#
|
10
9
|
require 'net/ftp'
|
11
10
|
|
12
11
|
module Net
|
13
|
-
class FTPFXP < FTP
|
14
12
|
|
15
|
-
|
16
|
-
|
13
|
+
# :stopdoc:
|
14
|
+
class FTPFXPError < FTPError; end
|
15
|
+
class FTPFXPSrcSiteError < FTPFXPError; end
|
16
|
+
class FTPFXPDstSiteError < FTPFXPError; end
|
17
|
+
# :startdoc:
|
18
|
+
|
19
|
+
#
|
20
|
+
# This class implements the File Transfer Protocol with
|
21
|
+
# FXP Server-to-Server transfer. This class makes FXP
|
22
|
+
# file transfers extremely easy yet also provides the
|
23
|
+
# low level control for users who wish to do things their
|
24
|
+
# own ways.
|
25
|
+
#
|
26
|
+
# == Major Methods
|
27
|
+
#
|
28
|
+
# - #feat
|
29
|
+
# - #xdupe
|
30
|
+
# - #fxpgetpasvport
|
31
|
+
# - #fxpsetport
|
32
|
+
# - #fxpstor
|
33
|
+
# - #fxpretr
|
34
|
+
# - #fxpwait
|
35
|
+
# - #fxpto
|
36
|
+
# - #fastlist
|
37
|
+
# - #fileExists
|
38
|
+
#
|
39
|
+
class FTPFXP < FTP
|
40
|
+
#
|
41
|
+
# Issue the +FEAT+ command to dump a list of FTP extensions supported
|
42
|
+
# by this FTP server. Please note that this list is based on what
|
43
|
+
# the server wants to return.
|
44
|
+
#
|
17
45
|
def feat
|
18
46
|
synchronize do
|
19
47
|
putline('FEAT')
|
@@ -21,14 +49,16 @@ module Net
|
|
21
49
|
end
|
22
50
|
end
|
23
51
|
|
24
|
-
#
|
52
|
+
#
|
53
|
+
# Sets the <tt>extended dupe checking mode</tt> on the ftp server.
|
25
54
|
# If no mode specified, it returns the current mode.
|
26
55
|
# mode=0 : Disables the extended dupe checking mode.
|
27
56
|
# mode=1 : X-DUPE replies several file names per line.
|
28
57
|
# mode=2 : Server replies with one file name per X-DUPE line.
|
29
58
|
# mode=3 : Server replies with one filename per X-DUPE line with no truncation.
|
30
59
|
# mode=4 : All files listed in one long line up to max 1024 characters.
|
31
|
-
# For details, visit http://www.smartftp.com/Products/SmartFTP/RFC/x-dupe-info.txt
|
60
|
+
# For details, visit <em>http://www.smartftp.com/Products/SmartFTP/RFC/x-dupe-info.txt</em>
|
61
|
+
#
|
32
62
|
def xdupe(mode=nil)
|
33
63
|
synchronize do
|
34
64
|
if mode.nil?
|
@@ -41,7 +71,9 @@ module Net
|
|
41
71
|
end
|
42
72
|
end
|
43
73
|
|
44
|
-
#
|
74
|
+
#
|
75
|
+
# Returns the +passive+ port values on this ftp server.
|
76
|
+
#
|
45
77
|
def fxpgetpasvport
|
46
78
|
synchronize do
|
47
79
|
# Get the passive IP and port values for next transfer.
|
@@ -50,7 +82,9 @@ module Net
|
|
50
82
|
end
|
51
83
|
end
|
52
84
|
|
53
|
-
#
|
85
|
+
#
|
86
|
+
# Sets the +IP+ and +port+ for next transfer on this ftp server.
|
87
|
+
#
|
54
88
|
def fxpsetport(ipnport)
|
55
89
|
synchronize do
|
56
90
|
putline("PORT #{ipnport}")
|
@@ -58,8 +92,10 @@ module Net
|
|
58
92
|
end
|
59
93
|
end
|
60
94
|
|
95
|
+
#
|
61
96
|
# This is called on the destination side of the FXP.
|
62
|
-
# This should be called before fxpretr
|
97
|
+
# This should be called before +fxpretr+.
|
98
|
+
#
|
63
99
|
def fxpstor(file)
|
64
100
|
synchronize do
|
65
101
|
voidcmd('TYPE I')
|
@@ -68,8 +104,10 @@ module Net
|
|
68
104
|
end
|
69
105
|
end
|
70
106
|
|
107
|
+
#
|
71
108
|
# This is called on the source side of the FXP.
|
72
|
-
# This should be called after fxpstor
|
109
|
+
# This should be called after +fxpstor+.
|
110
|
+
#
|
73
111
|
def fxpretr(file)
|
74
112
|
synchronize do
|
75
113
|
voidcmd('TYPE I')
|
@@ -78,18 +116,25 @@ module Net
|
|
78
116
|
end
|
79
117
|
end
|
80
118
|
|
119
|
+
#
|
81
120
|
# This waits for the FXP to finish on the current ftp server.
|
82
121
|
# If this is the source, it should return 226 Transfer Complete,
|
83
122
|
# on success. If this is the destination, it should return
|
84
123
|
# 226 File receive OK.
|
124
|
+
#
|
85
125
|
def fxpwait
|
86
126
|
synchronize do
|
87
127
|
return getresp
|
88
128
|
end
|
89
129
|
end
|
90
130
|
|
131
|
+
#
|
91
132
|
# This FXP the specified source path to the destination path
|
92
133
|
# on the destination site. Path names should be for files only.
|
134
|
+
# This raises an exception <tt>FTPFXPSrcSiteError</tt> if errored
|
135
|
+
# on source site and raises an exception <tt>FTPFXPDstSiteError</tt>
|
136
|
+
# if errored on destination site.
|
137
|
+
#
|
93
138
|
def fxpto(dst, dstpath, srcpath)
|
94
139
|
pline = fxpgetpasvport
|
95
140
|
comp = pline.split(/\s+/)
|
@@ -98,16 +143,18 @@ module Net
|
|
98
143
|
dst.fxpstor(dstpath)
|
99
144
|
fxpretr(srcpath)
|
100
145
|
resp = fxpwait
|
101
|
-
raise
|
146
|
+
raise FTPFXPSrcSiteError unless '226' == resp[0,3]
|
102
147
|
resp = dst.fxpwait
|
103
|
-
raise
|
148
|
+
raise FTPFXPDstSiteError unless '226' == resp[0,3]
|
104
149
|
return resp
|
105
150
|
end
|
106
151
|
|
107
|
-
#
|
152
|
+
#
|
153
|
+
# This is a faster implementation of LIST where we use +STAT -l+
|
108
154
|
# on supported servers. (All latest versions of ftp servers should
|
109
155
|
# support this!) The path argument is optional, but it will call
|
110
|
-
# STAT -l on the path if it is specified.
|
156
|
+
# +STAT -l+ on the path if it is specified.
|
157
|
+
#
|
111
158
|
def fastlist(path = nil)
|
112
159
|
synchronize do
|
113
160
|
if path.nil?
|
@@ -119,7 +166,9 @@ module Net
|
|
119
166
|
end
|
120
167
|
end
|
121
168
|
|
169
|
+
#
|
122
170
|
# Check if a file path exists.
|
171
|
+
#
|
123
172
|
def fileExists(path)
|
124
173
|
resp = fastlist(path)
|
125
174
|
stats = false
|
data/lib/ftpfxp/ftpfxptls.rb
CHANGED
@@ -1,22 +1,73 @@
|
|
1
|
-
|
2
|
-
= ftpfxptlx.rb - FXP with SSL/TLS enhancements to the basic FTP Client Library.
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
=end
|
1
|
+
#
|
2
|
+
# = ftpfxptlx.rb - FXP with SSL/TLS enhancements to the basic FTP Client Library.
|
3
|
+
#
|
4
|
+
# Written by Alex Lee <alexeen@gmail.com>.
|
5
|
+
#
|
6
|
+
# This library is distributed under the terms of the Ruby license.
|
7
|
+
# You can freely distribute/modify this library.
|
8
|
+
#
|
10
9
|
require 'socket'
|
11
10
|
require 'openssl'
|
12
11
|
require 'ftpfxp'
|
13
12
|
|
14
13
|
module Net
|
14
|
+
# :stopdoc:
|
15
|
+
class FTPFXPTLSError < FTPFXPError; end
|
16
|
+
class FTPFXPTLSSrcSiteError < FTPFXPTLSError; end
|
17
|
+
class FTPFXPTLSDstSiteError < FTPFXPTLSError; end
|
18
|
+
# :startdoc:
|
19
|
+
|
20
|
+
#
|
21
|
+
# This class implements the File Transfer Protocol with
|
22
|
+
# SSL/TLS secure connections. This class makes secure
|
23
|
+
# file transfers extremely easy yet also provides the
|
24
|
+
# low level control for users who wish to do things their
|
25
|
+
# own ways.
|
26
|
+
#
|
27
|
+
# == Major Methods
|
28
|
+
#
|
29
|
+
# - #login
|
30
|
+
# - #fxpprotp
|
31
|
+
# - #fxpprotc
|
32
|
+
# - #fxpgetcpsvport
|
33
|
+
# - #ftpccc
|
34
|
+
# - #fxpsscnon
|
35
|
+
# - #fxpsscnoff
|
36
|
+
# - #fxpto
|
37
|
+
# - #fxpsscnto
|
38
|
+
#
|
15
39
|
class FTPFXPTLS < FTPFXP
|
16
40
|
include OpenSSL
|
17
|
-
|
18
|
-
#
|
19
|
-
|
41
|
+
|
42
|
+
# When +true+, transfers are performed securely. Default: +true+.
|
43
|
+
attr_reader :secure_on
|
44
|
+
|
45
|
+
#
|
46
|
+
# A synonym for <tt>FTPFXPTLS.new</tt>. but with a manditory host parameter.
|
47
|
+
#
|
48
|
+
# If a block is given, it is passed the +FTP+ object, which will be closed
|
49
|
+
# when the block finishes, or when an exception is raised.
|
50
|
+
#
|
51
|
+
def FTPFXPTLS.open(host, user = nil, passwd = nil, mode = 0, acct = nil)
|
52
|
+
if block_given?
|
53
|
+
ftpfxptls = new(host, user, passwd, mode, acct)
|
54
|
+
begin
|
55
|
+
yield ftpfxptls
|
56
|
+
ensure
|
57
|
+
ftpfxptls.close
|
58
|
+
end
|
59
|
+
else
|
60
|
+
new(host, user, passwd, mode, acct)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
# This method authenticates a user with the ftp server connection.
|
66
|
+
# If no +username+ given, defaults to +anonymous+.
|
67
|
+
# If no +mode+ given, defaults to +TLS AUTH+.
|
68
|
+
# - mode = 0 for +TLS+ (default)
|
69
|
+
# - mode = 1 for +SSL+
|
70
|
+
#
|
20
71
|
def login(user = "anonymous", passwd = nil, mode = 0, acct = nil)
|
21
72
|
# SSL/TLS context.
|
22
73
|
ctx = OpenSSL::SSL::SSLContext.new
|
@@ -45,17 +96,24 @@ module Net
|
|
45
96
|
@secure_on = true
|
46
97
|
end
|
47
98
|
|
99
|
+
# :stopdoc:
|
100
|
+
#
|
48
101
|
# Notes of support of each command extension.
|
49
102
|
# Servers known to support SSCN:
|
50
103
|
# glftpd, surgeftp, Gene6, RaidenFTPD, Serv-U
|
51
104
|
# Servers known to support CPSV
|
52
105
|
# glftpd, surgeftp, vsftpd, ioftpd, RaidenFTPd, and most others ...
|
53
106
|
# Note: Serv-U does not support CPSV.
|
107
|
+
#
|
108
|
+
# :startdoc:
|
54
109
|
|
110
|
+
#
|
111
|
+
# This method notifies the server to start using protection mode.
|
55
112
|
# Must issue this command on both control connections
|
56
|
-
# before CPSV or SSCN when preparing secure FXP.
|
113
|
+
# before +CPSV+ or +SSCN+ when preparing secure FXP.
|
57
114
|
# Both servers will attempt to initiate SSL/TLS handshake
|
58
115
|
# regardless if it is Active or Passive mode.
|
116
|
+
#
|
59
117
|
def fxpprotp
|
60
118
|
synchronize do
|
61
119
|
# PROT P - Private - Integrity and Privacy
|
@@ -68,9 +126,11 @@ module Net
|
|
68
126
|
end
|
69
127
|
end
|
70
128
|
|
129
|
+
#
|
71
130
|
# Issue this command on the server will set the data
|
72
|
-
# connection to unencrypted mode and no SSL/TLS handshake
|
131
|
+
# connection to +unencrypted mode+ and no SSL/TLS handshake
|
73
132
|
# will be initiated for subsequent transfers.
|
133
|
+
#
|
74
134
|
def fxpprotc
|
75
135
|
synchronize do
|
76
136
|
putline('PROT C')
|
@@ -78,6 +138,7 @@ module Net
|
|
78
138
|
end
|
79
139
|
end
|
80
140
|
|
141
|
+
#
|
81
142
|
# This is the exact same command as PASV, except it requires the
|
82
143
|
# control connection to be in protected mode (PROT P) and it tells
|
83
144
|
# the server NOT to initiate the SSL/TLS handshake. The other
|
@@ -85,6 +146,7 @@ module Net
|
|
85
146
|
# to do as usual and initiate SSL/TLS handshake.
|
86
147
|
# Server must support CPSV FTP extension protocol
|
87
148
|
# command. Most advance FTP servers implements CPSV.
|
149
|
+
#
|
88
150
|
def fxpgetcpsvport
|
89
151
|
synchronize do
|
90
152
|
putline('CPSV')
|
@@ -92,9 +154,11 @@ module Net
|
|
92
154
|
end
|
93
155
|
end
|
94
156
|
|
95
|
-
#
|
157
|
+
#
|
158
|
+
# This executes the +CCC+ (Clear Command Channel) command.
|
96
159
|
# Though the server may not allow this command because
|
97
160
|
# there are security issues with this.
|
161
|
+
#
|
98
162
|
def ftpccc
|
99
163
|
synchronize do
|
100
164
|
putline('CCC')
|
@@ -103,12 +167,14 @@ module Net
|
|
103
167
|
end
|
104
168
|
end
|
105
169
|
|
106
|
-
#
|
170
|
+
#
|
171
|
+
# Toggle the +SSCN+ mode to on for this server. SSCN
|
107
172
|
# requires that protected mode must be turned on
|
108
173
|
# (ie. PROT P). If SSCN is on, it tells the server
|
109
174
|
# to act in client mode for SSL/TLS handshakes.
|
110
175
|
# Server must support the SSCN FTP extension protocol
|
111
176
|
# command.
|
177
|
+
#
|
112
178
|
def fxpsscnon
|
113
179
|
synchronize do
|
114
180
|
putline('SSCN ON')
|
@@ -116,11 +182,13 @@ module Net
|
|
116
182
|
end
|
117
183
|
end
|
118
184
|
|
119
|
-
#
|
185
|
+
#
|
186
|
+
# Toggle the +SSCN+ mode to off for this server. If
|
120
187
|
# SSCN is off, it tells the server to act in server
|
121
188
|
# mode (default) for SSL/TLS handshakes.
|
122
189
|
# Server must support the SSCN FTP extension protocol
|
123
190
|
# command.
|
191
|
+
#
|
124
192
|
def fxpsscnoff
|
125
193
|
synchronize do
|
126
194
|
putline('SSCN OFF')
|
@@ -128,9 +196,15 @@ module Net
|
|
128
196
|
end
|
129
197
|
end
|
130
198
|
|
131
|
-
|
199
|
+
#
|
200
|
+
# This +FXP+ the specified source path to the destination path
|
132
201
|
# on the destination site. Path names should be for files only.
|
133
|
-
# Do not call this if you're using SSCN
|
202
|
+
# <em>Do not call this method if you're using SSCN.</em>
|
203
|
+
# This method uses +CPSV+. This raises an exception
|
204
|
+
# <tt>FTPFXPTLSSrcSiteError</tt> if errored on source site and
|
205
|
+
# raises an exception <tt>FTPFXPTLSDstSiteError</tt> if errored
|
206
|
+
# on destination site.
|
207
|
+
#
|
134
208
|
def fxpto(dst, dstpath, srcpath)
|
135
209
|
if not @secure_on
|
136
210
|
voidcmd('PROT P')
|
@@ -144,14 +218,18 @@ module Net
|
|
144
218
|
dst.fxpstor(dstpath)
|
145
219
|
fxpretr(srcpath)
|
146
220
|
resp = fxpwait
|
147
|
-
raise
|
221
|
+
raise FTPFXPTLSSrcSiteError unless '226' == resp[0,3]
|
148
222
|
resp = dst.fxpwait
|
149
|
-
raise
|
223
|
+
raise FTPFXPTLSDstSiteError unless '226' == resp[0,3]
|
150
224
|
return resp
|
151
225
|
end
|
152
226
|
|
153
|
-
|
227
|
+
#
|
228
|
+
# This +FXP+ the specified source path to the destination path
|
154
229
|
# on the destination site. Path names should be for files only.
|
230
|
+
# <em>Do not call this method if you're using CPSV.</em>
|
231
|
+
# This method uses +SSCN+.
|
232
|
+
#
|
155
233
|
def fxpsscnto(dst, dstpath, srcpath)
|
156
234
|
if not @secure_on
|
157
235
|
voidcmd('PROT P')
|
@@ -167,13 +245,15 @@ module Net
|
|
167
245
|
dst.fxpstor(dstpath)
|
168
246
|
fxpretr(srcpath)
|
169
247
|
resp = fxpwait
|
170
|
-
raise
|
248
|
+
raise FTPFXPTLSSrcSiteError unless '226' == resp[0,3]
|
171
249
|
resp = dst.fxpwait
|
172
|
-
raise
|
250
|
+
raise FTPFXPTLSDstSiteError unless '226' == resp[0,3]
|
173
251
|
return resp
|
174
252
|
end
|
175
253
|
|
254
|
+
#
|
176
255
|
# Override the transfercmd to support SSL sockets.
|
256
|
+
#
|
177
257
|
def transfercmd(cmd, rest_offset = nil)
|
178
258
|
if @passive
|
179
259
|
host, port = makepasv
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ftpfxp
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2006-07-
|
6
|
+
version: 0.0.2
|
7
|
+
date: 2006-07-11 00:00:00 -04:00
|
8
8
|
summary: Extension to Net::FTP providing FXP and SSL/TLS support
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -15,7 +15,7 @@ description:
|
|
15
15
|
autorequire: ftpfxp
|
16
16
|
default_executable:
|
17
17
|
bindir: bin
|
18
|
-
has_rdoc:
|
18
|
+
has_rdoc: true
|
19
19
|
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
20
|
requirements:
|
21
21
|
- - ">"
|