Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Side by Side Diff: net/ftp/ftp_network_transaction_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698