net-ftp 0.1.4 → 0.2.1
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/.github/dependabot.yml +6 -0
- data/.github/workflows/test.yml +2 -2
- data/lib/net/ftp.rb +38 -36
- data/net-ftp.gemspec +2 -4
- metadata +5 -6
- data/bin/console +0 -14
- data/bin/setup +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 18559c9c84d96f514739718efbda54e6fad17d4273091daa96439f8b2ca35088
|
4
|
+
data.tar.gz: 303c0fc5bfbf89f973b5dfc8adcab01353adbde0c1cc0a427ed5bcb545b680eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d06b941364767d71f483fd1396328324b6c15c88072058f904ca69509f6e70c57c64a2c4c3e3ee041a23aaa5d83b598bcf16061e8b13b76056d405d64fb349de
|
7
|
+
data.tar.gz: 13234a36e3e7ab0d0026fe84c4ab42b61b3f7ca0354a78dbc98dcbee2e8402d4130658c327c6e1e2124096b4b1faa0092fdb8e159baef060b801746531120e71
|
data/.github/workflows/test.yml
CHANGED
@@ -7,11 +7,11 @@ jobs:
|
|
7
7
|
name: build (${{ matrix.ruby }} / ${{ matrix.os }})
|
8
8
|
strategy:
|
9
9
|
matrix:
|
10
|
-
ruby: [ '3.0', 2.7, 2.6
|
10
|
+
ruby: [ head, '3.1', '3.0', '2.7', '2.6' ]
|
11
11
|
os: [ ubuntu-latest, macos-latest ]
|
12
12
|
runs-on: ${{ matrix.os }}
|
13
13
|
steps:
|
14
|
-
- uses: actions/checkout@
|
14
|
+
- uses: actions/checkout@v3
|
15
15
|
- name: Set up Ruby
|
16
16
|
uses: ruby/setup-ruby@v1
|
17
17
|
with:
|
data/lib/net/ftp.rb
CHANGED
@@ -85,7 +85,7 @@ module Net
|
|
85
85
|
end
|
86
86
|
|
87
87
|
# :stopdoc:
|
88
|
-
VERSION = "0.1
|
88
|
+
VERSION = "0.2.1"
|
89
89
|
FTP_PORT = 21
|
90
90
|
CRLF = "\r\n"
|
91
91
|
DEFAULT_BLOCKSIZE = BufferedIO::BUFSIZE
|
@@ -106,6 +106,11 @@ module Net
|
|
106
106
|
# to +$stdout+. Default: +false+.
|
107
107
|
attr_accessor :debug_mode
|
108
108
|
|
109
|
+
# Sets or retrieves the output stream for debugging.
|
110
|
+
# Output stream will be used only when +debug_mode+ is set to true.
|
111
|
+
# The default value is +$stdout+.
|
112
|
+
attr_accessor :debug_output
|
113
|
+
|
109
114
|
# Sets or retrieves the +resume+ status, which decides whether incomplete
|
110
115
|
# transfers are resumed or restarted. Default: +false+.
|
111
116
|
attr_accessor :resume
|
@@ -195,6 +200,8 @@ module Net
|
|
195
200
|
# as parameters.
|
196
201
|
# private_data_connection:: If true, TLS is used for data connections.
|
197
202
|
# Default: +true+ when +options+[:ssl] is true.
|
203
|
+
# implicit_ftps:: If true, TLS is established on initial connection.
|
204
|
+
# Default: +false+
|
198
205
|
# username:: Username for login. If +options+[:username] is the string
|
199
206
|
# "anonymous" and the +options+[:password] is +nil+,
|
200
207
|
# "anonymous@" is used as a password.
|
@@ -248,6 +255,11 @@ module Net
|
|
248
255
|
else
|
249
256
|
@private_data_connection = options[:private_data_connection]
|
250
257
|
end
|
258
|
+
if options[:implicit_ftps].nil?
|
259
|
+
@implicit_ftps = false
|
260
|
+
else
|
261
|
+
@implicit_ftps = options[:implicit_ftps]
|
262
|
+
end
|
251
263
|
else
|
252
264
|
@ssl_context = nil
|
253
265
|
if options[:private_data_connection]
|
@@ -255,6 +267,11 @@ module Net
|
|
255
267
|
"private_data_connection can be set to true only when ssl is enabled"
|
256
268
|
end
|
257
269
|
@private_data_connection = false
|
270
|
+
if options[:implicit_ftps]
|
271
|
+
raise ArgumentError,
|
272
|
+
"implicit_ftps can be set to true only when ssl is enabled"
|
273
|
+
end
|
274
|
+
@implicit_ftps = false
|
258
275
|
end
|
259
276
|
@binary = true
|
260
277
|
if options[:passive].nil?
|
@@ -267,6 +284,7 @@ module Net
|
|
267
284
|
else
|
268
285
|
@debug_mode = options[:debug_mode]
|
269
286
|
end
|
287
|
+
@debug_output = $stdout
|
270
288
|
@resume = false
|
271
289
|
@bare_sock = @sock = NullSocket.new
|
272
290
|
@logged_in = false
|
@@ -378,19 +396,17 @@ module Net
|
|
378
396
|
# <tt>Errno::ECONNREFUSED</tt>) if the connection cannot be established.
|
379
397
|
#
|
380
398
|
def connect(host, port = FTP_PORT)
|
381
|
-
|
382
|
-
print "connect: ", host, ", ", port, "\n"
|
383
|
-
end
|
399
|
+
debug_print "connect: #{host}:#{port}"
|
384
400
|
synchronize do
|
385
401
|
@host = host
|
386
402
|
@bare_sock = open_socket(host, port)
|
387
|
-
@sock = BufferedSocket.new(@bare_sock, read_timeout: @read_timeout)
|
388
|
-
voidresp
|
389
403
|
if @ssl_context
|
390
404
|
begin
|
391
|
-
|
392
|
-
|
393
|
-
|
405
|
+
unless @implicit_ftps
|
406
|
+
set_socket(BufferedSocket.new(@bare_sock, read_timeout: @read_timeout))
|
407
|
+
voidcmd("AUTH TLS")
|
408
|
+
end
|
409
|
+
set_socket(BufferedSSLSocket.new(start_tls_session(@bare_sock), read_timeout: @read_timeout), @implicit_ftps)
|
394
410
|
if @private_data_connection
|
395
411
|
voidcmd("PBSZ 0")
|
396
412
|
voidcmd("PROT P")
|
@@ -399,6 +415,8 @@ module Net
|
|
399
415
|
@sock.close
|
400
416
|
raise
|
401
417
|
end
|
418
|
+
else
|
419
|
+
set_socket(BufferedSocket.new(@bare_sock, read_timeout: @read_timeout))
|
402
420
|
end
|
403
421
|
end
|
404
422
|
end
|
@@ -430,9 +448,7 @@ module Net
|
|
430
448
|
# Ensures that +line+ has a control return / line feed (CRLF) and writes
|
431
449
|
# it to the socket.
|
432
450
|
def putline(line) # :nodoc:
|
433
|
-
|
434
|
-
print "put: ", sanitize(line), "\n"
|
435
|
-
end
|
451
|
+
debug_print "put: #{sanitize(line)}"
|
436
452
|
if /[\r\n]/ =~ line
|
437
453
|
raise ArgumentError, "A line must not contain CR or LF"
|
438
454
|
end
|
@@ -445,9 +461,7 @@ module Net
|
|
445
461
|
def getline # :nodoc:
|
446
462
|
line = @sock.readline # if get EOF, raise EOFError
|
447
463
|
line.sub!(/(\r\n|\n|\r)\z/n, "")
|
448
|
-
|
449
|
-
print "get: ", sanitize(line), "\n"
|
450
|
-
end
|
464
|
+
debug_print "get: #{sanitize(line)}"
|
451
465
|
return line
|
452
466
|
end
|
453
467
|
private :getline
|
@@ -545,7 +559,6 @@ module Net
|
|
545
559
|
host, port = parse227(sendcmd("PASV"))
|
546
560
|
else
|
547
561
|
host, port = parse229(sendcmd("EPSV"))
|
548
|
-
# host, port = parse228(sendcmd("LPSV"))
|
549
562
|
end
|
550
563
|
return host, port
|
551
564
|
end
|
@@ -1248,7 +1261,7 @@ module Net
|
|
1248
1261
|
#
|
1249
1262
|
def abort
|
1250
1263
|
line = "ABOR" + CRLF
|
1251
|
-
|
1264
|
+
debug_print "put: ABOR"
|
1252
1265
|
@sock.send(line, Socket::MSG_OOB)
|
1253
1266
|
resp = getmultiline
|
1254
1267
|
unless ["426", "226", "225"].include?(resp[0, 3])
|
@@ -1268,7 +1281,7 @@ module Net
|
|
1268
1281
|
if /[\r\n]/ =~ line
|
1269
1282
|
raise ArgumentError, "A line must not contain CR or LF"
|
1270
1283
|
end
|
1271
|
-
|
1284
|
+
debug_print "put: #{line}"
|
1272
1285
|
@sock.send(line + CRLF, Socket::MSG_OOB)
|
1273
1286
|
return getresp
|
1274
1287
|
end
|
@@ -1401,24 +1414,6 @@ module Net
|
|
1401
1414
|
end
|
1402
1415
|
private :parse227
|
1403
1416
|
|
1404
|
-
# handler for response code 228
|
1405
|
-
# (Entering Long Passive Mode)
|
1406
|
-
#
|
1407
|
-
# Returns host and port.
|
1408
|
-
def parse228(resp) # :nodoc:
|
1409
|
-
if !resp.start_with?("228")
|
1410
|
-
raise FTPReplyError, resp
|
1411
|
-
end
|
1412
|
-
if m = /\(4,4,(?<host>\d+(?:,\d+){3}),2,(?<port>\d+,\d+)\)/.match(resp)
|
1413
|
-
return parse_pasv_ipv4_host(m["host"]), parse_pasv_port(m["port"])
|
1414
|
-
elsif m = /\(6,16,(?<host>\d+(?:,\d+){15}),2,(?<port>\d+,\d+)\)/.match(resp)
|
1415
|
-
return parse_pasv_ipv6_host(m["host"]), parse_pasv_port(m["port"])
|
1416
|
-
else
|
1417
|
-
raise FTPProtoError, resp
|
1418
|
-
end
|
1419
|
-
end
|
1420
|
-
private :parse228
|
1421
|
-
|
1422
1417
|
def parse_pasv_ipv4_host(s)
|
1423
1418
|
return s.tr(",", ".")
|
1424
1419
|
end
|
@@ -1466,6 +1461,13 @@ module Net
|
|
1466
1461
|
end
|
1467
1462
|
private :parse257
|
1468
1463
|
|
1464
|
+
#
|
1465
|
+
# Writes debug message to the debug output stream
|
1466
|
+
#
|
1467
|
+
def debug_print(msg)
|
1468
|
+
@debug_output << msg + "\n" if @debug_mode && @debug_output
|
1469
|
+
end
|
1470
|
+
|
1469
1471
|
# :stopdoc:
|
1470
1472
|
class NullSocket
|
1471
1473
|
def read_timeout=(sec)
|
data/net-ftp.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.summary = %q{Support for the File Transfer Protocol.}
|
17
17
|
spec.description = %q{Support for the File Transfer Protocol.}
|
18
18
|
spec.homepage = "https://github.com/ruby/net-ftp"
|
19
|
-
spec.required_ruby_version = Gem::Requirement.new(">= 2.
|
19
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.6.0")
|
20
20
|
spec.licenses = ["Ruby", "BSD-2-Clause"]
|
21
21
|
|
22
22
|
spec.metadata["homepage_uri"] = spec.homepage
|
@@ -25,10 +25,8 @@ Gem::Specification.new do |spec|
|
|
25
25
|
# Specify which files should be added to the gem when it is released.
|
26
26
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
27
27
|
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
28
|
-
`git ls-files -z 2>/dev/null`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
28
|
+
`git ls-files -z 2>/dev/null`.split("\x0").reject { |f| f.match(%r{^(bin|test|spec|features)/}) }
|
29
29
|
end
|
30
|
-
spec.bindir = "exe"
|
31
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
32
30
|
spec.require_paths = ["lib"]
|
33
31
|
|
34
32
|
spec.add_dependency "net-protocol"
|
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: net-ftp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shugo Maeda
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
date: 2024-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
@@ -45,14 +45,13 @@ executables: []
|
|
45
45
|
extensions: []
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
|
+
- ".github/dependabot.yml"
|
48
49
|
- ".github/workflows/test.yml"
|
49
50
|
- ".gitignore"
|
50
51
|
- Gemfile
|
51
52
|
- LICENSE.txt
|
52
53
|
- README.md
|
53
54
|
- Rakefile
|
54
|
-
- bin/console
|
55
|
-
- bin/setup
|
56
55
|
- lib/net/ftp.rb
|
57
56
|
- net-ftp.gemspec
|
58
57
|
homepage: https://github.com/ruby/net-ftp
|
@@ -70,14 +69,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
70
69
|
requirements:
|
71
70
|
- - ">="
|
72
71
|
- !ruby/object:Gem::Version
|
73
|
-
version: 2.
|
72
|
+
version: 2.6.0
|
74
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
74
|
requirements:
|
76
75
|
- - ">="
|
77
76
|
- !ruby/object:Gem::Version
|
78
77
|
version: '0'
|
79
78
|
requirements: []
|
80
|
-
rubygems_version: 3.
|
79
|
+
rubygems_version: 3.4.19
|
81
80
|
signing_key:
|
82
81
|
specification_version: 4
|
83
82
|
summary: Support for the File Transfer Protocol.
|
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "net/ftp"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start(__FILE__)
|