1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be 3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file. 4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/autofill/autofill_ie_toolbar_import_win.h" 6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <stddef.h> 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <map> 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <string> 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <vector> 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/basictypes.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/logging.h" 14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/string16.h" 15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/win/registry.h" 16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/autofill/autofill_profile.h" 17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/autofill/credit_card.h" 18513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/autofill/crypto/rc4_decryptor.h" 19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/autofill/field_types.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/form_group.h" 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/autofill/personal_data_manager.h" 22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/sync/util/data_encryption.h" 23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing base::win::RegKey; 25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Forward declaration. This function is not in unnamed namespace as it 27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// is referenced in the unittest. 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool ImportCurrentUserProfiles(std::vector<AutofillProfile>* profiles, 29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::vector<CreditCard>* credit_cards); 30731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace { 31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst wchar_t* const kProfileKey = 33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick L"Software\\Google\\Google Toolbar\\4.0\\Autofill\\Profiles"; 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst wchar_t* const kCreditCardKey = 35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick L"Software\\Google\\Google Toolbar\\4.0\\Autofill\\Credit Cards"; 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst wchar_t* const kPasswordHashValue = L"password_hash"; 37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst wchar_t* const kSaltValue = L"salt"; 38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 39513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// This is RC4 decryption for Toolbar credit card data. This is necessary 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// because it is not standard, so Crypto API cannot be used. 41513209b27ff55e2841eac0e4120199c23acce758Ben Murdochstd::wstring DecryptCCNumber(const std::wstring& data) { 42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const wchar_t* kEmptyKey = 43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch L"\x3605\xCEE5\xCE49\x44F7\xCF4E\xF6CC\x604B\xFCBE\xC70A\x08FD"; 44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const size_t kMacLen = 10; 45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (data.length() <= kMacLen) 47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return std::wstring(); 48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch RC4Decryptor rc4_algorithm(kEmptyKey); 50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return rc4_algorithm.Run(data.substr(kMacLen)); 51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 53513209b27ff55e2841eac0e4120199c23acce758Ben Murdochbool IsEmptySalt(std::wstring const& salt) { 54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Empty salt in IE Toolbar is \x1\x2...\x14 55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (salt.length() != 20) 56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return false; 57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch for (size_t i = 0; i < salt.length(); ++i) { 58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (salt[i] != i + 1) 59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return false; 60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return true; 62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstring16 ReadAndDecryptValue(RegKey* key, const wchar_t* value_name) { 65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DWORD data_type = REG_BINARY; 66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DWORD data_size = 0; 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LONG result = key->ReadValue(value_name, NULL, &data_size, &data_type); 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if ((result != ERROR_SUCCESS) || !data_size || data_type != REG_BINARY) 69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return string16(); 70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::vector<uint8> data; 71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick data.resize(data_size); 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen result = key->ReadValue(value_name, &(data[0]), &data_size, &data_type); 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (result == ERROR_SUCCESS) { 74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string out_data; 75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (DecryptData(data, &out_data)) { 76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The actual data is in UTF16 already. 77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!(out_data.size() & 1) && (out_data.size() > 2) && 78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick !out_data[out_data.size() - 1] && !out_data[out_data.size() - 2]) { 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return string16( 80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick reinterpret_cast<const wchar_t *>(out_data.c_str())); 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return string16(); 85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstruct { 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillFieldType field_type; 89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const wchar_t *reg_value_name; 90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} profile_reg_values[] = { 91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { NAME_FIRST, L"name_first" }, 92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { NAME_MIDDLE, L"name_middle" }, 93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { NAME_LAST, L"name_last" }, 94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { NAME_SUFFIX, L"name_suffix" }, 95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { EMAIL_ADDRESS, L"email" }, 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { COMPANY_NAME, L"company_name" }, 97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { PHONE_HOME_NUMBER, L"phone_home_number" }, 98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { PHONE_HOME_CITY_CODE, L"phone_home_city_code" }, 99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { PHONE_HOME_COUNTRY_CODE, L"phone_home_country_code" }, 100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { PHONE_FAX_NUMBER, L"phone_fax_number" }, 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { PHONE_FAX_CITY_CODE, L"phone_fax_city_code" }, 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { PHONE_FAX_COUNTRY_CODE, L"phone_fax_country_code" }, 103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { ADDRESS_HOME_LINE1, L"address_home_line1" }, 104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { ADDRESS_HOME_LINE2, L"address_home_line2" }, 105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { ADDRESS_HOME_CITY, L"address_home_city" }, 106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { ADDRESS_HOME_STATE, L"address_home_state" }, 107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { ADDRESS_HOME_ZIP, L"address_home_zip" }, 108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { ADDRESS_HOME_COUNTRY, L"address_home_country" }, 109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { ADDRESS_BILLING_LINE1, L"address_billing_line1" }, 110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { ADDRESS_BILLING_LINE2, L"address_billing_line2" }, 111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { ADDRESS_BILLING_CITY, L"address_billing_city" }, 112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { ADDRESS_BILLING_STATE, L"address_billing_state" }, 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { ADDRESS_BILLING_ZIP, L"address_billing_zip" }, 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { ADDRESS_BILLING_COUNTRY, L"address_billing_country" }, 115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { CREDIT_CARD_NAME, L"credit_card_name" }, 116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { CREDIT_CARD_NUMBER, L"credit_card_number" }, 117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { CREDIT_CARD_EXP_MONTH, L"credit_card_exp_month" }, 118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { CREDIT_CARD_EXP_4_DIGIT_YEAR, L"credit_card_exp_4_digit_year" }, 119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { CREDIT_CARD_TYPE, L"credit_card_type" }, 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // We do not import verification code. 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentypedef std::map<std::wstring, AutofillFieldType> RegToFieldMap; 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool ImportSingleProfile(FormGroup* profile, 126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RegKey* key, 127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const RegToFieldMap& reg_to_field ) { 128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(profile != NULL); 129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!key->Valid()) 130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return false; 131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool has_non_empty_fields = false; 133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick for (uint32 value_index = 0; value_index < key->ValueCount(); ++value_index) { 135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::wstring value_name; 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (key->ReadName(value_index, &value_name) != ERROR_SUCCESS) 137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick continue; 138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RegToFieldMap::const_iterator it = reg_to_field.find(value_name); 139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (it == reg_to_field.end()) 140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick continue; // This field is not imported. 141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick string16 field_value = ReadAndDecryptValue(key, value_name.c_str()); 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!field_value.empty()) { 143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick has_non_empty_fields = true; 1444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (it->second == CREDIT_CARD_NUMBER) { 1454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch field_value = DecryptCCNumber(field_value); 1464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->SetInfo(it->second, field_value); 148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return has_non_empty_fields; 151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Imports profiles from the IE toolbar and stores them. Asynchronous 154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// if PersonalDataManager has not been loaded yet. Deletes itself on completion. 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass AutofillImporter : public PersonalDataManager::Observer { 156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen explicit AutofillImporter(PersonalDataManager* personal_data_manager) 158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : personal_data_manager_(personal_data_manager) { 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick personal_data_manager_->SetObserver(this); 160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool ImportProfiles() { 163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!ImportCurrentUserProfiles(&profiles_, &credit_cards_)) { 164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick delete this; 165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return false; 166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (personal_data_manager_->IsDataLoaded()) 168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick OnPersonalDataLoaded(); 169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return true; 170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // PersonalDataManager::Observer methods: 173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void OnPersonalDataLoaded() { 174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!profiles_.empty()) 175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick personal_data_manager_->SetProfiles(&profiles_); 176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!credit_cards_.empty()) 177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick personal_data_manager_->SetCreditCards(&credit_cards_); 178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick delete this; 179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private: 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ~AutofillImporter() { 183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick personal_data_manager_->RemoveObserver(this); 184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick PersonalDataManager* personal_data_manager_; 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillProfile> profiles_; 188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::vector<CreditCard> credit_cards_; 189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} // namespace 192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Imports Autofill profiles and credit cards from IE Toolbar if present and not 194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// password protected. Returns true if data is successfully retrieved. False if 195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// there is no data, data is password protected or error occurred. 196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool ImportCurrentUserProfiles(std::vector<AutofillProfile>* profiles, 197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::vector<CreditCard>* credit_cards) { 198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(profiles); 199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(credit_cards); 200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Create a map of possible fields for a quick access. 202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RegToFieldMap reg_to_field; 203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick for (size_t i = 0; i < arraysize(profile_reg_values); ++i) { 204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick reg_to_field[std::wstring(profile_reg_values[i].reg_value_name)] = 205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick profile_reg_values[i].field_type; 206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick base::win::RegistryKeyIterator iterator_profiles(HKEY_CURRENT_USER, 209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick kProfileKey); 210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick for (; iterator_profiles.Valid(); ++iterator_profiles) { 211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::wstring key_name(kProfileKey); 212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick key_name.append(L"\\"); 213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick key_name.append(iterator_profiles.Name()); 214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RegKey key(HKEY_CURRENT_USER, key_name.c_str(), KEY_READ); 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile profile; 216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (ImportSingleProfile(&profile, &key, reg_to_field)) { 217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Combine phones into whole phone #. 218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick string16 phone; 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen phone = profile.GetInfo(PHONE_HOME_COUNTRY_CODE); 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen phone.append(profile.GetInfo(PHONE_HOME_CITY_CODE)); 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen phone.append(profile.GetInfo(PHONE_HOME_NUMBER)); 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.SetInfo(PHONE_HOME_WHOLE_NUMBER, phone); 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen phone = profile.GetInfo(PHONE_FAX_COUNTRY_CODE); 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen phone.append(profile.GetInfo(PHONE_FAX_CITY_CODE)); 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen phone.append(profile.GetInfo(PHONE_FAX_NUMBER)); 226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.SetInfo(PHONE_FAX_WHOLE_NUMBER, phone); 227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick profiles->push_back(profile); 228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick string16 password_hash; 231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick string16 salt; 232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RegKey cc_key(HKEY_CURRENT_USER, kCreditCardKey, KEY_READ); 233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (cc_key.Valid()) { 234731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick password_hash = ReadAndDecryptValue(&cc_key, kPasswordHashValue); 235731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick salt = ReadAndDecryptValue(&cc_key, kSaltValue); 236731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // We import CC profiles only if they are not password protected. 239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (password_hash.empty() && IsEmptySalt(salt)) { 240731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick base::win::RegistryKeyIterator iterator_cc(HKEY_CURRENT_USER, 241731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick kCreditCardKey); 242731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick for (; iterator_cc.Valid(); ++iterator_cc) { 243731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::wstring key_name(kCreditCardKey); 244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick key_name.append(L"\\"); 245731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick key_name.append(iterator_cc.Name()); 246731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RegKey key(HKEY_CURRENT_USER, key_name.c_str(), KEY_READ); 247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CreditCard credit_card; 248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (ImportSingleProfile(&credit_card, &key, reg_to_field)) { 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 cc_number = credit_card.GetInfo(CREDIT_CARD_NUMBER); 250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!cc_number.empty()) 251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick credit_cards->push_back(credit_card); 252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return (profiles->size() + credit_cards->size()) > 0; 256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool ImportAutofillDataWin(PersonalDataManager* pdm) { 2593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // In incognito mode we do not have PDM - and we should not import anything. 2603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen if (!pdm) 2613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen return false; 262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillImporter *importer = new AutofillImporter(pdm); 263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // importer will self delete. 264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return importer->ImportProfiles(); 265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 267