ftpd 0.4.0 → 0.5.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.
- data/Changelog.md +33 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +5 -0
- data/README.md +29 -30
- data/VERSION +1 -1
- data/config/cucumber.yml +2 -0
- data/doc/benchmarks.md +92 -0
- data/doc/references.md +39 -12
- data/doc/rfc-compliance.md +6 -6
- data/examples/example.rb +21 -0
- data/features/ftp_server/command_errors.feature +0 -1
- data/features/ftp_server/logging.feature +11 -0
- data/features/ftp_server/port.feature +15 -0
- data/features/ftp_server/status.feature +19 -0
- data/features/ftp_server/step_definitions/logging.rb +8 -0
- data/features/ftp_server/step_definitions/test_server.rb +19 -2
- data/features/ftp_server/timeout.feature +26 -0
- data/features/step_definitions/error_replies.rb +5 -0
- data/features/step_definitions/status.rb +17 -0
- data/features/step_definitions/timeout.rb +11 -0
- data/features/support/test_client.rb +13 -1
- data/features/support/test_server.rb +23 -9
- data/ftpd.gemspec +18 -5
- data/lib/ftpd.rb +3 -0
- data/lib/ftpd/ftp_server.rb +52 -18
- data/lib/ftpd/null_logger.rb +22 -0
- data/lib/ftpd/server.rb +11 -2
- data/lib/ftpd/session.rb +71 -25
- data/lib/ftpd/telnet.rb +119 -0
- data/rake_tasks/cucumber.rake +0 -1
- data/spec/null_logger_spec.rb +24 -0
- data/spec/telnet_spec.rb +75 -0
- metadata +32 -6
- data/features/ftp_server/debug.feature +0 -17
- data/features/ftp_server/step_definitions/debug.rb +0 -8
@@ -0,0 +1,11 @@
|
|
1
|
+
Feature: Logging
|
2
|
+
|
3
|
+
As a programmer
|
4
|
+
I want to see logging output
|
5
|
+
So that I can fix FTP protocol problems
|
6
|
+
|
7
|
+
Scenario: Logging enabled
|
8
|
+
Given the test server has logging enabled
|
9
|
+
And the test server is started
|
10
|
+
And a successful login
|
11
|
+
Then the server should have written log output
|
@@ -7,6 +7,21 @@ Feature: Port
|
|
7
7
|
Background:
|
8
8
|
Given the test server is started
|
9
9
|
|
10
|
+
Scenario: Port 1024
|
11
|
+
Given a successful login
|
12
|
+
Then the client successfully sends "PORT 1,2,3,4,4,0"
|
13
|
+
|
14
|
+
Scenario: Port 1023; low ports disallowed
|
15
|
+
Given the test server disallows low data ports
|
16
|
+
And a successful login
|
17
|
+
When the client sends "PORT 1,2,3,4,3,255"
|
18
|
+
Then the server returns an unimplemented parameter error
|
19
|
+
|
20
|
+
Scenario: Port 1023; low ports allowed
|
21
|
+
Given the test server allows low data ports
|
22
|
+
And a successful login
|
23
|
+
Then the client successfully sends "PORT 1,2,3,4,3,255"
|
24
|
+
|
10
25
|
Scenario: Not logged in
|
11
26
|
Given a successful connection
|
12
27
|
When the client sends PORT "1,2,3,4,5,6"
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Feature: Status
|
2
|
+
|
3
|
+
As a client
|
4
|
+
I want server status
|
5
|
+
To know what state the server is in
|
6
|
+
|
7
|
+
Background:
|
8
|
+
Given the test server is started
|
9
|
+
|
10
|
+
Scenario: Not logged in
|
11
|
+
Given a successful connection
|
12
|
+
When the client requests status
|
13
|
+
Then the server returns a not logged in error
|
14
|
+
|
15
|
+
Scenario: Server status
|
16
|
+
Given a successful login
|
17
|
+
When the client successfully requests status
|
18
|
+
Then the server returns its name
|
19
|
+
And the server returns its version
|
@@ -10,8 +10,8 @@ Given /^the test server has TLS mode "(\w+)"$/ do |mode|
|
|
10
10
|
server.tls = mode.to_sym
|
11
11
|
end
|
12
12
|
|
13
|
-
Given /^the test server has
|
14
|
-
server.
|
13
|
+
Given /^the test server has logging (enabled|disabled)$/ do |state|
|
14
|
+
server.logging = state == 'enabled'
|
15
15
|
end
|
16
16
|
|
17
17
|
Given /^the test server lacks (\w+)$/ do |feature|
|
@@ -22,3 +22,20 @@ Given /^the test server has auth level "(.*?)"$/ do |auth_level|
|
|
22
22
|
auth_level = Ftpd.const_get(auth_level)
|
23
23
|
server.auth_level = auth_level
|
24
24
|
end
|
25
|
+
|
26
|
+
Given /^the test server has session timeout set to (\S+) seconds$/ do
|
27
|
+
|timeout|
|
28
|
+
server.session_timeout = timeout.to_f
|
29
|
+
end
|
30
|
+
|
31
|
+
Given /^the test server has session timeout disabled$/ do
|
32
|
+
server.session_timeout = nil
|
33
|
+
end
|
34
|
+
|
35
|
+
Given /^the test server disallows low data ports$/ do
|
36
|
+
server.allow_low_data_ports = false
|
37
|
+
end
|
38
|
+
|
39
|
+
Given /^the test server allows low data ports$/ do
|
40
|
+
server.allow_low_data_ports = true
|
41
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
Feature: Port
|
2
|
+
|
3
|
+
As a programmer
|
4
|
+
I want idle sessions to timeout and disconnect
|
5
|
+
So that I can claim RFC compliance
|
6
|
+
|
7
|
+
Scenario: Session idle too long
|
8
|
+
Given the test server has session timeout set to 0.5 seconds
|
9
|
+
And the test server is started
|
10
|
+
And a successful login
|
11
|
+
When the client is idle for 0.6 seconds
|
12
|
+
Then the client is not connected
|
13
|
+
|
14
|
+
Scenario: Session not idle too long
|
15
|
+
Given the test server has session timeout set to 0.5 seconds
|
16
|
+
And the test server is started
|
17
|
+
And a successful login
|
18
|
+
When the client is idle for 0 seconds
|
19
|
+
Then the client is connected
|
20
|
+
|
21
|
+
Scenario: Timeout disabled
|
22
|
+
Given the test server has session timeout disabled
|
23
|
+
And the test server is started
|
24
|
+
And a successful login
|
25
|
+
When the client is idle for 0.6 seconds
|
26
|
+
Then the client is connected
|
@@ -73,6 +73,11 @@ Then /^the server returns a format not implemented error$/ do
|
|
73
73
|
step 'the server returns a "504 Format not implemented" error'
|
74
74
|
end
|
75
75
|
|
76
|
+
Then /^the server returns an unimplemented parameter error$/ do
|
77
|
+
step('the server returns a "504 Command not '\
|
78
|
+
'implemented for that parameter" error')
|
79
|
+
end
|
80
|
+
|
76
81
|
Then /^the server returns a command unrecognized error$/ do
|
77
82
|
step 'the server returns a "500 Syntax error, command unrecognized" error'
|
78
83
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
When /^the client successfully requests status$/ do
|
2
|
+
@status = @client.status
|
3
|
+
end
|
4
|
+
|
5
|
+
When /^the client requests status$/ do
|
6
|
+
capture_error do
|
7
|
+
step 'the client successfully requests status'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
Then /^the server returns its name$/ do
|
12
|
+
@status.should include @server.server_name
|
13
|
+
end
|
14
|
+
|
15
|
+
Then /^the server returns its version$/ do
|
16
|
+
@status.should =~ /\b\d+\.\d+\.\d+\b/
|
17
|
+
end
|
@@ -30,9 +30,10 @@ class TestClient
|
|
30
30
|
:noop,
|
31
31
|
:passive=,
|
32
32
|
:pwd,
|
33
|
+
:quit,
|
33
34
|
:rename,
|
34
35
|
:rmdir,
|
35
|
-
:
|
36
|
+
:status,
|
36
37
|
:system
|
37
38
|
|
38
39
|
def raw(*command)
|
@@ -91,6 +92,17 @@ class TestClient
|
|
91
92
|
end
|
92
93
|
end
|
93
94
|
|
95
|
+
def connected?
|
96
|
+
begin
|
97
|
+
@ftp.noop
|
98
|
+
true
|
99
|
+
rescue Net::FTPTempError => e
|
100
|
+
!!e.to_s =~ /^421/
|
101
|
+
rescue EOFError
|
102
|
+
false
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
94
106
|
private
|
95
107
|
|
96
108
|
RAW_METHOD_REGEX = /^send_(.*)$/
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'forwardable'
|
3
|
+
require 'stringio'
|
3
4
|
require 'tempfile'
|
4
5
|
|
5
6
|
require File.expand_path('test_server_files',
|
@@ -202,22 +203,24 @@ class TestServer
|
|
202
203
|
include Ftpd::InsecureCertificate
|
203
204
|
include TestServerFiles
|
204
205
|
|
206
|
+
attr_writer :logging
|
207
|
+
|
205
208
|
def initialize
|
206
209
|
@temp_dir = Ftpd::TempDir.make
|
207
|
-
@
|
208
|
-
@debug_file.close
|
210
|
+
@log_device = StringIO.new
|
209
211
|
@driver = TestServerDriver.new(@temp_dir)
|
210
212
|
@server = Ftpd::FtpServer.new(@driver)
|
211
213
|
@server.certfile_path = insecure_certfile_path
|
212
|
-
@server.debug_path = @debug_file.path
|
213
214
|
@templates = TestFileTemplates.new
|
214
|
-
self.debug = false
|
215
215
|
self.tls = :off
|
216
216
|
end
|
217
217
|
|
218
|
+
def_delegator :@server, :'allow_low_data_ports='
|
218
219
|
def_delegator :@server, :'auth_level'
|
219
220
|
def_delegator :@server, :'auth_level='
|
220
|
-
def_delegator :@server, :'
|
221
|
+
def_delegator :@server, :'server_name'
|
222
|
+
def_delegator :@server, :'server_name='
|
223
|
+
def_delegator :@server, :'session_timeout='
|
221
224
|
def_delegator :@server, :'tls='
|
222
225
|
|
223
226
|
def_delegator :@driver, :'append='
|
@@ -229,7 +232,12 @@ class TestServer
|
|
229
232
|
def_delegator :@driver, :'rename='
|
230
233
|
def_delegator :@driver, :'write='
|
231
234
|
|
235
|
+
def log_output
|
236
|
+
@log_device.string
|
237
|
+
end
|
238
|
+
|
232
239
|
def start
|
240
|
+
@server.log = make_log
|
233
241
|
@server.start
|
234
242
|
end
|
235
243
|
|
@@ -237,10 +245,6 @@ class TestServer
|
|
237
245
|
@server.stop
|
238
246
|
end
|
239
247
|
|
240
|
-
def debug_output
|
241
|
-
IO.read(@debug_file.path)
|
242
|
-
end
|
243
|
-
|
244
248
|
def host
|
245
249
|
'localhost'
|
246
250
|
end
|
@@ -271,4 +275,14 @@ class TestServer
|
|
271
275
|
@temp_dir
|
272
276
|
end
|
273
277
|
|
278
|
+
def make_log
|
279
|
+
if @logging
|
280
|
+
Logger.new(@log_device)
|
281
|
+
elsif ENV['FTPD_DEBUG'].to_i != 0
|
282
|
+
Logger.new($stdout)
|
283
|
+
else
|
284
|
+
nil
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
274
288
|
end
|
data/ftpd.gemspec
CHANGED
@@ -5,12 +5,12 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "ftpd"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.5.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Wayne Conrad"]
|
12
|
-
s.date = "2013-03-
|
13
|
-
s.description = "ftpd is a pure Ruby FTP server library. It supports implicit and explicit TLS, passive and active mode, and
|
12
|
+
s.date = "2013-03-10"
|
13
|
+
s.description = "ftpd is a pure Ruby FTP server library. It supports implicit and explicit TLS, passive and active mode, and is unconditionally complaint per RFC-1123. It an be used as part of a test fixture or embedded in a program."
|
14
14
|
s.email = "wconrad@yagni.com"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE.md",
|
@@ -25,6 +25,8 @@ Gem::Specification.new do |s|
|
|
25
25
|
"README.md",
|
26
26
|
"Rakefile",
|
27
27
|
"VERSION",
|
28
|
+
"config/cucumber.yml",
|
29
|
+
"doc/benchmarks.md",
|
28
30
|
"doc/references.md",
|
29
31
|
"doc/rfc-compliance.md",
|
30
32
|
"examples/example.rb",
|
@@ -38,7 +40,6 @@ Gem::Specification.new do |s|
|
|
38
40
|
"features/ftp_server/cdup.feature",
|
39
41
|
"features/ftp_server/command_errors.feature",
|
40
42
|
"features/ftp_server/concurrent_sessions.feature",
|
41
|
-
"features/ftp_server/debug.feature",
|
42
43
|
"features/ftp_server/delete.feature",
|
43
44
|
"features/ftp_server/directory_navigation.feature",
|
44
45
|
"features/ftp_server/file_structure.feature",
|
@@ -49,6 +50,7 @@ Gem::Specification.new do |s|
|
|
49
50
|
"features/ftp_server/invertability.feature",
|
50
51
|
"features/ftp_server/list.feature",
|
51
52
|
"features/ftp_server/list_tls.feature",
|
53
|
+
"features/ftp_server/logging.feature",
|
52
54
|
"features/ftp_server/login_auth_level_account.feature",
|
53
55
|
"features/ftp_server/login_auth_level_password.feature",
|
54
56
|
"features/ftp_server/login_auth_level_user.feature",
|
@@ -64,10 +66,12 @@ Gem::Specification.new do |s|
|
|
64
66
|
"features/ftp_server/quit.feature",
|
65
67
|
"features/ftp_server/rename.feature",
|
66
68
|
"features/ftp_server/rmdir.feature",
|
67
|
-
"features/ftp_server/
|
69
|
+
"features/ftp_server/status.feature",
|
70
|
+
"features/ftp_server/step_definitions/logging.rb",
|
68
71
|
"features/ftp_server/step_definitions/test_server.rb",
|
69
72
|
"features/ftp_server/syntax_errors.feature",
|
70
73
|
"features/ftp_server/syst.feature",
|
74
|
+
"features/ftp_server/timeout.feature",
|
71
75
|
"features/ftp_server/type.feature",
|
72
76
|
"features/step_definitions/append.rb",
|
73
77
|
"features/step_definitions/client.rb",
|
@@ -97,9 +101,11 @@ Gem::Specification.new do |s|
|
|
97
101
|
"features/step_definitions/rename.rb",
|
98
102
|
"features/step_definitions/rmdir.rb",
|
99
103
|
"features/step_definitions/server_files.rb",
|
104
|
+
"features/step_definitions/status.rb",
|
100
105
|
"features/step_definitions/stop_server.rb",
|
101
106
|
"features/step_definitions/success_replies.rb",
|
102
107
|
"features/step_definitions/system.rb",
|
108
|
+
"features/step_definitions/timeout.rb",
|
103
109
|
"features/step_definitions/type.rb",
|
104
110
|
"features/support/env.rb",
|
105
111
|
"features/support/example_server.rb",
|
@@ -125,9 +131,11 @@ Gem::Specification.new do |s|
|
|
125
131
|
"lib/ftpd/insecure_certificate.rb",
|
126
132
|
"lib/ftpd/list_format/eplf.rb",
|
127
133
|
"lib/ftpd/list_format/ls.rb",
|
134
|
+
"lib/ftpd/null_logger.rb",
|
128
135
|
"lib/ftpd/read_only_disk_file_system.rb",
|
129
136
|
"lib/ftpd/server.rb",
|
130
137
|
"lib/ftpd/session.rb",
|
138
|
+
"lib/ftpd/telnet.rb",
|
131
139
|
"lib/ftpd/temp_dir.rb",
|
132
140
|
"lib/ftpd/tls_server.rb",
|
133
141
|
"lib/ftpd/translate_exceptions.rb",
|
@@ -144,7 +152,9 @@ Gem::Specification.new do |s|
|
|
144
152
|
"spec/file_system_error_translator_spec.rb",
|
145
153
|
"spec/list_format/eplf_spec.rb",
|
146
154
|
"spec/list_format/ls_spec.rb",
|
155
|
+
"spec/null_logger_spec.rb",
|
147
156
|
"spec/spec_helper.rb",
|
157
|
+
"spec/telnet_spec.rb",
|
148
158
|
"spec/translate_exceptions_spec.rb"
|
149
159
|
]
|
150
160
|
s.homepage = "http://github.com/wconrad/ftpd"
|
@@ -160,6 +170,7 @@ Gem::Specification.new do |s|
|
|
160
170
|
s.add_runtime_dependency(%q<memoizer>, ["~> 1.0.1"])
|
161
171
|
s.add_development_dependency(%q<cucumber>, [">= 0"])
|
162
172
|
s.add_development_dependency(%q<double-bag-ftps>, [">= 0"])
|
173
|
+
s.add_development_dependency(%q<fuubar-cucumber>, [">= 0"])
|
163
174
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
164
175
|
s.add_development_dependency(%q<rake>, [">= 0"])
|
165
176
|
s.add_development_dependency(%q<redcarpet>, [">= 0"])
|
@@ -170,6 +181,7 @@ Gem::Specification.new do |s|
|
|
170
181
|
s.add_dependency(%q<memoizer>, ["~> 1.0.1"])
|
171
182
|
s.add_dependency(%q<cucumber>, [">= 0"])
|
172
183
|
s.add_dependency(%q<double-bag-ftps>, [">= 0"])
|
184
|
+
s.add_dependency(%q<fuubar-cucumber>, [">= 0"])
|
173
185
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
174
186
|
s.add_dependency(%q<rake>, [">= 0"])
|
175
187
|
s.add_dependency(%q<redcarpet>, [">= 0"])
|
@@ -181,6 +193,7 @@ Gem::Specification.new do |s|
|
|
181
193
|
s.add_dependency(%q<memoizer>, ["~> 1.0.1"])
|
182
194
|
s.add_dependency(%q<cucumber>, [">= 0"])
|
183
195
|
s.add_dependency(%q<double-bag-ftps>, [">= 0"])
|
196
|
+
s.add_dependency(%q<fuubar-cucumber>, [">= 0"])
|
184
197
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
185
198
|
s.add_dependency(%q<rake>, [">= 0"])
|
186
199
|
s.add_dependency(%q<redcarpet>, [">= 0"])
|
data/lib/ftpd.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'fileutils'
|
2
|
+
require 'logger'
|
2
3
|
require 'memoizer'
|
3
4
|
require 'openssl'
|
4
5
|
require 'pathname'
|
@@ -20,9 +21,11 @@ module Ftpd
|
|
20
21
|
autoload :FileSystemMethodMissing, 'ftpd/file_system_method_missing'
|
21
22
|
autoload :FtpServer, 'ftpd/ftp_server'
|
22
23
|
autoload :InsecureCertificate, 'ftpd/insecure_certificate'
|
24
|
+
autoload :NullLogger, 'ftpd/null_logger'
|
23
25
|
autoload :ReadOnlyDiskFileSystem, 'ftpd/read_only_disk_file_system'
|
24
26
|
autoload :Server, 'ftpd/server'
|
25
27
|
autoload :Session, 'ftpd/session'
|
28
|
+
autoload :Telnet, 'ftpd/telnet'
|
26
29
|
autoload :TempDir, 'ftpd/temp_dir'
|
27
30
|
autoload :TlsServer, 'ftpd/tls_server'
|
28
31
|
autoload :TranslateExceptions, 'ftpd/translate_exceptions'
|
data/lib/ftpd/ftp_server.rb
CHANGED
@@ -3,19 +3,8 @@
|
|
3
3
|
module Ftpd
|
4
4
|
class FtpServer < TlsServer
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
#
|
9
|
-
# Change to this attribute only take effect for new sessions.
|
10
|
-
|
11
|
-
attr_accessor :debug
|
12
|
-
|
13
|
-
# The path to which to write debug information. Defaults to
|
14
|
-
# '/dev/stdout'
|
15
|
-
#
|
16
|
-
# Change to this attribute only take effect for new sessions.
|
17
|
-
|
18
|
-
attr_accessor :debug_path
|
6
|
+
DEFAULT_SERVER_NAME = 'wconrad/ftpd'
|
7
|
+
DEFAULT_SESSION_TIMEOUT = 300 # seconds
|
19
8
|
|
20
9
|
# The number of seconds to delay before replying. This is for
|
21
10
|
# testing, when you need to test, for example, client timeouts.
|
@@ -39,6 +28,37 @@ module Ftpd
|
|
39
28
|
|
40
29
|
attr_accessor :auth_level
|
41
30
|
|
31
|
+
# The session timeout. When a session is awaiting a command, if
|
32
|
+
# one is not received in this many seconds, the session is
|
33
|
+
# disconnected. Defaults to {DEFAULT_SESSION_TIMEOUT}. If nil,
|
34
|
+
# then timeout is disabled.
|
35
|
+
# @return [Numeric]
|
36
|
+
|
37
|
+
attr_accessor :session_timeout
|
38
|
+
|
39
|
+
# The server's name, sent in a STAT reply. Defaults to
|
40
|
+
# {DEFAULT_SERVER_NAME}.
|
41
|
+
|
42
|
+
attr_accessor :server_name
|
43
|
+
|
44
|
+
# The server's version, sent in a STAT reply. Defaults to the
|
45
|
+
# contents of the VERSION file.
|
46
|
+
|
47
|
+
attr_accessor :server_version
|
48
|
+
|
49
|
+
# The logger. Defaults to nil (no logging).
|
50
|
+
# @return [Logger]
|
51
|
+
|
52
|
+
attr_accessor :log
|
53
|
+
|
54
|
+
# Allow PORT command to specify data ports below 1024. Defaults
|
55
|
+
# to false. Setting this to true makes it easier for an attacker
|
56
|
+
# to use the server to attack another server. See RFC 2577
|
57
|
+
# section 3.
|
58
|
+
# @return [Boolean]
|
59
|
+
|
60
|
+
attr_accessor :allow_low_data_ports
|
61
|
+
|
42
62
|
# Create a new FTP server. The server won't start until the
|
43
63
|
# #start method is called.
|
44
64
|
#
|
@@ -52,11 +72,14 @@ module Ftpd
|
|
52
72
|
def initialize(driver)
|
53
73
|
super()
|
54
74
|
@driver = driver
|
55
|
-
@debug_path = '/dev/stdout'
|
56
|
-
@debug = false
|
57
75
|
@response_delay = 0
|
58
76
|
@list_formatter = ListFormat::Ls
|
59
77
|
@auth_level = AUTH_PASSWORD
|
78
|
+
@session_timeout = 300
|
79
|
+
@server_name = DEFAULT_SERVER_NAME
|
80
|
+
@server_version = read_version_file
|
81
|
+
@allow_low_data_ports = false
|
82
|
+
@log = nil
|
60
83
|
end
|
61
84
|
|
62
85
|
private
|
@@ -64,12 +87,23 @@ module Ftpd
|
|
64
87
|
def session(socket)
|
65
88
|
Session.new(:socket => socket,
|
66
89
|
:driver => @driver,
|
67
|
-
:debug => @debug,
|
68
|
-
:debug_path => debug_path,
|
69
90
|
:list_formatter => @list_formatter,
|
70
91
|
:response_delay => response_delay,
|
71
92
|
:tls => @tls,
|
72
|
-
:auth_level => @auth_level
|
93
|
+
:auth_level => @auth_level,
|
94
|
+
:session_timeout => @session_timeout,
|
95
|
+
:server_name => @server_name,
|
96
|
+
:server_version => @server_version,
|
97
|
+
:log => log,
|
98
|
+
:allow_low_data_ports => allow_low_data_ports).run
|
99
|
+
end
|
100
|
+
|
101
|
+
def read_version_file
|
102
|
+
File.open(version_file_path, 'r', &:read).strip
|
103
|
+
end
|
104
|
+
|
105
|
+
def version_file_path
|
106
|
+
File.expand_path('../../VERSION', File.dirname(__FILE__))
|
73
107
|
end
|
74
108
|
|
75
109
|
end
|