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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 use_epsv_(true), | 61 use_epsv_(true), |
62 data_type_('I') { | 62 data_type_('I') { |
63 Init(); | 63 Init(); |
64 } | 64 } |
65 | 65 |
66 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 66 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
67 if (InjectFault()) | 67 if (InjectFault()) |
68 return MockWriteResult(ASYNC, data.length()); | 68 return MockWriteResult(ASYNC, data.length()); |
69 switch (state()) { | 69 switch (state()) { |
70 case PRE_USER: | 70 case PRE_USER: |
71 return Verify("USER anonymous\r\n", data, PRE_PASSWD, | 71 return Verify( |
72 "331 Password needed\r\n"); | 72 "USER anonymous\r\n", data, PRE_PASSWD, "331 Password needed\r\n"); |
73 case PRE_PASSWD: | 73 case PRE_PASSWD: { |
74 { | 74 const char* response_one = "230 Welcome\r\n"; |
75 const char* response_one = "230 Welcome\r\n"; | 75 const char* response_multi = "230- One\r\n230- Two\r\n230 Three\r\n"; |
76 const char* response_multi = "230- One\r\n230- Two\r\n230 Three\r\n"; | 76 return Verify("PASS chrome@example.com\r\n", |
77 return Verify("PASS chrome@example.com\r\n", data, PRE_SYST, | 77 data, |
78 multiline_welcome_ ? response_multi : response_one); | 78 PRE_SYST, |
79 } | 79 multiline_welcome_ ? response_multi : response_one); |
| 80 } |
80 case PRE_SYST: | 81 case PRE_SYST: |
81 return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n"); | 82 return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n"); |
82 case PRE_PWD: | 83 case PRE_PWD: |
83 return Verify("PWD\r\n", data, PRE_TYPE, | 84 return Verify("PWD\r\n", |
| 85 data, |
| 86 PRE_TYPE, |
84 "257 \"/\" is your current location\r\n"); | 87 "257 \"/\" is your current location\r\n"); |
85 case PRE_TYPE: | 88 case PRE_TYPE: |
86 return Verify(std::string("TYPE ") + data_type_ + "\r\n", data, | 89 return Verify(std::string("TYPE ") + data_type_ + "\r\n", |
| 90 data, |
87 use_epsv_ ? PRE_EPSV : PRE_PASV, | 91 use_epsv_ ? PRE_EPSV : PRE_PASV, |
88 "200 TYPE set successfully\r\n"); | 92 "200 TYPE set successfully\r\n"); |
89 case PRE_EPSV: | 93 case PRE_EPSV: |
90 return Verify("EPSV\r\n", data, PRE_SIZE, | 94 return Verify("EPSV\r\n", |
| 95 data, |
| 96 PRE_SIZE, |
91 "227 Entering Extended Passive Mode (|||31744|)\r\n"); | 97 "227 Entering Extended Passive Mode (|||31744|)\r\n"); |
92 case PRE_CWD_EPSV: | 98 case PRE_CWD_EPSV: |
93 return Verify("EPSV\r\n", data, PRE_CWD, | 99 return Verify("EPSV\r\n", |
| 100 data, |
| 101 PRE_CWD, |
94 "227 Entering Extended Passive Mode (|||31744|)\r\n"); | 102 "227 Entering Extended Passive Mode (|||31744|)\r\n"); |
95 case PRE_RETR_EPSV: | 103 case PRE_RETR_EPSV: |
96 return Verify("EPSV\r\n", data, PRE_RETR, | 104 return Verify("EPSV\r\n", |
| 105 data, |
| 106 PRE_RETR, |
97 "227 Entering Extended Passive Mode (|||31744|)\r\n"); | 107 "227 Entering Extended Passive Mode (|||31744|)\r\n"); |
98 case PRE_CWD_PASV: | 108 case PRE_CWD_PASV: |
99 return Verify("PASV\r\n", data, PRE_CWD, | 109 return Verify("PASV\r\n", |
| 110 data, |
| 111 PRE_CWD, |
100 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); | 112 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
101 case PRE_RETR_PASV: | 113 case PRE_RETR_PASV: |
102 return Verify("PASV\r\n", data, PRE_RETR, | 114 return Verify("PASV\r\n", |
| 115 data, |
| 116 PRE_RETR, |
103 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); | 117 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
104 case PRE_PASV: | 118 case PRE_PASV: |
105 return Verify("PASV\r\n", data, PRE_SIZE, | 119 return Verify("PASV\r\n", |
| 120 data, |
| 121 PRE_SIZE, |
106 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); | 122 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
107 case PRE_NOPASV: | 123 case PRE_NOPASV: |
108 // Use unallocated 599 FTP error code to make sure it falls into the | 124 // Use unallocated 599 FTP error code to make sure it falls into the |
109 // generic ERR_FTP_FAILED bucket. | 125 // generic ERR_FTP_FAILED bucket. |
110 return Verify("PASV\r\n", data, PRE_QUIT, | 126 return Verify("PASV\r\n", data, PRE_QUIT, "599 fail\r\n"); |
111 "599 fail\r\n"); | |
112 case PRE_QUIT: | 127 case PRE_QUIT: |
113 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); | 128 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); |
114 default: | 129 default: |
115 NOTREACHED() << "State not handled " << state(); | 130 NOTREACHED() << "State not handled " << state(); |
116 return MockWriteResult(ASYNC, ERR_UNEXPECTED); | 131 return MockWriteResult(ASYNC, ERR_UNEXPECTED); |
117 } | 132 } |
118 } | 133 } |
119 | 134 |
120 void InjectFailure(State state, State next_state, const char* response) { | 135 void InjectFailure(State state, State next_state, const char* response) { |
121 DCHECK_EQ(NONE, failure_injection_state_); | 136 DCHECK_EQ(NONE, failure_injection_state_); |
122 DCHECK_NE(NONE, state); | 137 DCHECK_NE(NONE, state); |
123 DCHECK_NE(NONE, next_state); | 138 DCHECK_NE(NONE, next_state); |
124 DCHECK_NE(state, next_state); | 139 DCHECK_NE(state, next_state); |
125 failure_injection_state_ = state; | 140 failure_injection_state_ = state; |
126 failure_injection_next_state_ = next_state; | 141 failure_injection_next_state_ = next_state; |
127 fault_response_ = response; | 142 fault_response_ = response; |
128 } | 143 } |
129 | 144 |
130 State state() const { | 145 State state() const { return state_; } |
131 return state_; | |
132 } | |
133 | 146 |
134 virtual void Reset() OVERRIDE { | 147 virtual void Reset() OVERRIDE { |
135 DynamicSocketDataProvider::Reset(); | 148 DynamicSocketDataProvider::Reset(); |
136 Init(); | 149 Init(); |
137 } | 150 } |
138 | 151 |
139 void set_multiline_welcome(bool multiline) { multiline_welcome_ = multiline; } | 152 void set_multiline_welcome(bool multiline) { multiline_welcome_ = multiline; } |
140 | 153 |
141 bool use_epsv() const { return use_epsv_; } | 154 bool use_epsv() const { return use_epsv_; } |
142 void set_use_epsv(bool use_epsv) { use_epsv_ = use_epsv; } | 155 void set_use_epsv(bool use_epsv) { use_epsv_ = use_epsv; } |
(...skipping 27 matching lines...) Expand all Loading... |
170 SimulateRead(next_read, next_read_length); | 183 SimulateRead(next_read, next_read_length); |
171 return MockWriteResult(ASYNC, data.length()); | 184 return MockWriteResult(ASYNC, data.length()); |
172 } | 185 } |
173 return MockWriteResult(ASYNC, ERR_UNEXPECTED); | 186 return MockWriteResult(ASYNC, ERR_UNEXPECTED); |
174 } | 187 } |
175 | 188 |
176 MockWriteResult Verify(const std::string& expected, | 189 MockWriteResult Verify(const std::string& expected, |
177 const std::string& data, | 190 const std::string& data, |
178 State next_state, | 191 State next_state, |
179 const char* next_read) { | 192 const char* next_read) { |
180 return Verify(expected, data, next_state, | 193 return Verify( |
181 next_read, std::strlen(next_read)); | 194 expected, data, next_state, next_read, std::strlen(next_read)); |
182 } | 195 } |
183 | 196 |
184 | |
185 private: | 197 private: |
186 State state_; | 198 State state_; |
187 State failure_injection_state_; | 199 State failure_injection_state_; |
188 State failure_injection_next_state_; | 200 State failure_injection_next_state_; |
189 const char* fault_response_; | 201 const char* fault_response_; |
190 | 202 |
191 // If true, we will send multiple 230 lines as response after PASS. | 203 // If true, we will send multiple 230 lines as response after PASS. |
192 bool multiline_welcome_; | 204 bool multiline_welcome_; |
193 | 205 |
194 // If true, we will use EPSV command. | 206 // If true, we will use EPSV command. |
195 bool use_epsv_; | 207 bool use_epsv_; |
196 | 208 |
197 // Data type to be used for TYPE command. | 209 // Data type to be used for TYPE command. |
198 char data_type_; | 210 char data_type_; |
199 | 211 |
200 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProvider); | 212 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProvider); |
201 }; | 213 }; |
202 | 214 |
203 class FtpSocketDataProviderDirectoryListing : public FtpSocketDataProvider { | 215 class FtpSocketDataProviderDirectoryListing : public FtpSocketDataProvider { |
204 public: | 216 public: |
205 FtpSocketDataProviderDirectoryListing() { | 217 FtpSocketDataProviderDirectoryListing() {} |
206 } | |
207 | 218 |
208 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 219 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
209 if (InjectFault()) | 220 if (InjectFault()) |
210 return MockWriteResult(ASYNC, data.length()); | 221 return MockWriteResult(ASYNC, data.length()); |
211 switch (state()) { | 222 switch (state()) { |
212 case PRE_SIZE: | 223 case PRE_SIZE: |
213 return Verify("SIZE /\r\n", data, | 224 return Verify("SIZE /\r\n", |
| 225 data, |
214 use_epsv() ? PRE_CWD_EPSV : PRE_CWD_PASV, | 226 use_epsv() ? PRE_CWD_EPSV : PRE_CWD_PASV, |
215 "550 I can only retrieve regular files\r\n"); | 227 "550 I can only retrieve regular files\r\n"); |
216 case PRE_CWD: | 228 case PRE_CWD: |
217 return Verify("CWD /\r\n", data, PRE_LIST, "200 OK\r\n"); | 229 return Verify("CWD /\r\n", data, PRE_LIST, "200 OK\r\n"); |
218 case PRE_LIST: | 230 case PRE_LIST: |
219 return Verify("LIST -l\r\n", data, PRE_QUIT, "200 OK\r\n"); | 231 return Verify("LIST -l\r\n", data, PRE_QUIT, "200 OK\r\n"); |
220 default: | 232 default: |
221 return FtpSocketDataProvider::OnWrite(data); | 233 return FtpSocketDataProvider::OnWrite(data); |
222 } | 234 } |
223 } | 235 } |
224 | 236 |
225 private: | 237 private: |
226 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderDirectoryListing); | 238 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderDirectoryListing); |
227 }; | 239 }; |
228 | 240 |
229 class FtpSocketDataProviderDirectoryListingWithPasvFallback | 241 class FtpSocketDataProviderDirectoryListingWithPasvFallback |
230 : public FtpSocketDataProviderDirectoryListing { | 242 : public FtpSocketDataProviderDirectoryListing { |
231 public: | 243 public: |
232 FtpSocketDataProviderDirectoryListingWithPasvFallback() { | 244 FtpSocketDataProviderDirectoryListingWithPasvFallback() {} |
233 } | |
234 | 245 |
235 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 246 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
236 if (InjectFault()) | 247 if (InjectFault()) |
237 return MockWriteResult(ASYNC, data.length()); | 248 return MockWriteResult(ASYNC, data.length()); |
238 switch (state()) { | 249 switch (state()) { |
239 case PRE_EPSV: | 250 case PRE_EPSV: |
240 return Verify("EPSV\r\n", data, PRE_PASV, | 251 return Verify("EPSV\r\n", data, PRE_PASV, "500 no EPSV for you\r\n"); |
241 "500 no EPSV for you\r\n"); | |
242 case PRE_SIZE: | 252 case PRE_SIZE: |
243 return Verify("SIZE /\r\n", data, PRE_CWD_PASV, | 253 return Verify("SIZE /\r\n", |
| 254 data, |
| 255 PRE_CWD_PASV, |
244 "550 I can only retrieve regular files\r\n"); | 256 "550 I can only retrieve regular files\r\n"); |
245 default: | 257 default: |
246 return FtpSocketDataProviderDirectoryListing::OnWrite(data); | 258 return FtpSocketDataProviderDirectoryListing::OnWrite(data); |
247 } | 259 } |
248 } | 260 } |
249 | 261 |
250 private: | 262 private: |
251 DISALLOW_COPY_AND_ASSIGN( | 263 DISALLOW_COPY_AND_ASSIGN( |
252 FtpSocketDataProviderDirectoryListingWithPasvFallback); | 264 FtpSocketDataProviderDirectoryListingWithPasvFallback); |
253 }; | 265 }; |
254 | 266 |
255 class FtpSocketDataProviderDirectoryListingZeroSize | 267 class FtpSocketDataProviderDirectoryListingZeroSize |
256 : public FtpSocketDataProviderDirectoryListing { | 268 : public FtpSocketDataProviderDirectoryListing { |
257 public: | 269 public: |
258 FtpSocketDataProviderDirectoryListingZeroSize() { | 270 FtpSocketDataProviderDirectoryListingZeroSize() {} |
259 } | |
260 | 271 |
261 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 272 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
262 if (InjectFault()) | 273 if (InjectFault()) |
263 return MockWriteResult(ASYNC, data.length()); | 274 return MockWriteResult(ASYNC, data.length()); |
264 switch (state()) { | 275 switch (state()) { |
265 case PRE_SIZE: | 276 case PRE_SIZE: |
266 return Verify("SIZE /\r\n", data, PRE_CWD, "213 0\r\n"); | 277 return Verify("SIZE /\r\n", data, PRE_CWD, "213 0\r\n"); |
267 default: | 278 default: |
268 return FtpSocketDataProviderDirectoryListing::OnWrite(data); | 279 return FtpSocketDataProviderDirectoryListing::OnWrite(data); |
269 } | 280 } |
270 } | 281 } |
271 | 282 |
272 private: | 283 private: |
273 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderDirectoryListingZeroSize); | 284 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderDirectoryListingZeroSize); |
274 }; | 285 }; |
275 | 286 |
276 class FtpSocketDataProviderVMSDirectoryListing : public FtpSocketDataProvider { | 287 class FtpSocketDataProviderVMSDirectoryListing : public FtpSocketDataProvider { |
277 public: | 288 public: |
278 FtpSocketDataProviderVMSDirectoryListing() { | 289 FtpSocketDataProviderVMSDirectoryListing() {} |
279 } | |
280 | 290 |
281 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 291 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
282 if (InjectFault()) | 292 if (InjectFault()) |
283 return MockWriteResult(ASYNC, data.length()); | 293 return MockWriteResult(ASYNC, data.length()); |
284 switch (state()) { | 294 switch (state()) { |
285 case PRE_SYST: | 295 case PRE_SYST: |
286 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); | 296 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); |
287 case PRE_PWD: | 297 case PRE_PWD: |
288 return Verify("PWD\r\n", data, PRE_TYPE, | 298 return Verify( |
289 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); | 299 "PWD\r\n", data, PRE_TYPE, "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
290 case PRE_EPSV: | 300 case PRE_EPSV: |
291 return Verify("EPSV\r\n", data, PRE_PASV, "500 Invalid command\r\n"); | 301 return Verify("EPSV\r\n", data, PRE_PASV, "500 Invalid command\r\n"); |
292 case PRE_SIZE: | 302 case PRE_SIZE: |
293 return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_CWD_PASV, | 303 return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n", |
| 304 data, |
| 305 PRE_CWD_PASV, |
294 "550 I can only retrieve regular files\r\n"); | 306 "550 I can only retrieve regular files\r\n"); |
295 case PRE_CWD: | 307 case PRE_CWD: |
296 return Verify("CWD ANONYMOUS_ROOT:[dir]\r\n", data, PRE_LIST, | 308 return Verify( |
297 "200 OK\r\n"); | 309 "CWD ANONYMOUS_ROOT:[dir]\r\n", data, PRE_LIST, "200 OK\r\n"); |
298 case PRE_LIST: | 310 case PRE_LIST: |
299 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); | 311 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); |
300 default: | 312 default: |
301 return FtpSocketDataProvider::OnWrite(data); | 313 return FtpSocketDataProvider::OnWrite(data); |
302 } | 314 } |
303 } | 315 } |
304 | 316 |
305 private: | 317 private: |
306 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSDirectoryListing); | 318 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSDirectoryListing); |
307 }; | 319 }; |
308 | 320 |
309 class FtpSocketDataProviderVMSDirectoryListingRootDirectory | 321 class FtpSocketDataProviderVMSDirectoryListingRootDirectory |
310 : public FtpSocketDataProvider { | 322 : public FtpSocketDataProvider { |
311 public: | 323 public: |
312 FtpSocketDataProviderVMSDirectoryListingRootDirectory() { | 324 FtpSocketDataProviderVMSDirectoryListingRootDirectory() {} |
313 } | |
314 | 325 |
315 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 326 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
316 if (InjectFault()) | 327 if (InjectFault()) |
317 return MockWriteResult(ASYNC, data.length()); | 328 return MockWriteResult(ASYNC, data.length()); |
318 switch (state()) { | 329 switch (state()) { |
319 case PRE_SYST: | 330 case PRE_SYST: |
320 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); | 331 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); |
321 case PRE_PWD: | 332 case PRE_PWD: |
322 return Verify("PWD\r\n", data, PRE_TYPE, | 333 return Verify( |
323 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); | 334 "PWD\r\n", data, PRE_TYPE, "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
324 case PRE_EPSV: | 335 case PRE_EPSV: |
325 return Verify("EPSV\r\n", data, PRE_PASV, | 336 return Verify( |
326 "500 EPSV command unknown\r\n"); | 337 "EPSV\r\n", data, PRE_PASV, "500 EPSV command unknown\r\n"); |
327 case PRE_SIZE: | 338 case PRE_SIZE: |
328 return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_CWD_PASV, | 339 return Verify("SIZE ANONYMOUS_ROOT\r\n", |
| 340 data, |
| 341 PRE_CWD_PASV, |
329 "550 I can only retrieve regular files\r\n"); | 342 "550 I can only retrieve regular files\r\n"); |
330 case PRE_CWD: | 343 case PRE_CWD: |
331 return Verify("CWD ANONYMOUS_ROOT:[000000]\r\n", data, PRE_LIST, | 344 return Verify( |
332 "200 OK\r\n"); | 345 "CWD ANONYMOUS_ROOT:[000000]\r\n", data, PRE_LIST, "200 OK\r\n"); |
333 case PRE_LIST: | 346 case PRE_LIST: |
334 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); | 347 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); |
335 default: | 348 default: |
336 return FtpSocketDataProvider::OnWrite(data); | 349 return FtpSocketDataProvider::OnWrite(data); |
337 } | 350 } |
338 } | 351 } |
339 | 352 |
340 private: | 353 private: |
341 DISALLOW_COPY_AND_ASSIGN( | 354 DISALLOW_COPY_AND_ASSIGN( |
342 FtpSocketDataProviderVMSDirectoryListingRootDirectory); | 355 FtpSocketDataProviderVMSDirectoryListingRootDirectory); |
343 }; | 356 }; |
344 | 357 |
345 class FtpSocketDataProviderFileDownloadWithFileTypecode | 358 class FtpSocketDataProviderFileDownloadWithFileTypecode |
346 : public FtpSocketDataProvider { | 359 : public FtpSocketDataProvider { |
347 public: | 360 public: |
348 FtpSocketDataProviderFileDownloadWithFileTypecode() { | 361 FtpSocketDataProviderFileDownloadWithFileTypecode() {} |
349 } | |
350 | 362 |
351 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 363 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
352 if (InjectFault()) | 364 if (InjectFault()) |
353 return MockWriteResult(ASYNC, data.length()); | 365 return MockWriteResult(ASYNC, data.length()); |
354 switch (state()) { | 366 switch (state()) { |
355 case PRE_SIZE: | 367 case PRE_SIZE: |
356 return Verify("SIZE /file\r\n", data, PRE_RETR, | 368 return Verify("SIZE /file\r\n", data, PRE_RETR, "213 18\r\n"); |
357 "213 18\r\n"); | |
358 case PRE_RETR: | 369 case PRE_RETR: |
359 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); | 370 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); |
360 default: | 371 default: |
361 return FtpSocketDataProvider::OnWrite(data); | 372 return FtpSocketDataProvider::OnWrite(data); |
362 } | 373 } |
363 } | 374 } |
364 | 375 |
365 private: | 376 private: |
366 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithFileTypecode); | 377 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithFileTypecode); |
367 }; | 378 }; |
368 | 379 |
369 class FtpSocketDataProviderFileDownload : public FtpSocketDataProvider { | 380 class FtpSocketDataProviderFileDownload : public FtpSocketDataProvider { |
370 public: | 381 public: |
371 FtpSocketDataProviderFileDownload() { | 382 FtpSocketDataProviderFileDownload() {} |
372 } | |
373 | 383 |
374 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 384 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
375 if (InjectFault()) | 385 if (InjectFault()) |
376 return MockWriteResult(ASYNC, data.length()); | 386 return MockWriteResult(ASYNC, data.length()); |
377 switch (state()) { | 387 switch (state()) { |
378 case PRE_SIZE: | 388 case PRE_SIZE: |
379 return Verify("SIZE /file\r\n", data, PRE_CWD, | 389 return Verify("SIZE /file\r\n", data, PRE_CWD, "213 18\r\n"); |
380 "213 18\r\n"); | |
381 case PRE_CWD: | 390 case PRE_CWD: |
382 return Verify("CWD /file\r\n", data, | 391 return Verify("CWD /file\r\n", |
| 392 data, |
383 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, | 393 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
384 "550 Not a directory\r\n"); | 394 "550 Not a directory\r\n"); |
385 case PRE_RETR: | 395 case PRE_RETR: |
386 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); | 396 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); |
387 default: | 397 default: |
388 return FtpSocketDataProvider::OnWrite(data); | 398 return FtpSocketDataProvider::OnWrite(data); |
389 } | 399 } |
390 } | 400 } |
391 | 401 |
392 private: | 402 private: |
393 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownload); | 403 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownload); |
394 }; | 404 }; |
395 | 405 |
396 class FtpSocketDataProviderFileNotFound : public FtpSocketDataProvider { | 406 class FtpSocketDataProviderFileNotFound : public FtpSocketDataProvider { |
397 public: | 407 public: |
398 FtpSocketDataProviderFileNotFound() { | 408 FtpSocketDataProviderFileNotFound() {} |
399 } | |
400 | 409 |
401 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 410 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
402 if (InjectFault()) | 411 if (InjectFault()) |
403 return MockWriteResult(ASYNC, data.length()); | 412 return MockWriteResult(ASYNC, data.length()); |
404 switch (state()) { | 413 switch (state()) { |
405 case PRE_SIZE: | 414 case PRE_SIZE: |
406 return Verify("SIZE /file\r\n", data, | 415 return Verify("SIZE /file\r\n", |
| 416 data, |
407 use_epsv() ? PRE_CWD_EPSV : PRE_CWD_PASV, | 417 use_epsv() ? PRE_CWD_EPSV : PRE_CWD_PASV, |
408 "550 File Not Found\r\n"); | 418 "550 File Not Found\r\n"); |
409 case PRE_CWD: | 419 case PRE_CWD: |
410 return Verify("CWD /file\r\n", data, | 420 return Verify("CWD /file\r\n", |
| 421 data, |
411 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, | 422 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
412 "550 File Not Found\r\n"); | 423 "550 File Not Found\r\n"); |
413 case PRE_RETR: | 424 case PRE_RETR: |
414 return Verify("RETR /file\r\n", data, PRE_QUIT, | 425 return Verify( |
415 "550 File Not Found\r\n"); | 426 "RETR /file\r\n", data, PRE_QUIT, "550 File Not Found\r\n"); |
416 default: | 427 default: |
417 return FtpSocketDataProvider::OnWrite(data); | 428 return FtpSocketDataProvider::OnWrite(data); |
418 } | 429 } |
419 } | 430 } |
420 | 431 |
421 private: | 432 private: |
422 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileNotFound); | 433 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileNotFound); |
423 }; | 434 }; |
424 | 435 |
425 class FtpSocketDataProviderFileDownloadWithPasvFallback | 436 class FtpSocketDataProviderFileDownloadWithPasvFallback |
426 : public FtpSocketDataProviderFileDownload { | 437 : public FtpSocketDataProviderFileDownload { |
427 public: | 438 public: |
428 FtpSocketDataProviderFileDownloadWithPasvFallback() { | 439 FtpSocketDataProviderFileDownloadWithPasvFallback() {} |
429 } | |
430 | 440 |
431 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 441 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
432 if (InjectFault()) | 442 if (InjectFault()) |
433 return MockWriteResult(ASYNC, data.length()); | 443 return MockWriteResult(ASYNC, data.length()); |
434 switch (state()) { | 444 switch (state()) { |
435 case PRE_EPSV: | 445 case PRE_EPSV: |
436 return Verify("EPSV\r\n", data, PRE_PASV, | 446 return Verify("EPSV\r\n", data, PRE_PASV, "500 No can do\r\n"); |
437 "500 No can do\r\n"); | |
438 case PRE_CWD: | 447 case PRE_CWD: |
439 return Verify("CWD /file\r\n", data, PRE_RETR_PASV, | 448 return Verify( |
440 "550 Not a directory\r\n"); | 449 "CWD /file\r\n", data, PRE_RETR_PASV, "550 Not a directory\r\n"); |
441 default: | 450 default: |
442 return FtpSocketDataProviderFileDownload::OnWrite(data); | 451 return FtpSocketDataProviderFileDownload::OnWrite(data); |
443 } | 452 } |
444 } | 453 } |
445 | 454 |
446 private: | 455 private: |
447 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithPasvFallback); | 456 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithPasvFallback); |
448 }; | 457 }; |
449 | 458 |
450 class FtpSocketDataProviderFileDownloadZeroSize | 459 class FtpSocketDataProviderFileDownloadZeroSize |
451 : public FtpSocketDataProviderFileDownload { | 460 : public FtpSocketDataProviderFileDownload { |
452 public: | 461 public: |
453 FtpSocketDataProviderFileDownloadZeroSize() { | 462 FtpSocketDataProviderFileDownloadZeroSize() {} |
454 } | |
455 | 463 |
456 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 464 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
457 if (InjectFault()) | 465 if (InjectFault()) |
458 return MockWriteResult(ASYNC, data.length()); | 466 return MockWriteResult(ASYNC, data.length()); |
459 switch (state()) { | 467 switch (state()) { |
460 case PRE_SIZE: | 468 case PRE_SIZE: |
461 return Verify("SIZE /file\r\n", data, PRE_CWD, | 469 return Verify("SIZE /file\r\n", data, PRE_CWD, "213 0\r\n"); |
462 "213 0\r\n"); | |
463 case PRE_CWD: | 470 case PRE_CWD: |
464 return Verify("CWD /file\r\n", data, | 471 return Verify("CWD /file\r\n", |
| 472 data, |
465 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, | 473 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
466 "550 not a directory\r\n"); | 474 "550 not a directory\r\n"); |
467 default: | 475 default: |
468 return FtpSocketDataProviderFileDownload::OnWrite(data); | 476 return FtpSocketDataProviderFileDownload::OnWrite(data); |
469 } | 477 } |
470 } | 478 } |
471 | 479 |
472 private: | 480 private: |
473 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadZeroSize); | 481 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadZeroSize); |
474 }; | 482 }; |
475 | 483 |
476 class FtpSocketDataProviderFileDownloadCWD451 | 484 class FtpSocketDataProviderFileDownloadCWD451 |
477 : public FtpSocketDataProviderFileDownload { | 485 : public FtpSocketDataProviderFileDownload { |
478 public: | 486 public: |
479 FtpSocketDataProviderFileDownloadCWD451() { | 487 FtpSocketDataProviderFileDownloadCWD451() {} |
480 } | |
481 | 488 |
482 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 489 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
483 if (InjectFault()) | 490 if (InjectFault()) |
484 return MockWriteResult(ASYNC, data.length()); | 491 return MockWriteResult(ASYNC, data.length()); |
485 switch (state()) { | 492 switch (state()) { |
486 case PRE_CWD: | 493 case PRE_CWD: |
487 return Verify("CWD /file\r\n", data, | 494 return Verify("CWD /file\r\n", |
| 495 data, |
488 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, | 496 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
489 "451 not a directory\r\n"); | 497 "451 not a directory\r\n"); |
490 default: | 498 default: |
491 return FtpSocketDataProviderFileDownload::OnWrite(data); | 499 return FtpSocketDataProviderFileDownload::OnWrite(data); |
492 } | 500 } |
493 } | 501 } |
494 | 502 |
495 private: | 503 private: |
496 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadCWD451); | 504 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadCWD451); |
497 }; | 505 }; |
498 | 506 |
499 class FtpSocketDataProviderVMSFileDownload : public FtpSocketDataProvider { | 507 class FtpSocketDataProviderVMSFileDownload : public FtpSocketDataProvider { |
500 public: | 508 public: |
501 FtpSocketDataProviderVMSFileDownload() { | 509 FtpSocketDataProviderVMSFileDownload() {} |
502 } | |
503 | 510 |
504 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 511 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
505 if (InjectFault()) | 512 if (InjectFault()) |
506 return MockWriteResult(ASYNC, data.length()); | 513 return MockWriteResult(ASYNC, data.length()); |
507 switch (state()) { | 514 switch (state()) { |
508 case PRE_SYST: | 515 case PRE_SYST: |
509 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); | 516 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); |
510 case PRE_PWD: | 517 case PRE_PWD: |
511 return Verify("PWD\r\n", data, PRE_TYPE, | 518 return Verify( |
512 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); | 519 "PWD\r\n", data, PRE_TYPE, "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
513 case PRE_EPSV: | 520 case PRE_EPSV: |
514 return Verify("EPSV\r\n", data, PRE_PASV, | 521 return Verify( |
515 "500 EPSV command unknown\r\n"); | 522 "EPSV\r\n", data, PRE_PASV, "500 EPSV command unknown\r\n"); |
516 case PRE_SIZE: | 523 case PRE_SIZE: |
517 return Verify("SIZE ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_CWD, | 524 return Verify("SIZE ANONYMOUS_ROOT:[000000]file\r\n", |
| 525 data, |
| 526 PRE_CWD, |
518 "213 18\r\n"); | 527 "213 18\r\n"); |
519 case PRE_CWD: | 528 case PRE_CWD: |
520 return Verify("CWD ANONYMOUS_ROOT:[file]\r\n", data, PRE_RETR_PASV, | 529 return Verify("CWD ANONYMOUS_ROOT:[file]\r\n", |
| 530 data, |
| 531 PRE_RETR_PASV, |
521 "550 Not a directory\r\n"); | 532 "550 Not a directory\r\n"); |
522 case PRE_RETR: | 533 case PRE_RETR: |
523 return Verify("RETR ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_QUIT, | 534 return Verify("RETR ANONYMOUS_ROOT:[000000]file\r\n", |
| 535 data, |
| 536 PRE_QUIT, |
524 "200 OK\r\n"); | 537 "200 OK\r\n"); |
525 default: | 538 default: |
526 return FtpSocketDataProvider::OnWrite(data); | 539 return FtpSocketDataProvider::OnWrite(data); |
527 } | 540 } |
528 } | 541 } |
529 | 542 |
530 private: | 543 private: |
531 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSFileDownload); | 544 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSFileDownload); |
532 }; | 545 }; |
533 | 546 |
534 class FtpSocketDataProviderEscaping : public FtpSocketDataProviderFileDownload { | 547 class FtpSocketDataProviderEscaping : public FtpSocketDataProviderFileDownload { |
535 public: | 548 public: |
536 FtpSocketDataProviderEscaping() { | 549 FtpSocketDataProviderEscaping() {} |
537 } | |
538 | 550 |
539 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 551 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
540 if (InjectFault()) | 552 if (InjectFault()) |
541 return MockWriteResult(ASYNC, data.length()); | 553 return MockWriteResult(ASYNC, data.length()); |
542 switch (state()) { | 554 switch (state()) { |
543 case PRE_SIZE: | 555 case PRE_SIZE: |
544 return Verify("SIZE / !\"#$%y\200\201\r\n", data, PRE_CWD, | 556 return Verify( |
545 "213 18\r\n"); | 557 "SIZE / !\"#$%y\200\201\r\n", data, PRE_CWD, "213 18\r\n"); |
546 case PRE_CWD: | 558 case PRE_CWD: |
547 return Verify("CWD / !\"#$%y\200\201\r\n", data, | 559 return Verify("CWD / !\"#$%y\200\201\r\n", |
| 560 data, |
548 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, | 561 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
549 "550 Not a directory\r\n"); | 562 "550 Not a directory\r\n"); |
550 case PRE_RETR: | 563 case PRE_RETR: |
551 return Verify("RETR / !\"#$%y\200\201\r\n", data, PRE_QUIT, | 564 return Verify( |
552 "200 OK\r\n"); | 565 "RETR / !\"#$%y\200\201\r\n", data, PRE_QUIT, "200 OK\r\n"); |
553 default: | 566 default: |
554 return FtpSocketDataProviderFileDownload::OnWrite(data); | 567 return FtpSocketDataProviderFileDownload::OnWrite(data); |
555 } | 568 } |
556 } | 569 } |
557 | 570 |
558 private: | 571 private: |
559 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEscaping); | 572 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEscaping); |
560 }; | 573 }; |
561 | 574 |
562 class FtpSocketDataProviderFileDownloadTransferStarting | 575 class FtpSocketDataProviderFileDownloadTransferStarting |
563 : public FtpSocketDataProviderFileDownload { | 576 : public FtpSocketDataProviderFileDownload { |
564 public: | 577 public: |
565 FtpSocketDataProviderFileDownloadTransferStarting() { | 578 FtpSocketDataProviderFileDownloadTransferStarting() {} |
566 } | |
567 | 579 |
568 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 580 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
569 if (InjectFault()) | 581 if (InjectFault()) |
570 return MockWriteResult(ASYNC, data.length()); | 582 return MockWriteResult(ASYNC, data.length()); |
571 switch (state()) { | 583 switch (state()) { |
572 case PRE_RETR: | 584 case PRE_RETR: |
573 return Verify("RETR /file\r\n", data, PRE_QUIT, | 585 return Verify("RETR /file\r\n", |
| 586 data, |
| 587 PRE_QUIT, |
574 "125-Data connection already open.\r\n" | 588 "125-Data connection already open.\r\n" |
575 "125 Transfer starting.\r\n" | 589 "125 Transfer starting.\r\n" |
576 "226 Transfer complete.\r\n"); | 590 "226 Transfer complete.\r\n"); |
577 default: | 591 default: |
578 return FtpSocketDataProviderFileDownload::OnWrite(data); | 592 return FtpSocketDataProviderFileDownload::OnWrite(data); |
579 } | 593 } |
580 } | 594 } |
581 | 595 |
582 private: | 596 private: |
583 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadTransferStarting); | 597 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadTransferStarting); |
584 }; | 598 }; |
585 | 599 |
586 class FtpSocketDataProviderDirectoryListingTransferStarting | 600 class FtpSocketDataProviderDirectoryListingTransferStarting |
587 : public FtpSocketDataProviderDirectoryListing { | 601 : public FtpSocketDataProviderDirectoryListing { |
588 public: | 602 public: |
589 FtpSocketDataProviderDirectoryListingTransferStarting() { | 603 FtpSocketDataProviderDirectoryListingTransferStarting() {} |
590 } | |
591 | 604 |
592 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 605 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
593 if (InjectFault()) | 606 if (InjectFault()) |
594 return MockWriteResult(ASYNC, data.length()); | 607 return MockWriteResult(ASYNC, data.length()); |
595 switch (state()) { | 608 switch (state()) { |
596 case PRE_LIST: | 609 case PRE_LIST: |
597 return Verify("LIST -l\r\n", data, PRE_QUIT, | 610 return Verify("LIST -l\r\n", |
| 611 data, |
| 612 PRE_QUIT, |
598 "125-Data connection already open.\r\n" | 613 "125-Data connection already open.\r\n" |
599 "125 Transfer starting.\r\n" | 614 "125 Transfer starting.\r\n" |
600 "226 Transfer complete.\r\n"); | 615 "226 Transfer complete.\r\n"); |
601 default: | 616 default: |
602 return FtpSocketDataProviderDirectoryListing::OnWrite(data); | 617 return FtpSocketDataProviderDirectoryListing::OnWrite(data); |
603 } | 618 } |
604 } | 619 } |
605 | 620 |
606 private: | 621 private: |
607 DISALLOW_COPY_AND_ASSIGN( | 622 DISALLOW_COPY_AND_ASSIGN( |
608 FtpSocketDataProviderDirectoryListingTransferStarting); | 623 FtpSocketDataProviderDirectoryListingTransferStarting); |
609 }; | 624 }; |
610 | 625 |
611 class FtpSocketDataProviderFileDownloadInvalidResponse | 626 class FtpSocketDataProviderFileDownloadInvalidResponse |
612 : public FtpSocketDataProviderFileDownload { | 627 : public FtpSocketDataProviderFileDownload { |
613 public: | 628 public: |
614 FtpSocketDataProviderFileDownloadInvalidResponse() { | 629 FtpSocketDataProviderFileDownloadInvalidResponse() {} |
615 } | |
616 | 630 |
617 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 631 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
618 if (InjectFault()) | 632 if (InjectFault()) |
619 return MockWriteResult(ASYNC, data.length()); | 633 return MockWriteResult(ASYNC, data.length()); |
620 switch (state()) { | 634 switch (state()) { |
621 case PRE_SIZE: | 635 case PRE_SIZE: |
622 // Use unallocated 599 FTP error code to make sure it falls into the | 636 // Use unallocated 599 FTP error code to make sure it falls into the |
623 // generic ERR_FTP_FAILED bucket. | 637 // generic ERR_FTP_FAILED bucket. |
624 return Verify("SIZE /file\r\n", data, PRE_QUIT, | 638 return Verify("SIZE /file\r\n", |
| 639 data, |
| 640 PRE_QUIT, |
625 "599 Evil Response\r\n" | 641 "599 Evil Response\r\n" |
626 "599 More Evil\r\n"); | 642 "599 More Evil\r\n"); |
627 default: | 643 default: |
628 return FtpSocketDataProviderFileDownload::OnWrite(data); | 644 return FtpSocketDataProviderFileDownload::OnWrite(data); |
629 } | 645 } |
630 } | 646 } |
631 | 647 |
632 private: | 648 private: |
633 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadInvalidResponse); | 649 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadInvalidResponse); |
634 }; | 650 }; |
635 | 651 |
636 class FtpSocketDataProviderEvilEpsv : public FtpSocketDataProviderFileDownload { | 652 class FtpSocketDataProviderEvilEpsv : public FtpSocketDataProviderFileDownload { |
637 public: | 653 public: |
638 FtpSocketDataProviderEvilEpsv(const char* epsv_response, | 654 FtpSocketDataProviderEvilEpsv(const char* epsv_response, State expected_state) |
639 State expected_state) | |
640 : epsv_response_(epsv_response), | 655 : epsv_response_(epsv_response), |
641 epsv_response_length_(std::strlen(epsv_response)), | 656 epsv_response_length_(std::strlen(epsv_response)), |
642 expected_state_(expected_state) {} | 657 expected_state_(expected_state) {} |
643 | 658 |
644 FtpSocketDataProviderEvilEpsv(const char* epsv_response, | 659 FtpSocketDataProviderEvilEpsv(const char* epsv_response, |
645 size_t epsv_response_length, | 660 size_t epsv_response_length, |
646 State expected_state) | 661 State expected_state) |
647 : epsv_response_(epsv_response), | 662 : epsv_response_(epsv_response), |
648 epsv_response_length_(epsv_response_length), | 663 epsv_response_length_(epsv_response_length), |
649 expected_state_(expected_state) {} | 664 expected_state_(expected_state) {} |
650 | 665 |
651 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 666 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
652 if (InjectFault()) | 667 if (InjectFault()) |
653 return MockWriteResult(ASYNC, data.length()); | 668 return MockWriteResult(ASYNC, data.length()); |
654 switch (state()) { | 669 switch (state()) { |
655 case PRE_EPSV: | 670 case PRE_EPSV: |
656 return Verify("EPSV\r\n", data, expected_state_, | 671 return Verify("EPSV\r\n", |
657 epsv_response_, epsv_response_length_); | 672 data, |
| 673 expected_state_, |
| 674 epsv_response_, |
| 675 epsv_response_length_); |
658 default: | 676 default: |
659 return FtpSocketDataProviderFileDownload::OnWrite(data); | 677 return FtpSocketDataProviderFileDownload::OnWrite(data); |
660 } | 678 } |
661 } | 679 } |
662 | 680 |
663 private: | 681 private: |
664 const char* epsv_response_; | 682 const char* epsv_response_; |
665 const size_t epsv_response_length_; | 683 const size_t epsv_response_length_; |
666 const State expected_state_; | 684 const State expected_state_; |
667 | 685 |
668 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilEpsv); | 686 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilEpsv); |
669 }; | 687 }; |
670 | 688 |
671 class FtpSocketDataProviderEvilPasv | 689 class FtpSocketDataProviderEvilPasv |
672 : public FtpSocketDataProviderFileDownloadWithPasvFallback { | 690 : public FtpSocketDataProviderFileDownloadWithPasvFallback { |
673 public: | 691 public: |
674 FtpSocketDataProviderEvilPasv(const char* pasv_response, State expected_state) | 692 FtpSocketDataProviderEvilPasv(const char* pasv_response, State expected_state) |
675 : pasv_response_(pasv_response), | 693 : pasv_response_(pasv_response), expected_state_(expected_state) {} |
676 expected_state_(expected_state) { | |
677 } | |
678 | 694 |
679 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 695 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
680 if (InjectFault()) | 696 if (InjectFault()) |
681 return MockWriteResult(ASYNC, data.length()); | 697 return MockWriteResult(ASYNC, data.length()); |
682 switch (state()) { | 698 switch (state()) { |
683 case PRE_PASV: | 699 case PRE_PASV: |
684 return Verify("PASV\r\n", data, expected_state_, pasv_response_); | 700 return Verify("PASV\r\n", data, expected_state_, pasv_response_); |
685 default: | 701 default: |
686 return FtpSocketDataProviderFileDownloadWithPasvFallback::OnWrite(data); | 702 return FtpSocketDataProviderFileDownloadWithPasvFallback::OnWrite(data); |
687 } | 703 } |
688 } | 704 } |
689 | 705 |
690 private: | 706 private: |
691 const char* pasv_response_; | 707 const char* pasv_response_; |
692 const State expected_state_; | 708 const State expected_state_; |
693 | 709 |
694 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilPasv); | 710 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilPasv); |
695 }; | 711 }; |
696 | 712 |
697 class FtpSocketDataProviderEvilSize : public FtpSocketDataProviderFileDownload { | 713 class FtpSocketDataProviderEvilSize : public FtpSocketDataProviderFileDownload { |
698 public: | 714 public: |
699 FtpSocketDataProviderEvilSize(const char* size_response, State expected_state) | 715 FtpSocketDataProviderEvilSize(const char* size_response, State expected_state) |
700 : size_response_(size_response), | 716 : size_response_(size_response), expected_state_(expected_state) {} |
701 expected_state_(expected_state) { | |
702 } | |
703 | 717 |
704 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 718 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
705 if (InjectFault()) | 719 if (InjectFault()) |
706 return MockWriteResult(ASYNC, data.length()); | 720 return MockWriteResult(ASYNC, data.length()); |
707 switch (state()) { | 721 switch (state()) { |
708 case PRE_SIZE: | 722 case PRE_SIZE: |
709 return Verify("SIZE /file\r\n", data, expected_state_, size_response_); | 723 return Verify("SIZE /file\r\n", data, expected_state_, size_response_); |
710 default: | 724 default: |
711 return FtpSocketDataProviderFileDownload::OnWrite(data); | 725 return FtpSocketDataProviderFileDownload::OnWrite(data); |
712 } | 726 } |
713 } | 727 } |
714 | 728 |
715 private: | 729 private: |
716 const char* size_response_; | 730 const char* size_response_; |
717 const State expected_state_; | 731 const State expected_state_; |
718 | 732 |
719 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilSize); | 733 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilSize); |
720 }; | 734 }; |
721 | 735 |
722 class FtpSocketDataProviderEvilLogin | 736 class FtpSocketDataProviderEvilLogin |
723 : public FtpSocketDataProviderFileDownload { | 737 : public FtpSocketDataProviderFileDownload { |
724 public: | 738 public: |
725 FtpSocketDataProviderEvilLogin(const char* expected_user, | 739 FtpSocketDataProviderEvilLogin(const char* expected_user, |
726 const char* expected_password) | 740 const char* expected_password) |
727 : expected_user_(expected_user), | 741 : expected_user_(expected_user), expected_password_(expected_password) {} |
728 expected_password_(expected_password) { | |
729 } | |
730 | 742 |
731 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 743 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
732 if (InjectFault()) | 744 if (InjectFault()) |
733 return MockWriteResult(ASYNC, data.length()); | 745 return MockWriteResult(ASYNC, data.length()); |
734 switch (state()) { | 746 switch (state()) { |
735 case PRE_USER: | 747 case PRE_USER: |
736 return Verify(std::string("USER ") + expected_user_ + "\r\n", data, | 748 return Verify(std::string("USER ") + expected_user_ + "\r\n", |
737 PRE_PASSWD, "331 Password needed\r\n"); | 749 data, |
| 750 PRE_PASSWD, |
| 751 "331 Password needed\r\n"); |
738 case PRE_PASSWD: | 752 case PRE_PASSWD: |
739 return Verify(std::string("PASS ") + expected_password_ + "\r\n", data, | 753 return Verify(std::string("PASS ") + expected_password_ + "\r\n", |
740 PRE_SYST, "230 Welcome\r\n"); | 754 data, |
| 755 PRE_SYST, |
| 756 "230 Welcome\r\n"); |
741 default: | 757 default: |
742 return FtpSocketDataProviderFileDownload::OnWrite(data); | 758 return FtpSocketDataProviderFileDownload::OnWrite(data); |
743 } | 759 } |
744 } | 760 } |
745 | 761 |
746 private: | 762 private: |
747 const char* expected_user_; | 763 const char* expected_user_; |
748 const char* expected_password_; | 764 const char* expected_password_; |
749 | 765 |
750 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilLogin); | 766 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilLogin); |
751 }; | 767 }; |
752 | 768 |
753 class FtpSocketDataProviderCloseConnection : public FtpSocketDataProvider { | 769 class FtpSocketDataProviderCloseConnection : public FtpSocketDataProvider { |
754 public: | 770 public: |
755 FtpSocketDataProviderCloseConnection() { | 771 FtpSocketDataProviderCloseConnection() {} |
756 } | |
757 | 772 |
758 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | 773 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { |
759 if (InjectFault()) | 774 if (InjectFault()) |
760 return MockWriteResult(ASYNC, data.length()); | 775 return MockWriteResult(ASYNC, data.length()); |
761 switch (state()) { | 776 switch (state()) { |
762 case PRE_USER: | 777 case PRE_USER: |
763 return Verify("USER anonymous\r\n", data, | 778 return Verify("USER anonymous\r\n", data, PRE_QUIT, ""); |
764 PRE_QUIT, ""); | |
765 default: | 779 default: |
766 return FtpSocketDataProvider::OnWrite(data); | 780 return FtpSocketDataProvider::OnWrite(data); |
767 } | 781 } |
768 } | 782 } |
769 | 783 |
770 private: | 784 private: |
771 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderCloseConnection); | 785 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderCloseConnection); |
772 }; | 786 }; |
773 | 787 |
774 class FtpNetworkTransactionTest | 788 class FtpNetworkTransactionTest : public PlatformTest, |
775 : public PlatformTest, | 789 public ::testing::WithParamInterface<int> { |
776 public ::testing::WithParamInterface<int> { | |
777 public: | 790 public: |
778 FtpNetworkTransactionTest() | 791 FtpNetworkTransactionTest() |
779 : host_resolver_(new MockHostResolver), | 792 : host_resolver_(new MockHostResolver), |
780 session_(new FtpNetworkSession(host_resolver_.get())), | 793 session_(new FtpNetworkSession(host_resolver_.get())), |
781 transaction_(session_.get(), &mock_socket_factory_) { | 794 transaction_(session_.get(), &mock_socket_factory_) { |
782 scoped_refptr<RuleBasedHostResolverProc> rules( | 795 scoped_refptr<RuleBasedHostResolverProc> rules( |
783 new RuleBasedHostResolverProc(NULL)); | 796 new RuleBasedHostResolverProc(NULL)); |
784 if (GetFamily() == AF_INET) { | 797 if (GetFamily() == AF_INET) { |
785 rules->AddIPLiteralRule("*", "127.0.0.1", "127.0.0.1"); | 798 rules->AddIPLiteralRule("*", "127.0.0.1", "127.0.0.1"); |
786 } else if (GetFamily() == AF_INET6) { | 799 } else if (GetFamily() == AF_INET6) { |
787 rules->AddIPLiteralRule("*", "::1", "::1"); | 800 rules->AddIPLiteralRule("*", "::1", "::1"); |
788 } else { | 801 } else { |
789 NOTREACHED(); | 802 NOTREACHED(); |
790 } | 803 } |
791 host_resolver_->set_rules(rules.get()); | 804 host_resolver_->set_rules(rules.get()); |
792 } | 805 } |
793 | 806 |
794 protected: | 807 protected: |
795 // Accessor to make code refactoring-friendly, e.g. when we change the way | 808 // Accessor to make code refactoring-friendly, e.g. when we change the way |
796 // parameters are passed (like more parameters). | 809 // parameters are passed (like more parameters). |
797 int GetFamily() { | 810 int GetFamily() { return GetParam(); } |
798 return GetParam(); | |
799 } | |
800 | 811 |
801 FtpRequestInfo GetRequestInfo(const std::string& url) { | 812 FtpRequestInfo GetRequestInfo(const std::string& url) { |
802 FtpRequestInfo info; | 813 FtpRequestInfo info; |
803 info.url = GURL(url); | 814 info.url = GURL(url); |
804 return info; | 815 return info; |
805 } | 816 } |
806 | 817 |
807 void ExecuteTransaction(FtpSocketDataProvider* ctrl_socket, | 818 void ExecuteTransaction(FtpSocketDataProvider* ctrl_socket, |
808 const char* request, | 819 const char* request, |
809 int data_socket, | 820 int data_socket, |
810 int expected_result) { | 821 int expected_result) { |
811 // Expect EPSV usage for non-IPv4 control connections. | 822 // Expect EPSV usage for non-IPv4 control connections. |
812 ctrl_socket->set_use_epsv((GetFamily() != AF_INET)); | 823 ctrl_socket->set_use_epsv((GetFamily() != AF_INET)); |
813 | 824 |
814 mock_socket_factory_.AddSocketDataProvider(ctrl_socket); | 825 mock_socket_factory_.AddSocketDataProvider(ctrl_socket); |
815 | 826 |
816 std::string mock_data("mock-data"); | 827 std::string mock_data("mock-data"); |
817 MockRead data_reads[] = { | 828 MockRead data_reads[] = { |
818 // Usually FTP servers close the data connection after the entire data has | 829 // Usually FTP servers close the data connection after the entire data |
819 // been received. | 830 // has |
820 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 831 // been received. |
821 MockRead(mock_data.c_str()), | 832 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 833 MockRead(mock_data.c_str()), |
822 }; | 834 }; |
823 | 835 |
824 ScopedVector<StaticSocketDataProvider> data_sockets; | 836 ScopedVector<StaticSocketDataProvider> data_sockets; |
825 data_sockets.reserve(data_socket); | 837 data_sockets.reserve(data_socket); |
826 for (int i = 0; i < data_socket + 1; i++) { | 838 for (int i = 0; i < data_socket + 1; i++) { |
827 // We only read from one data socket, other ones are dummy. | 839 // We only read from one data socket, other ones are dummy. |
828 if (i == data_socket) { | 840 if (i == data_socket) { |
829 data_sockets.push_back(new StaticSocketDataProvider( | 841 data_sockets.push_back(new StaticSocketDataProvider( |
830 data_reads, arraysize(data_reads), NULL, 0)); | 842 data_reads, arraysize(data_reads), NULL, 0)); |
831 } else { | 843 } else { |
832 data_sockets.push_back(new StaticSocketDataProvider); | 844 data_sockets.push_back(new StaticSocketDataProvider); |
833 } | 845 } |
834 mock_socket_factory_.AddSocketDataProvider(data_sockets[i]); | 846 mock_socket_factory_.AddSocketDataProvider(data_sockets[i]); |
835 } | 847 } |
836 | 848 |
837 FtpRequestInfo request_info = GetRequestInfo(request); | 849 FtpRequestInfo request_info = GetRequestInfo(request); |
838 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 850 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
839 ASSERT_EQ(ERR_IO_PENDING, | 851 ASSERT_EQ( |
840 transaction_.Start(&request_info, callback_.callback(), | 852 ERR_IO_PENDING, |
841 BoundNetLog())); | 853 transaction_.Start(&request_info, callback_.callback(), BoundNetLog())); |
842 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 854 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
843 ASSERT_EQ(expected_result, callback_.WaitForResult()); | 855 ASSERT_EQ(expected_result, callback_.WaitForResult()); |
844 if (expected_result == OK) { | 856 if (expected_result == OK) { |
845 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); | 857 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); |
846 memset(io_buffer->data(), 0, kBufferSize); | 858 memset(io_buffer->data(), 0, kBufferSize); |
847 ASSERT_EQ(ERR_IO_PENDING, | 859 ASSERT_EQ(ERR_IO_PENDING, |
848 transaction_.Read(io_buffer.get(), kBufferSize, | 860 transaction_.Read( |
849 callback_.callback())); | 861 io_buffer.get(), kBufferSize, callback_.callback())); |
850 ASSERT_EQ(static_cast<int>(mock_data.length()), | 862 ASSERT_EQ(static_cast<int>(mock_data.length()), |
851 callback_.WaitForResult()); | 863 callback_.WaitForResult()); |
852 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); | 864 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); |
853 | 865 |
854 // Do another Read to detect that the data socket is now closed. | 866 // Do another Read to detect that the data socket is now closed. |
855 int rv = transaction_.Read(io_buffer.get(), kBufferSize, | 867 int rv = |
856 callback_.callback()); | 868 transaction_.Read(io_buffer.get(), kBufferSize, callback_.callback()); |
857 if (rv == ERR_IO_PENDING) { | 869 if (rv == ERR_IO_PENDING) { |
858 EXPECT_EQ(0, callback_.WaitForResult()); | 870 EXPECT_EQ(0, callback_.WaitForResult()); |
859 } else { | 871 } else { |
860 EXPECT_EQ(0, rv); | 872 EXPECT_EQ(0, rv); |
861 } | 873 } |
862 } | 874 } |
863 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket->state()); | 875 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket->state()); |
864 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 876 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
865 } | 877 } |
866 | 878 |
(...skipping 15 matching lines...) Expand all Loading... |
882 }; | 894 }; |
883 | 895 |
884 TEST_P(FtpNetworkTransactionTest, FailedLookup) { | 896 TEST_P(FtpNetworkTransactionTest, FailedLookup) { |
885 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); | 897 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); |
886 scoped_refptr<RuleBasedHostResolverProc> rules( | 898 scoped_refptr<RuleBasedHostResolverProc> rules( |
887 new RuleBasedHostResolverProc(NULL)); | 899 new RuleBasedHostResolverProc(NULL)); |
888 rules->AddSimulatedFailure("badhost"); | 900 rules->AddSimulatedFailure("badhost"); |
889 host_resolver_->set_rules(rules.get()); | 901 host_resolver_->set_rules(rules.get()); |
890 | 902 |
891 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 903 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
892 ASSERT_EQ(ERR_IO_PENDING, | 904 ASSERT_EQ( |
893 transaction_.Start(&request_info, callback_.callback(), | 905 ERR_IO_PENDING, |
894 BoundNetLog())); | 906 transaction_.Start(&request_info, callback_.callback(), BoundNetLog())); |
895 ASSERT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); | 907 ASSERT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); |
896 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 908 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
897 } | 909 } |
898 | 910 |
899 // Check that when determining the host, the square brackets decorating IPv6 | 911 // Check that when determining the host, the square brackets decorating IPv6 |
900 // literals in URLs are stripped. | 912 // literals in URLs are stripped. |
901 TEST_P(FtpNetworkTransactionTest, StripBracketsFromIPv6Literals) { | 913 TEST_P(FtpNetworkTransactionTest, StripBracketsFromIPv6Literals) { |
902 // This test only makes sense for IPv6 connections. | 914 // This test only makes sense for IPv6 connections. |
903 if (GetFamily() != AF_INET6) | 915 if (GetFamily() != AF_INET6) |
904 return; | 916 return; |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1102 FtpSocketDataProvider::PRE_QUIT); | 1114 FtpSocketDataProvider::PRE_QUIT); |
1103 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); | 1115 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); |
1104 } | 1116 } |
1105 | 1117 |
1106 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafeHost) { | 1118 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafeHost) { |
1107 FtpSocketDataProviderEvilPasv ctrl_socket( | 1119 FtpSocketDataProviderEvilPasv ctrl_socket( |
1108 "227 Portscan (10,1,2,3,123,456)\r\n", FtpSocketDataProvider::PRE_SIZE); | 1120 "227 Portscan (10,1,2,3,123,456)\r\n", FtpSocketDataProvider::PRE_SIZE); |
1109 ctrl_socket.set_use_epsv(GetFamily() != AF_INET); | 1121 ctrl_socket.set_use_epsv(GetFamily() != AF_INET); |
1110 std::string mock_data("mock-data"); | 1122 std::string mock_data("mock-data"); |
1111 MockRead data_reads[] = { | 1123 MockRead data_reads[] = { |
1112 MockRead(mock_data.c_str()), | 1124 MockRead(mock_data.c_str()), |
1113 }; | 1125 }; |
1114 StaticSocketDataProvider data_socket1; | 1126 StaticSocketDataProvider data_socket1; |
1115 StaticSocketDataProvider data_socket2(data_reads, arraysize(data_reads), | 1127 StaticSocketDataProvider data_socket2( |
1116 NULL, 0); | 1128 data_reads, arraysize(data_reads), NULL, 0); |
1117 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); | 1129 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); |
1118 mock_socket_factory_.AddSocketDataProvider(&data_socket1); | 1130 mock_socket_factory_.AddSocketDataProvider(&data_socket1); |
1119 mock_socket_factory_.AddSocketDataProvider(&data_socket2); | 1131 mock_socket_factory_.AddSocketDataProvider(&data_socket2); |
1120 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 1132 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
1121 | 1133 |
1122 // Start the transaction. | 1134 // Start the transaction. |
1123 ASSERT_EQ(ERR_IO_PENDING, | 1135 ASSERT_EQ( |
1124 transaction_.Start(&request_info, callback_.callback(), | 1136 ERR_IO_PENDING, |
1125 BoundNetLog())); | 1137 transaction_.Start(&request_info, callback_.callback(), BoundNetLog())); |
1126 ASSERT_EQ(OK, callback_.WaitForResult()); | 1138 ASSERT_EQ(OK, callback_.WaitForResult()); |
1127 | 1139 |
1128 // The transaction fires the callback when we can start reading data. That | 1140 // The transaction fires the callback when we can start reading data. That |
1129 // means that the data socket should be open. | 1141 // means that the data socket should be open. |
1130 MockTCPClientSocket* data_socket = | 1142 MockTCPClientSocket* data_socket = |
1131 static_cast<MockTCPClientSocket*>(transaction_.data_socket_.get()); | 1143 static_cast<MockTCPClientSocket*>(transaction_.data_socket_.get()); |
1132 ASSERT_TRUE(data_socket); | 1144 ASSERT_TRUE(data_socket); |
1133 ASSERT_TRUE(data_socket->IsConnected()); | 1145 ASSERT_TRUE(data_socket->IsConnected()); |
1134 | 1146 |
1135 // Even if the PASV response specified some other address, we connect | 1147 // Even if the PASV response specified some other address, we connect |
1136 // to the address we used for control connection (which could be 127.0.0.1 | 1148 // to the address we used for control connection (which could be 127.0.0.1 |
1137 // or ::1 depending on whether we use IPv6). | 1149 // or ::1 depending on whether we use IPv6). |
1138 for (AddressList::const_iterator it = data_socket->addresses().begin(); | 1150 for (AddressList::const_iterator it = data_socket->addresses().begin(); |
1139 it != data_socket->addresses().end(); ++it) { | 1151 it != data_socket->addresses().end(); |
| 1152 ++it) { |
1140 EXPECT_NE("10.1.2.3", it->ToStringWithoutPort()); | 1153 EXPECT_NE("10.1.2.3", it->ToStringWithoutPort()); |
1141 } | 1154 } |
1142 } | 1155 } |
1143 | 1156 |
1144 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat1) { | 1157 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat1) { |
1145 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1158 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1146 if (GetFamily() == AF_INET) | 1159 if (GetFamily() == AF_INET) |
1147 return; | 1160 return; |
1148 | 1161 |
1149 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22)\r\n", | 1162 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22)\r\n", |
(...skipping 30 matching lines...) Expand all Loading... |
1180 FtpSocketDataProvider::PRE_QUIT); | 1193 FtpSocketDataProvider::PRE_QUIT); |
1181 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); | 1194 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); |
1182 } | 1195 } |
1183 | 1196 |
1184 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat5) { | 1197 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat5) { |
1185 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1198 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1186 if (GetFamily() == AF_INET) | 1199 if (GetFamily() == AF_INET) |
1187 return; | 1200 return; |
1188 | 1201 |
1189 const char response[] = "227 Portscan (\0\0\031773\0)\r\n"; | 1202 const char response[] = "227 Portscan (\0\0\031773\0)\r\n"; |
1190 FtpSocketDataProviderEvilEpsv ctrl_socket(response, sizeof(response)-1, | 1203 FtpSocketDataProviderEvilEpsv ctrl_socket( |
1191 FtpSocketDataProvider::PRE_QUIT); | 1204 response, sizeof(response) - 1, FtpSocketDataProvider::PRE_QUIT); |
1192 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); | 1205 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); |
1193 } | 1206 } |
1194 | 1207 |
1195 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort1) { | 1208 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort1) { |
1196 // This test makes no sense for IPv4 connections (we don't use EPSV there). | 1209 // This test makes no sense for IPv4 connections (we don't use EPSV there). |
1197 if (GetFamily() == AF_INET) | 1210 if (GetFamily() == AF_INET) |
1198 return; | 1211 return; |
1199 | 1212 |
1200 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22|)\r\n", | 1213 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22|)\r\n", |
1201 FtpSocketDataProvider::PRE_QUIT); | 1214 FtpSocketDataProvider::PRE_QUIT); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1285 | 1298 |
1286 TEST_P(FtpNetworkTransactionTest, EvilRestartUser) { | 1299 TEST_P(FtpNetworkTransactionTest, EvilRestartUser) { |
1287 FtpSocketDataProvider ctrl_socket1; | 1300 FtpSocketDataProvider ctrl_socket1; |
1288 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, | 1301 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, |
1289 FtpSocketDataProvider::PRE_QUIT, | 1302 FtpSocketDataProvider::PRE_QUIT, |
1290 "530 Login authentication failed\r\n"); | 1303 "530 Login authentication failed\r\n"); |
1291 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); | 1304 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); |
1292 | 1305 |
1293 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 1306 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
1294 | 1307 |
1295 ASSERT_EQ(ERR_IO_PENDING, | 1308 ASSERT_EQ( |
1296 transaction_.Start(&request_info, callback_.callback(), | 1309 ERR_IO_PENDING, |
1297 BoundNetLog())); | 1310 transaction_.Start(&request_info, callback_.callback(), BoundNetLog())); |
1298 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); | 1311 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); |
1299 | 1312 |
1300 MockRead ctrl_reads[] = { | 1313 MockRead ctrl_reads[] = { |
1301 MockRead("220 host TestFTPd\r\n"), | 1314 MockRead("220 host TestFTPd\r\n"), MockRead("221 Goodbye!\r\n"), |
1302 MockRead("221 Goodbye!\r\n"), | 1315 MockRead(SYNCHRONOUS, OK), |
1303 MockRead(SYNCHRONOUS, OK), | |
1304 }; | 1316 }; |
1305 MockWrite ctrl_writes[] = { | 1317 MockWrite ctrl_writes[] = { |
1306 MockWrite("QUIT\r\n"), | 1318 MockWrite("QUIT\r\n"), |
1307 }; | 1319 }; |
1308 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), | 1320 StaticSocketDataProvider ctrl_socket2( |
1309 ctrl_writes, arraysize(ctrl_writes)); | 1321 ctrl_reads, arraysize(ctrl_reads), ctrl_writes, arraysize(ctrl_writes)); |
1310 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); | 1322 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); |
1311 ASSERT_EQ(ERR_IO_PENDING, | 1323 ASSERT_EQ(ERR_IO_PENDING, |
1312 transaction_.RestartWithAuth( | 1324 transaction_.RestartWithAuth( |
1313 AuthCredentials( | 1325 AuthCredentials(base::ASCIIToUTF16("foo\nownz0red"), |
1314 base::ASCIIToUTF16("foo\nownz0red"), | 1326 base::ASCIIToUTF16("innocent")), |
1315 base::ASCIIToUTF16("innocent")), | |
1316 callback_.callback())); | 1327 callback_.callback())); |
1317 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); | 1328 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); |
1318 } | 1329 } |
1319 | 1330 |
1320 TEST_P(FtpNetworkTransactionTest, EvilRestartPassword) { | 1331 TEST_P(FtpNetworkTransactionTest, EvilRestartPassword) { |
1321 FtpSocketDataProvider ctrl_socket1; | 1332 FtpSocketDataProvider ctrl_socket1; |
1322 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, | 1333 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, |
1323 FtpSocketDataProvider::PRE_QUIT, | 1334 FtpSocketDataProvider::PRE_QUIT, |
1324 "530 Login authentication failed\r\n"); | 1335 "530 Login authentication failed\r\n"); |
1325 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); | 1336 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); |
1326 | 1337 |
1327 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 1338 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
1328 | 1339 |
1329 ASSERT_EQ(ERR_IO_PENDING, | 1340 ASSERT_EQ( |
1330 transaction_.Start(&request_info, callback_.callback(), | 1341 ERR_IO_PENDING, |
1331 BoundNetLog())); | 1342 transaction_.Start(&request_info, callback_.callback(), BoundNetLog())); |
1332 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); | 1343 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); |
1333 | 1344 |
1334 MockRead ctrl_reads[] = { | 1345 MockRead ctrl_reads[] = { |
1335 MockRead("220 host TestFTPd\r\n"), | 1346 MockRead("220 host TestFTPd\r\n"), |
1336 MockRead("331 User okay, send password\r\n"), | 1347 MockRead("331 User okay, send password\r\n"), |
1337 MockRead("221 Goodbye!\r\n"), | 1348 MockRead("221 Goodbye!\r\n"), MockRead(SYNCHRONOUS, OK), |
1338 MockRead(SYNCHRONOUS, OK), | |
1339 }; | 1349 }; |
1340 MockWrite ctrl_writes[] = { | 1350 MockWrite ctrl_writes[] = { |
1341 MockWrite("USER innocent\r\n"), | 1351 MockWrite("USER innocent\r\n"), MockWrite("QUIT\r\n"), |
1342 MockWrite("QUIT\r\n"), | |
1343 }; | 1352 }; |
1344 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), | 1353 StaticSocketDataProvider ctrl_socket2( |
1345 ctrl_writes, arraysize(ctrl_writes)); | 1354 ctrl_reads, arraysize(ctrl_reads), ctrl_writes, arraysize(ctrl_writes)); |
1346 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); | 1355 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); |
1347 ASSERT_EQ(ERR_IO_PENDING, | 1356 ASSERT_EQ(ERR_IO_PENDING, |
1348 transaction_.RestartWithAuth( | 1357 transaction_.RestartWithAuth( |
1349 AuthCredentials(base::ASCIIToUTF16("innocent"), | 1358 AuthCredentials(base::ASCIIToUTF16("innocent"), |
1350 base::ASCIIToUTF16("foo\nownz0red")), | 1359 base::ASCIIToUTF16("foo\nownz0red")), |
1351 callback_.callback())); | 1360 callback_.callback())); |
1352 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); | 1361 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); |
1353 } | 1362 } |
1354 | 1363 |
1355 TEST_P(FtpNetworkTransactionTest, Escaping) { | 1364 TEST_P(FtpNetworkTransactionTest, Escaping) { |
1356 FtpSocketDataProviderEscaping ctrl_socket; | 1365 FtpSocketDataProviderEscaping ctrl_socket; |
1357 ExecuteTransaction(&ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", | 1366 ExecuteTransaction( |
1358 1, OK); | 1367 &ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", 1, OK); |
1359 } | 1368 } |
1360 | 1369 |
1361 // Test for http://crbug.com/23794. | 1370 // Test for http://crbug.com/23794. |
1362 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilSize) { | 1371 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilSize) { |
1363 // Try to overflow int64 in the response. | 1372 // Try to overflow int64 in the response. |
1364 FtpSocketDataProviderEvilSize ctrl_socket( | 1373 FtpSocketDataProviderEvilSize ctrl_socket( |
1365 "213 99999999999999999999999999999999\r\n", | 1374 "213 99999999999999999999999999999999\r\n", |
1366 FtpSocketDataProvider::PRE_QUIT); | 1375 FtpSocketDataProvider::PRE_QUIT); |
1367 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); | 1376 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); |
1368 } | 1377 } |
1369 | 1378 |
1370 // Test for http://crbug.com/36360. | 1379 // Test for http://crbug.com/36360. |
1371 TEST_P(FtpNetworkTransactionTest, DownloadTransactionBigSize) { | 1380 TEST_P(FtpNetworkTransactionTest, DownloadTransactionBigSize) { |
1372 // Pass a valid, but large file size. The transaction should not fail. | 1381 // Pass a valid, but large file size. The transaction should not fail. |
1373 FtpSocketDataProviderEvilSize ctrl_socket( | 1382 FtpSocketDataProviderEvilSize ctrl_socket("213 3204427776\r\n", |
1374 "213 3204427776\r\n", | 1383 FtpSocketDataProvider::PRE_CWD); |
1375 FtpSocketDataProvider::PRE_CWD); | |
1376 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); | 1384 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); |
1377 EXPECT_EQ(3204427776LL, | 1385 EXPECT_EQ(3204427776LL, |
1378 transaction_.GetResponseInfo()->expected_content_size); | 1386 transaction_.GetResponseInfo()->expected_content_size); |
1379 } | 1387 } |
1380 | 1388 |
1381 // Regression test for http://crbug.com/25023. | 1389 // Regression test for http://crbug.com/25023. |
1382 TEST_P(FtpNetworkTransactionTest, CloseConnection) { | 1390 TEST_P(FtpNetworkTransactionTest, CloseConnection) { |
1383 FtpSocketDataProviderCloseConnection ctrl_socket; | 1391 FtpSocketDataProviderCloseConnection ctrl_socket; |
1384 ExecuteTransaction(&ctrl_socket, "ftp://host", 1, ERR_EMPTY_RESPONSE); | 1392 ExecuteTransaction(&ctrl_socket, "ftp://host", 1, ERR_EMPTY_RESPONSE); |
1385 } | 1393 } |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1593 FtpSocketDataProvider::PRE_TYPE, | 1601 FtpSocketDataProvider::PRE_TYPE, |
1594 "257 \"\"\r\n", | 1602 "257 \"\"\r\n", |
1595 OK); | 1603 OK); |
1596 } | 1604 } |
1597 | 1605 |
1598 INSTANTIATE_TEST_CASE_P(FTP, | 1606 INSTANTIATE_TEST_CASE_P(FTP, |
1599 FtpNetworkTransactionTest, | 1607 FtpNetworkTransactionTest, |
1600 ::testing::Values(AF_INET, AF_INET6)); | 1608 ::testing::Values(AF_INET, AF_INET6)); |
1601 | 1609 |
1602 } // namespace net | 1610 } // namespace net |
OLD | NEW |