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
@@ -49,44 +49,35 @@ module Ftpd
49
49
  @command_loop.read_and_execute_commands
50
50
  end
51
51
 
52
- private
53
-
54
- def register_commands
55
- handlers = CommandHandlerFactory.standard_command_handlers
56
- handlers.each do |klass|
57
- @command_handlers << klass.new(self)
58
- end
59
- end
60
-
61
52
  def valid_command?(command)
62
53
  @command_handlers.has?(command)
63
54
  end
64
-
55
+
65
56
  def execute_command command, argument
66
57
  @command_handlers.execute command, argument
67
58
  end
68
-
59
+
69
60
  def ensure_logged_in
70
61
  return if @logged_in
71
62
  error "Not logged in", 530
72
63
  end
73
-
64
+
74
65
  def ensure_tls_supported
75
66
  unless tls_enabled?
76
67
  error "TLS not enabled", 534
77
68
  end
78
69
  end
79
-
70
+
80
71
  def ensure_not_epsv_all
81
72
  if @epsv_all
82
73
  error "Not allowed after EPSV ALL", 501
83
74
  end
84
75
  end
85
-
76
+
86
77
  def tls_enabled?
87
78
  @config.tls != :off
88
79
  end
89
-
80
+
90
81
  def ensure_protocol_supported(protocol_code)
91
82
  unless @protocols.supports_protocol?(protocol_code)
92
83
  protocol_list = @protocols.protocol_codes.join(',')
@@ -94,15 +85,15 @@ module Ftpd
94
85
  "use (#{protocol_list})", 522)
95
86
  end
96
87
  end
97
-
88
+
98
89
  def supported_commands
99
90
  @command_handlers.commands.map(&:upcase)
100
91
  end
101
-
92
+
102
93
  def pwd(status_code)
103
94
  reply %Q(#{status_code} "#{@name_prefix}" is current directory)
104
95
  end
105
-
96
+
106
97
  FORMAT_TYPES = {
107
98
  'N'=>['Non-print', true],
108
99
  'T'=>['Telnet format effectors', true],
@@ -120,20 +111,16 @@ module Ftpd
120
111
  @command_sequence_checker.expect command
121
112
  end
122
113
 
123
- def set_file_system(file_system)
124
- @file_system = file_system
125
- end
126
-
127
114
  def command_not_needed
128
115
  reply '202 Command not needed at this site'
129
116
  end
130
-
117
+
131
118
  def close_data_server_socket
132
119
  return unless @data_server
133
120
  @data_server.close
134
121
  @data_server = nil
135
122
  end
136
-
123
+
137
124
  def reply(s)
138
125
  if @config.response_delay.to_i != 0
139
126
  @config.log.warn "#{@config.response_delay} second delay before replying"
@@ -143,6 +130,43 @@ module Ftpd
143
130
  @socket.write s + "\r\n"
144
131
  end
145
132
 
133
+ def login(*auth_tokens)
134
+ user = auth_tokens.first
135
+ unless authenticate(*auth_tokens)
136
+ failed_auth
137
+ error "Login incorrect", 530
138
+ end
139
+ reply "230 Logged in"
140
+ set_file_system @config.driver.file_system(user)
141
+ @logged_in = true
142
+ reset_failed_auths
143
+ end
144
+
145
+ def set_active_mode_address(address, port)
146
+ if port > 0xffff || port < 1024 && !@config.allow_low_data_ports
147
+ error "Command not implemented for that parameter", 504
148
+ end
149
+ @data_hostname = address
150
+ @data_port = port
151
+ end
152
+
153
+ def server_name_and_version
154
+ "#{@config.server_name} #{@config.server_version}"
155
+ end
156
+
157
+ private
158
+
159
+ def register_commands
160
+ handlers = CommandHandlerFactory.standard_command_handlers
161
+ handlers.each do |klass|
162
+ @command_handlers << klass.new(self)
163
+ end
164
+ end
165
+
166
+ def set_file_system(file_system)
167
+ @file_system = file_system
168
+ end
169
+
146
170
  def init_command_sequence_checker
147
171
  checker = CommandSequenceChecker.new
148
172
  checker.must_expect 'acct'
@@ -157,19 +181,7 @@ module Ftpd
157
181
  end
158
182
  @config.driver.authenticate(*args)
159
183
  end
160
-
161
- def login(*auth_tokens)
162
- user = auth_tokens.first
163
- unless authenticate(*auth_tokens)
164
- failed_auth
165
- error "Login incorrect", 530
166
- end
167
- reply "230 Logged in"
168
- set_file_system @config.driver.file_system(user)
169
- @logged_in = true
170
- reset_failed_auths
171
- end
172
-
184
+
173
185
  def set_socket_options
174
186
  disable_nagle @socket
175
187
  receive_oob_data_inline @socket
@@ -195,15 +207,7 @@ module Ftpd
195
207
  throw :done
196
208
  end
197
209
  end
198
-
199
- def set_active_mode_address(address, port)
200
- if port > 0xffff || port < 1024 && !@config.allow_low_data_ports
201
- error "Command not implemented for that parameter", 504
202
- end
203
- @data_hostname = address
204
- @data_port = port
205
- end
206
-
210
+
207
211
  def initialize_session
208
212
  @logged_in = false
209
213
  @data_type = 'A'
@@ -218,10 +222,6 @@ module Ftpd
218
222
  close_data_server_socket
219
223
  reset_failed_auths
220
224
  end
221
-
222
- def server_name_and_version
223
- "#{@config.server_name} #{@config.server_version}"
224
- end
225
-
225
+
226
226
  end
227
227
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ftpd
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wayne Conrad
@@ -44,7 +44,7 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 0.1.3
47
+ version: 0.1.4
48
48
  - - "~>"
49
49
  - !ruby/object:Gem::Version
50
50
  version: '0.1'
@@ -54,24 +54,10 @@ dependencies:
54
54
  requirements:
55
55
  - - ">="
56
56
  - !ruby/object:Gem::Version
57
- version: 0.1.3
57
+ version: 0.1.4
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0.1'
61
- - !ruby/object:Gem::Dependency
62
- name: jeweler
63
- requirement: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: '2.0'
68
- type: :development
69
- prerelease: false
70
- version_requirements: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - "~>"
73
- - !ruby/object:Gem::Version
74
- version: '2.0'
75
61
  - !ruby/object:Gem::Dependency
76
62
  name: rake
77
63
  requirement: !ruby/object:Gem::Requirement
@@ -156,10 +142,10 @@ dependencies:
156
142
  - - "~>"
157
143
  - !ruby/object:Gem::Version
158
144
  version: 0.8.7
159
- description: ftpd is a pure Ruby FTP server library. It supports implicit and explicit
160
- TLS, IPV6, passive and active mode, and is unconditionally compliant per RFC-1123. It
161
- can be used as part of a test fixture or embedded in a program.
162
- email: wconrad@yagni.com
145
+ description: "ftpd is a pure Ruby FTP server library. It supports implicit and explicit
146
+ TLS, IPV6, passive and active mode, and is unconditionally compliant per \x01. It
147
+ can be used as part of a test fixture or embedded in a program."
148
+ email: kf7qga@gmail.com
163
149
  executables:
164
150
  - ftpdrb
165
151
  extensions: []
@@ -167,7 +153,6 @@ extra_rdoc_files:
167
153
  - LICENSE.md
168
154
  - README.md
169
155
  files:
170
- - ".travis.yml"
171
156
  - ".yardopts"
172
157
  - Changelog.md
173
158
  - Gemfile
@@ -183,111 +168,7 @@ files:
183
168
  - examples/example.rb
184
169
  - examples/example_spec.rb
185
170
  - examples/hello_world.rb
186
- - features/example/eplf.feature
187
- - features/example/example.feature
188
- - features/example/read_only.feature
189
- - features/example/step_definitions/example_server.rb
190
- - features/ftp_server/abort.feature
191
- - features/ftp_server/allo.feature
192
- - features/ftp_server/append.feature
193
- - features/ftp_server/cdup.feature
194
- - features/ftp_server/command_errors.feature
195
- - features/ftp_server/concurrent_sessions.feature
196
- - features/ftp_server/delay_after_failed_login.feature
197
- - features/ftp_server/delete.feature
198
- - features/ftp_server/directory_navigation.feature
199
- - features/ftp_server/disconnect_after_failed_logins.feature
200
- - features/ftp_server/eprt.feature
201
- - features/ftp_server/epsv.feature
202
- - features/ftp_server/features.feature
203
- - features/ftp_server/file_structure.feature
204
- - features/ftp_server/get.feature
205
- - features/ftp_server/get_ipv6.feature
206
- - features/ftp_server/get_tls.feature
207
- - features/ftp_server/help.feature
208
- - features/ftp_server/implicit_tls.feature
209
- - features/ftp_server/invertability.feature
210
- - features/ftp_server/list.feature
211
- - features/ftp_server/list_tls.feature
212
- - features/ftp_server/logging.feature
213
- - features/ftp_server/login_auth_level_account.feature
214
- - features/ftp_server/login_auth_level_password.feature
215
- - features/ftp_server/login_auth_level_user.feature
216
- - features/ftp_server/max_connections.feature
217
- - features/ftp_server/mdtm.feature
218
- - features/ftp_server/mkdir.feature
219
- - features/ftp_server/mode.feature
220
- - features/ftp_server/name_list.feature
221
- - features/ftp_server/name_list_tls.feature
222
- - features/ftp_server/noop.feature
223
- - features/ftp_server/options.feature
224
- - features/ftp_server/pasv.feature
225
- - features/ftp_server/port.feature
226
- - features/ftp_server/put.feature
227
- - features/ftp_server/put_tls.feature
228
- - features/ftp_server/put_unique.feature
229
- - features/ftp_server/quit.feature
230
- - features/ftp_server/reinitialize.feature
231
- - features/ftp_server/rename.feature
232
- - features/ftp_server/rmdir.feature
233
- - features/ftp_server/site.feature
234
- - features/ftp_server/size.feature
235
- - features/ftp_server/status.feature
236
- - features/ftp_server/step_definitions/logging.rb
237
- - features/ftp_server/step_definitions/test_server.rb
238
- - features/ftp_server/structure_mount.feature
239
- - features/ftp_server/syntax_errors.feature
240
- - features/ftp_server/syst.feature
241
- - features/ftp_server/timeout.feature
242
- - features/ftp_server/type.feature
243
- - features/step_definitions/append.rb
244
- - features/step_definitions/client.rb
245
- - features/step_definitions/client_and_server_files.rb
246
- - features/step_definitions/client_files.rb
247
- - features/step_definitions/command.rb
248
- - features/step_definitions/connect.rb
249
- - features/step_definitions/delete.rb
250
- - features/step_definitions/directory_navigation.rb
251
- - features/step_definitions/error_replies.rb
252
- - features/step_definitions/features.rb
253
- - features/step_definitions/file_structure.rb
254
- - features/step_definitions/generic_send.rb
255
- - features/step_definitions/get.rb
256
- - features/step_definitions/help.rb
257
- - features/step_definitions/invalid_commands.rb
258
- - features/step_definitions/ipv6.rb
259
- - features/step_definitions/line_endings.rb
260
- - features/step_definitions/list.rb
261
- - features/step_definitions/login.rb
262
- - features/step_definitions/mkdir.rb
263
- - features/step_definitions/mode.rb
264
- - features/step_definitions/mtime.rb
265
- - features/step_definitions/noop.rb
266
- - features/step_definitions/options.rb
267
- - features/step_definitions/passive.rb
268
- - features/step_definitions/pending.rb
269
- - features/step_definitions/port.rb
270
- - features/step_definitions/put.rb
271
- - features/step_definitions/quit.rb
272
- - features/step_definitions/rename.rb
273
- - features/step_definitions/rmdir.rb
274
- - features/step_definitions/server_files.rb
275
- - features/step_definitions/server_title.rb
276
- - features/step_definitions/size.rb
277
- - features/step_definitions/status.rb
278
- - features/step_definitions/success_replies.rb
279
- - features/step_definitions/system.rb
280
- - features/step_definitions/timing.rb
281
- - features/step_definitions/type.rb
282
- - features/support/env.rb
283
- - features/support/example_server.rb
284
- - features/support/file_templates/ascii_unix
285
- - features/support/file_templates/ascii_windows
286
- - features/support/file_templates/binary
287
- - features/support/test_client.rb
288
- - features/support/test_file_templates.rb
289
- - features/support/test_server.rb
290
- - features/support/test_server_files.rb
171
+ - examples/write_only.rb
291
172
  - ftpd.gemspec
292
173
  - insecure-test-cert.pem
293
174
  - lib/ftpd.rb
@@ -366,30 +247,6 @@ files:
366
247
  - lib/ftpd/temp_dir.rb
367
248
  - lib/ftpd/tls_server.rb
368
249
  - lib/ftpd/translate_exceptions.rb
369
- - rake_tasks/cucumber.rake
370
- - rake_tasks/default.rake
371
- - rake_tasks/jeweler.rake
372
- - rake_tasks/spec.rake
373
- - rake_tasks/test.rake
374
- - rake_tasks/yard.rake
375
- - spec/command_sequence_checker_spec.rb
376
- - spec/connection_throttle_spec.rb
377
- - spec/connection_tracker_spec.rb
378
- - spec/data_server_factory_spec.rb
379
- - spec/disk_file_system_spec.rb
380
- - spec/exception_translator_spec.rb
381
- - spec/file_info_spec.rb
382
- - spec/ftp_server_error_spec.rb
383
- - spec/list_format/eplf_spec.rb
384
- - spec/list_format/ls_spec.rb
385
- - spec/list_path_spec.rb
386
- - spec/null_logger_spec.rb
387
- - spec/protocols_spec.rb
388
- - spec/server_spec.rb
389
- - spec/spec_helper.rb
390
- - spec/telnet_spec.rb
391
- - spec/translate_exceptions_spec.rb
392
- - testlib/network.rb
393
250
  homepage: http://github.com/wconrad/ftpd
394
251
  licenses:
395
252
  - MIT
@@ -402,7 +259,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
402
259
  requirements:
403
260
  - - ">="
404
261
  - !ruby/object:Gem::Version
405
- version: '0'
262
+ version: 1.9.3
406
263
  required_rubygems_version: !ruby/object:Gem::Requirement
407
264
  requirements:
408
265
  - - ">="
@@ -410,8 +267,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
410
267
  version: '0'
411
268
  requirements: []
412
269
  rubyforge_project:
413
- rubygems_version: 2.5.1
270
+ rubygems_version: 2.4.8
414
271
  signing_key:
415
272
  specification_version: 4
416
273
  summary: Pure Ruby FTP server library
417
274
  test_files: []
275
+ has_rdoc:
@@ -1,6 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 1.9.3
4
- - 2.0
5
- - 2.1
6
- - 2.2
@@ -1,14 +0,0 @@
1
- Feature: Example
2
-
3
- As a programmer
4
- I want to enable EPLF list format
5
- So that I can test this library with an EPLF client
6
-
7
- Background:
8
- Given the example has argument "--eplf"
9
- And the example server is started
10
-
11
- Scenario: List directory
12
- Given a successful login
13
- When the client successfully lists the directory
14
- Then the list should be in EPLF format
@@ -1,18 +0,0 @@
1
- Feature: Example
2
-
3
- As a programmer
4
- I want to connect to the example
5
- So that I can try this libary with an arbitrary FTP client
6
-
7
- Background:
8
- Given the example server is started
9
-
10
- Scenario: Normal connection
11
- Given a successful login
12
- Then the server returns no error
13
- And the client should be logged in
14
-
15
- Scenario: Fetch README
16
- Given a successful login
17
- When the client successfully gets text "README"
18
- Then the local file "README" should match the remote file