summaryrefslogtreecommitdiff
path: root/lib/net/ftp.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/net/ftp.rb')
-rw-r--r--lib/net/ftp.rb336
1 files changed, 168 insertions, 168 deletions
diff --git a/lib/net/ftp.rb b/lib/net/ftp.rb
index 825a1cc22f..14c6b07826 100644
--- a/lib/net/ftp.rb
+++ b/lib/net/ftp.rb
@@ -136,10 +136,10 @@ module Net
@sock = NullSocket.new
@logged_in = false
if host
- connect(host)
- if user
- login(user, passwd, acct)
- end
+ connect(host)
+ if user
+ login(user, passwd, acct)
+ end
end
end
@@ -197,10 +197,10 @@ module Net
# else a TCPSocket is returned.
def open_socket(host, port)
if defined? SOCKSSocket and ENV["SOCKS_SERVER"]
- @passive = true
- return SOCKSSocket.open(host, port)
+ @passive = true
+ return SOCKSSocket.open(host, port)
else
- return TCPSocket.open(host, port)
+ return TCPSocket.open(host, port)
end
end
private :open_socket
@@ -213,11 +213,11 @@ module Net
#
def connect(host, port = FTP_PORT)
if @debug_mode
- print "connect: ", host, ", ", port, "\n"
+ print "connect: ", host, ", ", port, "\n"
end
synchronize do
- @sock = open_socket(host, port)
- voidresp
+ @sock = open_socket(host, port)
+ voidresp
end
end
@@ -226,10 +226,10 @@ module Net
#
def set_socket(sock, get_greeting = true)
synchronize do
- @sock = sock
- if get_greeting
- voidresp
- end
+ @sock = sock
+ if get_greeting
+ voidresp
+ end
end
end
@@ -237,9 +237,9 @@ module Net
# then the contents of the password are cleaned from the string using "*"
def sanitize(s)
if s =~ /^PASS /i
- return s[0, 5] + "*" * (s.length - 5)
+ return s[0, 5] + "*" * (s.length - 5)
else
- return s
+ return s
end
end
private :sanitize
@@ -248,7 +248,7 @@ module Net
# and writes it to the socket.
def putline(line)
if @debug_mode
- print "put: ", sanitize(line), "\n"
+ print "put: ", sanitize(line), "\n"
end
line = line + CRLF
@sock.write(line)
@@ -261,7 +261,7 @@ module Net
line = @sock.readline # if get EOF, raise EOFError
line.sub!(/(\r\n|\n|\r)\z/n, "")
if @debug_mode
- print "get: ", sanitize(line), "\n"
+ print "get: ", sanitize(line), "\n"
end
return line
end
@@ -272,11 +272,11 @@ module Net
line = getline
buff = line
if line[3] == ?-
- code = line[0, 3]
- begin
- line = getline
- buff << "\n" << line
- end until line[0, 3] == code and line[3] != ?-
+ code = line[0, 3]
+ begin
+ line = getline
+ buff << "\n" << line
+ end until line[0, 3] == code and line[3] != ?-
end
return buff << "\n"
end
@@ -290,13 +290,13 @@ module Net
@last_response_code = @last_response[0, 3]
case @last_response_code
when /\A[123]/
- return @last_response
+ return @last_response
when /\A4/
- raise FTPTempError, @last_response
+ raise FTPTempError, @last_response
when /\A5/
- raise FTPPermError, @last_response
+ raise FTPPermError, @last_response
else
- raise FTPProtoError, @last_response
+ raise FTPProtoError, @last_response
end
end
private :getresp
@@ -306,7 +306,7 @@ module Net
def voidresp
resp = getresp
if resp[0] != ?2
- raise FTPReplyError, resp
+ raise FTPReplyError, resp
end
end
private :voidresp
@@ -316,8 +316,8 @@ module Net
#
def sendcmd(cmd)
synchronize do
- putline(cmd)
- return getresp
+ putline(cmd)
+ return getresp
end
end
@@ -326,8 +326,8 @@ module Net
#
def voidcmd(cmd)
synchronize do
- putline(cmd)
- voidresp
+ putline(cmd)
+ voidresp
end
end
@@ -335,11 +335,11 @@ module Net
def sendport(host, port)
af = (@sock.peeraddr)[0]
if af == "AF_INET"
- cmd = "PORT " + (host.split(".") + port.divmod(256)).join(",")
+ cmd = "PORT " + (host.split(".") + port.divmod(256)).join(",")
elsif af == "AF_INET6"
- cmd = sprintf("EPRT |2|%s|%d|", host, port)
+ cmd = sprintf("EPRT |2|%s|%d|", host, port)
else
- raise FTPProtoError, host
+ raise FTPProtoError, host
end
voidcmd(cmd)
end
@@ -360,10 +360,10 @@ module Net
# sends the appropriate command to enable a passive connection
def makepasv
if @sock.peeraddr[0] == "AF_INET"
- host, port = parse227(sendcmd("PASV"))
+ host, port = parse227(sendcmd("PASV"))
else
- host, port = parse229(sendcmd("EPSV"))
- # host, port = parse228(sendcmd("LPSV"))
+ host, port = parse229(sendcmd("EPSV"))
+ # host, port = parse228(sendcmd("LPSV"))
end
return host, port
end
@@ -372,36 +372,36 @@ module Net
# Constructs a connection for transferring data
def transfercmd(cmd, rest_offset = nil)
if @passive
- host, port = makepasv
- conn = open_socket(host, port)
- if @resume and rest_offset
- resp = sendcmd("REST " + rest_offset.to_s)
- if resp[0] != ?3
- raise FTPReplyError, resp
- end
- end
- resp = sendcmd(cmd)
+ host, port = makepasv
+ conn = open_socket(host, port)
+ if @resume and rest_offset
+ resp = sendcmd("REST " + rest_offset.to_s)
+ if resp[0] != ?3
+ raise FTPReplyError, resp
+ end
+ end
+ resp = sendcmd(cmd)
# skip 2XX for some ftp servers
resp = getresp if resp[0] == ?2
- if resp[0] != ?1
- raise FTPReplyError, resp
- end
+ if resp[0] != ?1
+ raise FTPReplyError, resp
+ end
else
- sock = makeport
- if @resume and rest_offset
- resp = sendcmd("REST " + rest_offset.to_s)
- if resp[0] != ?3
- raise FTPReplyError, resp
- end
- end
- resp = sendcmd(cmd)
+ sock = makeport
+ if @resume and rest_offset
+ resp = sendcmd("REST " + rest_offset.to_s)
+ if resp[0] != ?3
+ raise FTPReplyError, resp
+ end
+ end
+ resp = sendcmd(cmd)
# skip 2XX for some ftp servers
resp = getresp if resp[0] == ?2
- if resp[0] != ?1
- raise FTPReplyError, resp
- end
- conn = sock.accept
- sock.close
+ if resp[0] != ?1
+ raise FTPReplyError, resp
+ end
+ conn = sock.accept
+ sock.close
end
return conn
end
@@ -417,23 +417,23 @@ module Net
#
def login(user = "anonymous", passwd = nil, acct = nil)
if user == "anonymous" and passwd == nil
- passwd = "anonymous@"
+ passwd = "anonymous@"
end
resp = ""
synchronize do
- resp = sendcmd('USER ' + user)
- if resp[0] == ?3
+ resp = sendcmd('USER ' + user)
+ if resp[0] == ?3
raise FTPReplyError, resp if passwd.nil?
- resp = sendcmd('PASS ' + passwd)
- end
- if resp[0] == ?3
+ resp = sendcmd('PASS ' + passwd)
+ end
+ if resp[0] == ?3
raise FTPReplyError, resp if acct.nil?
- resp = sendcmd('ACCT ' + acct)
- end
+ resp = sendcmd('ACCT ' + acct)
+ end
end
if resp[0] != ?2
- raise FTPReplyError, resp
+ raise FTPReplyError, resp
end
@welcome = resp
send_type_command
@@ -448,7 +448,7 @@ module Net
#
def retrbinary(cmd, blocksize, rest_offset = nil) # :yield: data
synchronize do
- with_binary(true) do
+ with_binary(true) do
conn = transfercmd(cmd, rest_offset)
loop do
data = conn.read(blocksize)
@@ -469,7 +469,7 @@ module Net
#
def retrlines(cmd) # :yield: line
synchronize do
- with_binary(false) do
+ with_binary(false) do
conn = transfercmd(cmd)
loop do
line = conn.gets
@@ -493,7 +493,7 @@ module Net
file.seek(rest_offset, IO::SEEK_SET)
end
synchronize do
- with_binary(true) do
+ with_binary(true) do
conn = transfercmd(cmd)
loop do
buf = file.read(blocksize)
@@ -522,7 +522,7 @@ module Net
#
def storlines(cmd, file, &block) # :yield: line
synchronize do
- with_binary(false) do
+ with_binary(false) do
conn = transfercmd(cmd)
loop do
buf = file.gets
@@ -553,7 +553,7 @@ module Net
# chunks.
#
def getbinaryfile(remotefile, localfile = File.basename(remotefile),
- blocksize = DEFAULT_BLOCKSIZE) # :yield: data
+ blocksize = DEFAULT_BLOCKSIZE) # :yield: data
result = nil
if localfile
if @resume
@@ -567,15 +567,15 @@ module Net
result = ""
end
begin
- f.binmode if localfile
- retrbinary("RETR " + remotefile.to_s, blocksize, rest_offset) do |data|
- f.write(data) if localfile
- yield(data) if block_given?
+ f.binmode if localfile
+ retrbinary("RETR " + remotefile.to_s, blocksize, rest_offset) do |data|
+ f.write(data) if localfile
+ yield(data) if block_given?
result.concat(data) if result
- end
+ end
return result
ensure
- f.close if localfile
+ f.close if localfile
end
end
@@ -594,15 +594,15 @@ module Net
result = ""
end
begin
- retrlines("RETR " + remotefile) do |line, newline|
+ retrlines("RETR " + remotefile) do |line, newline|
l = newline ? line + "\n" : line
- f.print(l) if localfile
- yield(line, newline) if block_given?
+ f.print(l) if localfile
+ yield(line, newline) if block_given?
result.concat(l) if result
- end
+ end
return result
ensure
- f.close if localfile
+ f.close if localfile
end
end
@@ -611,11 +611,11 @@ module Net
# binary). See #gettextfile and #getbinaryfile.
#
def get(remotefile, localfile = File.basename(remotefile),
- blocksize = DEFAULT_BLOCKSIZE, &block) # :yield: data
+ blocksize = DEFAULT_BLOCKSIZE, &block) # :yield: data
if @binary
- getbinaryfile(remotefile, localfile, blocksize, &block)
+ getbinaryfile(remotefile, localfile, blocksize, &block)
else
- gettextfile(remotefile, localfile, &block)
+ gettextfile(remotefile, localfile, &block)
end
end
@@ -625,7 +625,7 @@ module Net
# data in +blocksize+ chunks.
#
def putbinaryfile(localfile, remotefile = File.basename(localfile),
- blocksize = DEFAULT_BLOCKSIZE, &block) # :yield: data
+ blocksize = DEFAULT_BLOCKSIZE, &block) # :yield: data
if @resume
begin
rest_offset = size(remotefile)
@@ -633,18 +633,18 @@ module Net
rest_offset = nil
end
else
- rest_offset = nil
+ rest_offset = nil
end
f = open(localfile)
begin
- f.binmode
+ f.binmode
if rest_offset
storbinary("APPE " + remotefile, f, blocksize, rest_offset, &block)
else
storbinary("STOR " + remotefile, f, blocksize, rest_offset, &block)
end
ensure
- f.close
+ f.close
end
end
@@ -656,9 +656,9 @@ module Net
def puttextfile(localfile, remotefile = File.basename(localfile), &block) # :yield: line
f = open(localfile)
begin
- storlines("STOR " + remotefile, f, &block)
+ storlines("STOR " + remotefile, f, &block)
ensure
- f.close
+ f.close
end
end
@@ -667,11 +667,11 @@ module Net
# (text or binary). See #puttextfile and #putbinaryfile.
#
def put(localfile, remotefile = File.basename(localfile),
- blocksize = DEFAULT_BLOCKSIZE, &block)
+ blocksize = DEFAULT_BLOCKSIZE, &block)
if @binary
- putbinaryfile(localfile, remotefile, blocksize, &block)
+ putbinaryfile(localfile, remotefile, blocksize, &block)
else
- puttextfile(localfile, remotefile, &block)
+ puttextfile(localfile, remotefile, &block)
end
end
@@ -692,11 +692,11 @@ module Net
def nlst(dir = nil)
cmd = "NLST"
if dir
- cmd = cmd + " " + dir
+ cmd = cmd + " " + dir
end
files = []
retrlines(cmd) do |line|
- files.push(line)
+ files.push(line)
end
return files
end
@@ -708,16 +708,16 @@ module Net
def list(*args, &block) # :yield: line
cmd = "LIST"
args.each do |arg|
- cmd = cmd + " " + arg.to_s
+ cmd = cmd + " " + arg.to_s
end
if block
- retrlines(cmd, &block)
+ retrlines(cmd, &block)
else
- lines = []
- retrlines(cmd) do |line|
- lines << line
- end
- return lines
+ lines = []
+ retrlines(cmd) do |line|
+ lines << line
+ end
+ return lines
end
end
alias ls list
@@ -729,7 +729,7 @@ module Net
def rename(fromname, toname)
resp = sendcmd("RNFR " + fromname)
if resp[0] != ?3
- raise FTPReplyError, resp
+ raise FTPReplyError, resp
end
voidcmd("RNTO " + toname)
end
@@ -740,11 +740,11 @@ module Net
def delete(filename)
resp = sendcmd("DELE " + filename)
if resp[0, 3] == "250"
- return
+ return
elsif resp[0] == ?5
- raise FTPPermError, resp
+ raise FTPPermError, resp
else
- raise FTPReplyError, resp
+ raise FTPReplyError, resp
end
end
@@ -753,14 +753,14 @@ module Net
#
def chdir(dirname)
if dirname == ".."
- begin
- voidcmd("CDUP")
- return
- rescue FTPPermError => e
- if e.message[0, 3] != "500"
- raise e
- end
- end
+ begin
+ voidcmd("CDUP")
+ return
+ rescue FTPPermError => e
+ if e.message[0, 3] != "500"
+ raise e
+ end
+ end
end
cmd = "CWD " + dirname
voidcmd(cmd)
@@ -781,15 +781,15 @@ module Net
MDTM_REGEXP = /^(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/ # :nodoc:
- #
- # Returns the last modification time of the (remote) file. If +local+ is
- # +true+, it is returned as a local time, otherwise it's a UTC time.
- #
- def mtime(filename, local = false)
- str = mdtm(filename)
- ary = str.scan(MDTM_REGEXP)[0].collect {|i| i.to_i}
- return local ? Time.local(*ary) : Time.gm(*ary)
- end
+ #
+ # Returns the last modification time of the (remote) file. If +local+ is
+ # +true+, it is returned as a local time, otherwise it's a UTC time.
+ #
+ def mtime(filename, local = false)
+ str = mdtm(filename)
+ ary = str.scan(MDTM_REGEXP)[0].collect {|i| i.to_i}
+ return local ? Time.local(*ary) : Time.gm(*ary)
+ end
#
# Creates a remote directory.
@@ -821,7 +821,7 @@ module Net
def system
resp = sendcmd("SYST")
if resp[0, 3] != "215"
- raise FTPReplyError, resp
+ raise FTPReplyError, resp
end
return resp[4 .. -1]
end
@@ -835,7 +835,7 @@ module Net
@sock.send(line, Socket::MSG_OOB)
resp = getmultiline
unless ["426", "226", "225"].include?(resp[0, 3])
- raise FTPProtoError, resp
+ raise FTPProtoError, resp
end
return resp
end
@@ -856,7 +856,7 @@ module Net
def mdtm(filename)
resp = sendcmd("MDTM " + filename)
if resp[0, 3] == "213"
- return resp[3 .. -1].strip
+ return resp[3 .. -1].strip
end
end
@@ -866,7 +866,7 @@ module Net
def help(arg = nil)
cmd = "HELP"
if arg
- cmd = cmd + " " + arg
+ cmd = cmd + " " + arg
end
sendcmd(cmd)
end
@@ -916,16 +916,16 @@ module Net
# Returns host and port.
def parse227(resp)
if resp[0, 3] != "227"
- raise FTPReplyError, resp
+ raise FTPReplyError, resp
end
left = resp.index("(")
right = resp.index(")")
if left == nil or right == nil
- raise FTPProtoError, resp
+ raise FTPProtoError, resp
end
numbers = resp[left + 1 .. right - 1].split(",")
if numbers.length != 6
- raise FTPProtoError, resp
+ raise FTPProtoError, resp
end
host = numbers[0, 4].join(".")
port = (numbers[4].to_i << 8) + numbers[5].to_i
@@ -939,31 +939,31 @@ module Net
# Returns host and port.
def parse228(resp)
if resp[0, 3] != "228"
- raise FTPReplyError, resp
+ raise FTPReplyError, resp
end
left = resp.index("(")
right = resp.index(")")
if left == nil or right == nil
- raise FTPProtoError, resp
+ raise FTPProtoError, resp
end
numbers = resp[left + 1 .. right - 1].split(",")
if numbers[0] == "4"
- if numbers.length != 9 || numbers[1] != "4" || numbers[2 + 4] != "2"
- raise FTPProtoError, resp
- end
- host = numbers[2, 4].join(".")
- port = (numbers[7].to_i << 8) + numbers[8].to_i
+ if numbers.length != 9 || numbers[1] != "4" || numbers[2 + 4] != "2"
+ raise FTPProtoError, resp
+ end
+ host = numbers[2, 4].join(".")
+ port = (numbers[7].to_i << 8) + numbers[8].to_i
elsif numbers[0] == "6"
- if numbers.length != 21 || numbers[1] != "16" || numbers[2 + 16] != "2"
- raise FTPProtoError, resp
- end
- v6 = ["", "", "", "", "", "", "", ""]
- for i in 0 .. 7
- v6[i] = sprintf("%02x%02x", numbers[(i * 2) + 2].to_i,
- numbers[(i * 2) + 3].to_i)
- end
- host = v6[0, 8].join(":")
- port = (numbers[19].to_i << 8) + numbers[20].to_i
+ if numbers.length != 21 || numbers[1] != "16" || numbers[2 + 16] != "2"
+ raise FTPProtoError, resp
+ end
+ v6 = ["", "", "", "", "", "", "", ""]
+ for i in 0 .. 7
+ v6[i] = sprintf("%02x%02x", numbers[(i * 2) + 2].to_i,
+ numbers[(i * 2) + 3].to_i)
+ end
+ host = v6[0, 8].join(":")
+ port = (numbers[19].to_i << 8) + numbers[20].to_i
end
return host, port
end
@@ -975,16 +975,16 @@ module Net
# Returns host and port.
def parse229(resp)
if resp[0, 3] != "229"
- raise FTPReplyError, resp
+ raise FTPReplyError, resp
end
left = resp.index("(")
right = resp.index(")")
if left == nil or right == nil
- raise FTPProtoError, resp
+ raise FTPProtoError, resp
end
numbers = resp[left + 1 .. right - 1].split(resp[left + 1, 1])
if numbers.length != 4
- raise FTPProtoError, resp
+ raise FTPProtoError, resp
end
port = numbers[3].to_i
host = (@sock.peeraddr())[3]
@@ -998,24 +998,24 @@ module Net
# Returns host and port.
def parse257(resp)
if resp[0, 3] != "257"
- raise FTPReplyError, resp
+ raise FTPReplyError, resp
end
if resp[3, 2] != ' "'
- return ""
+ return ""
end
dirname = ""
i = 5
n = resp.length
while i < n
- c = resp[i, 1]
- i = i + 1
- if c == '"'
- if i > n or resp[i, 1] != '"'
- break
- end
- i = i + 1
- end
- dirname = dirname + c
+ c = resp[i, 1]
+ i = i + 1
+ if c == '"'
+ if i > n or resp[i, 1] != '"'
+ break
+ end
+ i = i + 1
+ end
+ dirname = dirname + c
end
return dirname
end