ftpd 1.1.1 → 2.0.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.
Files changed (156) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/Changelog.md +15 -0
  4. data/Gemfile +2 -2
  5. data/Gemfile.lock +57 -48
  6. data/README.md +8 -1
  7. data/VERSION +1 -1
  8. data/examples/example.rb +12 -0
  9. data/features/example/step_definitions/example_server.rb +2 -0
  10. data/features/ftp_server/eprt.feature +1 -0
  11. data/features/ftp_server/epsv.feature +1 -0
  12. data/features/ftp_server/get_ipv6.feature +3 -0
  13. data/features/ftp_server/pasv.feature +10 -3
  14. data/features/ftp_server/step_definitions/logging.rb +2 -0
  15. data/features/ftp_server/step_definitions/test_server.rb +6 -0
  16. data/features/step_definitions/append.rb +2 -0
  17. data/features/step_definitions/client.rb +3 -0
  18. data/features/step_definitions/client_and_server_files.rb +2 -0
  19. data/features/step_definitions/client_files.rb +2 -0
  20. data/features/step_definitions/command.rb +2 -0
  21. data/features/step_definitions/connect.rb +2 -0
  22. data/features/step_definitions/delete.rb +2 -0
  23. data/features/step_definitions/directory_navigation.rb +2 -0
  24. data/features/step_definitions/error_replies.rb +2 -0
  25. data/features/step_definitions/features.rb +2 -0
  26. data/features/step_definitions/file_structure.rb +2 -0
  27. data/features/step_definitions/generic_send.rb +2 -0
  28. data/features/step_definitions/get.rb +2 -0
  29. data/features/step_definitions/help.rb +2 -0
  30. data/features/step_definitions/invalid_commands.rb +2 -0
  31. data/features/step_definitions/ipv6.rb +11 -0
  32. data/features/step_definitions/line_endings.rb +2 -0
  33. data/features/step_definitions/list.rb +2 -0
  34. data/features/step_definitions/login.rb +2 -0
  35. data/features/step_definitions/mkdir.rb +2 -0
  36. data/features/step_definitions/mode.rb +2 -0
  37. data/features/step_definitions/mtime.rb +2 -0
  38. data/features/step_definitions/noop.rb +2 -0
  39. data/features/step_definitions/options.rb +2 -0
  40. data/features/step_definitions/passive.rb +7 -0
  41. data/features/step_definitions/pending.rb +2 -0
  42. data/features/step_definitions/port.rb +2 -0
  43. data/features/step_definitions/put.rb +2 -0
  44. data/features/step_definitions/quit.rb +2 -0
  45. data/features/step_definitions/rename.rb +2 -0
  46. data/features/step_definitions/rmdir.rb +2 -0
  47. data/features/step_definitions/server_files.rb +2 -0
  48. data/features/step_definitions/server_title.rb +2 -0
  49. data/features/step_definitions/size.rb +2 -0
  50. data/features/step_definitions/status.rb +2 -0
  51. data/features/step_definitions/success_replies.rb +2 -0
  52. data/features/step_definitions/system.rb +5 -0
  53. data/features/step_definitions/timing.rb +2 -0
  54. data/features/step_definitions/type.rb +2 -0
  55. data/features/support/env.rb +2 -0
  56. data/features/support/example_server.rb +3 -1
  57. data/features/support/test_client.rb +27 -19
  58. data/features/support/test_file_templates.rb +2 -0
  59. data/features/support/test_server.rb +31 -20
  60. data/features/support/test_server_files.rb +2 -0
  61. data/ftpd.gemspec +17 -11
  62. data/lib/ftpd.rb +2 -0
  63. data/lib/ftpd/auth_levels.rb +2 -0
  64. data/lib/ftpd/cmd_abor.rb +2 -0
  65. data/lib/ftpd/cmd_allo.rb +2 -0
  66. data/lib/ftpd/cmd_appe.rb +2 -0
  67. data/lib/ftpd/cmd_auth.rb +2 -0
  68. data/lib/ftpd/cmd_cdup.rb +2 -0
  69. data/lib/ftpd/cmd_cwd.rb +2 -0
  70. data/lib/ftpd/cmd_dele.rb +2 -0
  71. data/lib/ftpd/cmd_eprt.rb +2 -0
  72. data/lib/ftpd/cmd_epsv.rb +4 -2
  73. data/lib/ftpd/cmd_feat.rb +2 -0
  74. data/lib/ftpd/cmd_help.rb +2 -0
  75. data/lib/ftpd/cmd_list.rb +2 -0
  76. data/lib/ftpd/cmd_login.rb +2 -0
  77. data/lib/ftpd/cmd_mdtm.rb +2 -0
  78. data/lib/ftpd/cmd_mkd.rb +2 -0
  79. data/lib/ftpd/cmd_mode.rb +2 -0
  80. data/lib/ftpd/cmd_nlst.rb +2 -0
  81. data/lib/ftpd/cmd_noop.rb +2 -0
  82. data/lib/ftpd/cmd_opts.rb +2 -0
  83. data/lib/ftpd/cmd_pasv.rb +5 -3
  84. data/lib/ftpd/cmd_pbsz.rb +2 -0
  85. data/lib/ftpd/cmd_port.rb +2 -0
  86. data/lib/ftpd/cmd_prot.rb +2 -0
  87. data/lib/ftpd/cmd_pwd.rb +2 -0
  88. data/lib/ftpd/cmd_quit.rb +2 -0
  89. data/lib/ftpd/cmd_rein.rb +2 -0
  90. data/lib/ftpd/cmd_rename.rb +2 -0
  91. data/lib/ftpd/cmd_rest.rb +2 -0
  92. data/lib/ftpd/cmd_retr.rb +2 -0
  93. data/lib/ftpd/cmd_rmd.rb +2 -0
  94. data/lib/ftpd/cmd_site.rb +2 -0
  95. data/lib/ftpd/cmd_size.rb +2 -0
  96. data/lib/ftpd/cmd_smnt.rb +2 -0
  97. data/lib/ftpd/cmd_stat.rb +2 -0
  98. data/lib/ftpd/cmd_stor.rb +2 -0
  99. data/lib/ftpd/cmd_stou.rb +2 -0
  100. data/lib/ftpd/cmd_stru.rb +2 -0
  101. data/lib/ftpd/cmd_syst.rb +2 -0
  102. data/lib/ftpd/cmd_type.rb +2 -0
  103. data/lib/ftpd/command_handler.rb +3 -0
  104. data/lib/ftpd/command_handler_factory.rb +2 -0
  105. data/lib/ftpd/command_handlers.rb +2 -0
  106. data/lib/ftpd/command_loop.rb +2 -0
  107. data/lib/ftpd/command_sequence_checker.rb +2 -0
  108. data/lib/ftpd/config.rb +2 -0
  109. data/lib/ftpd/connection_throttle.rb +2 -0
  110. data/lib/ftpd/connection_tracker.rb +2 -0
  111. data/lib/ftpd/data_connection_helper.rb +2 -0
  112. data/lib/ftpd/data_server_factory.rb +44 -0
  113. data/lib/ftpd/data_server_factory/random_ephemeral_port.rb +26 -0
  114. data/lib/ftpd/data_server_factory/specific_port_range.rb +37 -0
  115. data/lib/ftpd/disk_file_system.rb +2 -0
  116. data/lib/ftpd/error.rb +2 -0
  117. data/lib/ftpd/exception_translator.rb +2 -0
  118. data/lib/ftpd/exceptions.rb +2 -0
  119. data/lib/ftpd/file_info.rb +2 -0
  120. data/lib/ftpd/file_system_helper.rb +2 -0
  121. data/lib/ftpd/ftp_server.rb +27 -0
  122. data/lib/ftpd/gets_peer_address.rb +2 -0
  123. data/lib/ftpd/insecure_certificate.rb +2 -0
  124. data/lib/ftpd/list_format/eplf.rb +2 -0
  125. data/lib/ftpd/list_format/ls.rb +2 -0
  126. data/lib/ftpd/list_path.rb +2 -0
  127. data/lib/ftpd/null_logger.rb +2 -0
  128. data/lib/ftpd/protocols.rb +2 -0
  129. data/lib/ftpd/read_only_disk_file_system.rb +2 -0
  130. data/lib/ftpd/server.rb +2 -0
  131. data/lib/ftpd/session.rb +7 -0
  132. data/lib/ftpd/session_config.rb +26 -2
  133. data/lib/ftpd/stream.rb +2 -0
  134. data/lib/ftpd/telnet.rb +3 -2
  135. data/lib/ftpd/temp_dir.rb +2 -0
  136. data/lib/ftpd/tls_server.rb +2 -0
  137. data/lib/ftpd/translate_exceptions.rb +2 -0
  138. data/spec/command_sequence_checker_spec.rb +2 -0
  139. data/spec/connection_throttle_spec.rb +2 -0
  140. data/spec/connection_tracker_spec.rb +2 -0
  141. data/spec/data_server_factory_spec.rb +104 -0
  142. data/spec/disk_file_system_spec.rb +2 -0
  143. data/spec/exception_translator_spec.rb +2 -0
  144. data/spec/file_info_spec.rb +2 -0
  145. data/spec/ftp_server_error_spec.rb +2 -0
  146. data/spec/list_format/eplf_spec.rb +2 -0
  147. data/spec/list_format/ls_spec.rb +2 -0
  148. data/spec/list_path_spec.rb +2 -0
  149. data/spec/null_logger_spec.rb +2 -0
  150. data/spec/protocols_spec.rb +58 -38
  151. data/spec/server_spec.rb +2 -0
  152. data/spec/spec_helper.rb +2 -0
  153. data/spec/telnet_spec.rb +2 -0
  154. data/spec/translate_exceptions_spec.rb +2 -0
  155. data/testlib/network.rb +17 -0
  156. metadata +13 -7
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('spec_helper', File.dirname(__FILE__))
2
4
 
3
5
  module Ftpd
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('spec_helper', File.dirname(__FILE__))
2
4
 
3
5
  module Ftpd
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('spec_helper', File.dirname(__FILE__))
4
+
5
+ module Ftpd
6
+ describe DataServerFactory do
7
+
8
+ it "creates a socket bound to 127.0.0.1" do
9
+ factory = DataServerFactory.make("127.0.0.1", nil)
10
+ tcp_server = factory.make_tcp_server
11
+ expect(tcp_server.addr[3]).to eq "127.0.0.1"
12
+ end
13
+
14
+ it "creates a socket bound to 127.0.0.2" do
15
+ factory = DataServerFactory.make("127.0.0.2", nil)
16
+ tcp_server = factory.make_tcp_server
17
+ expect(tcp_server.addr[3]).to eq "127.0.0.2"
18
+ end
19
+
20
+ context "with no port range" do
21
+
22
+ it "creates a socket bound to an ephemeral port" do
23
+ interface = "0.0.0.0"
24
+ factory = DataServerFactory.make(interface, nil)
25
+ ports = (1..10).map do
26
+ tcp_server = factory.make_tcp_server
27
+ begin
28
+ tcp_server.addr[1]
29
+ ensure
30
+ tcp_server.close
31
+ end
32
+ end
33
+ expect(ports.uniq.size).to be > 1
34
+ ports.each do |port|
35
+ expect(port).to be_between(1024, 65535)
36
+ end
37
+ end
38
+
39
+ end
40
+
41
+ context "with a port range" do
42
+
43
+ let(:interface) { "127.0.0.1" }
44
+
45
+ def get_unused_port
46
+ server = TCPServer.new(interface, 0)
47
+ port = server.addr[1]
48
+ server.close
49
+ port
50
+ end
51
+
52
+ def use_port(port)
53
+ server = TCPServer.new(interface, port)
54
+ begin
55
+ yield
56
+ ensure
57
+ server.close
58
+ end
59
+ end
60
+
61
+ it "creates a socket bound to an ephemeral port" do
62
+ ports = (1..10).map { get_unused_port }
63
+ factory = DataServerFactory.make(interface, ports)
64
+ 10.times do
65
+ tcp_server = factory.make_tcp_server
66
+ begin
67
+ port = tcp_server.addr[1]
68
+ expect(ports).to include(port)
69
+ ensure
70
+ tcp_server.close
71
+ end
72
+ end
73
+ end
74
+
75
+ it "skips a port that is already in use" do
76
+ ports = (1..2).map { get_unused_port }
77
+ use_port(ports[0]) do
78
+ factory = DataServerFactory.make(interface, ports)
79
+ 10.times do
80
+ tcp_server = factory.make_tcp_server
81
+ begin
82
+ port = tcp_server.addr[1]
83
+ expect(port).to eq ports[1]
84
+ ensure
85
+ tcp_server.close
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ it "uses a random ephemeral port when all configured ports are in use" do
92
+ ports = [ get_unused_port ]
93
+ use_port(ports[0]) do
94
+ factory = DataServerFactory.make(interface, ports)
95
+ tcp_server = factory.make_tcp_server
96
+ port = tcp_server.addr[1]
97
+ expect(port).to_not eq ports[0]
98
+ end
99
+ end
100
+
101
+ end
102
+
103
+ end
104
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('spec_helper', File.dirname(__FILE__))
2
4
 
3
5
  module Ftpd
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('spec_helper', File.dirname(__FILE__))
2
4
 
3
5
  module Ftpd
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('spec_helper', File.dirname(__FILE__))
2
4
 
3
5
  module Ftpd
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('spec_helper', File.dirname(__FILE__))
2
4
 
3
5
  module Ftpd
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('../spec_helper', File.dirname(__FILE__))
2
4
 
3
5
  module Ftpd
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('../spec_helper', File.dirname(__FILE__))
2
4
 
3
5
  module Ftpd
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('spec_helper', File.dirname(__FILE__))
2
4
 
3
5
  module Ftpd
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('spec_helper', File.dirname(__FILE__))
2
4
 
3
5
  module Ftpd
@@ -1,10 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('spec_helper', File.dirname(__FILE__))
2
4
 
5
+ require_relative "../testlib/network"
6
+
3
7
  module Ftpd
4
8
  describe Protocols do
5
9
 
6
- # A fake server that returns a connected server-side socket.
10
+ extend TestLib::Network
11
+
12
+ def self.if_stack_supports_ipv6
13
+ if ipv6_supported?
14
+ return yield
15
+ else
16
+ if !@ipv6_warning_issued
17
+ warn "Stack does not support IPV6; skipping some tests"
18
+ @ipv6_warning_issued = true
19
+ end
20
+ end
21
+ end
7
22
 
23
+ # A fake server that returns a connected server-side socket.
8
24
  class TestServer
9
25
 
10
26
  # The socket upon which the server is listening
@@ -58,29 +74,31 @@ module Ftpd
58
74
 
59
75
  end
60
76
 
61
- context 'IPV6 server, IPV6 connection' do
77
+ if_stack_supports_ipv6 do
78
+ context 'IPV6 server, IPV6 connection' do
62
79
 
63
- let(:bind_address) {'::1'}
64
- let(:connect_address) {'::1'}
65
- let(:connected_socket) do
66
- TestServer.new(bind_address, connect_address).connected_socket
67
- end
68
- subject(:protocols) {Protocols.new(connected_socket)}
80
+ let(:bind_address) {'::1'}
81
+ let(:connect_address) {'::1'}
82
+ let(:connected_socket) do
83
+ TestServer.new(bind_address, connect_address).connected_socket
84
+ end
85
+ subject(:protocols) {Protocols.new(connected_socket)}
69
86
 
70
- it 'should not support IPV4' do
71
- expect(protocols.supports_protocol?(Protocols::IPV4)).to be_falsey
72
- end
87
+ it 'should not support IPV4' do
88
+ expect(protocols.supports_protocol?(Protocols::IPV4)).to be_falsey
89
+ end
73
90
 
74
- it 'should support IPV6' do
75
- expect(protocols.supports_protocol?(Protocols::IPV6)).to be_truthy
76
- end
91
+ it 'should support IPV6' do
92
+ expect(protocols.supports_protocol?(Protocols::IPV6)).to be_truthy
93
+ end
77
94
 
78
- it 'should list the supported protocols' do
79
- expect(protocols.protocol_codes).to eq [
80
- Protocols::IPV6,
81
- ]
82
- end
95
+ it 'should list the supported protocols' do
96
+ expect(protocols.protocol_codes).to eq [
97
+ Protocols::IPV6,
98
+ ]
99
+ end
83
100
 
101
+ end
84
102
  end
85
103
 
86
104
  context 'wildcard server, IPV4 connection' do
@@ -109,30 +127,32 @@ module Ftpd
109
127
 
110
128
  end
111
129
 
112
- context 'wildcard server, IPV6 connection' do
130
+ if_stack_supports_ipv6 do
131
+ context 'wildcard server, IPV6 connection' do
113
132
 
114
- let(:bind_address) {'::'}
115
- let(:connect_address) {'::1'}
116
- let(:connected_socket) do
117
- TestServer.new(bind_address, connect_address).connected_socket
118
- end
119
- subject(:protocols) {Protocols.new(connected_socket)}
133
+ let(:bind_address) {'::'}
134
+ let(:connect_address) {'::1'}
135
+ let(:connected_socket) do
136
+ TestServer.new(bind_address, connect_address).connected_socket
137
+ end
138
+ subject(:protocols) {Protocols.new(connected_socket)}
120
139
 
121
- it 'should support IPV4' do
122
- expect(protocols.supports_protocol?(Protocols::IPV4)).to be_truthy
123
- end
140
+ it 'should support IPV4' do
141
+ expect(protocols.supports_protocol?(Protocols::IPV4)).to be_truthy
142
+ end
124
143
 
125
- it 'should support IPV6' do
126
- expect(protocols.supports_protocol?(Protocols::IPV6)).to be_truthy
127
- end
144
+ it 'should support IPV6' do
145
+ expect(protocols.supports_protocol?(Protocols::IPV6)).to be_truthy
146
+ end
128
147
 
129
- it 'should list the supported protocols' do
130
- expect(protocols.protocol_codes).to eq [
131
- Protocols::IPV4,
132
- Protocols::IPV6,
133
- ]
134
- end
148
+ it 'should list the supported protocols' do
149
+ expect(protocols.protocol_codes).to eq [
150
+ Protocols::IPV4,
151
+ Protocols::IPV6,
152
+ ]
153
+ end
135
154
 
155
+ end
136
156
  end
137
157
 
138
158
  end
data/spec/server_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('spec_helper', File.dirname(__FILE__))
2
4
 
3
5
  module Ftpd
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  unless $:.include?(File.dirname(__FILE__) + '/../lib')
2
4
  $:.unshift(File.dirname(__FILE__) + '/../lib')
3
5
  end
data/spec/telnet_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # -*- ruby encoding: us-ascii -*-
2
4
 
3
5
  require File.expand_path('spec_helper', File.dirname(__FILE__))
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('spec_helper', File.dirname(__FILE__))
2
4
 
3
5
  module Ftpd
@@ -0,0 +1,17 @@
1
+ module TestLib
2
+ module Network
3
+
4
+ extend self
5
+
6
+ def ipv6_supported?
7
+ begin
8
+ server = TCPServer.new("::1", 0)
9
+ server.close
10
+ true
11
+ rescue Errno::EADDRNOTAVAIL
12
+ false
13
+ end
14
+ end
15
+
16
+ end
17
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ftpd
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wayne Conrad
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-22 00:00:00.000000000 Z
11
+ date: 2016-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: memoizer
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.3'
33
+ version: '2.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.3'
40
+ version: '2.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: double-bag-ftps
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '10.3'
75
+ version: '11.1'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '10.3'
82
+ version: '11.1'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: redcarpet
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -247,6 +247,7 @@ files:
247
247
  - features/step_definitions/get.rb
248
248
  - features/step_definitions/help.rb
249
249
  - features/step_definitions/invalid_commands.rb
250
+ - features/step_definitions/ipv6.rb
250
251
  - features/step_definitions/line_endings.rb
251
252
  - features/step_definitions/list.rb
252
253
  - features/step_definitions/login.rb
@@ -331,6 +332,9 @@ files:
331
332
  - lib/ftpd/connection_throttle.rb
332
333
  - lib/ftpd/connection_tracker.rb
333
334
  - lib/ftpd/data_connection_helper.rb
335
+ - lib/ftpd/data_server_factory.rb
336
+ - lib/ftpd/data_server_factory/random_ephemeral_port.rb
337
+ - lib/ftpd/data_server_factory/specific_port_range.rb
334
338
  - lib/ftpd/disk_file_system.rb
335
339
  - lib/ftpd/error.rb
336
340
  - lib/ftpd/exception_translator.rb
@@ -363,6 +367,7 @@ files:
363
367
  - spec/command_sequence_checker_spec.rb
364
368
  - spec/connection_throttle_spec.rb
365
369
  - spec/connection_tracker_spec.rb
370
+ - spec/data_server_factory_spec.rb
366
371
  - spec/disk_file_system_spec.rb
367
372
  - spec/exception_translator_spec.rb
368
373
  - spec/file_info_spec.rb
@@ -376,6 +381,7 @@ files:
376
381
  - spec/spec_helper.rb
377
382
  - spec/telnet_spec.rb
378
383
  - spec/translate_exceptions_spec.rb
384
+ - testlib/network.rb
379
385
  homepage: http://github.com/wconrad/ftpd
380
386
  licenses:
381
387
  - MIT
@@ -396,7 +402,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
396
402
  version: '0'
397
403
  requirements: []
398
404
  rubyforge_project:
399
- rubygems_version: 2.4.4
405
+ rubygems_version: 2.4.8
400
406
  signing_key:
401
407
  specification_version: 4
402
408
  summary: Pure Ruby FTP server library