net-ftp 0.1.1 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ba4ad76088a26b22d04b1c904c98d47d064d69c9ec06cb1c29d5f81d604963b7
4
- data.tar.gz: 2416f84cfc9b309026a027af2f44629119fa19a1cd2fb45a306d8aeae1653115
3
+ metadata.gz: 8a662c5a1b1201b6381d8c674ef0fcbe4a5a882ca023a24bd0606b607ec2a9cf
4
+ data.tar.gz: a89263fa37869d75365ffa13206244fae8efcaa2dcd8a24aa032ebdaf58bbbd4
5
5
  SHA512:
6
- metadata.gz: 59a15adc74781c2720af162360e9f05768b91d0a5b1937faf6ee2d04679feabdb1b9e892ea6c56f48fc06c2487506461935ee67163335b2700dd53c3c7f591c3
7
- data.tar.gz: 8b08d23da6ad3126d18c2efd7711d2b95a7df621399e73548596e27cd5e159ea3e195181ba83e3cedebd4dff4b43853ad74ed88fe644ea648dc44713cb6026a5
6
+ metadata.gz: cd09e0b10d7188943dcbdf8a7af4482d2798f4207fbdd5e42c44e6156ccb40b29e6f026b38c773d10b69e3549776ee79a266a1c7fb33315ad899faf0e25852f9
7
+ data.tar.gz: 76ca5bc18729d1ad8f0aaf732845a08ed6d21539d60db29bdadab43d9d3801f53772fd9312f1bd900fbd4e16f533b61b2c08cf60bfef87f4a3ebb7ced2e51630
@@ -7,18 +7,16 @@ jobs:
7
7
  name: build (${{ matrix.ruby }} / ${{ matrix.os }})
8
8
  strategy:
9
9
  matrix:
10
- ruby: [ 2.7, 2.6, 2.5, 2.4, head ]
10
+ ruby: [ '3.0', 2.7, 2.6, 2.5, 2.4, head ]
11
11
  os: [ ubuntu-latest, macos-latest ]
12
12
  runs-on: ${{ matrix.os }}
13
13
  steps:
14
- - uses: actions/checkout@master
14
+ - uses: actions/checkout@v2
15
15
  - name: Set up Ruby
16
16
  uses: ruby/setup-ruby@v1
17
17
  with:
18
18
  ruby-version: ${{ matrix.ruby }}
19
19
  - name: Install dependencies
20
- run: |
21
- gem install bundler --no-document
22
- bundle install
20
+ run: bundle install
23
21
  - name: Run test
24
22
  run: rake test
data/.gitignore CHANGED
@@ -6,3 +6,4 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ Gemfile.lock
data/lib/net/ftp.rb CHANGED
@@ -85,7 +85,7 @@ module Net
85
85
  end
86
86
 
87
87
  # :stopdoc:
88
- VERSION = "0.1.1"
88
+ VERSION = "0.1.3"
89
89
  FTP_PORT = 21
90
90
  CRLF = "\r\n"
91
91
  DEFAULT_BLOCKSIZE = BufferedIO::BUFSIZE
@@ -98,6 +98,10 @@ module Net
98
98
  # When +true+, the connection is in passive mode. Default: +true+.
99
99
  attr_accessor :passive
100
100
 
101
+ # When +true+, use the IP address in PASV responses. Otherwise, it uses
102
+ # the same IP address for the control connection. Default: +false+.
103
+ attr_accessor :use_pasv_ip
104
+
101
105
  # When +true+, all traffic to and from the server is written
102
106
  # to +$stdout+. Default: +false+.
103
107
  attr_accessor :debug_mode
@@ -206,6 +210,9 @@ module Net
206
210
  # handshake.
207
211
  # See Net::FTP#ssl_handshake_timeout for
208
212
  # details. Default: +nil+.
213
+ # use_pasv_ip:: When +true+, use the IP address in PASV responses.
214
+ # Otherwise, it uses the same IP address for the control
215
+ # connection. Default: +false+.
209
216
  # debug_mode:: When +true+, all traffic to and from the server is
210
217
  # written to +$stdout+. Default: +false+.
211
218
  #
@@ -266,6 +273,7 @@ module Net
266
273
  @open_timeout = options[:open_timeout]
267
274
  @ssl_handshake_timeout = options[:ssl_handshake_timeout]
268
275
  @read_timeout = options[:read_timeout] || 60
276
+ @use_pasv_ip = options[:use_pasv_ip] || false
269
277
  if host
270
278
  connect(host, options[:port] || FTP_PORT)
271
279
  if options[:username]
@@ -330,14 +338,19 @@ module Net
330
338
  # SOCKS_SERVER, then a SOCKSSocket is returned, else a Socket is
331
339
  # returned.
332
340
  def open_socket(host, port) # :nodoc:
333
- return Timeout.timeout(@open_timeout, OpenTimeout) {
334
- if defined? SOCKSSocket and ENV["SOCKS_SERVER"]
335
- @passive = true
341
+ if defined? SOCKSSocket and ENV["SOCKS_SERVER"]
342
+ @passive = true
343
+ Timeout.timeout(@open_timeout, OpenTimeout) do
336
344
  SOCKSSocket.open(host, port)
337
- else
338
- Socket.tcp(host, port)
339
345
  end
340
- }
346
+ else
347
+ begin
348
+ Socket.tcp host, port, nil, nil, connect_timeout: @open_timeout
349
+ rescue Errno::ETIMEDOUT #raise Net:OpenTimeout instead for compatibility with previous versions
350
+ raise Net::OpenTimeout, "Timeout to open TCP connection to "\
351
+ "#{host}:#{port} (exceeds #{@open_timeout} seconds)"
352
+ end
353
+ end
341
354
  end
342
355
  private :open_socket
343
356
 
@@ -542,18 +555,22 @@ module Net
542
555
  def transfercmd(cmd, rest_offset = nil) # :nodoc:
543
556
  if @passive
544
557
  host, port = makepasv
545
- conn = open_socket(host, port)
546
- if @resume and rest_offset
547
- resp = sendcmd("REST " + rest_offset.to_s)
548
- if !resp.start_with?("3")
558
+ begin
559
+ conn = open_socket(host, port)
560
+ if @resume and rest_offset
561
+ resp = sendcmd("REST " + rest_offset.to_s)
562
+ if !resp.start_with?("3")
563
+ raise FTPReplyError, resp
564
+ end
565
+ end
566
+ resp = sendcmd(cmd)
567
+ # skip 2XX for some ftp servers
568
+ resp = getresp if resp.start_with?("2")
569
+ if !resp.start_with?("1")
549
570
  raise FTPReplyError, resp
550
571
  end
551
- end
552
- resp = sendcmd(cmd)
553
- # skip 2XX for some ftp servers
554
- resp = getresp if resp.start_with?("2")
555
- if !resp.start_with?("1")
556
- raise FTPReplyError, resp
572
+ ensure
573
+ conn.close if conn && $!
557
574
  end
558
575
  else
559
576
  sock = makeport
@@ -1045,10 +1062,11 @@ module Net
1045
1062
  TIME_PARSER = ->(value, local = false) {
1046
1063
  unless /\A(?<year>\d{4})(?<month>\d{2})(?<day>\d{2})
1047
1064
  (?<hour>\d{2})(?<min>\d{2})(?<sec>\d{2})
1048
- (?:\.(?<fractions>\d+))?/x =~ value
1065
+ (?:\.(?<fractions>\d{1,17}))?/x =~ value
1066
+ value = value[0, 97] + "..." if value.size > 100
1049
1067
  raise FTPProtoError, "invalid time-val: #{value}"
1050
1068
  end
1051
- usec = fractions.to_i * 10 ** (6 - fractions.to_s.size)
1069
+ usec = ".#{fractions}".to_r * 1_000_000 if fractions
1052
1070
  Time.public_send(local ? :local : :utc, year, month, day, hour, min, sec, usec)
1053
1071
  }
1054
1072
  FACT_PARSERS = Hash.new(CASE_DEPENDENT_PARSER)
@@ -1356,7 +1374,7 @@ module Net
1356
1374
  end
1357
1375
 
1358
1376
  #
1359
- # Returns +true+ iff the connection is closed.
1377
+ # Returns +true+ if and only if the connection is closed.
1360
1378
  #
1361
1379
  def closed?
1362
1380
  @sock == nil or @sock.closed?
@@ -1371,7 +1389,12 @@ module Net
1371
1389
  raise FTPReplyError, resp
1372
1390
  end
1373
1391
  if m = /\((?<host>\d+(?:,\d+){3}),(?<port>\d+,\d+)\)/.match(resp)
1374
- return parse_pasv_ipv4_host(m["host"]), parse_pasv_port(m["port"])
1392
+ if @use_pasv_ip
1393
+ host = parse_pasv_ipv4_host(m["host"])
1394
+ else
1395
+ host = @bare_sock.remote_address.ip_address
1396
+ end
1397
+ return host, parse_pasv_port(m["port"])
1375
1398
  else
1376
1399
  raise FTPProtoError, resp
1377
1400
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-ftp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shugo Maeda
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-22 00:00:00.000000000 Z
11
+ date: 2021-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: net-protocol
@@ -48,7 +48,6 @@ files:
48
48
  - ".github/workflows/test.yml"
49
49
  - ".gitignore"
50
50
  - Gemfile
51
- - Gemfile.lock
52
51
  - LICENSE.txt
53
52
  - README.md
54
53
  - Rakefile
@@ -78,7 +77,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
77
  - !ruby/object:Gem::Version
79
78
  version: '0'
80
79
  requirements: []
81
- rubygems_version: 3.2.2
80
+ rubygems_version: 3.3.0.dev
82
81
  signing_key:
83
82
  specification_version: 4
84
83
  summary: Support for the File Transfer Protocol.
data/Gemfile.lock DELETED
@@ -1,23 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- net-ftp (0.1.0)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- power_assert (1.1.5)
10
- rake (13.0.1)
11
- test-unit (3.3.5)
12
- power_assert
13
-
14
- PLATFORMS
15
- ruby
16
-
17
- DEPENDENCIES
18
- net-ftp!
19
- rake
20
- test-unit
21
-
22
- BUNDLED WITH
23
- 2.1.4