| 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 |