| 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 "chrome/browser/autofill/wallet/wallet_client.h" | 5 #include "chrome/browser/autofill/wallet/wallet_client.h" |
| 6 | 6 |
| 7 #include "base/json/json_reader.h" | 7 #include "base/json/json_reader.h" |
| 8 #include "base/json/json_writer.h" | 8 #include "base/json/json_writer.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| 11 #include "base/string_number_conversions.h" | 11 #include "base/string_number_conversions.h" |
| 12 #include "base/string_split.h" | 12 #include "base/string_split.h" |
| 13 #include "base/stringprintf.h" | 13 #include "base/stringprintf.h" |
| 14 #include "base/values.h" | 14 #include "base/values.h" |
| 15 #include "chrome/browser/autofill/wallet/cart.h" | 15 #include "chrome/browser/autofill/wallet/cart.h" |
| 16 #include "chrome/browser/autofill/wallet/full_wallet.h" | 16 #include "chrome/browser/autofill/wallet/full_wallet.h" |
| 17 #include "chrome/browser/autofill/wallet/wallet_address.h" | 17 #include "chrome/browser/autofill/wallet/wallet_address.h" |
| 18 #include "chrome/browser/autofill/wallet/wallet_items.h" | 18 #include "chrome/browser/autofill/wallet/wallet_items.h" |
| 19 #include "chrome/browser/autofill/wallet/wallet_service_url.h" | 19 #include "chrome/browser/autofill/wallet/wallet_service_url.h" |
| 20 #include "googleurl/src/gurl.h" | 20 #include "googleurl/src/gurl.h" |
| 21 #include "net/http/http_status_code.h" | 21 #include "net/http/http_status_code.h" |
| 22 #include "net/url_request/url_fetcher.h" | 22 #include "net/url_request/url_fetcher.h" |
| 23 #include "net/url_request/url_request_context_getter.h" | 23 #include "net/url_request/url_request_context_getter.h" |
| 24 | 24 |
| 25 namespace { | 25 namespace { |
| 26 | 26 |
| 27 const char kEncryptOtpBodyFormat[] = "cvv=%s:%s"; | 27 const char kEncryptOtpBodyFormat[] = "cvv=%s:%s"; |
| 28 const char kEscrowSensitiveInformationFormat[] = "gid=%s&cardNumber=%s&cvv=%s"; |
| 28 const char kJsonMimeType[] = "application/json"; | 29 const char kJsonMimeType[] = "application/json"; |
| 29 const char kApplicationMimeType[] = "application/x-www-form-urlencoded"; | 30 const char kApplicationMimeType[] = "application/x-www-form-urlencoded"; |
| 30 const size_t kMaxBits = 63; | 31 const size_t kMaxBits = 63; |
| 31 | 32 |
| 32 } // anonymous namespace | 33 } // anonymous namespace |
| 33 | 34 |
| 34 namespace wallet { | 35 namespace wallet { |
| 35 | 36 |
| 36 void WalletClient::AcceptLegalDocuments( | 37 void WalletClient::AcceptLegalDocuments( |
| 37 const std::vector<std::string>& document_ids, | 38 const std::vector<std::string>& document_ids, |
| 38 const std::string& google_transaction_id, | 39 const std::string& google_transaction_id, |
| 39 WalletClient::WalletClientObserver* observer) { | 40 WalletClient::WalletClientObserver* observer) { |
| 40 DCHECK_EQ(request_type_, NO_PENDING_REQUEST); | 41 DCHECK_EQ(NO_PENDING_REQUEST, request_type_); |
| 41 | |
| 42 request_type_ = ACCEPT_LEGAL_DOCUMENTS; | 42 request_type_ = ACCEPT_LEGAL_DOCUMENTS; |
| 43 | 43 |
| 44 DictionaryValue request_dict; | 44 DictionaryValue request_dict; |
| 45 request_dict.SetString("api_key", wallet::kApiKey); | 45 request_dict.SetString("api_key", wallet::kApiKey); |
| 46 request_dict.SetString("google_transaction_id", google_transaction_id); | 46 request_dict.SetString("google_transaction_id", google_transaction_id); |
| 47 ListValue* docs_list = new ListValue(); | 47 ListValue* docs_list = new ListValue(); |
| 48 for (std::vector<std::string>::const_iterator it = document_ids.begin(); | 48 for (std::vector<std::string>::const_iterator it = document_ids.begin(); |
| 49 it != document_ids.end(); | 49 it != document_ids.end(); |
| 50 ++it) { | 50 ++it) { |
| 51 docs_list->AppendString(*it); | 51 docs_list->AppendString(*it); |
| 52 } | 52 } |
| 53 request_dict.Set("accepted_legal_document", docs_list); | 53 request_dict.Set("accepted_legal_document", docs_list); |
| 54 | 54 |
| 55 std::string post_body; | 55 std::string post_body; |
| 56 base::JSONWriter::Write(&request_dict, &post_body); | 56 base::JSONWriter::Write(&request_dict, &post_body); |
| 57 | 57 |
| 58 MakeWalletRequest(GetAcceptLegalDocumentsUrl(), | 58 MakeWalletRequest(GetAcceptLegalDocumentsUrl(), |
| 59 post_body, | 59 post_body, |
| 60 observer, | 60 observer, |
| 61 kJsonMimeType); | 61 kJsonMimeType); |
| 62 } | 62 } |
| 63 | 63 |
| 64 void WalletClient::EncryptOtp( | 64 void WalletClient::EncryptOtp( |
| 65 const void* otp, | 65 const void* otp, |
| 66 size_t length, | 66 size_t length, |
| 67 WalletClient::WalletClientObserver* observer) { | 67 WalletClient::WalletClientObserver* observer) { |
| 68 DCHECK_EQ(request_type_, NO_PENDING_REQUEST); | 68 DCHECK_EQ(NO_PENDING_REQUEST, request_type_); |
| 69 size_t num_bits = length * 8; | 69 size_t num_bits = length * 8; |
| 70 DCHECK_LT(num_bits, kMaxBits); | 70 DCHECK_LT(num_bits, kMaxBits); |
| 71 | 71 |
| 72 request_type_ = ENCRYPT_OTP; | 72 request_type_ = ENCRYPT_OTP; |
| 73 | 73 |
| 74 std::string post_body = StringPrintf(kEncryptOtpBodyFormat, | 74 std::string post_body = StringPrintf(kEncryptOtpBodyFormat, |
| 75 base::HexEncode(&num_bits, 1).c_str(), | 75 base::HexEncode(&num_bits, 1).c_str(), |
| 76 base::HexEncode(otp, length).c_str()); | 76 base::HexEncode(otp, length).c_str()); |
| 77 | 77 |
| 78 MakeWalletRequest(GetSecureUrl(), post_body, observer, kApplicationMimeType); | 78 MakeWalletRequest(GetEncryptionUrl(), |
| 79 post_body, |
| 80 observer, |
| 81 kApplicationMimeType); |
| 79 } | 82 } |
| 80 | 83 |
| 84 void WalletClient::EscrowSensitiveInformation( |
| 85 const std::string& primary_account_number, |
| 86 const std::string& card_verification_number, |
| 87 const std::string& obfuscated_gaia_id, |
| 88 WalletClient::WalletClientObserver* observer) { |
| 89 DCHECK_EQ(NO_PENDING_REQUEST, request_type_); |
| 90 request_type_ = ESCROW_SENSITIVE_INFORMATION; |
| 91 |
| 92 std::string post_body = StringPrintf(kEscrowSensitiveInformationFormat, |
| 93 obfuscated_gaia_id.c_str(), |
| 94 primary_account_number.c_str(), |
| 95 card_verification_number.c_str()); |
| 96 |
| 97 MakeWalletRequest(GetEscrowUrl(), post_body, observer, kApplicationMimeType); |
| 98 } |
| 99 |
| 100 |
| 81 void WalletClient::GetFullWallet( | 101 void WalletClient::GetFullWallet( |
| 82 const std::string& instrument_id, | 102 const std::string& instrument_id, |
| 83 const std::string& address_id, | 103 const std::string& address_id, |
| 84 const std::string& merchant_domain, | 104 const std::string& merchant_domain, |
| 85 const Cart& cart, | 105 const Cart& cart, |
| 86 const std::string& google_transaction_id, | 106 const std::string& google_transaction_id, |
| 87 const std::string& encrypted_otp, | 107 const std::string& encrypted_otp, |
| 88 const std::string& session_material, | 108 const std::string& session_material, |
| 89 WalletClient::WalletClientObserver* observer) { | 109 WalletClient::WalletClientObserver* observer) { |
| 90 DCHECK_EQ(request_type_, NO_PENDING_REQUEST); | 110 DCHECK_EQ(NO_PENDING_REQUEST, request_type_); |
| 91 | |
| 92 request_type_ = GET_FULL_WALLET; | 111 request_type_ = GET_FULL_WALLET; |
| 93 | 112 |
| 94 DictionaryValue request_dict; | 113 DictionaryValue request_dict; |
| 95 request_dict.SetString("api_key", wallet::kApiKey); | 114 request_dict.SetString("api_key", wallet::kApiKey); |
| 96 request_dict.SetString("risk_params", GetRiskParams()); | 115 request_dict.SetString("risk_params", GetRiskParams()); |
| 97 request_dict.SetString("selected_instrument_id", instrument_id); | 116 request_dict.SetString("selected_instrument_id", instrument_id); |
| 98 request_dict.SetString("selected_address_id", address_id); | 117 request_dict.SetString("selected_address_id", address_id); |
| 99 request_dict.SetString("merchant_domain", merchant_domain); | 118 request_dict.SetString("merchant_domain", merchant_domain); |
| 100 request_dict.SetString("google_transaction_id", google_transaction_id); | 119 request_dict.SetString("google_transaction_id", google_transaction_id); |
| 101 request_dict.Set("cart", cart.ToDictionary().release()); | 120 request_dict.Set("cart", cart.ToDictionary().release()); |
| 102 request_dict.SetString("encrypted_otp", encrypted_otp); | 121 request_dict.SetString("encrypted_otp", encrypted_otp); |
| 103 request_dict.SetString("session_material", session_material); | 122 request_dict.SetString("session_material", session_material); |
| 104 | 123 |
| 105 std::string post_body; | 124 std::string post_body; |
| 106 base::JSONWriter::Write(&request_dict, &post_body); | 125 base::JSONWriter::Write(&request_dict, &post_body); |
| 107 | 126 |
| 108 MakeWalletRequest(GetGetFullWalletUrl(), post_body, observer, kJsonMimeType); | 127 MakeWalletRequest(GetGetFullWalletUrl(), post_body, observer, kJsonMimeType); |
| 109 } | 128 } |
| 110 | 129 |
| 111 void WalletClient::GetWalletItems( | 130 void WalletClient::GetWalletItems( |
| 112 WalletClient::WalletClientObserver* observer) { | 131 WalletClient::WalletClientObserver* observer) { |
| 113 DCHECK_EQ(request_type_, NO_PENDING_REQUEST); | 132 DCHECK_EQ(NO_PENDING_REQUEST, request_type_); |
| 114 | |
| 115 request_type_ = GET_WALLET_ITEMS; | 133 request_type_ = GET_WALLET_ITEMS; |
| 116 | 134 |
| 117 DictionaryValue request_dict; | 135 DictionaryValue request_dict; |
| 118 request_dict.SetString("api_key", wallet::kApiKey); | 136 request_dict.SetString("api_key", wallet::kApiKey); |
| 119 request_dict.SetString("risk_params", GetRiskParams()); | 137 request_dict.SetString("risk_params", GetRiskParams()); |
| 120 | 138 |
| 121 std::string post_body; | 139 std::string post_body; |
| 122 base::JSONWriter::Write(&request_dict, &post_body); | 140 base::JSONWriter::Write(&request_dict, &post_body); |
| 123 | 141 |
| 124 MakeWalletRequest(GetGetWalletItemsUrl(), post_body, observer, kJsonMimeType); | 142 MakeWalletRequest(GetGetWalletItemsUrl(), post_body, observer, kJsonMimeType); |
| 125 } | 143 } |
| 126 | 144 |
| 127 void WalletClient::SendExtendedAutofillStatus( | 145 void WalletClient::SendExtendedAutofillStatus( |
| 128 bool success, | 146 bool success, |
| 129 const std::string& merchant_domain, | 147 const std::string& merchant_domain, |
| 130 const std::string& reason, | 148 const std::string& reason, |
| 131 const std::string& google_transaction_id, | 149 const std::string& google_transaction_id, |
| 132 WalletClient::WalletClientObserver* observer) { | 150 WalletClient::WalletClientObserver* observer) { |
| 133 DCHECK_EQ(request_type_, NO_PENDING_REQUEST); | 151 DCHECK_EQ(NO_PENDING_REQUEST, request_type_); |
| 134 | |
| 135 request_type_ = SEND_STATUS; | 152 request_type_ = SEND_STATUS; |
| 136 | 153 |
| 137 DictionaryValue request_dict; | 154 DictionaryValue request_dict; |
| 138 request_dict.SetString("api_key", wallet::kApiKey); | 155 request_dict.SetString("api_key", wallet::kApiKey); |
| 139 request_dict.SetBoolean("success", success); | 156 request_dict.SetBoolean("success", success); |
| 140 request_dict.SetString("hostname", merchant_domain); | 157 request_dict.SetString("hostname", merchant_domain); |
| 141 if (!success) { | 158 if (!success) { |
| 142 // TODO(ahutter): Probably want to do some checks on reason. | 159 // TODO(ahutter): Probably want to do some checks on reason. |
| 143 request_dict.SetString("reason", reason); | 160 request_dict.SetString("reason", reason); |
| 144 } | 161 } |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 request_type_ = NO_PENDING_REQUEST; | 229 request_type_ = NO_PENDING_REQUEST; |
| 213 observer_->OnNetworkError(response_code); | 230 observer_->OnNetworkError(response_code); |
| 214 return; | 231 return; |
| 215 } | 232 } |
| 216 } | 233 } |
| 217 | 234 |
| 218 RequestType type = request_type_; | 235 RequestType type = request_type_; |
| 219 request_type_ = NO_PENDING_REQUEST; | 236 request_type_ = NO_PENDING_REQUEST; |
| 220 | 237 |
| 221 switch (type) { | 238 switch (type) { |
| 222 case ACCEPT_LEGAL_DOCUMENTS: { | 239 case ACCEPT_LEGAL_DOCUMENTS: |
| 223 observer_->OnAcceptLegalDocuments(); | 240 observer_->OnAcceptLegalDocuments(); |
| 224 break; | 241 break; |
| 225 } | 242 case SEND_STATUS: |
| 226 case SEND_STATUS: { | |
| 227 observer_->OnSendExtendedAutofillStatus(); | 243 observer_->OnSendExtendedAutofillStatus(); |
| 228 break; | 244 break; |
| 229 } | |
| 230 case ENCRYPT_OTP: { | 245 case ENCRYPT_OTP: { |
| 231 if (!data.empty()) { | 246 if (!data.empty()) { |
| 232 std::vector<std::string> splits; | 247 std::vector<std::string> splits; |
| 233 base::SplitString(data, '|', &splits); | 248 base::SplitString(data, '|', &splits); |
| 234 if (splits.size() == 2) | 249 if (splits.size() == 2) |
| 235 observer_->OnEncryptOtp(splits[1], splits[0]); | 250 observer_->OnEncryptOtp(splits[1], splits[0]); |
| 236 else | 251 else |
| 237 observer_->OnNetworkError(response_code); | 252 observer_->OnNetworkError(response_code); |
| 238 } else { | 253 } else { |
| 239 observer_->OnWalletError(); | 254 observer_->OnWalletError(); |
| 240 } | 255 } |
| 241 break; | 256 break; |
| 242 } | 257 } |
| 258 case ESCROW_SENSITIVE_INFORMATION: |
| 259 if (!data.empty()) |
| 260 observer_->OnDidEscrowSensitiveInformation(data); |
| 261 else |
| 262 observer_->OnWalletError(); |
| 263 break; |
| 243 case GET_FULL_WALLET: { | 264 case GET_FULL_WALLET: { |
| 244 if (response_dict.get()) { | 265 if (response_dict.get()) { |
| 245 scoped_ptr<FullWallet> full_wallet( | 266 scoped_ptr<FullWallet> full_wallet( |
| 246 FullWallet::CreateFullWallet(*response_dict)); | 267 FullWallet::CreateFullWallet(*response_dict)); |
| 247 if (full_wallet.get()) | 268 if (full_wallet.get()) |
| 248 observer_->OnGetFullWallet(full_wallet.get()); | 269 observer_->OnGetFullWallet(full_wallet.get()); |
| 249 else | 270 else |
| 250 observer_->OnNetworkError(response_code); | 271 observer_->OnNetworkError(response_code); |
| 251 } else { | 272 } else { |
| 252 observer_->OnWalletError(); | 273 observer_->OnWalletError(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 276 : context_getter_(context_getter), | 297 : context_getter_(context_getter), |
| 277 observer_(NULL), | 298 observer_(NULL), |
| 278 request_type_(NO_PENDING_REQUEST) { | 299 request_type_(NO_PENDING_REQUEST) { |
| 279 DCHECK(context_getter); | 300 DCHECK(context_getter); |
| 280 } | 301 } |
| 281 | 302 |
| 282 WalletClient::~WalletClient() {} | 303 WalletClient::~WalletClient() {} |
| 283 | 304 |
| 284 } // namespace wallet | 305 } // namespace wallet |
| 285 | 306 |
| OLD | NEW |