ftpd 2.0.1 → 2.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.
- checksums.yaml +4 -4
- data/Changelog.md +6 -0
- data/Gemfile +2 -15
- data/Gemfile.lock +12 -51
- data/README.md +12 -0
- data/VERSION +1 -1
- data/bin/ftpdrb +17 -12
- data/examples/write_only.rb +61 -0
- data/ftpd.gemspec +59 -261
- data/lib/ftpd/session.rb +51 -51
- metadata +11 -153
- data/.travis.yml +0 -6
- data/features/example/eplf.feature +0 -14
- data/features/example/example.feature +0 -18
- data/features/example/read_only.feature +0 -63
- data/features/example/step_definitions/example_server.rb +0 -13
- data/features/ftp_server/abort.feature +0 -13
- data/features/ftp_server/allo.feature +0 -33
- data/features/ftp_server/append.feature +0 -94
- data/features/ftp_server/cdup.feature +0 -36
- data/features/ftp_server/command_errors.feature +0 -13
- data/features/ftp_server/concurrent_sessions.feature +0 -14
- data/features/ftp_server/delay_after_failed_login.feature +0 -23
- data/features/ftp_server/delete.feature +0 -60
- data/features/ftp_server/directory_navigation.feature +0 -59
- data/features/ftp_server/disconnect_after_failed_logins.feature +0 -25
- data/features/ftp_server/eprt.feature +0 -56
- data/features/ftp_server/epsv.feature +0 -37
- data/features/ftp_server/features.feature +0 -38
- data/features/ftp_server/file_structure.feature +0 -43
- data/features/ftp_server/get.feature +0 -80
- data/features/ftp_server/get_ipv6.feature +0 -46
- data/features/ftp_server/get_tls.feature +0 -23
- data/features/ftp_server/help.feature +0 -21
- data/features/ftp_server/implicit_tls.feature +0 -23
- data/features/ftp_server/invertability.feature +0 -15
- data/features/ftp_server/list.feature +0 -94
- data/features/ftp_server/list_tls.feature +0 -29
- data/features/ftp_server/logging.feature +0 -11
- data/features/ftp_server/login_auth_level_account.feature +0 -51
- data/features/ftp_server/login_auth_level_password.feature +0 -59
- data/features/ftp_server/login_auth_level_user.feature +0 -31
- data/features/ftp_server/max_connections.feature +0 -39
- data/features/ftp_server/mdtm.feature +0 -53
- data/features/ftp_server/mkdir.feature +0 -70
- data/features/ftp_server/mode.feature +0 -43
- data/features/ftp_server/name_list.feature +0 -77
- data/features/ftp_server/name_list_tls.feature +0 -30
- data/features/ftp_server/noop.feature +0 -17
- data/features/ftp_server/options.feature +0 -17
- data/features/ftp_server/pasv.feature +0 -30
- data/features/ftp_server/port.feature +0 -49
- data/features/ftp_server/put.feature +0 -79
- data/features/ftp_server/put_tls.feature +0 -23
- data/features/ftp_server/put_unique.feature +0 -56
- data/features/ftp_server/quit.feature +0 -23
- data/features/ftp_server/reinitialize.feature +0 -13
- data/features/ftp_server/rename.feature +0 -97
- data/features/ftp_server/rmdir.feature +0 -71
- data/features/ftp_server/site.feature +0 -13
- data/features/ftp_server/size.feature +0 -69
- data/features/ftp_server/status.feature +0 -18
- data/features/ftp_server/step_definitions/logging.rb +0 -10
- data/features/ftp_server/step_definitions/test_server.rb +0 -71
- data/features/ftp_server/structure_mount.feature +0 -13
- data/features/ftp_server/syntax_errors.feature +0 -18
- data/features/ftp_server/syst.feature +0 -18
- data/features/ftp_server/timeout.feature +0 -26
- data/features/ftp_server/type.feature +0 -59
- data/features/step_definitions/append.rb +0 -17
- data/features/step_definitions/client.rb +0 -27
- data/features/step_definitions/client_and_server_files.rb +0 -26
- data/features/step_definitions/client_files.rb +0 -16
- data/features/step_definitions/command.rb +0 -7
- data/features/step_definitions/connect.rb +0 -39
- data/features/step_definitions/delete.rb +0 -17
- data/features/step_definitions/directory_navigation.rb +0 -28
- data/features/step_definitions/error_replies.rb +0 -117
- data/features/step_definitions/features.rb +0 -23
- data/features/step_definitions/file_structure.rb +0 -18
- data/features/step_definitions/generic_send.rb +0 -11
- data/features/step_definitions/get.rb +0 -18
- data/features/step_definitions/help.rb +0 -20
- data/features/step_definitions/invalid_commands.rb +0 -13
- data/features/step_definitions/ipv6.rb +0 -11
- data/features/step_definitions/line_endings.rb +0 -9
- data/features/step_definitions/list.rb +0 -75
- data/features/step_definitions/login.rb +0 -84
- data/features/step_definitions/mkdir.rb +0 -11
- data/features/step_definitions/mode.rb +0 -17
- data/features/step_definitions/mtime.rb +0 -25
- data/features/step_definitions/noop.rb +0 -17
- data/features/step_definitions/options.rb +0 -11
- data/features/step_definitions/passive.rb +0 -10
- data/features/step_definitions/pending.rb +0 -5
- data/features/step_definitions/port.rb +0 -7
- data/features/step_definitions/put.rb +0 -31
- data/features/step_definitions/quit.rb +0 -17
- data/features/step_definitions/rename.rb +0 -13
- data/features/step_definitions/rmdir.rb +0 -11
- data/features/step_definitions/server_files.rb +0 -63
- data/features/step_definitions/server_title.rb +0 -14
- data/features/step_definitions/size.rb +0 -22
- data/features/step_definitions/status.rb +0 -11
- data/features/step_definitions/success_replies.rb +0 -9
- data/features/step_definitions/system.rb +0 -12
- data/features/step_definitions/timing.rb +0 -21
- data/features/step_definitions/type.rb +0 -17
- data/features/support/env.rb +0 -6
- data/features/support/example_server.rb +0 -69
- data/features/support/file_templates/ascii_unix +0 -4
- data/features/support/file_templates/ascii_windows +0 -4
- data/features/support/file_templates/binary +0 -0
- data/features/support/test_client.rb +0 -258
- data/features/support/test_file_templates.rb +0 -35
- data/features/support/test_server.rb +0 -304
- data/features/support/test_server_files.rb +0 -59
- data/rake_tasks/cucumber.rake +0 -9
- data/rake_tasks/default.rake +0 -1
- data/rake_tasks/jeweler.rake +0 -52
- data/rake_tasks/spec.rake +0 -3
- data/rake_tasks/test.rake +0 -2
- data/rake_tasks/yard.rake +0 -3
- data/spec/command_sequence_checker_spec.rb +0 -85
- data/spec/connection_throttle_spec.rb +0 -101
- data/spec/connection_tracker_spec.rb +0 -99
- data/spec/data_server_factory_spec.rb +0 -104
- data/spec/disk_file_system_spec.rb +0 -322
- data/spec/exception_translator_spec.rb +0 -38
- data/spec/file_info_spec.rb +0 -61
- data/spec/ftp_server_error_spec.rb +0 -15
- data/spec/list_format/eplf_spec.rb +0 -63
- data/spec/list_format/ls_spec.rb +0 -272
- data/spec/list_path_spec.rb +0 -23
- data/spec/null_logger_spec.rb +0 -26
- data/spec/protocols_spec.rb +0 -159
- data/spec/server_spec.rb +0 -83
- data/spec/spec_helper.rb +0 -17
- data/spec/telnet_spec.rb +0 -77
- data/spec/translate_exceptions_spec.rb +0 -42
- data/testlib/network.rb +0 -17
data/spec/server_spec.rb
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
|
4
|
-
|
|
5
|
-
module Ftpd
|
|
6
|
-
|
|
7
|
-
describe Server do
|
|
8
|
-
|
|
9
|
-
describe '#join' do
|
|
10
|
-
it 'calls server_thread#join' do
|
|
11
|
-
expect_any_instance_of(Thread).to receive(:join)
|
|
12
|
-
server = Server.new
|
|
13
|
-
server.start
|
|
14
|
-
server.join
|
|
15
|
-
end
|
|
16
|
-
context 'when server is not started' do
|
|
17
|
-
it 'raises an error' do
|
|
18
|
-
server = Server.new
|
|
19
|
-
expect { server.join }.to raise_error('Server is not started!')
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
describe 'reuse explicit port (github #23)' do
|
|
25
|
-
|
|
26
|
-
# The bug being tested involves a race condition. Monkey patch
|
|
27
|
-
# the server so that start does not return until "accept" has
|
|
28
|
-
# been called on the server socket. This causes the test to
|
|
29
|
-
# reliably expose the bug.
|
|
30
|
-
|
|
31
|
-
def monkey_patch_server(server)
|
|
32
|
-
|
|
33
|
-
class << server
|
|
34
|
-
|
|
35
|
-
def start
|
|
36
|
-
@accepting = Queue.new
|
|
37
|
-
super
|
|
38
|
-
wait_for_accept
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def accept
|
|
42
|
-
@accepting.enq true
|
|
43
|
-
super
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
private
|
|
47
|
-
|
|
48
|
-
def wait_for_accept
|
|
49
|
-
@accepting.deq
|
|
50
|
-
# There's a potential race condition in _this_ code:
|
|
51
|
-
# @accepting is triggered just before the accept is done
|
|
52
|
-
# on the socket, but it's possible that the server thread
|
|
53
|
-
# has been preempted and accept has not yet been called.
|
|
54
|
-
# A little sleep gives the server thread another shot at
|
|
55
|
-
# actually getting the accept done before we continue.
|
|
56
|
-
sleep 0.01
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
it do
|
|
64
|
-
port = find_open_port
|
|
65
|
-
2.times do
|
|
66
|
-
server = Server.new
|
|
67
|
-
monkey_patch_server server
|
|
68
|
-
server.port = port
|
|
69
|
-
server.start
|
|
70
|
-
server.stop
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def find_open_port
|
|
75
|
-
socket = TCPServer.new('localhost', 0)
|
|
76
|
-
socket.addr[1].tap {socket.close}
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
end
|
data/spec/spec_helper.rb
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
unless $:.include?(File.dirname(__FILE__) + '/../lib')
|
|
4
|
-
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
require 'ftpd'
|
|
8
|
-
require 'rspec/its'
|
|
9
|
-
require 'stringio'
|
|
10
|
-
require 'thread'
|
|
11
|
-
require 'timecop'
|
|
12
|
-
require 'tmpdir'
|
|
13
|
-
|
|
14
|
-
glob = File.expand_path('helpers/*.rb', File.dirname(__FILE__))
|
|
15
|
-
Dir[glob].sort.each do |helper_path|
|
|
16
|
-
require helper_path
|
|
17
|
-
end
|
data/spec/telnet_spec.rb
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# -*- ruby encoding: us-ascii -*-
|
|
4
|
-
|
|
5
|
-
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
|
6
|
-
|
|
7
|
-
module Ftpd
|
|
8
|
-
describe Telnet do
|
|
9
|
-
|
|
10
|
-
IAC = 255.chr # 0xff
|
|
11
|
-
DONT = 254.chr # 0xfe
|
|
12
|
-
DO = 253.chr # 0xfd
|
|
13
|
-
WONT = 252.chr # 0xfc
|
|
14
|
-
WILL = 251.chr # 0xfb
|
|
15
|
-
IP = 244.chr # 0xf4
|
|
16
|
-
DM = 242.chr # 0xf2
|
|
17
|
-
|
|
18
|
-
subject {Telnet.new(command)}
|
|
19
|
-
let(:plain_command) {"NOOP\r\n"}
|
|
20
|
-
let(:command) {codes + plain_command}
|
|
21
|
-
|
|
22
|
-
context '(plain command)' do
|
|
23
|
-
let(:codes) {''}
|
|
24
|
-
its(:reply) {should == ''}
|
|
25
|
-
its(:plain) {should == plain_command}
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
context '(escaped IAC)' do
|
|
29
|
-
let(:codes) {"#{IAC}#{IAC}"}
|
|
30
|
-
its(:reply) {should == ''}
|
|
31
|
-
its(:plain) {should == "#{IAC}" + plain_command}
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
context '(IAC + unknown code)' do
|
|
35
|
-
let(:codes) {"#{IAC}\x01"}
|
|
36
|
-
its(:reply) {should == ''}
|
|
37
|
-
its(:plain) {should == codes + plain_command}
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
context '(WILL)' do
|
|
41
|
-
let(:codes) {"#{IAC}#{WILL}\x01"}
|
|
42
|
-
its(:reply) {should == "#{IAC}#{DONT}\x01"}
|
|
43
|
-
its(:plain) {should == plain_command}
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
context '(WONT)' do
|
|
47
|
-
let(:codes) {"#{IAC}#{WONT}\x01"}
|
|
48
|
-
its(:reply) {should == ''}
|
|
49
|
-
its(:plain) {should == plain_command}
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
context '(DO)' do
|
|
53
|
-
let(:codes) {"#{IAC}#{DO}\x01"}
|
|
54
|
-
its(:reply) {should == "#{IAC}#{WONT}\x01"}
|
|
55
|
-
its(:plain) {should == plain_command}
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
context '(DONT)' do
|
|
59
|
-
let(:codes) {"#{IAC}#{DONT}\x01"}
|
|
60
|
-
its(:reply) {should == ''}
|
|
61
|
-
its(:plain) {should == plain_command}
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
context '(interrupt process)' do
|
|
65
|
-
let(:codes) {"#{IAC}#{IP}"}
|
|
66
|
-
its(:reply) {should == ''}
|
|
67
|
-
its(:plain) {should == plain_command}
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
context '(data mark)' do
|
|
71
|
-
let(:codes) {"#{IAC}#{DM}"}
|
|
72
|
-
its(:reply) {should == ''}
|
|
73
|
-
its(:plain) {should == plain_command}
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
end
|
|
77
|
-
end
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
|
4
|
-
|
|
5
|
-
module Ftpd
|
|
6
|
-
describe TranslateExceptions do
|
|
7
|
-
|
|
8
|
-
class FooError < StandardError ; end
|
|
9
|
-
class BarError < StandardError ; end
|
|
10
|
-
|
|
11
|
-
class Subject
|
|
12
|
-
|
|
13
|
-
include TranslateExceptions
|
|
14
|
-
|
|
15
|
-
def initialize
|
|
16
|
-
translate_exception FooError
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def raise_error(error, message)
|
|
20
|
-
raise error, message
|
|
21
|
-
end
|
|
22
|
-
translate_exceptions :raise_error
|
|
23
|
-
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
let(:subject) {Subject.new}
|
|
27
|
-
let(:message) {'An error happened'}
|
|
28
|
-
|
|
29
|
-
it 'should translate a registered error' do
|
|
30
|
-
expect {
|
|
31
|
-
subject.raise_error(FooError, message)
|
|
32
|
-
}.to raise_error PermanentFileSystemError, message
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
it 'should pass through an unregistered error' do
|
|
36
|
-
expect {
|
|
37
|
-
subject.raise_error(BarError, message)
|
|
38
|
-
}.to raise_error BarError, message
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
end
|
|
42
|
-
end
|