OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/ftp/ftp_network_transaction.h" | 5 #include "net/ftp/ftp_network_transaction.h" |
6 | 6 |
7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
8 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
(...skipping 23 matching lines...) Expand all Loading... |
34 class FtpSocketDataProvider : public DynamicSocketDataProvider { | 34 class FtpSocketDataProvider : public DynamicSocketDataProvider { |
35 public: | 35 public: |
36 enum State { | 36 enum State { |
37 NONE, | 37 NONE, |
38 PRE_USER, | 38 PRE_USER, |
39 PRE_PASSWD, | 39 PRE_PASSWD, |
40 PRE_SYST, | 40 PRE_SYST, |
41 PRE_PWD, | 41 PRE_PWD, |
42 PRE_TYPE, | 42 PRE_TYPE, |
43 PRE_SIZE, | 43 PRE_SIZE, |
44 PRE_EPSV, | 44 PRE_LIST_EPSV, |
45 PRE_PASV, | 45 PRE_LIST_PASV, |
46 PRE_LIST, | 46 PRE_LIST, |
47 PRE_RETR, | 47 PRE_RETR, |
48 PRE_RETR_EPSV, | 48 PRE_RETR_EPSV, |
49 PRE_RETR_PASV, | 49 PRE_RETR_PASV, |
50 PRE_CWD_EPSV, | |
51 PRE_CWD_PASV, | |
52 PRE_CWD, | 50 PRE_CWD, |
53 PRE_QUIT, | 51 PRE_QUIT, |
54 PRE_NOPASV, | 52 PRE_NOPASV, |
55 QUIT | 53 QUIT |
56 }; | 54 }; |
57 | 55 |
58 FtpSocketDataProvider() | 56 FtpSocketDataProvider() |
59 : failure_injection_state_(NONE), | 57 : failure_injection_state_(NONE), |
60 multiline_welcome_(false), | 58 multiline_welcome_(false), |
61 use_epsv_(true), | 59 use_epsv_(true), |
(...skipping 16 matching lines...) Expand all Loading... |
78 return Verify("PASS chrome@example.com\r\n", data, PRE_SYST, | 76 return Verify("PASS chrome@example.com\r\n", data, PRE_SYST, |
79 multiline_welcome_ ? response_multi : response_one); | 77 multiline_welcome_ ? response_multi : response_one); |
80 } | 78 } |
81 case PRE_SYST: | 79 case PRE_SYST: |
82 return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n"); | 80 return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n"); |
83 case PRE_PWD: | 81 case PRE_PWD: |
84 return Verify("PWD\r\n", data, PRE_TYPE, | 82 return Verify("PWD\r\n", data, PRE_TYPE, |
85 "257 \"/\" is your current location\r\n"); | 83 "257 \"/\" is your current location\r\n"); |
86 case PRE_TYPE: | 84 case PRE_TYPE: |
87 return Verify(std::string("TYPE ") + data_type_ + "\r\n", data, | 85 return Verify(std::string("TYPE ") + data_type_ + "\r\n", data, |
88 use_epsv_ ? PRE_EPSV : PRE_PASV, | 86 PRE_SIZE, "200 TYPE set successfully\r\n"); |
89 "200 TYPE set successfully\r\n"); | 87 case PRE_LIST_EPSV: |
90 case PRE_EPSV: | 88 return Verify("EPSV\r\n", data, PRE_LIST, |
91 return Verify("EPSV\r\n", data, PRE_SIZE, | |
92 "227 Entering Extended Passive Mode (|||31744|)\r\n"); | 89 "227 Entering Extended Passive Mode (|||31744|)\r\n"); |
93 case PRE_CWD_EPSV: | 90 case PRE_LIST_PASV: |
94 return Verify("EPSV\r\n", data, PRE_CWD, | 91 return Verify("PASV\r\n", data, PRE_LIST, |
95 "227 Entering Extended Passive Mode (|||31744|)\r\n"); | 92 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
96 case PRE_RETR_EPSV: | 93 case PRE_RETR_EPSV: |
97 return Verify("EPSV\r\n", data, PRE_RETR, | 94 return Verify("EPSV\r\n", data, PRE_RETR, |
98 "227 Entering Extended Passive Mode (|||31744|)\r\n"); | 95 "227 Entering Extended Passive Mode (|||31744|)\r\n"); |
99 case PRE_CWD_PASV: | |
100 return Verify("PASV\r\n", data, PRE_CWD, | |
101 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); | |
102 case PRE_RETR_PASV: | 96 case PRE_RETR_PASV: |
103 return Verify("PASV\r\n", data, PRE_RETR, | 97 return Verify("PASV\r\n", data, PRE_RETR, |
104 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); | 98 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
105 case PRE_PASV: | |
106 return Verify("PASV\r\n", data, PRE_SIZE, | |
107 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); | |
108 case PRE_NOPASV: | 99 case PRE_NOPASV: |
109 // Use unallocated 599 FTP error code to make sure it falls into the | 100 // Use unallocated 599 FTP error code to make sure it falls into the |
110 // generic ERR_FTP_FAILED bucket. | 101 // generic ERR_FTP_FAILED bucket. |
111 return Verify("PASV\r\n", data, PRE_QUIT, | 102 return Verify("PASV\r\n", data, PRE_QUIT, |
112 "599 fail\r\n"); | 103 "599 fail\r\n"); |
113 case PRE_QUIT: | 104 case PRE_QUIT: |
114 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); | 105 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); |
115 default: | 106 default: |
116 NOTREACHED() << "State not handled " << state(); | 107 NOTREACHED() << "State not handled " << state(); |
117 return MockWriteResult(ASYNC, ERR_UNEXPECTED); | 108 return MockWriteResult(ASYNC, ERR_UNEXPECTED); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 class FtpSocketDataProviderDirectoryListing : public FtpSocketDataProvider { | 195 class FtpSocketDataProviderDirectoryListing : public FtpSocketDataProvider { |
205 public: | 196 public: |
206 FtpSocketDataProviderDirectoryListing() { | 197 FtpSocketDataProviderDirectoryListing() { |
207 } | 198 } |
208 | 199 |
209 MockWriteResult OnWrite(const std::string& data) override { | 200 MockWriteResult OnWrite(const std::string& data) override { |
210 if (InjectFault()) | 201 if (InjectFault()) |
211 return MockWriteResult(ASYNC, data.length()); | 202 return MockWriteResult(ASYNC, data.length()); |
212 switch (state()) { | 203 switch (state()) { |
213 case PRE_SIZE: | 204 case PRE_SIZE: |
214 return Verify("SIZE /\r\n", data, | 205 return Verify("SIZE /\r\n", data, PRE_CWD, |
215 use_epsv() ? PRE_CWD_EPSV : PRE_CWD_PASV, | |
216 "550 I can only retrieve regular files\r\n"); | 206 "550 I can only retrieve regular files\r\n"); |
217 case PRE_CWD: | 207 case PRE_CWD: |
218 return Verify("CWD /\r\n", data, PRE_LIST, "200 OK\r\n"); | 208 return Verify("CWD /\r\n", data, |
| 209 use_epsv() ? PRE_LIST_EPSV : PRE_LIST_PASV, "200 OK\r\n"); |
219 case PRE_LIST: | 210 case PRE_LIST: |
220 return Verify("LIST -l\r\n", data, PRE_QUIT, "200 OK\r\n"); | 211 return Verify("LIST -l\r\n", data, PRE_QUIT, "200 OK\r\n"); |
221 default: | 212 default: |
222 return FtpSocketDataProvider::OnWrite(data); | 213 return FtpSocketDataProvider::OnWrite(data); |
223 } | 214 } |
224 } | 215 } |
225 | 216 |
226 private: | 217 private: |
227 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderDirectoryListing); | 218 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderDirectoryListing); |
228 }; | 219 }; |
229 | 220 |
230 class FtpSocketDataProviderDirectoryListingWithPasvFallback | 221 class FtpSocketDataProviderDirectoryListingWithPasvFallback |
231 : public FtpSocketDataProviderDirectoryListing { | 222 : public FtpSocketDataProviderDirectoryListing { |
232 public: | 223 public: |
233 FtpSocketDataProviderDirectoryListingWithPasvFallback() { | 224 FtpSocketDataProviderDirectoryListingWithPasvFallback() { |
234 } | 225 } |
235 | 226 |
236 MockWriteResult OnWrite(const std::string& data) override { | 227 MockWriteResult OnWrite(const std::string& data) override { |
237 if (InjectFault()) | 228 if (InjectFault()) |
238 return MockWriteResult(ASYNC, data.length()); | 229 return MockWriteResult(ASYNC, data.length()); |
239 switch (state()) { | 230 switch (state()) { |
240 case PRE_EPSV: | 231 case PRE_LIST_EPSV: |
241 return Verify("EPSV\r\n", data, PRE_PASV, | 232 return Verify("EPSV\r\n", data, PRE_LIST_PASV, |
242 "500 no EPSV for you\r\n"); | 233 "500 no EPSV for you\r\n"); |
243 case PRE_SIZE: | 234 case PRE_SIZE: |
244 return Verify("SIZE /\r\n", data, PRE_CWD_PASV, | 235 return Verify("SIZE /\r\n", data, PRE_CWD, |
245 "550 I can only retrieve regular files\r\n"); | 236 "550 I can only retrieve regular files\r\n"); |
246 default: | 237 default: |
247 return FtpSocketDataProviderDirectoryListing::OnWrite(data); | 238 return FtpSocketDataProviderDirectoryListing::OnWrite(data); |
248 } | 239 } |
249 } | 240 } |
250 | 241 |
251 private: | 242 private: |
252 DISALLOW_COPY_AND_ASSIGN( | 243 DISALLOW_COPY_AND_ASSIGN( |
253 FtpSocketDataProviderDirectoryListingWithPasvFallback); | 244 FtpSocketDataProviderDirectoryListingWithPasvFallback); |
254 }; | 245 }; |
(...skipping 26 matching lines...) Expand all Loading... |
281 | 272 |
282 MockWriteResult OnWrite(const std::string& data) override { | 273 MockWriteResult OnWrite(const std::string& data) override { |
283 if (InjectFault()) | 274 if (InjectFault()) |
284 return MockWriteResult(ASYNC, data.length()); | 275 return MockWriteResult(ASYNC, data.length()); |
285 switch (state()) { | 276 switch (state()) { |
286 case PRE_SYST: | 277 case PRE_SYST: |
287 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); | 278 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); |
288 case PRE_PWD: | 279 case PRE_PWD: |
289 return Verify("PWD\r\n", data, PRE_TYPE, | 280 return Verify("PWD\r\n", data, PRE_TYPE, |
290 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); | 281 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
291 case PRE_EPSV: | 282 case PRE_LIST_EPSV: |
292 return Verify("EPSV\r\n", data, PRE_PASV, "500 Invalid command\r\n"); | 283 return Verify("EPSV\r\n", data, PRE_LIST_PASV, |
| 284 "500 Invalid command\r\n"); |
293 case PRE_SIZE: | 285 case PRE_SIZE: |
294 return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_CWD_PASV, | 286 return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_CWD, |
295 "550 I can only retrieve regular files\r\n"); | 287 "550 I can only retrieve regular files\r\n"); |
296 case PRE_CWD: | 288 case PRE_CWD: |
297 return Verify("CWD ANONYMOUS_ROOT:[dir]\r\n", data, PRE_LIST, | 289 return Verify("CWD ANONYMOUS_ROOT:[dir]\r\n", data, |
298 "200 OK\r\n"); | 290 use_epsv() ? PRE_LIST_EPSV : PRE_LIST_PASV, "200 OK\r\n"); |
299 case PRE_LIST: | 291 case PRE_LIST: |
300 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); | 292 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); |
301 default: | 293 default: |
302 return FtpSocketDataProvider::OnWrite(data); | 294 return FtpSocketDataProvider::OnWrite(data); |
303 } | 295 } |
304 } | 296 } |
305 | 297 |
306 private: | 298 private: |
307 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSDirectoryListing); | 299 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSDirectoryListing); |
308 }; | 300 }; |
309 | 301 |
310 class FtpSocketDataProviderVMSDirectoryListingRootDirectory | 302 class FtpSocketDataProviderVMSDirectoryListingRootDirectory |
311 : public FtpSocketDataProvider { | 303 : public FtpSocketDataProvider { |
312 public: | 304 public: |
313 FtpSocketDataProviderVMSDirectoryListingRootDirectory() { | 305 FtpSocketDataProviderVMSDirectoryListingRootDirectory() { |
314 } | 306 } |
315 | 307 |
316 MockWriteResult OnWrite(const std::string& data) override { | 308 MockWriteResult OnWrite(const std::string& data) override { |
317 if (InjectFault()) | 309 if (InjectFault()) |
318 return MockWriteResult(ASYNC, data.length()); | 310 return MockWriteResult(ASYNC, data.length()); |
319 switch (state()) { | 311 switch (state()) { |
320 case PRE_SYST: | 312 case PRE_SYST: |
321 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); | 313 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); |
322 case PRE_PWD: | 314 case PRE_PWD: |
323 return Verify("PWD\r\n", data, PRE_TYPE, | 315 return Verify("PWD\r\n", data, PRE_TYPE, |
324 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); | 316 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
325 case PRE_EPSV: | 317 case PRE_LIST_EPSV: |
326 return Verify("EPSV\r\n", data, PRE_PASV, | 318 return Verify("EPSV\r\n", data, PRE_LIST_PASV, |
327 "500 EPSV command unknown\r\n"); | 319 "500 EPSV command unknown\r\n"); |
328 case PRE_SIZE: | 320 case PRE_SIZE: |
329 return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_CWD_PASV, | 321 return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_CWD, |
330 "550 I can only retrieve regular files\r\n"); | 322 "550 I can only retrieve regular files\r\n"); |
331 case PRE_CWD: | 323 case PRE_CWD: |
332 return Verify("CWD ANONYMOUS_ROOT:[000000]\r\n", data, PRE_LIST, | 324 return Verify("CWD ANONYMOUS_ROOT:[000000]\r\n", data, |
333 "200 OK\r\n"); | 325 use_epsv() ? PRE_LIST_EPSV : PRE_LIST_PASV, "200 OK\r\n"); |
334 case PRE_LIST: | 326 case PRE_LIST: |
335 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); | 327 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); |
336 default: | 328 default: |
337 return FtpSocketDataProvider::OnWrite(data); | 329 return FtpSocketDataProvider::OnWrite(data); |
338 } | 330 } |
339 } | 331 } |
340 | 332 |
341 private: | 333 private: |
342 DISALLOW_COPY_AND_ASSIGN( | 334 DISALLOW_COPY_AND_ASSIGN( |
343 FtpSocketDataProviderVMSDirectoryListingRootDirectory); | 335 FtpSocketDataProviderVMSDirectoryListingRootDirectory); |
344 }; | 336 }; |
345 | 337 |
346 class FtpSocketDataProviderFileDownloadWithFileTypecode | 338 class FtpSocketDataProviderFileDownloadWithFileTypecode |
347 : public FtpSocketDataProvider { | 339 : public FtpSocketDataProvider { |
348 public: | 340 public: |
349 FtpSocketDataProviderFileDownloadWithFileTypecode() { | 341 FtpSocketDataProviderFileDownloadWithFileTypecode() { |
350 } | 342 } |
351 | 343 |
352 MockWriteResult OnWrite(const std::string& data) override { | 344 MockWriteResult OnWrite(const std::string& data) override { |
353 if (InjectFault()) | 345 if (InjectFault()) |
354 return MockWriteResult(ASYNC, data.length()); | 346 return MockWriteResult(ASYNC, data.length()); |
355 switch (state()) { | 347 switch (state()) { |
356 case PRE_SIZE: | 348 case PRE_SIZE: |
357 return Verify("SIZE /file\r\n", data, PRE_RETR, | 349 return Verify("SIZE /file\r\n", data, |
358 "213 18\r\n"); | 350 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, "213 18\r\n"); |
359 case PRE_RETR: | 351 case PRE_RETR: |
360 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); | 352 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); |
361 default: | 353 default: |
362 return FtpSocketDataProvider::OnWrite(data); | 354 return FtpSocketDataProvider::OnWrite(data); |
363 } | 355 } |
364 } | 356 } |
365 | 357 |
366 private: | 358 private: |
367 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithFileTypecode); | 359 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithFileTypecode); |
368 }; | 360 }; |
369 | 361 |
370 class FtpSocketDataProviderFileDownload : public FtpSocketDataProvider { | 362 class FtpSocketDataProviderFileDownload : public FtpSocketDataProvider { |
371 public: | 363 public: |
372 FtpSocketDataProviderFileDownload() { | 364 FtpSocketDataProviderFileDownload() { |
373 } | 365 } |
374 | 366 |
375 MockWriteResult OnWrite(const std::string& data) override { | 367 MockWriteResult OnWrite(const std::string& data) override { |
376 if (InjectFault()) | 368 if (InjectFault()) |
377 return MockWriteResult(ASYNC, data.length()); | 369 return MockWriteResult(ASYNC, data.length()); |
378 switch (state()) { | 370 switch (state()) { |
379 case PRE_SIZE: | 371 case PRE_SIZE: |
380 return Verify("SIZE /file\r\n", data, PRE_CWD, | 372 return Verify("SIZE /file\r\n", data, PRE_CWD, "213 18\r\n"); |
381 "213 18\r\n"); | |
382 case PRE_CWD: | 373 case PRE_CWD: |
383 return Verify("CWD /file\r\n", data, | 374 return Verify("CWD /file\r\n", data, |
384 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, | 375 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
385 "550 Not a directory\r\n"); | 376 "550 Not a directory\r\n"); |
386 case PRE_RETR: | 377 case PRE_RETR: |
387 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); | 378 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); |
388 default: | 379 default: |
389 return FtpSocketDataProvider::OnWrite(data); | 380 return FtpSocketDataProvider::OnWrite(data); |
390 } | 381 } |
391 } | 382 } |
392 | 383 |
393 private: | 384 private: |
394 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownload); | 385 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownload); |
395 }; | 386 }; |
396 | 387 |
397 class FtpSocketDataProviderFileNotFound : public FtpSocketDataProvider { | 388 class FtpSocketDataProviderFileNotFound : public FtpSocketDataProvider { |
398 public: | 389 public: |
399 FtpSocketDataProviderFileNotFound() { | 390 FtpSocketDataProviderFileNotFound() { |
400 } | 391 } |
401 | 392 |
402 MockWriteResult OnWrite(const std::string& data) override { | 393 MockWriteResult OnWrite(const std::string& data) override { |
403 if (InjectFault()) | 394 if (InjectFault()) |
404 return MockWriteResult(ASYNC, data.length()); | 395 return MockWriteResult(ASYNC, data.length()); |
405 switch (state()) { | 396 switch (state()) { |
406 case PRE_SIZE: | 397 case PRE_SIZE: |
407 return Verify("SIZE /file\r\n", data, | 398 return Verify("SIZE /file\r\n", data, PRE_CWD, |
408 use_epsv() ? PRE_CWD_EPSV : PRE_CWD_PASV, | |
409 "550 File Not Found\r\n"); | 399 "550 File Not Found\r\n"); |
410 case PRE_CWD: | 400 case PRE_CWD: |
411 return Verify("CWD /file\r\n", data, | 401 return Verify("CWD /file\r\n", data, |
412 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, | 402 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
413 "550 File Not Found\r\n"); | 403 "550 File Not Found\r\n"); |
414 case PRE_RETR: | 404 case PRE_RETR: |
415 return Verify("RETR /file\r\n", data, PRE_QUIT, | 405 return Verify("RETR /file\r\n", data, PRE_QUIT, |
416 "550 File Not Found\r\n"); | 406 "550 File Not Found\r\n"); |
417 default: | 407 default: |
418 return FtpSocketDataProvider::OnWrite(data); | 408 return FtpSocketDataProvider::OnWrite(data); |
419 } | 409 } |
420 } | 410 } |
421 | 411 |
422 private: | 412 private: |
423 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileNotFound); | 413 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileNotFound); |
424 }; | 414 }; |
425 | 415 |
426 class FtpSocketDataProviderFileDownloadWithPasvFallback | 416 class FtpSocketDataProviderFileDownloadWithPasvFallback |
427 : public FtpSocketDataProviderFileDownload { | 417 : public FtpSocketDataProviderFileDownload { |
428 public: | 418 public: |
429 FtpSocketDataProviderFileDownloadWithPasvFallback() { | 419 FtpSocketDataProviderFileDownloadWithPasvFallback() { |
430 } | 420 } |
431 | 421 |
432 MockWriteResult OnWrite(const std::string& data) override { | 422 MockWriteResult OnWrite(const std::string& data) override { |
433 if (InjectFault()) | 423 if (InjectFault()) |
434 return MockWriteResult(ASYNC, data.length()); | 424 return MockWriteResult(ASYNC, data.length()); |
435 switch (state()) { | 425 switch (state()) { |
436 case PRE_EPSV: | 426 case PRE_RETR_EPSV: |
437 return Verify("EPSV\r\n", data, PRE_PASV, | 427 return Verify("EPSV\r\n", data, PRE_RETR_PASV, "500 No can do\r\n"); |
438 "500 No can do\r\n"); | |
439 case PRE_CWD: | 428 case PRE_CWD: |
440 return Verify("CWD /file\r\n", data, PRE_RETR_PASV, | 429 return Verify("CWD /file\r\n", data, |
| 430 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
441 "550 Not a directory\r\n"); | 431 "550 Not a directory\r\n"); |
442 default: | 432 default: |
443 return FtpSocketDataProviderFileDownload::OnWrite(data); | 433 return FtpSocketDataProviderFileDownload::OnWrite(data); |
444 } | 434 } |
445 } | 435 } |
446 | 436 |
447 private: | 437 private: |
448 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithPasvFallback); | 438 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithPasvFallback); |
449 }; | 439 }; |
450 | 440 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 | 494 |
505 MockWriteResult OnWrite(const std::string& data) override { | 495 MockWriteResult OnWrite(const std::string& data) override { |
506 if (InjectFault()) | 496 if (InjectFault()) |
507 return MockWriteResult(ASYNC, data.length()); | 497 return MockWriteResult(ASYNC, data.length()); |
508 switch (state()) { | 498 switch (state()) { |
509 case PRE_SYST: | 499 case PRE_SYST: |
510 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); | 500 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); |
511 case PRE_PWD: | 501 case PRE_PWD: |
512 return Verify("PWD\r\n", data, PRE_TYPE, | 502 return Verify("PWD\r\n", data, PRE_TYPE, |
513 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); | 503 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
514 case PRE_EPSV: | 504 case PRE_LIST_EPSV: |
515 return Verify("EPSV\r\n", data, PRE_PASV, | 505 return Verify("EPSV\r\n", data, PRE_LIST_PASV, |
516 "500 EPSV command unknown\r\n"); | 506 "500 EPSV command unknown\r\n"); |
517 case PRE_SIZE: | 507 case PRE_SIZE: |
518 return Verify("SIZE ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_CWD, | 508 return Verify("SIZE ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_CWD, |
519 "213 18\r\n"); | 509 "213 18\r\n"); |
520 case PRE_CWD: | 510 case PRE_CWD: |
521 return Verify("CWD ANONYMOUS_ROOT:[file]\r\n", data, PRE_RETR_PASV, | 511 return Verify("CWD ANONYMOUS_ROOT:[file]\r\n", data, |
| 512 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
522 "550 Not a directory\r\n"); | 513 "550 Not a directory\r\n"); |
523 case PRE_RETR: | 514 case PRE_RETR: |
524 return Verify("RETR ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_QUIT, | 515 return Verify("RETR ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_QUIT, |
525 "200 OK\r\n"); | 516 "200 OK\r\n"); |
526 default: | 517 default: |
527 return FtpSocketDataProvider::OnWrite(data); | 518 return FtpSocketDataProvider::OnWrite(data); |
528 } | 519 } |
529 } | 520 } |
530 | 521 |
531 private: | 522 private: |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
646 size_t epsv_response_length, | 637 size_t epsv_response_length, |
647 State expected_state) | 638 State expected_state) |
648 : epsv_response_(epsv_response), | 639 : epsv_response_(epsv_response), |
649 epsv_response_length_(epsv_response_length), | 640 epsv_response_length_(epsv_response_length), |
650 expected_state_(expected_state) {} | 641 expected_state_(expected_state) {} |
651 | 642 |
652 MockWriteResult OnWrite(const std::string& data) override { | 643 MockWriteResult OnWrite(const std::string& data) override { |
653 if (InjectFault()) | 644 if (InjectFault()) |
654 return MockWriteResult(ASYNC, data.length()); | 645 return MockWriteResult(ASYNC, data.length()); |
655 switch (state()) { | 646 switch (state()) { |
656 case PRE_EPSV: | 647 case PRE_RETR_EPSV: |
657 return Verify("EPSV\r\n", data, expected_state_, | 648 return Verify("EPSV\r\n", data, expected_state_, |
658 epsv_response_, epsv_response_length_); | 649 epsv_response_, epsv_response_length_); |
659 default: | 650 default: |
660 return FtpSocketDataProviderFileDownload::OnWrite(data); | 651 return FtpSocketDataProviderFileDownload::OnWrite(data); |
661 } | 652 } |
662 } | 653 } |
663 | 654 |
664 private: | 655 private: |
665 const char* epsv_response_; | 656 const char* epsv_response_; |
666 const size_t epsv_response_length_; | 657 const size_t epsv_response_length_; |
667 const State expected_state_; | 658 const State expected_state_; |
668 | 659 |
669 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilEpsv); | 660 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilEpsv); |
670 }; | 661 }; |
671 | 662 |
672 class FtpSocketDataProviderEvilPasv | 663 class FtpSocketDataProviderEvilPasv |
673 : public FtpSocketDataProviderFileDownloadWithPasvFallback { | 664 : public FtpSocketDataProviderFileDownloadWithPasvFallback { |
674 public: | 665 public: |
675 FtpSocketDataProviderEvilPasv(const char* pasv_response, State expected_state) | 666 FtpSocketDataProviderEvilPasv(const char* pasv_response, State expected_state) |
676 : pasv_response_(pasv_response), | 667 : pasv_response_(pasv_response), |
677 expected_state_(expected_state) { | 668 expected_state_(expected_state) { |
678 } | 669 } |
679 | 670 |
680 MockWriteResult OnWrite(const std::string& data) override { | 671 MockWriteResult OnWrite(const std::string& data) override { |
681 if (InjectFault()) | 672 if (InjectFault()) |
682 return MockWriteResult(ASYNC, data.length()); | 673 return MockWriteResult(ASYNC, data.length()); |
683 switch (state()) { | 674 switch (state()) { |
684 case PRE_PASV: | 675 case PRE_RETR_PASV: |
685 return Verify("PASV\r\n", data, expected_state_, pasv_response_); | 676 return Verify("PASV\r\n", data, expected_state_, pasv_response_); |
686 default: | 677 default: |
687 return FtpSocketDataProviderFileDownloadWithPasvFallback::OnWrite(data); | 678 return FtpSocketDataProviderFileDownloadWithPasvFallback::OnWrite(data); |
688 } | 679 } |
689 } | 680 } |
690 | 681 |
691 private: | 682 private: |
692 const char* pasv_response_; | 683 const char* pasv_response_; |
693 const State expected_state_; | 684 const State expected_state_; |
694 | 685 |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
800 } | 791 } |
801 | 792 |
802 FtpRequestInfo GetRequestInfo(const std::string& url) { | 793 FtpRequestInfo GetRequestInfo(const std::string& url) { |
803 FtpRequestInfo info; | 794 FtpRequestInfo info; |
804 info.url = GURL(url); | 795 info.url = GURL(url); |
805 return info; | 796 return info; |
806 } | 797 } |
807 | 798 |
808 void ExecuteTransaction(FtpSocketDataProvider* ctrl_socket, | 799 void ExecuteTransaction(FtpSocketDataProvider* ctrl_socket, |
809 const char* request, | 800 const char* request, |
810 int data_socket, | |
811 int expected_result) { | 801 int expected_result) { |
812 // Expect EPSV usage for non-IPv4 control connections. | 802 // Expect EPSV usage for non-IPv4 control connections. |
813 ctrl_socket->set_use_epsv((GetFamily() != AF_INET)); | 803 ctrl_socket->set_use_epsv((GetFamily() != AF_INET)); |
814 | 804 |
815 mock_socket_factory_.AddSocketDataProvider(ctrl_socket); | 805 mock_socket_factory_.AddSocketDataProvider(ctrl_socket); |
816 | 806 |
817 std::string mock_data("mock-data"); | 807 std::string mock_data("mock-data"); |
818 MockRead data_reads[] = { | 808 MockRead data_reads[] = { |
819 // Usually FTP servers close the data connection after the entire data has | 809 // Usually FTP servers close the data connection after the entire data has |
820 // been received. | 810 // been received. |
821 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 811 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
822 MockRead(mock_data.c_str()), | 812 MockRead(mock_data.c_str()), |
823 }; | 813 }; |
824 | 814 |
825 ScopedVector<StaticSocketDataProvider> data_sockets; | 815 scoped_ptr<StaticSocketDataProvider> data_socket( |
826 data_sockets.reserve(data_socket); | 816 new StaticSocketDataProvider(data_reads, arraysize(data_reads), NULL, |
827 for (int i = 0; i < data_socket + 1; i++) { | 817 0)); |
828 // We only read from one data socket, other ones are dummy. | 818 mock_socket_factory_.AddSocketDataProvider(data_socket.get()); |
829 if (i == data_socket) { | |
830 data_sockets.push_back(new StaticSocketDataProvider( | |
831 data_reads, arraysize(data_reads), NULL, 0)); | |
832 } else { | |
833 data_sockets.push_back(new StaticSocketDataProvider); | |
834 } | |
835 mock_socket_factory_.AddSocketDataProvider(data_sockets[i]); | |
836 } | |
837 | |
838 FtpRequestInfo request_info = GetRequestInfo(request); | 819 FtpRequestInfo request_info = GetRequestInfo(request); |
839 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 820 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
840 ASSERT_EQ(ERR_IO_PENDING, | 821 ASSERT_EQ(ERR_IO_PENDING, |
841 transaction_.Start(&request_info, callback_.callback(), | 822 transaction_.Start(&request_info, callback_.callback(), |
842 BoundNetLog())); | 823 BoundNetLog())); |
843 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 824 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
844 ASSERT_EQ(expected_result, callback_.WaitForResult()); | 825 ASSERT_EQ(expected_result, callback_.WaitForResult()); |
845 if (expected_result == OK) { | 826 if (expected_result == OK) { |
846 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); | 827 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); |
847 memset(io_buffer->data(), 0, kBufferSize); | 828 memset(io_buffer->data(), 0, kBufferSize); |
(...skipping 17 matching lines...) Expand all Loading... |
865 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 846 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
866 } | 847 } |
867 | 848 |
868 void TransactionFailHelper(FtpSocketDataProvider* ctrl_socket, | 849 void TransactionFailHelper(FtpSocketDataProvider* ctrl_socket, |
869 const char* request, | 850 const char* request, |
870 FtpSocketDataProvider::State state, | 851 FtpSocketDataProvider::State state, |
871 FtpSocketDataProvider::State next_state, | 852 FtpSocketDataProvider::State next_state, |
872 const char* response, | 853 const char* response, |
873 int expected_result) { | 854 int expected_result) { |
874 ctrl_socket->InjectFailure(state, next_state, response); | 855 ctrl_socket->InjectFailure(state, next_state, response); |
875 ExecuteTransaction(ctrl_socket, request, 1, expected_result); | 856 ExecuteTransaction(ctrl_socket, request, expected_result); |
876 } | 857 } |
877 | 858 |
878 scoped_ptr<MockHostResolver> host_resolver_; | 859 scoped_ptr<MockHostResolver> host_resolver_; |
879 scoped_refptr<FtpNetworkSession> session_; | 860 scoped_refptr<FtpNetworkSession> session_; |
880 MockClientSocketFactory mock_socket_factory_; | 861 MockClientSocketFactory mock_socket_factory_; |
881 FtpNetworkTransaction transaction_; | 862 FtpNetworkTransaction transaction_; |
882 TestCompletionCallback callback_; | 863 TestCompletionCallback callback_; |
883 }; | 864 }; |
884 | 865 |
885 TEST_P(FtpNetworkTransactionTest, FailedLookup) { | 866 TEST_P(FtpNetworkTransactionTest, FailedLookup) { |
(...skipping 20 matching lines...) Expand all Loading... |
906 | 887 |
907 host_resolver_->rules()->AddSimulatedFailure("[::1]"); | 888 host_resolver_->rules()->AddSimulatedFailure("[::1]"); |
908 | 889 |
909 // We start a transaction that is expected to fail with ERR_INVALID_RESPONSE. | 890 // We start a transaction that is expected to fail with ERR_INVALID_RESPONSE. |
910 // The important part of this test is to make sure that we don't fail with | 891 // The important part of this test is to make sure that we don't fail with |
911 // ERR_NAME_NOT_RESOLVED, since that would mean the decorated hostname | 892 // ERR_NAME_NOT_RESOLVED, since that would mean the decorated hostname |
912 // was used. | 893 // was used. |
913 FtpSocketDataProviderEvilSize ctrl_socket( | 894 FtpSocketDataProviderEvilSize ctrl_socket( |
914 "213 99999999999999999999999999999999\r\n", | 895 "213 99999999999999999999999999999999\r\n", |
915 FtpSocketDataProvider::PRE_QUIT); | 896 FtpSocketDataProvider::PRE_QUIT); |
916 ExecuteTransaction(&ctrl_socket, "ftp://[::1]/file", 1, ERR_INVALID_RESPONSE); | 897 ExecuteTransaction(&ctrl_socket, "ftp://[::1]/file", ERR_INVALID_RESPONSE); |
917 } | 898 } |
918 | 899 |
919 TEST_P(FtpNetworkTransactionTest, DirectoryTransaction) { | 900 TEST_P(FtpNetworkTransactionTest, DirectoryTransaction) { |
920 FtpSocketDataProviderDirectoryListing ctrl_socket; | 901 FtpSocketDataProviderDirectoryListing ctrl_socket; |
921 ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); | 902 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
922 | 903 |
923 EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); | 904 EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); |
924 EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); | 905 EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); |
925 EXPECT_EQ((GetFamily() == AF_INET) ? "127.0.0.1" : "::1", | 906 EXPECT_EQ((GetFamily() == AF_INET) ? "127.0.0.1" : "::1", |
926 transaction_.GetResponseInfo()->socket_address.host()); | 907 transaction_.GetResponseInfo()->socket_address.host()); |
927 EXPECT_EQ(21, transaction_.GetResponseInfo()->socket_address.port()); | 908 EXPECT_EQ(21, transaction_.GetResponseInfo()->socket_address.port()); |
928 } | 909 } |
929 | 910 |
930 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionWithPasvFallback) { | 911 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionWithPasvFallback) { |
931 FtpSocketDataProviderDirectoryListingWithPasvFallback ctrl_socket; | 912 FtpSocketDataProviderDirectoryListingWithPasvFallback ctrl_socket; |
932 ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); | 913 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
933 | 914 |
934 EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); | 915 EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); |
935 EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); | 916 EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); |
936 } | 917 } |
937 | 918 |
938 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionWithTypecode) { | 919 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionWithTypecode) { |
939 FtpSocketDataProviderDirectoryListing ctrl_socket; | 920 FtpSocketDataProviderDirectoryListing ctrl_socket; |
940 ExecuteTransaction(&ctrl_socket, "ftp://host;type=d", 1, OK); | 921 ExecuteTransaction(&ctrl_socket, "ftp://host;type=d", OK); |
941 | 922 |
942 EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); | 923 EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); |
943 EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); | 924 EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); |
944 } | 925 } |
945 | 926 |
946 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcome) { | 927 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcome) { |
947 FtpSocketDataProviderDirectoryListing ctrl_socket; | 928 FtpSocketDataProviderDirectoryListing ctrl_socket; |
948 ctrl_socket.set_multiline_welcome(true); | 929 ctrl_socket.set_multiline_welcome(true); |
949 ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); | 930 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
950 } | 931 } |
951 | 932 |
952 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionShortReads2) { | 933 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionShortReads2) { |
953 FtpSocketDataProviderDirectoryListing ctrl_socket; | 934 FtpSocketDataProviderDirectoryListing ctrl_socket; |
954 ctrl_socket.set_short_read_limit(2); | 935 ctrl_socket.set_short_read_limit(2); |
955 ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); | 936 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
956 } | 937 } |
957 | 938 |
958 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionShortReads5) { | 939 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionShortReads5) { |
959 FtpSocketDataProviderDirectoryListing ctrl_socket; | 940 FtpSocketDataProviderDirectoryListing ctrl_socket; |
960 ctrl_socket.set_short_read_limit(5); | 941 ctrl_socket.set_short_read_limit(5); |
961 ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); | 942 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
962 } | 943 } |
963 | 944 |
964 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcomeShort) { | 945 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcomeShort) { |
965 FtpSocketDataProviderDirectoryListing ctrl_socket; | 946 FtpSocketDataProviderDirectoryListing ctrl_socket; |
966 // The client will not consume all three 230 lines. That's good, we want to | 947 // The client will not consume all three 230 lines. That's good, we want to |
967 // test that scenario. | 948 // test that scenario. |
968 ctrl_socket.allow_unconsumed_reads(true); | 949 ctrl_socket.allow_unconsumed_reads(true); |
969 ctrl_socket.set_multiline_welcome(true); | 950 ctrl_socket.set_multiline_welcome(true); |
970 ctrl_socket.set_short_read_limit(5); | 951 ctrl_socket.set_short_read_limit(5); |
971 ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); | 952 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
972 } | 953 } |
973 | 954 |
974 // Regression test for http://crbug.com/60555. | 955 // Regression test for http://crbug.com/60555. |
975 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionZeroSize) { | 956 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionZeroSize) { |
976 FtpSocketDataProviderDirectoryListingZeroSize ctrl_socket; | 957 FtpSocketDataProviderDirectoryListingZeroSize ctrl_socket; |
977 ExecuteTransaction(&ctrl_socket, "ftp://host", 0, OK); | 958 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
978 } | 959 } |
979 | 960 |
980 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionVMS) { | 961 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionVMS) { |
981 FtpSocketDataProviderVMSDirectoryListing ctrl_socket; | 962 FtpSocketDataProviderVMSDirectoryListing ctrl_socket; |
982 ExecuteTransaction(&ctrl_socket, "ftp://host/dir", 1, OK); | 963 ExecuteTransaction(&ctrl_socket, "ftp://host/dir", OK); |
983 } | 964 } |
984 | 965 |
985 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionVMSRootDirectory) { | 966 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionVMSRootDirectory) { |
986 FtpSocketDataProviderVMSDirectoryListingRootDirectory ctrl_socket; | 967 FtpSocketDataProviderVMSDirectoryListingRootDirectory ctrl_socket; |
987 ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); | 968 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
988 } | 969 } |
989 | 970 |
990 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionTransferStarting) { | 971 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionTransferStarting) { |
991 FtpSocketDataProviderDirectoryListingTransferStarting ctrl_socket; | 972 FtpSocketDataProviderDirectoryListingTransferStarting ctrl_socket; |
992 ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); | 973 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
993 } | 974 } |
994 | 975 |
995 TEST_P(FtpNetworkTransactionTest, DownloadTransaction) { | 976 TEST_P(FtpNetworkTransactionTest, DownloadTransaction) { |
996 FtpSocketDataProviderFileDownload ctrl_socket; | 977 FtpSocketDataProviderFileDownload ctrl_socket; |
997 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); | 978 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
998 | 979 |
999 // We pass an artificial value of 18 as a response to the SIZE command. | 980 // We pass an artificial value of 18 as a response to the SIZE command. |
1000 EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); | 981 EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); |
1001 EXPECT_EQ((GetFamily() == AF_INET) ? "127.0.0.1" : "::1", | 982 EXPECT_EQ((GetFamily() == AF_INET) ? "127.0.0.1" : "::1", |
1002 transaction_.GetResponseInfo()->socket_address.host()); | 983 transaction_.GetResponseInfo()->socket_address.host()); |
1003 EXPECT_EQ(21, transaction_.GetResponseInfo()->socket_address.port()); | 984 EXPECT_EQ(21, transaction_.GetResponseInfo()->socket_address.port()); |
1004 } | 985 } |
1005 | 986 |
1006 TEST_P(FtpNetworkTransactionTest, DownloadTransactionWithPasvFallback) { | 987 TEST_P(FtpNetworkTransactionTest, DownloadTransactionWithPasvFallback) { |
1007 FtpSocketDataProviderFileDownloadWithPasvFallback ctrl_socket; | 988 FtpSocketDataProviderFileDownloadWithPasvFallback ctrl_socket; |
1008 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); | 989 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
1009 | 990 |
1010 // We pass an artificial value of 18 as a response to the SIZE command. | 991 // We pass an artificial value of 18 as a response to the SIZE command. |
1011 EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); | 992 EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); |
1012 } | 993 } |
1013 | 994 |
1014 TEST_P(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeA) { | 995 TEST_P(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeA) { |
1015 FtpSocketDataProviderFileDownloadWithFileTypecode ctrl_socket; | 996 FtpSocketDataProviderFileDownloadWithFileTypecode ctrl_socket; |
1016 ctrl_socket.set_data_type('A'); | 997 ctrl_socket.set_data_type('A'); |
1017 ExecuteTransaction(&ctrl_socket, "ftp://host/file;type=a", 0, OK); | 998 ExecuteTransaction(&ctrl_socket, "ftp://host/file;type=a", OK); |
1018 | 999 |
1019 // We pass an artificial value of 18 as a response to the SIZE command. | 1000 // We pass an artificial value of 18 as a response to the SIZE command. |
1020 EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); | 1001 EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); |
1021 } | 1002 } |
1022 | 1003 |
1023 TEST_P(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeI) { | 1004 TEST_P(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeI) { |
1024 FtpSocketDataProviderFileDownloadWithFileTypecode ctrl_socket; | 1005 FtpSocketDataProviderFileDownloadWithFileTypecode ctrl_socket; |
1025 ExecuteTransaction(&ctrl_socket, "ftp://host/file;type=i", 0, OK); | 1006 ExecuteTransaction(&ctrl_socket, "ftp://host/file;type=i", OK); |
1026 | 1007 |
1027 // We pass an artificial value of 18 as a response to the SIZE command. | 1008 // We pass an artificial value of 18 as a response to the SIZE command. |
1028 EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); | 1009 EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); |
1029 } | 1010 } |
1030 | 1011 |
1031 TEST_P(FtpNetworkTransactionTest, DownloadTransactionMultilineWelcome) { | 1012 TEST_P(FtpNetworkTransactionTest, DownloadTransactionMultilineWelcome) { |
1032 FtpSocketDataProviderFileDownload ctrl_socket; | 1013 FtpSocketDataProviderFileDownload ctrl_socket; |
1033 ctrl_socket.set_multiline_welcome(true); | 1014 ctrl_socket.set_multiline_welcome(true); |
1034 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); | 1015 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
1035 } | 1016 } |
1036 | 1017 |
1037 TEST_P(FtpNetworkTransactionTest, DownloadTransactionShortReads2) { | 1018 TEST_P(FtpNetworkTransactionTest, DownloadTransactionShortReads2) { |
1038 FtpSocketDataProviderFileDownload ctrl_socket; | 1019 FtpSocketDataProviderFileDownload ctrl_socket; |
1039 ctrl_socket.set_short_read_limit(2); | 1020 ctrl_socket.set_short_read_limit(2); |
1040 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); | 1021 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
1041 } | 1022 } |
1042 | 1023 |
1043 TEST_P(FtpNetworkTransactionTest, DownloadTransactionShortReads5) { | 1024 TEST_P(FtpNetworkTransactionTest, DownloadTransactionShortReads5) { |
1044 FtpSocketDataProviderFileDownload ctrl_socket; | 1025 FtpSocketDataProviderFileDownload ctrl_socket; |
1045 ctrl_socket.set_short_read_limit(5); | 1026 ctrl_socket.set_short_read_limit(5); |
1046 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); | 1027 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
1047 } | 1028 } |
1048 | 1029 |
1049 TEST_P(FtpNetworkTransactionTest, DownloadTransactionZeroSize) { | 1030 TEST_P(FtpNetworkTransactionTest, DownloadTransactionZeroSize) { |
1050 FtpSocketDataProviderFileDownloadZeroSize ctrl_socket; | 1031 FtpSocketDataProviderFileDownloadZeroSize ctrl_socket; |
1051 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); | 1032 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
1052 } | 1033 } |
1053 | 1034 |
1054 TEST_P(FtpNetworkTransactionTest, DownloadTransactionCWD451) { | 1035 TEST_P(FtpNetworkTransactionTest, DownloadTransactionCWD451) { |
1055 FtpSocketDataProviderFileDownloadCWD451 ctrl_socket; | 1036 FtpSocketDataProviderFileDownloadCWD451 ctrl_socket; |
1056 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); | 1037 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
1057 } | 1038 } |
1058 | 1039 |
1059 TEST_P(FtpNetworkTransactionTest, DownloadTransactionVMS) { | 1040 TEST_P(FtpNetworkTransactionTest, DownloadTransactionVMS) { |
1060 FtpSocketDataProviderVMSFileDownload ctrl_socket; | 1041 FtpSocketDataProviderVMSFileDownload ctrl_socket; |
1061 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); | 1042 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
1062 } | 1043 } |
1063 | 1044 |
1064 TEST_P(FtpNetworkTransactionTest, DownloadTransactionTransferStarting) { | 1045 TEST_P(FtpNetworkTransactionTest, DownloadTransactionTransferStarting) { |
1065 FtpSocketDataProviderFileDownloadTransferStarting ctrl_socket; | 1046 FtpSocketDataProviderFileDownloadTransferStarting ctrl_socket; |
1066 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); | 1047 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
1067 } | 1048 } |
1068 | 1049 |
1069 TEST_P(FtpNetworkTransactionTest, DownloadTransactionInvalidResponse) { | 1050 TEST_P(FtpNetworkTransactionTest, DownloadTransactionInvalidResponse) { |
1070 FtpSocketDataProviderFileDownloadInvalidResponse ctrl_socket; | 1051 FtpSocketDataProviderFileDownloadInvalidResponse ctrl_socket; |
1071 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); | 1052 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
1072 } | 1053 } |
1073 | 1054 |
1074 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvReallyBadFormat) { | 1055 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvReallyBadFormat) { |
1075 FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,\r\n", | 1056 FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,\r\n", |
1076 FtpSocketDataProvider::PRE_QUIT); | 1057 FtpSocketDataProvider::PRE_QUIT); |
1077 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); | 1058 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
1078 } | 1059 } |
1079 | 1060 |
1080 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort1) { | 1061 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort1) { |
1081 FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,0,22)\r\n", | 1062 FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,0,22)\r\n", |
1082 FtpSocketDataProvider::PRE_QUIT); | 1063 FtpSocketDataProvider::PRE_QUIT); |
1083 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); | 1064 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
1084 } | 1065 } |
1085 | 1066 |
1086 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort2) { | 1067 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort2) { |
1087 // Still unsafe. 1 * 256 + 2 = 258, which is < 1024. | 1068 // Still unsafe. 1 * 256 + 2 = 258, which is < 1024. |
1088 FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,1,2)\r\n", | 1069 FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,1,2)\r\n", |
1089 FtpSocketDataProvider::PRE_QUIT); | 1070 FtpSocketDataProvider::PRE_QUIT); |
1090 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); | 1071 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
1091 } | 1072 } |
1092 | 1073 |
1093 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort3) { | 1074 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort3) { |
1094 // Still unsafe. 3 * 256 + 4 = 772, which is < 1024. | 1075 // Still unsafe. 3 * 256 + 4 = 772, which is < 1024. |
1095 FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,3,4)\r\n", | 1076 FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,3,4)\r\n", |
1096 FtpSocketDataProvider::PRE_QUIT); | 1077 FtpSocketDataProvider::PRE_QUIT); |
1097 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); | 1078 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
1098 } | 1079 } |
1099 | 1080 |
1100 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort4) { | 1081 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort4) { |
1101 // Unsafe. 8 * 256 + 1 = 2049, which is used by nfs. | 1082 // Unsafe. 8 * 256 + 1 = 2049, which is used by nfs. |
1102 FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,8,1)\r\n", | 1083 FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,8,1)\r\n", |
1103 FtpSocketDataProvider::PRE_QUIT); | 1084 FtpSocketDataProvider::PRE_QUIT); |
1104 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); | 1085 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
1105 } | 1086 } |
1106 | 1087 |
1107 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafeHost) { | 1088 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafeHost) { |
1108 FtpSocketDataProviderEvilPasv ctrl_socket( | 1089 FtpSocketDataProviderEvilPasv ctrl_socket( |
1109 "227 Portscan (10,1,2,3,123,456)\r\n", FtpSocketDataProvider::PRE_SIZE); | 1090 "227 Portscan (10,1,2,3,123,456)\r\n", FtpSocketDataProvider::PRE_RETR); |
1110 ctrl_socket.set_use_epsv(GetFamily() != AF_INET); | 1091 ctrl_socket.set_use_epsv(GetFamily() != AF_INET); |
1111 std::string mock_data("mock-data"); | 1092 std::string mock_data("mock-data"); |
1112 MockRead data_reads[] = { | 1093 MockRead data_reads[] = { |
1113 MockRead(mock_data.c_str()), | 1094 MockRead(mock_data.c_str()), |
1114 }; | 1095 }; |
1115 StaticSocketDataProvider data_socket1; | 1096 StaticSocketDataProvider data_socket1; |
1116 StaticSocketDataProvider data_socket2(data_reads, arraysize(data_reads), | 1097 StaticSocketDataProvider data_socket2(data_reads, arraysize(data_reads), |
1117 NULL, 0); | 1098 NULL, 0); |
1118 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); | 1099 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); |
1119 mock_socket_factory_.AddSocketDataProvider(&data_socket1); | 1100 mock_socket_factory_.AddSocketDataProvider(&data_socket1); |
(...skipping 22 matching lines...) Expand all Loading... |
1142 } | 1123 } |
1143 } | 1124 } |
1144 | 1125 |
1145 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat1) { | 1126 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat1) { |
1146 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1127 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1147 if (GetFamily() == AF_INET) | 1128 if (GetFamily() == AF_INET) |
1148 return; | 1129 return; |
1149 | 1130 |
1150 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22)\r\n", | 1131 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22)\r\n", |
1151 FtpSocketDataProvider::PRE_QUIT); | 1132 FtpSocketDataProvider::PRE_QUIT); |
1152 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); | 1133 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
1153 } | 1134 } |
1154 | 1135 |
1155 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat2) { | 1136 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat2) { |
1156 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1137 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1157 if (GetFamily() == AF_INET) | 1138 if (GetFamily() == AF_INET) |
1158 return; | 1139 return; |
1159 | 1140 |
1160 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (||\r\n", | 1141 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (||\r\n", |
1161 FtpSocketDataProvider::PRE_QUIT); | 1142 FtpSocketDataProvider::PRE_QUIT); |
1162 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); | 1143 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
1163 } | 1144 } |
1164 | 1145 |
1165 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat3) { | 1146 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat3) { |
1166 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1147 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1167 if (GetFamily() == AF_INET) | 1148 if (GetFamily() == AF_INET) |
1168 return; | 1149 return; |
1169 | 1150 |
1170 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan\r\n", | 1151 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan\r\n", |
1171 FtpSocketDataProvider::PRE_QUIT); | 1152 FtpSocketDataProvider::PRE_QUIT); |
1172 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); | 1153 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
1173 } | 1154 } |
1174 | 1155 |
1175 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat4) { | 1156 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat4) { |
1176 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1157 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1177 if (GetFamily() == AF_INET) | 1158 if (GetFamily() == AF_INET) |
1178 return; | 1159 return; |
1179 | 1160 |
1180 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (||||)\r\n", | 1161 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (||||)\r\n", |
1181 FtpSocketDataProvider::PRE_QUIT); | 1162 FtpSocketDataProvider::PRE_QUIT); |
1182 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); | 1163 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
1183 } | 1164 } |
1184 | 1165 |
1185 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat5) { | 1166 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat5) { |
1186 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1167 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1187 if (GetFamily() == AF_INET) | 1168 if (GetFamily() == AF_INET) |
1188 return; | 1169 return; |
1189 | 1170 |
1190 // Breaking the string in the next line prevents MSVC warning C4125. | 1171 // Breaking the string in the next line prevents MSVC warning C4125. |
1191 const char response[] = "227 Portscan (\0\0\031" "773\0)\r\n"; | 1172 const char response[] = "227 Portscan (\0\0\031" "773\0)\r\n"; |
1192 FtpSocketDataProviderEvilEpsv ctrl_socket(response, sizeof(response)-1, | 1173 FtpSocketDataProviderEvilEpsv ctrl_socket(response, sizeof(response)-1, |
1193 FtpSocketDataProvider::PRE_QUIT); | 1174 FtpSocketDataProvider::PRE_QUIT); |
1194 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); | 1175 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
1195 } | 1176 } |
1196 | 1177 |
1197 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort1) { | 1178 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort1) { |
1198 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1179 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1199 if (GetFamily() == AF_INET) | 1180 if (GetFamily() == AF_INET) |
1200 return; | 1181 return; |
1201 | 1182 |
1202 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22|)\r\n", | 1183 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22|)\r\n", |
1203 FtpSocketDataProvider::PRE_QUIT); | 1184 FtpSocketDataProvider::PRE_QUIT); |
1204 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); | 1185 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
1205 } | 1186 } |
1206 | 1187 |
1207 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort2) { | 1188 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort2) { |
1208 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1189 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1209 if (GetFamily() == AF_INET) | 1190 if (GetFamily() == AF_INET) |
1210 return; | 1191 return; |
1211 | 1192 |
1212 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||258|)\r\n", | 1193 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||258|)\r\n", |
1213 FtpSocketDataProvider::PRE_QUIT); | 1194 FtpSocketDataProvider::PRE_QUIT); |
1214 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); | 1195 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
1215 } | 1196 } |
1216 | 1197 |
1217 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort3) { | 1198 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort3) { |
1218 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1199 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1219 if (GetFamily() == AF_INET) | 1200 if (GetFamily() == AF_INET) |
1220 return; | 1201 return; |
1221 | 1202 |
1222 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||772|)\r\n", | 1203 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||772|)\r\n", |
1223 FtpSocketDataProvider::PRE_QUIT); | 1204 FtpSocketDataProvider::PRE_QUIT); |
1224 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); | 1205 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
1225 } | 1206 } |
1226 | 1207 |
1227 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort4) { | 1208 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort4) { |
1228 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1209 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1229 if (GetFamily() == AF_INET) | 1210 if (GetFamily() == AF_INET) |
1230 return; | 1211 return; |
1231 | 1212 |
1232 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||2049|)\r\n", | 1213 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||2049|)\r\n", |
1233 FtpSocketDataProvider::PRE_QUIT); | 1214 FtpSocketDataProvider::PRE_QUIT); |
1234 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); | 1215 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
1235 } | 1216 } |
1236 | 1217 |
1237 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvWeirdSep) { | 1218 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvWeirdSep) { |
1238 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1219 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1239 if (GetFamily() == AF_INET) | 1220 if (GetFamily() == AF_INET) |
1240 return; | 1221 return; |
1241 | 1222 |
1242 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan ($$$31744$)\r\n", | 1223 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan ($$$31744$)\r\n", |
1243 FtpSocketDataProvider::PRE_SIZE); | 1224 FtpSocketDataProvider::PRE_RETR); |
1244 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); | 1225 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
1245 } | 1226 } |
1246 | 1227 |
1247 TEST_P(FtpNetworkTransactionTest, | 1228 TEST_P(FtpNetworkTransactionTest, |
1248 DownloadTransactionEvilEpsvWeirdSepUnsafePort) { | 1229 DownloadTransactionEvilEpsvWeirdSepUnsafePort) { |
1249 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1230 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1250 if (GetFamily() == AF_INET) | 1231 if (GetFamily() == AF_INET) |
1251 return; | 1232 return; |
1252 | 1233 |
1253 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan ($$$317$)\r\n", | 1234 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan ($$$317$)\r\n", |
1254 FtpSocketDataProvider::PRE_QUIT); | 1235 FtpSocketDataProvider::PRE_QUIT); |
1255 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); | 1236 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
1256 } | 1237 } |
1257 | 1238 |
1258 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvIllegalHost) { | 1239 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvIllegalHost) { |
1259 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1240 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1260 if (GetFamily() == AF_INET) | 1241 if (GetFamily() == AF_INET) |
1261 return; | 1242 return; |
1262 | 1243 |
1263 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|2|::1|31744|)\r\n", | 1244 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|2|::1|31744|)\r\n", |
1264 FtpSocketDataProvider::PRE_QUIT); | 1245 FtpSocketDataProvider::PRE_QUIT); |
1265 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); | 1246 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
1266 } | 1247 } |
1267 | 1248 |
1268 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadUsername) { | 1249 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadUsername) { |
1269 FtpSocketDataProviderEvilLogin ctrl_socket("hello%0Aworld", "test"); | 1250 FtpSocketDataProviderEvilLogin ctrl_socket("hello%0Aworld", "test"); |
1270 ExecuteTransaction(&ctrl_socket, "ftp://hello%0Aworld:test@host/file", 1, OK); | 1251 ExecuteTransaction(&ctrl_socket, "ftp://hello%0Aworld:test@host/file", OK); |
1271 } | 1252 } |
1272 | 1253 |
1273 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadPassword) { | 1254 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadPassword) { |
1274 FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello%0Dworld"); | 1255 FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello%0Dworld"); |
1275 ExecuteTransaction(&ctrl_socket, "ftp://test:hello%0Dworld@host/file", 1, OK); | 1256 ExecuteTransaction(&ctrl_socket, "ftp://test:hello%0Dworld@host/file", OK); |
1276 } | 1257 } |
1277 | 1258 |
1278 TEST_P(FtpNetworkTransactionTest, DownloadTransactionSpaceInLogin) { | 1259 TEST_P(FtpNetworkTransactionTest, DownloadTransactionSpaceInLogin) { |
1279 FtpSocketDataProviderEvilLogin ctrl_socket("hello world", "test"); | 1260 FtpSocketDataProviderEvilLogin ctrl_socket("hello world", "test"); |
1280 ExecuteTransaction(&ctrl_socket, "ftp://hello%20world:test@host/file", 1, OK); | 1261 ExecuteTransaction(&ctrl_socket, "ftp://hello%20world:test@host/file", OK); |
1281 } | 1262 } |
1282 | 1263 |
1283 TEST_P(FtpNetworkTransactionTest, DownloadTransactionSpaceInPassword) { | 1264 TEST_P(FtpNetworkTransactionTest, DownloadTransactionSpaceInPassword) { |
1284 FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello world"); | 1265 FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello world"); |
1285 ExecuteTransaction(&ctrl_socket, "ftp://test:hello%20world@host/file", 1, OK); | 1266 ExecuteTransaction(&ctrl_socket, "ftp://test:hello%20world@host/file", OK); |
1286 } | 1267 } |
1287 | 1268 |
1288 TEST_P(FtpNetworkTransactionTest, EvilRestartUser) { | 1269 TEST_P(FtpNetworkTransactionTest, EvilRestartUser) { |
1289 FtpSocketDataProvider ctrl_socket1; | 1270 FtpSocketDataProvider ctrl_socket1; |
1290 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, | 1271 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, |
1291 FtpSocketDataProvider::PRE_QUIT, | 1272 FtpSocketDataProvider::PRE_QUIT, |
1292 "530 Login authentication failed\r\n"); | 1273 "530 Login authentication failed\r\n"); |
1293 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); | 1274 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); |
1294 | 1275 |
1295 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 1276 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1350 transaction_.RestartWithAuth( | 1331 transaction_.RestartWithAuth( |
1351 AuthCredentials(base::ASCIIToUTF16("innocent"), | 1332 AuthCredentials(base::ASCIIToUTF16("innocent"), |
1352 base::ASCIIToUTF16("foo\nownz0red")), | 1333 base::ASCIIToUTF16("foo\nownz0red")), |
1353 callback_.callback())); | 1334 callback_.callback())); |
1354 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); | 1335 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); |
1355 } | 1336 } |
1356 | 1337 |
1357 TEST_P(FtpNetworkTransactionTest, Escaping) { | 1338 TEST_P(FtpNetworkTransactionTest, Escaping) { |
1358 FtpSocketDataProviderEscaping ctrl_socket; | 1339 FtpSocketDataProviderEscaping ctrl_socket; |
1359 ExecuteTransaction(&ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", | 1340 ExecuteTransaction(&ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", |
1360 1, OK); | 1341 OK); |
1361 } | 1342 } |
1362 | 1343 |
1363 // Test for http://crbug.com/23794. | 1344 // Test for http://crbug.com/23794. |
1364 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilSize) { | 1345 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilSize) { |
1365 // Try to overflow int64 in the response. | 1346 // Try to overflow int64 in the response. |
1366 FtpSocketDataProviderEvilSize ctrl_socket( | 1347 FtpSocketDataProviderEvilSize ctrl_socket( |
1367 "213 99999999999999999999999999999999\r\n", | 1348 "213 99999999999999999999999999999999\r\n", |
1368 FtpSocketDataProvider::PRE_QUIT); | 1349 FtpSocketDataProvider::PRE_QUIT); |
1369 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); | 1350 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
1370 } | 1351 } |
1371 | 1352 |
1372 // Test for http://crbug.com/36360. | 1353 // Test for http://crbug.com/36360. |
1373 TEST_P(FtpNetworkTransactionTest, DownloadTransactionBigSize) { | 1354 TEST_P(FtpNetworkTransactionTest, DownloadTransactionBigSize) { |
1374 // Pass a valid, but large file size. The transaction should not fail. | 1355 // Pass a valid, but large file size. The transaction should not fail. |
1375 FtpSocketDataProviderEvilSize ctrl_socket( | 1356 FtpSocketDataProviderEvilSize ctrl_socket( |
1376 "213 3204427776\r\n", | 1357 "213 3204427776\r\n", |
1377 FtpSocketDataProvider::PRE_CWD); | 1358 FtpSocketDataProvider::PRE_CWD); |
1378 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); | 1359 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
1379 EXPECT_EQ(3204427776LL, | 1360 EXPECT_EQ(3204427776LL, |
1380 transaction_.GetResponseInfo()->expected_content_size); | 1361 transaction_.GetResponseInfo()->expected_content_size); |
1381 } | 1362 } |
1382 | 1363 |
1383 // Regression test for http://crbug.com/25023. | 1364 // Regression test for http://crbug.com/25023. |
1384 TEST_P(FtpNetworkTransactionTest, CloseConnection) { | 1365 TEST_P(FtpNetworkTransactionTest, CloseConnection) { |
1385 FtpSocketDataProviderCloseConnection ctrl_socket; | 1366 FtpSocketDataProviderCloseConnection ctrl_socket; |
1386 ExecuteTransaction(&ctrl_socket, "ftp://host", 1, ERR_EMPTY_RESPONSE); | 1367 ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_EMPTY_RESPONSE); |
1387 } | 1368 } |
1388 | 1369 |
1389 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionFailUser) { | 1370 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionFailUser) { |
1390 FtpSocketDataProviderDirectoryListing ctrl_socket; | 1371 FtpSocketDataProviderDirectoryListing ctrl_socket; |
1391 // Use unallocated 599 FTP error code to make sure it falls into the generic | 1372 // Use unallocated 599 FTP error code to make sure it falls into the generic |
1392 // ERR_FTP_FAILED bucket. | 1373 // ERR_FTP_FAILED bucket. |
1393 TransactionFailHelper(&ctrl_socket, | 1374 TransactionFailHelper(&ctrl_socket, |
1394 "ftp://host", | 1375 "ftp://host", |
1395 FtpSocketDataProvider::PRE_USER, | 1376 FtpSocketDataProvider::PRE_USER, |
1396 FtpSocketDataProvider::PRE_QUIT, | 1377 FtpSocketDataProvider::PRE_QUIT, |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1456 } | 1437 } |
1457 | 1438 |
1458 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionFailEpsv) { | 1439 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionFailEpsv) { |
1459 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1440 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1460 if (GetFamily() == AF_INET) | 1441 if (GetFamily() == AF_INET) |
1461 return; | 1442 return; |
1462 | 1443 |
1463 FtpSocketDataProviderDirectoryListing ctrl_socket; | 1444 FtpSocketDataProviderDirectoryListing ctrl_socket; |
1464 // Use unallocated 599 FTP error code to make sure it falls into the generic | 1445 // Use unallocated 599 FTP error code to make sure it falls into the generic |
1465 // ERR_FTP_FAILED bucket. | 1446 // ERR_FTP_FAILED bucket. |
1466 TransactionFailHelper(&ctrl_socket, | 1447 TransactionFailHelper( |
1467 "ftp://host", | 1448 &ctrl_socket, "ftp://host", FtpSocketDataProvider::PRE_LIST_EPSV, |
1468 FtpSocketDataProvider::PRE_EPSV, | 1449 FtpSocketDataProvider::PRE_NOPASV, "599 fail\r\n", ERR_FTP_FAILED); |
1469 FtpSocketDataProvider::PRE_NOPASV, | |
1470 "599 fail\r\n", | |
1471 ERR_FTP_FAILED); | |
1472 } | 1450 } |
1473 | 1451 |
1474 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionFailCwd) { | 1452 TEST_P(FtpNetworkTransactionTest, DirectoryTransactionFailCwd) { |
1475 FtpSocketDataProviderDirectoryListing ctrl_socket; | 1453 FtpSocketDataProviderDirectoryListing ctrl_socket; |
1476 // Use unallocated 599 FTP error code to make sure it falls into the generic | 1454 // Use unallocated 599 FTP error code to make sure it falls into the generic |
1477 // ERR_FTP_FAILED bucket. | 1455 // ERR_FTP_FAILED bucket. |
1478 TransactionFailHelper(&ctrl_socket, | 1456 TransactionFailHelper(&ctrl_socket, |
1479 "ftp://host", | 1457 "ftp://host", |
1480 FtpSocketDataProvider::PRE_CWD, | 1458 FtpSocketDataProvider::PRE_CWD, |
1481 FtpSocketDataProvider::PRE_QUIT, | 1459 FtpSocketDataProvider::PRE_QUIT, |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1554 } | 1532 } |
1555 | 1533 |
1556 TEST_P(FtpNetworkTransactionTest, DownloadTransactionFailEpsv) { | 1534 TEST_P(FtpNetworkTransactionTest, DownloadTransactionFailEpsv) { |
1557 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1535 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1558 if (GetFamily() == AF_INET) | 1536 if (GetFamily() == AF_INET) |
1559 return; | 1537 return; |
1560 | 1538 |
1561 FtpSocketDataProviderFileDownload ctrl_socket; | 1539 FtpSocketDataProviderFileDownload ctrl_socket; |
1562 // Use unallocated 599 FTP error code to make sure it falls into the generic | 1540 // Use unallocated 599 FTP error code to make sure it falls into the generic |
1563 // ERR_FTP_FAILED bucket. | 1541 // ERR_FTP_FAILED bucket. |
1564 TransactionFailHelper(&ctrl_socket, | 1542 TransactionFailHelper( |
1565 "ftp://host/file", | 1543 &ctrl_socket, "ftp://host/file", FtpSocketDataProvider::PRE_RETR_EPSV, |
1566 FtpSocketDataProvider::PRE_EPSV, | 1544 FtpSocketDataProvider::PRE_NOPASV, "599 fail\r\n", ERR_FTP_FAILED); |
1567 FtpSocketDataProvider::PRE_NOPASV, | |
1568 "599 fail\r\n", | |
1569 ERR_FTP_FAILED); | |
1570 } | 1545 } |
1571 | 1546 |
1572 TEST_P(FtpNetworkTransactionTest, DownloadTransactionFailRetr) { | 1547 TEST_P(FtpNetworkTransactionTest, DownloadTransactionFailRetr) { |
1573 FtpSocketDataProviderFileDownload ctrl_socket; | 1548 FtpSocketDataProviderFileDownload ctrl_socket; |
1574 // Use unallocated 599 FTP error code to make sure it falls into the generic | 1549 // Use unallocated 599 FTP error code to make sure it falls into the generic |
1575 // ERR_FTP_FAILED bucket. | 1550 // ERR_FTP_FAILED bucket. |
1576 TransactionFailHelper(&ctrl_socket, | 1551 TransactionFailHelper(&ctrl_socket, |
1577 "ftp://host/file", | 1552 "ftp://host/file", |
1578 FtpSocketDataProvider::PRE_RETR, | 1553 FtpSocketDataProvider::PRE_RETR, |
1579 FtpSocketDataProvider::PRE_QUIT, | 1554 FtpSocketDataProvider::PRE_QUIT, |
1580 "599 fail\r\n", | 1555 "599 fail\r\n", |
1581 ERR_FTP_FAILED); | 1556 ERR_FTP_FAILED); |
1582 } | 1557 } |
1583 | 1558 |
1584 TEST_P(FtpNetworkTransactionTest, FileNotFound) { | 1559 TEST_P(FtpNetworkTransactionTest, FileNotFound) { |
1585 FtpSocketDataProviderFileNotFound ctrl_socket; | 1560 FtpSocketDataProviderFileNotFound ctrl_socket; |
1586 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 2, ERR_FTP_FAILED); | 1561 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_FTP_FAILED); |
1587 } | 1562 } |
1588 | 1563 |
1589 // Test for http://crbug.com/38845. | 1564 // Test for http://crbug.com/38845. |
1590 TEST_P(FtpNetworkTransactionTest, ZeroLengthDirInPWD) { | 1565 TEST_P(FtpNetworkTransactionTest, ZeroLengthDirInPWD) { |
1591 FtpSocketDataProviderFileDownload ctrl_socket; | 1566 FtpSocketDataProviderFileDownload ctrl_socket; |
1592 TransactionFailHelper(&ctrl_socket, | 1567 TransactionFailHelper(&ctrl_socket, |
1593 "ftp://host/file", | 1568 "ftp://host/file", |
1594 FtpSocketDataProvider::PRE_PWD, | 1569 FtpSocketDataProvider::PRE_PWD, |
1595 FtpSocketDataProvider::PRE_TYPE, | 1570 FtpSocketDataProvider::PRE_TYPE, |
1596 "257 \"\"\r\n", | 1571 "257 \"\"\r\n", |
1597 OK); | 1572 OK); |
1598 } | 1573 } |
1599 | 1574 |
1600 INSTANTIATE_TEST_CASE_P(FTP, | 1575 INSTANTIATE_TEST_CASE_P(FTP, |
1601 FtpNetworkTransactionTest, | 1576 FtpNetworkTransactionTest, |
1602 ::testing::Values(AF_INET, AF_INET6)); | 1577 ::testing::Values(AF_INET, AF_INET6)); |
1603 | 1578 |
1604 } // namespace net | 1579 } // namespace net |
OLD | NEW |