1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_ie_toolbar_import_win.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stddef.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/registry.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_country.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_profile.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/credit_card.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/crypto/rc4_decryptor.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/field_types.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/form_group.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h"
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager_observer.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/phone_number.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/phone_number_i18n.h"
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/os_crypt/os_crypt.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::win::RegKey;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Forward declaration. This function is not in unnamed namespace as it
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is referenced in the unittest.
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ImportCurrentUserProfiles(const std::string& app_locale,
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               std::vector<AutofillProfile>* profiles,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               std::vector<CreditCard>* credit_cards);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t* const kProfileKey =
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"Software\\Google\\Google Toolbar\\4.0\\Autofill\\Profiles";
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t* const kCreditCardKey =
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"Software\\Google\\Google Toolbar\\4.0\\Autofill\\Credit Cards";
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t* const kPasswordHashValue = L"password_hash";
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t* const kSaltValue = L"salt";
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This string is stored along with saved addresses and credit cards in the
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// WebDB, and hence should not be modified, so that it remains consistent over
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// time.
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kIEToolbarImportOrigin[] = "Imported from Internet Explorer";
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is RC4 decryption for Toolbar credit card data. This is necessary
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// because it is not standard, so Crypto API cannot be used.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::wstring DecryptCCNumber(const std::wstring& data) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t* kEmptyKey =
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L"\x3605\xCEE5\xCE49\x44F7\xCF4E\xF6CC\x604B\xFCBE\xC70A\x08FD";
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kMacLen = 10;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data.length() <= kMacLen)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::wstring();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RC4Decryptor rc4_algorithm(kEmptyKey);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc4_algorithm.Run(data.substr(kMacLen));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsEmptySalt(std::wstring const& salt) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Empty salt in IE Toolbar is \x1\x2...\x14
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (salt.length() != 20)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < salt.length(); ++i) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (salt[i] != i + 1)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::string16 ReadAndDecryptValue(const RegKey& key,
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   const wchar_t* value_name) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD data_type = REG_BINARY;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD data_size = 0;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LONG result = key.ReadValue(value_name, NULL, &data_size, &data_type);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((result != ERROR_SUCCESS) || !data_size || data_type != REG_BINARY)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return base::string16();
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string data;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.resize(data_size);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result = key.ReadValue(value_name, &(data[0]), &data_size, &data_type);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == ERROR_SUCCESS) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string out_data;
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (OSCrypt::DecryptString(data, &out_data)) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The actual data is in UTF16 already.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!(out_data.size() & 1) && (out_data.size() > 2) &&
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          !out_data[out_data.size() - 1] && !out_data[out_data.size() - 2]) {
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return base::string16(
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            reinterpret_cast<const wchar_t *>(out_data.c_str()));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return base::string16();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct {
1023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  ServerFieldType field_type;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t *reg_value_name;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} profile_reg_values[] = {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { NAME_FIRST,                    L"name_first" },
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { NAME_MIDDLE,                   L"name_middle" },
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { NAME_LAST,                     L"name_last" },
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { NAME_SUFFIX,                   L"name_suffix" },
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { EMAIL_ADDRESS,                 L"email" },
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { COMPANY_NAME,                  L"company_name" },
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { PHONE_HOME_NUMBER,             L"phone_home_number" },
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { PHONE_HOME_CITY_CODE,          L"phone_home_city_code" },
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { PHONE_HOME_COUNTRY_CODE,       L"phone_home_country_code" },
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { ADDRESS_HOME_LINE1,            L"address_home_line1" },
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { ADDRESS_HOME_LINE2,            L"address_home_line2" },
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { ADDRESS_HOME_CITY,             L"address_home_city" },
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { ADDRESS_HOME_STATE,            L"address_home_state" },
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { ADDRESS_HOME_ZIP,              L"address_home_zip" },
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { ADDRESS_HOME_COUNTRY,          L"address_home_country" },
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { ADDRESS_BILLING_LINE1,         L"address_billing_line1" },
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { ADDRESS_BILLING_LINE2,         L"address_billing_line2" },
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { ADDRESS_BILLING_CITY,          L"address_billing_city" },
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { ADDRESS_BILLING_STATE,         L"address_billing_state" },
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { ADDRESS_BILLING_ZIP,           L"address_billing_zip" },
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { ADDRESS_BILLING_COUNTRY,       L"address_billing_country" },
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { CREDIT_CARD_NAME,              L"credit_card_name" },
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { CREDIT_CARD_NUMBER,            L"credit_card_number" },
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { CREDIT_CARD_EXP_MONTH,         L"credit_card_exp_month" },
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { CREDIT_CARD_EXP_4_DIGIT_YEAR,  L"credit_card_exp_4_digit_year" },
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { CREDIT_CARD_TYPE,              L"credit_card_type" },
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We do not import verification code.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochtypedef std::map<std::wstring, ServerFieldType> RegToFieldMap;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Imports address or credit card data from the given registry |key| into the
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// given |form_group|, with the help of |reg_to_field|.  When importing address
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// data, writes the phone data into |phone|; otherwise, |phone| should be null.
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if any fields were set, false otherwise.
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ImportSingleFormGroup(const RegKey& key,
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const RegToFieldMap& reg_to_field,
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           const std::string& app_locale,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           FormGroup* form_group,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           PhoneNumber::PhoneCombineHelper* phone) {
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!key.Valid())
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_non_empty_fields = false;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (uint32 i = 0; i < key.GetValueCount(); ++i) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring value_name;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (key.GetValueNameAt(i, &value_name) != ERROR_SUCCESS)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegToFieldMap::const_iterator it = reg_to_field.find(value_name);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it == reg_to_field.end())
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;  // This field is not imported.
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 field_value = ReadAndDecryptValue(key, value_name.c_str());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!field_value.empty()) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (it->second == CREDIT_CARD_NUMBER)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        field_value = DecryptCCNumber(field_value);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Phone numbers are stored piece-by-piece, and then reconstructed from
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // the pieces.  The rest of the fields are set "as is".
1663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      if (!phone || !phone->SetInfo(AutofillType(it->second), field_value)) {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        has_non_empty_fields = true;
1683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        form_group->SetInfo(AutofillType(it->second), field_value, app_locale);
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return has_non_empty_fields;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Imports address data from the given registry |key| into the given |profile|,
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// with the help of |reg_to_field|.  Returns true if any fields were set, false
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// otherwise.
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ImportSingleProfile(const std::string& app_locale,
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         const RegKey& key,
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const RegToFieldMap& reg_to_field,
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         AutofillProfile* profile) {
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PhoneNumber::PhoneCombineHelper phone;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_non_empty_fields =
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ImportSingleFormGroup(key, reg_to_field, app_locale, profile, &phone);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now re-construct the phones if needed.
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 constructed_number;
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (phone.ParseNumber(*profile, app_locale, &constructed_number)) {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    has_non_empty_fields = true;
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER, constructed_number);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return has_non_empty_fields;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Imports profiles from the IE toolbar and stores them. Asynchronous
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if PersonalDataManager has not been loaded yet. Deletes itself on completion.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillImporter : public PersonalDataManagerObserver {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit AutofillImporter(PersonalDataManager* personal_data_manager)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : personal_data_manager_(personal_data_manager) {
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      personal_data_manager_->AddObserver(this);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ImportProfiles() {
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!ImportCurrentUserProfiles(personal_data_manager_->app_locale(),
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   &profiles_,
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   &credit_cards_)) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete this;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (personal_data_manager_->IsDataLoaded())
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OnPersonalDataChanged();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PersonalDataManagerObserver:
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnPersonalDataChanged() OVERRIDE {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<AutofillProfile>::const_iterator iter = profiles_.begin();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         iter != profiles_.end(); ++iter) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      personal_data_manager_->AddProfile(*iter);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<CreditCard>::const_iterator iter = credit_cards_.begin();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         iter != credit_cards_.end(); ++iter) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      personal_data_manager_->AddCreditCard(*iter);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete this;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~AutofillImporter() {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    personal_data_manager_->RemoveObserver(this);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PersonalDataManager* personal_data_manager_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> profiles_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<CreditCard> credit_cards_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Imports Autofill profiles and credit cards from IE Toolbar if present and not
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// password protected. Returns true if data is successfully retrieved. False if
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// there is no data, data is password protected or error occurred.
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ImportCurrentUserProfiles(const std::string& app_locale,
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               std::vector<AutofillProfile>* profiles,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               std::vector<CreditCard>* credit_cards) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profiles);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(credit_cards);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a map of possible fields for a quick access.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegToFieldMap reg_to_field;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(profile_reg_values); ++i) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reg_to_field[std::wstring(profile_reg_values[i].reg_value_name)] =
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        profile_reg_values[i].field_type;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::RegistryKeyIterator iterator_profiles(HKEY_CURRENT_USER,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   kProfileKey);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; iterator_profiles.Valid(); ++iterator_profiles) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring key_name(kProfileKey);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    key_name.append(L"\\");
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    key_name.append(iterator_profiles.Name());
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegKey key(HKEY_CURRENT_USER, key_name.c_str(), KEY_READ);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutofillProfile profile;
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    profile.set_origin(kIEToolbarImportOrigin);
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (ImportSingleProfile(app_locale, key, reg_to_field, &profile)) {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Combine phones into whole phone #.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profiles->push_back(profile);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 password_hash;
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 salt;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey cc_key(HKEY_CURRENT_USER, kCreditCardKey, KEY_READ);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cc_key.Valid()) {
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    password_hash = ReadAndDecryptValue(cc_key, kPasswordHashValue);
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    salt = ReadAndDecryptValue(cc_key, kSaltValue);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We import CC profiles only if they are not password protected.
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (password_hash.empty() && IsEmptySalt(salt)) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::win::RegistryKeyIterator iterator_cc(HKEY_CURRENT_USER,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               kCreditCardKey);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (; iterator_cc.Valid(); ++iterator_cc) {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::wstring key_name(kCreditCardKey);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key_name.append(L"\\");
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key_name.append(iterator_cc.Name());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RegKey key(HKEY_CURRENT_USER, key_name.c_str(), KEY_READ);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreditCard credit_card;
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      credit_card.set_origin(kIEToolbarImportOrigin);
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (ImportSingleFormGroup(
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              key, reg_to_field, app_locale, &credit_card, NULL)) {
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::string16 cc_number = credit_card.GetRawInfo(CREDIT_CARD_NUMBER);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!cc_number.empty())
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          credit_cards->push_back(credit_card);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (profiles->size() + credit_cards->size()) > 0;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ImportAutofillDataWin(PersonalDataManager* pdm) {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In incognito mode we do not have PDM - and we should not import anything.
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!pdm)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillImporter *importer = new AutofillImporter(pdm);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // importer will self delete.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return importer->ImportProfiles();
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
313