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.
Files changed (141) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +6 -0
  3. data/Gemfile +2 -15
  4. data/Gemfile.lock +12 -51
  5. data/README.md +12 -0
  6. data/VERSION +1 -1
  7. data/bin/ftpdrb +17 -12
  8. data/examples/write_only.rb +61 -0
  9. data/ftpd.gemspec +59 -261
  10. data/lib/ftpd/session.rb +51 -51
  11. metadata +11 -153
  12. data/.travis.yml +0 -6
  13. data/features/example/eplf.feature +0 -14
  14. data/features/example/example.feature +0 -18
  15. data/features/example/read_only.feature +0 -63
  16. data/features/example/step_definitions/example_server.rb +0 -13
  17. data/features/ftp_server/abort.feature +0 -13
  18. data/features/ftp_server/allo.feature +0 -33
  19. data/features/ftp_server/append.feature +0 -94
  20. data/features/ftp_server/cdup.feature +0 -36
  21. data/features/ftp_server/command_errors.feature +0 -13
  22. data/features/ftp_server/concurrent_sessions.feature +0 -14
  23. data/features/ftp_server/delay_after_failed_login.feature +0 -23
  24. data/features/ftp_server/delete.feature +0 -60
  25. data/features/ftp_server/directory_navigation.feature +0 -59
  26. data/features/ftp_server/disconnect_after_failed_logins.feature +0 -25
  27. data/features/ftp_server/eprt.feature +0 -56
  28. data/features/ftp_server/epsv.feature +0 -37
  29. data/features/ftp_server/features.feature +0 -38
  30. data/features/ftp_server/file_structure.feature +0 -43
  31. data/features/ftp_server/get.feature +0 -80
  32. data/features/ftp_server/get_ipv6.feature +0 -46
  33. data/features/ftp_server/get_tls.feature +0 -23
  34. data/features/ftp_server/help.feature +0 -21
  35. data/features/ftp_server/implicit_tls.feature +0 -23
  36. data/features/ftp_server/invertability.feature +0 -15
  37. data/features/ftp_server/list.feature +0 -94
  38. data/features/ftp_server/list_tls.feature +0 -29
  39. data/features/ftp_server/logging.feature +0 -11
  40. data/features/ftp_server/login_auth_level_account.feature +0 -51
  41. data/features/ftp_server/login_auth_level_password.feature +0 -59
  42. data/features/ftp_server/login_auth_level_user.feature +0 -31
  43. data/features/ftp_server/max_connections.feature +0 -39
  44. data/features/ftp_server/mdtm.feature +0 -53
  45. data/features/ftp_server/mkdir.feature +0 -70
  46. data/features/ftp_server/mode.feature +0 -43
  47. data/features/ftp_server/name_list.feature +0 -77
  48. data/features/ftp_server/name_list_tls.feature +0 -30
  49. data/features/ftp_server/noop.feature +0 -17
  50. data/features/ftp_server/options.feature +0 -17
  51. data/features/ftp_server/pasv.feature +0 -30
  52. data/features/ftp_server/port.feature +0 -49
  53. data/features/ftp_server/put.feature +0 -79
  54. data/features/ftp_server/put_tls.feature +0 -23
  55. data/features/ftp_server/put_unique.feature +0 -56
  56. data/features/ftp_server/quit.feature +0 -23
  57. data/features/ftp_server/reinitialize.feature +0 -13
  58. data/features/ftp_server/rename.feature +0 -97
  59. data/features/ftp_server/rmdir.feature +0 -71
  60. data/features/ftp_server/site.feature +0 -13
  61. data/features/ftp_server/size.feature +0 -69
  62. data/features/ftp_server/status.feature +0 -18
  63. data/features/ftp_server/step_definitions/logging.rb +0 -10
  64. data/features/ftp_server/step_definitions/test_server.rb +0 -71
  65. data/features/ftp_server/structure_mount.feature +0 -13
  66. data/features/ftp_server/syntax_errors.feature +0 -18
  67. data/features/ftp_server/syst.feature +0 -18
  68. data/features/ftp_server/timeout.feature +0 -26
  69. data/features/ftp_server/type.feature +0 -59
  70. data/features/step_definitions/append.rb +0 -17
  71. data/features/step_definitions/client.rb +0 -27
  72. data/features/step_definitions/client_and_server_files.rb +0 -26
  73. data/features/step_definitions/client_files.rb +0 -16
  74. data/features/step_definitions/command.rb +0 -7
  75. data/features/step_definitions/connect.rb +0 -39
  76. data/features/step_definitions/delete.rb +0 -17
  77. data/features/step_definitions/directory_navigation.rb +0 -28
  78. data/features/step_definitions/error_replies.rb +0 -117
  79. data/features/step_definitions/features.rb +0 -23
  80. data/features/step_definitions/file_structure.rb +0 -18
  81. data/features/step_definitions/generic_send.rb +0 -11
  82. data/features/step_definitions/get.rb +0 -18
  83. data/features/step_definitions/help.rb +0 -20
  84. data/features/step_definitions/invalid_commands.rb +0 -13
  85. data/features/step_definitions/ipv6.rb +0 -11
  86. data/features/step_definitions/line_endings.rb +0 -9
  87. data/features/step_definitions/list.rb +0 -75
  88. data/features/step_definitions/login.rb +0 -84
  89. data/features/step_definitions/mkdir.rb +0 -11
  90. data/features/step_definitions/mode.rb +0 -17
  91. data/features/step_definitions/mtime.rb +0 -25
  92. data/features/step_definitions/noop.rb +0 -17
  93. data/features/step_definitions/options.rb +0 -11
  94. data/features/step_definitions/passive.rb +0 -10
  95. data/features/step_definitions/pending.rb +0 -5
  96. data/features/step_definitions/port.rb +0 -7
  97. data/features/step_definitions/put.rb +0 -31
  98. data/features/step_definitions/quit.rb +0 -17
  99. data/features/step_definitions/rename.rb +0 -13
  100. data/features/step_definitions/rmdir.rb +0 -11
  101. data/features/step_definitions/server_files.rb +0 -63
  102. data/features/step_definitions/server_title.rb +0 -14
  103. data/features/step_definitions/size.rb +0 -22
  104. data/features/step_definitions/status.rb +0 -11
  105. data/features/step_definitions/success_replies.rb +0 -9
  106. data/features/step_definitions/system.rb +0 -12
  107. data/features/step_definitions/timing.rb +0 -21
  108. data/features/step_definitions/type.rb +0 -17
  109. data/features/support/env.rb +0 -6
  110. data/features/support/example_server.rb +0 -69
  111. data/features/support/file_templates/ascii_unix +0 -4
  112. data/features/support/file_templates/ascii_windows +0 -4
  113. data/features/support/file_templates/binary +0 -0
  114. data/features/support/test_client.rb +0 -258
  115. data/features/support/test_file_templates.rb +0 -35
  116. data/features/support/test_server.rb +0 -304
  117. data/features/support/test_server_files.rb +0 -59
  118. data/rake_tasks/cucumber.rake +0 -9
  119. data/rake_tasks/default.rake +0 -1
  120. data/rake_tasks/jeweler.rake +0 -52
  121. data/rake_tasks/spec.rake +0 -3
  122. data/rake_tasks/test.rake +0 -2
  123. data/rake_tasks/yard.rake +0 -3
  124. data/spec/command_sequence_checker_spec.rb +0 -85
  125. data/spec/connection_throttle_spec.rb +0 -101
  126. data/spec/connection_tracker_spec.rb +0 -99
  127. data/spec/data_server_factory_spec.rb +0 -104
  128. data/spec/disk_file_system_spec.rb +0 -322
  129. data/spec/exception_translator_spec.rb +0 -38
  130. data/spec/file_info_spec.rb +0 -61
  131. data/spec/ftp_server_error_spec.rb +0 -15
  132. data/spec/list_format/eplf_spec.rb +0 -63
  133. data/spec/list_format/ls_spec.rb +0 -272
  134. data/spec/list_path_spec.rb +0 -23
  135. data/spec/null_logger_spec.rb +0 -26
  136. data/spec/protocols_spec.rb +0 -159
  137. data/spec/server_spec.rb +0 -83
  138. data/spec/spec_helper.rb +0 -17
  139. data/spec/telnet_spec.rb +0 -77
  140. data/spec/translate_exceptions_spec.rb +0 -42
  141. data/testlib/network.rb +0 -17
@@ -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
@@ -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
@@ -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
@@ -1,17 +0,0 @@
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