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