OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "components/autofill/content/browser/wallet/wallet_client.h" | 5 #include "components/autofill/content/browser/wallet/wallet_client.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 std::vector<std::string> document_ids; | 276 std::vector<std::string> document_ids; |
277 for (size_t i = 0; i < documents.size(); ++i) { | 277 for (size_t i = 0; i < documents.size(); ++i) { |
278 document_ids.push_back(documents[i]->id()); | 278 document_ids.push_back(documents[i]->id()); |
279 } | 279 } |
280 DoAcceptLegalDocuments(document_ids, google_transaction_id); | 280 DoAcceptLegalDocuments(document_ids, google_transaction_id); |
281 } | 281 } |
282 | 282 |
283 void WalletClient::AuthenticateInstrument( | 283 void WalletClient::AuthenticateInstrument( |
284 const std::string& instrument_id, | 284 const std::string& instrument_id, |
285 const std::string& card_verification_number) { | 285 const std::string& card_verification_number) { |
286 if (HasRequestInProgress()) { | |
287 pending_requests_.push(base::Bind(&WalletClient::AuthenticateInstrument, | |
288 base::Unretained(this), | |
289 instrument_id, | |
290 card_verification_number)); | |
291 return; | |
292 } | |
293 | |
294 DCHECK_EQ(NO_PENDING_REQUEST, request_type_); | |
295 request_type_ = AUTHENTICATE_INSTRUMENT; | |
296 | |
297 base::DictionaryValue request_dict; | 286 base::DictionaryValue request_dict; |
298 request_dict.SetString(kApiKeyKey, google_apis::GetAPIKey()); | 287 request_dict.SetString(kApiKeyKey, google_apis::GetAPIKey()); |
299 request_dict.SetString(kRiskParamsKey, delegate_->GetRiskData()); | 288 request_dict.SetString(kRiskParamsKey, delegate_->GetRiskData()); |
300 request_dict.SetString(kInstrumentIdKey, instrument_id); | 289 request_dict.SetString(kInstrumentIdKey, instrument_id); |
301 | 290 |
302 std::string json_payload; | 291 std::string json_payload; |
303 base::JSONWriter::Write(&request_dict, &json_payload); | 292 base::JSONWriter::Write(&request_dict, &json_payload); |
304 | 293 |
305 std::string escaped_card_verification_number = net::EscapeUrlEncodedData( | 294 std::string escaped_card_verification_number = net::EscapeUrlEncodedData( |
306 card_verification_number, true); | 295 card_verification_number, true); |
307 | 296 |
308 std::string post_body = base::StringPrintf( | 297 std::string post_body = base::StringPrintf( |
309 kEscrowCardVerificationNumberFormat, | 298 kEscrowCardVerificationNumberFormat, |
310 net::EscapeUrlEncodedData(json_payload, true).c_str(), | 299 net::EscapeUrlEncodedData(json_payload, true).c_str(), |
311 escaped_card_verification_number.c_str()); | 300 escaped_card_verification_number.c_str()); |
312 | 301 |
313 MakeWalletRequest(GetAuthenticateInstrumentUrl(user_index_), | 302 MakeWalletRequest(GetAuthenticateInstrumentUrl(user_index_), |
314 post_body, | 303 post_body, |
315 kFormEncodedMimeType); | 304 kFormEncodedMimeType, |
| 305 AUTHENTICATE_INSTRUMENT); |
316 } | 306 } |
317 | 307 |
318 void WalletClient::GetFullWallet(const FullWalletRequest& full_wallet_request) { | 308 void WalletClient::GetFullWallet(const FullWalletRequest& full_wallet_request) { |
319 if (HasRequestInProgress()) { | |
320 pending_requests_.push(base::Bind(&WalletClient::GetFullWallet, | |
321 base::Unretained(this), | |
322 full_wallet_request)); | |
323 return; | |
324 } | |
325 | |
326 DCHECK_EQ(NO_PENDING_REQUEST, request_type_); | |
327 request_type_ = GET_FULL_WALLET; | |
328 | |
329 base::DictionaryValue request_dict; | 309 base::DictionaryValue request_dict; |
330 request_dict.SetString(kApiKeyKey, google_apis::GetAPIKey()); | 310 request_dict.SetString(kApiKeyKey, google_apis::GetAPIKey()); |
331 request_dict.SetString(kRiskParamsKey, delegate_->GetRiskData()); | 311 request_dict.SetString(kRiskParamsKey, delegate_->GetRiskData()); |
332 request_dict.SetBoolean(kUseMinimalAddresses, false); | 312 request_dict.SetBoolean(kUseMinimalAddresses, false); |
333 request_dict.SetBoolean(kPhoneNumberRequired, true); | 313 request_dict.SetBoolean(kPhoneNumberRequired, true); |
334 request_dict.SetBoolean(kNewWalletUser, full_wallet_request.new_wallet_user); | 314 request_dict.SetBoolean(kNewWalletUser, full_wallet_request.new_wallet_user); |
335 | 315 |
336 request_dict.SetString(kSelectedInstrumentIdKey, | 316 request_dict.SetString(kSelectedInstrumentIdKey, |
337 full_wallet_request.instrument_id); | 317 full_wallet_request.instrument_id); |
338 request_dict.SetString(kSelectedAddressIdKey, full_wallet_request.address_id); | 318 request_dict.SetString(kSelectedAddressIdKey, full_wallet_request.address_id); |
(...skipping 23 matching lines...) Expand all Loading... |
362 DCHECK_GE(num_bits, kMinBits); | 342 DCHECK_GE(num_bits, kMinBits); |
363 | 343 |
364 std::string post_body = base::StringPrintf( | 344 std::string post_body = base::StringPrintf( |
365 kGetFullWalletRequestFormat, | 345 kGetFullWalletRequestFormat, |
366 net::EscapeUrlEncodedData(json_payload, true).c_str(), | 346 net::EscapeUrlEncodedData(json_payload, true).c_str(), |
367 base::HexEncode(&num_bits, 1).c_str(), | 347 base::HexEncode(&num_bits, 1).c_str(), |
368 base::HexEncode(&(one_time_pad_[0]), one_time_pad_.size()).c_str()); | 348 base::HexEncode(&(one_time_pad_[0]), one_time_pad_.size()).c_str()); |
369 | 349 |
370 MakeWalletRequest(GetGetFullWalletUrl(user_index_), | 350 MakeWalletRequest(GetGetFullWalletUrl(user_index_), |
371 post_body, | 351 post_body, |
372 kFormEncodedMimeType); | 352 kFormEncodedMimeType, |
| 353 GET_FULL_WALLET); |
373 } | 354 } |
374 | 355 |
375 void WalletClient::SaveToWallet(scoped_ptr<Instrument> instrument, | 356 void WalletClient::SaveToWallet( |
376 scoped_ptr<Address> address) { | 357 scoped_ptr<Instrument> instrument, |
| 358 scoped_ptr<Address> address, |
| 359 const WalletItems::MaskedInstrument* reference_instrument, |
| 360 const Address* reference_address) { |
377 DCHECK(instrument || address); | 361 DCHECK(instrument || address); |
378 if (HasRequestInProgress()) { | |
379 pending_requests_.push(base::Bind(&WalletClient::SaveToWallet, | |
380 base::Unretained(this), | |
381 base::Passed(&instrument), | |
382 base::Passed(&address))); | |
383 return; | |
384 } | |
385 | |
386 DCHECK_EQ(NO_PENDING_REQUEST, request_type_); | |
387 request_type_ = SAVE_TO_WALLET; | |
388 | 362 |
389 base::DictionaryValue request_dict; | 363 base::DictionaryValue request_dict; |
390 request_dict.SetString(kApiKeyKey, google_apis::GetAPIKey()); | 364 request_dict.SetString(kApiKeyKey, google_apis::GetAPIKey()); |
391 request_dict.SetString(kRiskParamsKey, delegate_->GetRiskData()); | 365 request_dict.SetString(kRiskParamsKey, delegate_->GetRiskData()); |
392 request_dict.SetString(kMerchantDomainKey, | 366 request_dict.SetString(kMerchantDomainKey, |
393 source_url_.GetWithEmptyPath().spec()); | 367 source_url_.GetWithEmptyPath().spec()); |
394 request_dict.SetBoolean(kUseMinimalAddresses, false); | 368 request_dict.SetBoolean(kUseMinimalAddresses, false); |
395 request_dict.SetBoolean(kPhoneNumberRequired, true); | 369 request_dict.SetBoolean(kPhoneNumberRequired, true); |
396 | 370 |
397 std::string primary_account_number; | 371 std::string primary_account_number; |
398 std::string card_verification_number; | 372 std::string card_verification_number; |
399 if (instrument) { | 373 if (instrument) { |
400 primary_account_number = net::EscapeUrlEncodedData( | 374 primary_account_number = net::EscapeUrlEncodedData( |
401 UTF16ToUTF8(instrument->primary_account_number()), true); | 375 UTF16ToUTF8(instrument->primary_account_number()), true); |
402 card_verification_number = net::EscapeUrlEncodedData( | 376 card_verification_number = net::EscapeUrlEncodedData( |
403 UTF16ToUTF8(instrument->card_verification_number()), true); | 377 UTF16ToUTF8(instrument->card_verification_number()), true); |
404 | 378 |
405 if (instrument->object_id().empty()) { | 379 if (!reference_instrument) { |
406 request_dict.Set(kInstrumentKey, instrument->ToDictionary().release()); | 380 request_dict.Set(kInstrumentKey, instrument->ToDictionary().release()); |
407 request_dict.SetString(kInstrumentPhoneNumberKey, | 381 request_dict.SetString(kInstrumentPhoneNumberKey, |
408 instrument->address()->phone_number()); | 382 instrument->address()->phone_number()); |
409 } else { | 383 } else { |
410 DCHECK(instrument->address() || | 384 DCHECK(!reference_instrument->object_id().empty()); |
411 (instrument->expiration_month() > 0 && | 385 |
412 instrument->expiration_year() > 0)); | 386 int new_month = instrument->expiration_month(); |
| 387 int new_year = instrument->expiration_year(); |
| 388 bool expiration_date_changed = |
| 389 new_month != reference_instrument->expiration_month() || |
| 390 new_year != reference_instrument->expiration_year(); |
| 391 |
| 392 DCHECK(instrument->address() || expiration_date_changed); |
413 | 393 |
414 request_dict.SetString(kUpgradedInstrumentIdKey, | 394 request_dict.SetString(kUpgradedInstrumentIdKey, |
415 instrument->object_id()); | 395 reference_instrument->object_id()); |
416 | 396 |
417 if (instrument->address()) { | 397 if (instrument->address()) { |
418 request_dict.SetString(kInstrumentPhoneNumberKey, | 398 request_dict.SetString(kInstrumentPhoneNumberKey, |
419 instrument->address()->phone_number()); | 399 instrument->address()->phone_number()); |
420 request_dict.Set( | 400 request_dict.Set( |
421 kUpgradedBillingAddressKey, | 401 kUpgradedBillingAddressKey, |
422 instrument->address()->ToDictionaryWithoutID().release()); | 402 instrument->address()->ToDictionaryWithoutID().release()); |
423 } | 403 } |
424 | 404 |
425 if (instrument->expiration_month() > 0 && | 405 if (expiration_date_changed) { |
426 instrument->expiration_year() > 0) { | 406 // Updating expiration date requires a CVC. |
427 DCHECK(!instrument->card_verification_number().empty()); | 407 DCHECK(!instrument->card_verification_number().empty()); |
428 request_dict.SetInteger(kInstrumentExpMonthKey, | 408 request_dict.SetInteger(kInstrumentExpMonthKey, |
429 instrument->expiration_month()); | 409 instrument->expiration_month()); |
430 request_dict.SetInteger(kInstrumentExpYearKey, | 410 request_dict.SetInteger(kInstrumentExpYearKey, |
431 instrument->expiration_year()); | 411 instrument->expiration_year()); |
432 } | 412 } |
433 | 413 |
434 if (request_dict.HasKey(kInstrumentKey)) | 414 if (request_dict.HasKey(kInstrumentKey)) |
435 request_dict.SetString(kInstrumentType, "CREDIT_CARD"); | 415 request_dict.SetString(kInstrumentType, "CREDIT_CARD"); |
436 } | 416 } |
437 } | 417 } |
438 if (address) { | 418 if (address) { |
| 419 if (reference_address) { |
| 420 address->set_object_id(reference_address->object_id()); |
| 421 DCHECK(!address->object_id().empty()); |
| 422 } |
439 request_dict.Set(kShippingAddressKey, | 423 request_dict.Set(kShippingAddressKey, |
440 address->ToDictionaryWithID().release()); | 424 address->ToDictionaryWithID().release()); |
441 } | 425 } |
442 | 426 |
443 std::string json_payload; | 427 std::string json_payload; |
444 base::JSONWriter::Write(&request_dict, &json_payload); | 428 base::JSONWriter::Write(&request_dict, &json_payload); |
445 | 429 |
446 if (!card_verification_number.empty()) { | 430 if (!card_verification_number.empty()) { |
447 std::string post_body; | 431 std::string post_body; |
448 if (!primary_account_number.empty()) { | 432 if (!primary_account_number.empty()) { |
449 post_body = base::StringPrintf( | 433 post_body = base::StringPrintf( |
450 kEscrowNewInstrumentFormat, | 434 kEscrowNewInstrumentFormat, |
451 net::EscapeUrlEncodedData(json_payload, true).c_str(), | 435 net::EscapeUrlEncodedData(json_payload, true).c_str(), |
452 card_verification_number.c_str(), | 436 card_verification_number.c_str(), |
453 primary_account_number.c_str()); | 437 primary_account_number.c_str()); |
454 } else { | 438 } else { |
455 post_body = base::StringPrintf( | 439 post_body = base::StringPrintf( |
456 kEscrowCardVerificationNumberFormat, | 440 kEscrowCardVerificationNumberFormat, |
457 net::EscapeUrlEncodedData(json_payload, true).c_str(), | 441 net::EscapeUrlEncodedData(json_payload, true).c_str(), |
458 card_verification_number.c_str()); | 442 card_verification_number.c_str()); |
459 } | 443 } |
460 MakeWalletRequest(GetSaveToWalletUrl(user_index_), | 444 MakeWalletRequest(GetSaveToWalletUrl(user_index_), |
461 post_body, | 445 post_body, |
462 kFormEncodedMimeType); | 446 kFormEncodedMimeType, |
| 447 SAVE_TO_WALLET); |
463 } else { | 448 } else { |
464 MakeWalletRequest(GetSaveToWalletNoEscrowUrl(user_index_), | 449 MakeWalletRequest(GetSaveToWalletNoEscrowUrl(user_index_), |
465 json_payload, | 450 json_payload, |
466 kJsonMimeType); | 451 kJsonMimeType, |
| 452 SAVE_TO_WALLET); |
467 } | 453 } |
468 } | 454 } |
469 | 455 |
470 void WalletClient::GetWalletItems() { | 456 void WalletClient::GetWalletItems() { |
471 if (HasRequestInProgress()) { | |
472 pending_requests_.push(base::Bind(&WalletClient::GetWalletItems, | |
473 base::Unretained(this))); | |
474 return; | |
475 } | |
476 | |
477 DCHECK_EQ(NO_PENDING_REQUEST, request_type_); | |
478 request_type_ = GET_WALLET_ITEMS; | |
479 | |
480 base::DictionaryValue request_dict; | 457 base::DictionaryValue request_dict; |
481 request_dict.SetString(kApiKeyKey, google_apis::GetAPIKey()); | 458 request_dict.SetString(kApiKeyKey, google_apis::GetAPIKey()); |
482 request_dict.SetString(kMerchantDomainKey, | 459 request_dict.SetString(kMerchantDomainKey, |
483 source_url_.GetWithEmptyPath().spec()); | 460 source_url_.GetWithEmptyPath().spec()); |
484 request_dict.SetBoolean(kShippingAddressRequired, | 461 request_dict.SetBoolean(kShippingAddressRequired, |
485 delegate_->IsShippingAddressRequired()); | 462 delegate_->IsShippingAddressRequired()); |
486 request_dict.SetBoolean(kUseMinimalAddresses, false); | 463 request_dict.SetBoolean(kUseMinimalAddresses, false); |
487 request_dict.SetBoolean(kPhoneNumberRequired, true); | 464 request_dict.SetBoolean(kPhoneNumberRequired, true); |
488 | 465 |
489 std::string post_body; | 466 std::string post_body; |
490 base::JSONWriter::Write(&request_dict, &post_body); | 467 base::JSONWriter::Write(&request_dict, &post_body); |
491 | 468 |
492 MakeWalletRequest(GetGetWalletItemsUrl(user_index_), | 469 MakeWalletRequest(GetGetWalletItemsUrl(user_index_), |
493 post_body, | 470 post_body, |
494 kJsonMimeType); | 471 kJsonMimeType, |
| 472 GET_WALLET_ITEMS); |
495 } | 473 } |
496 | 474 |
497 bool WalletClient::HasRequestInProgress() const { | 475 bool WalletClient::HasRequestInProgress() const { |
498 return request_; | 476 return request_; |
499 } | 477 } |
500 | 478 |
501 void WalletClient::CancelRequests() { | 479 void WalletClient::CancelRequests() { |
502 request_.reset(); | 480 request_.reset(); |
503 request_type_ = NO_PENDING_REQUEST; | 481 request_type_ = NO_PENDING_REQUEST; |
504 while (!pending_requests_.empty()) { | 482 while (!pending_requests_.empty()) { |
505 pending_requests_.pop(); | 483 pending_requests_.pop(); |
506 } | 484 } |
507 } | 485 } |
508 | 486 |
509 void WalletClient::DoAcceptLegalDocuments( | 487 void WalletClient::DoAcceptLegalDocuments( |
510 const std::vector<std::string>& document_ids, | 488 const std::vector<std::string>& document_ids, |
511 const std::string& google_transaction_id) { | 489 const std::string& google_transaction_id) { |
512 if (HasRequestInProgress()) { | |
513 pending_requests_.push(base::Bind(&WalletClient::DoAcceptLegalDocuments, | |
514 base::Unretained(this), | |
515 document_ids, | |
516 google_transaction_id)); | |
517 return; | |
518 } | |
519 | |
520 DCHECK_EQ(NO_PENDING_REQUEST, request_type_); | |
521 request_type_ = ACCEPT_LEGAL_DOCUMENTS; | |
522 | |
523 base::DictionaryValue request_dict; | 490 base::DictionaryValue request_dict; |
524 request_dict.SetString(kApiKeyKey, google_apis::GetAPIKey()); | 491 request_dict.SetString(kApiKeyKey, google_apis::GetAPIKey()); |
525 request_dict.SetString(kGoogleTransactionIdKey, google_transaction_id); | 492 request_dict.SetString(kGoogleTransactionIdKey, google_transaction_id); |
526 request_dict.SetString(kMerchantDomainKey, | 493 request_dict.SetString(kMerchantDomainKey, |
527 source_url_.GetWithEmptyPath().spec()); | 494 source_url_.GetWithEmptyPath().spec()); |
528 scoped_ptr<base::ListValue> docs_list(new base::ListValue()); | 495 scoped_ptr<base::ListValue> docs_list(new base::ListValue()); |
529 for (std::vector<std::string>::const_iterator it = document_ids.begin(); | 496 for (std::vector<std::string>::const_iterator it = document_ids.begin(); |
530 it != document_ids.end(); ++it) { | 497 it != document_ids.end(); ++it) { |
531 if (!it->empty()) | 498 if (!it->empty()) |
532 docs_list->AppendString(*it); | 499 docs_list->AppendString(*it); |
533 } | 500 } |
534 request_dict.Set(kAcceptedLegalDocumentKey, docs_list.release()); | 501 request_dict.Set(kAcceptedLegalDocumentKey, docs_list.release()); |
535 | 502 |
536 std::string post_body; | 503 std::string post_body; |
537 base::JSONWriter::Write(&request_dict, &post_body); | 504 base::JSONWriter::Write(&request_dict, &post_body); |
538 | 505 |
539 MakeWalletRequest(GetAcceptLegalDocumentsUrl(user_index_), | 506 MakeWalletRequest(GetAcceptLegalDocumentsUrl(user_index_), |
540 post_body, | 507 post_body, |
541 kJsonMimeType); | 508 kJsonMimeType, |
| 509 ACCEPT_LEGAL_DOCUMENTS); |
542 } | 510 } |
543 | 511 |
544 void WalletClient::MakeWalletRequest(const GURL& url, | 512 void WalletClient::MakeWalletRequest(const GURL& url, |
545 const std::string& post_body, | 513 const std::string& post_body, |
546 const std::string& mime_type) { | 514 const std::string& mime_type, |
547 DCHECK(!HasRequestInProgress()); | 515 RequestType request_type) { |
| 516 if (HasRequestInProgress()) { |
| 517 pending_requests_.push(base::Bind(&WalletClient::MakeWalletRequest, |
| 518 base::Unretained(this), |
| 519 url, |
| 520 post_body, |
| 521 mime_type, |
| 522 request_type)); |
| 523 return; |
| 524 } |
| 525 |
| 526 DCHECK_EQ(request_type_, NO_PENDING_REQUEST); |
| 527 request_type_ = request_type; |
548 | 528 |
549 request_.reset(net::URLFetcher::Create( | 529 request_.reset(net::URLFetcher::Create( |
550 0, url, net::URLFetcher::POST, this)); | 530 0, url, net::URLFetcher::POST, this)); |
551 request_->SetRequestContext(context_getter_.get()); | 531 request_->SetRequestContext(context_getter_.get()); |
552 VLOG(1) << "Making request to " << url << " with post_body=" << post_body; | 532 VLOG(1) << "Making request to " << url << " with post_body=" << post_body; |
553 request_->SetUploadData(mime_type, post_body); | 533 request_->SetUploadData(mime_type, post_body); |
554 request_->AddExtraRequestHeader("Authorization: GoogleLogin auth=" + | 534 request_->AddExtraRequestHeader("Authorization: GoogleLogin auth=" + |
555 delegate_->GetWalletCookieValue()); | 535 delegate_->GetWalletCookieValue()); |
556 DVLOG(1) << "Setting authorization header value to " | 536 DVLOG(1) << "Setting authorization header value to " |
557 << delegate_->GetWalletCookieValue(); | 537 << delegate_->GetWalletCookieValue(); |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
821 NOTREACHED(); | 801 NOTREACHED(); |
822 return AutofillMetrics::UNKNOWN_API_CALL; | 802 return AutofillMetrics::UNKNOWN_API_CALL; |
823 } | 803 } |
824 | 804 |
825 NOTREACHED(); | 805 NOTREACHED(); |
826 return AutofillMetrics::UNKNOWN_API_CALL; | 806 return AutofillMetrics::UNKNOWN_API_CALL; |
827 } | 807 } |
828 | 808 |
829 } // namespace wallet | 809 } // namespace wallet |
830 } // namespace autofill | 810 } // namespace autofill |
OLD | NEW |