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 15 matching lines...) Expand all Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |