OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/autofill_ie_toolbar_import_win.h" | 5 #include "chrome/browser/autofill/autofill_ie_toolbar_import_win.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <map> | 8 #include <map> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/string16.h" | 14 #include "base/string16.h" |
15 #include "base/win/registry.h" | 15 #include "base/win/registry.h" |
16 #include "chrome/browser/autofill/autofill_profile.h" | 16 #include "chrome/browser/autofill/autofill_profile.h" |
17 #include "chrome/browser/autofill/credit_card.h" | 17 #include "chrome/browser/autofill/credit_card.h" |
18 #include "chrome/browser/autofill/crypto/rc4_decryptor.h" | 18 #include "chrome/browser/autofill/crypto/rc4_decryptor.h" |
19 #include "chrome/browser/autofill/field_types.h" | 19 #include "chrome/browser/autofill/field_types.h" |
20 #include "chrome/browser/autofill/form_group.h" | 20 #include "chrome/browser/autofill/form_group.h" |
21 #include "chrome/browser/autofill/personal_data_manager.h" | 21 #include "chrome/browser/autofill/personal_data_manager.h" |
| 22 #include "chrome/browser/autofill/phone_number.h" |
| 23 #include "chrome/browser/autofill/phone_number_i18n.h" |
22 #include "chrome/browser/sync/util/data_encryption.h" | 24 #include "chrome/browser/sync/util/data_encryption.h" |
23 | 25 |
24 using base::win::RegKey; | 26 using base::win::RegKey; |
25 | 27 |
26 // Forward declaration. This function is not in unnamed namespace as it | 28 // Forward declaration. This function is not in unnamed namespace as it |
27 // is referenced in the unittest. | 29 // is referenced in the unittest. |
28 bool ImportCurrentUserProfiles(std::vector<AutofillProfile>* profiles, | 30 bool ImportCurrentUserProfiles(std::vector<AutofillProfile>* profiles, |
29 std::vector<CreditCard>* credit_cards); | 31 std::vector<CreditCard>* credit_cards); |
30 namespace { | 32 namespace { |
31 | 33 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 | 126 |
125 bool ImportSingleProfile(FormGroup* profile, | 127 bool ImportSingleProfile(FormGroup* profile, |
126 RegKey* key, | 128 RegKey* key, |
127 const RegToFieldMap& reg_to_field ) { | 129 const RegToFieldMap& reg_to_field ) { |
128 DCHECK(profile != NULL); | 130 DCHECK(profile != NULL); |
129 if (!key->Valid()) | 131 if (!key->Valid()) |
130 return false; | 132 return false; |
131 | 133 |
132 bool has_non_empty_fields = false; | 134 bool has_non_empty_fields = false; |
133 | 135 |
| 136 // Phones need to be rebuilt. |
| 137 PhoneNumber::PhoneCombineHelper home(AutofillType::PHONE_HOME); |
| 138 PhoneNumber::PhoneCombineHelper fax(AutofillType::PHONE_FAX); |
| 139 |
134 for (uint32 value_index = 0; value_index < key->ValueCount(); ++value_index) { | 140 for (uint32 value_index = 0; value_index < key->ValueCount(); ++value_index) { |
135 std::wstring value_name; | 141 std::wstring value_name; |
136 if (key->ReadName(value_index, &value_name) != ERROR_SUCCESS) | 142 if (key->ReadName(value_index, &value_name) != ERROR_SUCCESS) |
137 continue; | 143 continue; |
138 RegToFieldMap::const_iterator it = reg_to_field.find(value_name); | 144 RegToFieldMap::const_iterator it = reg_to_field.find(value_name); |
139 if (it == reg_to_field.end()) | 145 if (it == reg_to_field.end()) |
140 continue; // This field is not imported. | 146 continue; // This field is not imported. |
141 string16 field_value = ReadAndDecryptValue(key, value_name.c_str()); | 147 string16 field_value = ReadAndDecryptValue(key, value_name.c_str()); |
142 if (!field_value.empty()) { | 148 if (!field_value.empty()) { |
143 has_non_empty_fields = true; | 149 has_non_empty_fields = true; |
144 if (it->second == CREDIT_CARD_NUMBER) { | 150 if (it->second == CREDIT_CARD_NUMBER) { |
145 field_value = DecryptCCNumber(field_value); | 151 field_value = DecryptCCNumber(field_value); |
146 } | 152 } |
147 profile->SetInfo(it->second, field_value); | 153 // We need to store phone data in the variables, before building the whole |
| 154 // number at the end. The rest of the fields are set "as is". |
| 155 if (!home.SetInfo(it->second, field_value) && |
| 156 !fax.SetInfo(it->second, field_value)) { |
| 157 profile->SetInfo(it->second, field_value); |
| 158 } |
148 } | 159 } |
149 } | 160 } |
| 161 // Now re-construct the phones if needed. |
| 162 string16 constructed_number; |
| 163 if (!home.empty() && home.ParseNumber(std::string("US"), &constructed_number)) |
| 164 profile->SetInfo(PHONE_HOME_WHOLE_NUMBER, constructed_number); |
| 165 if (!fax.empty() && fax.ParseNumber(std::string("US"), &constructed_number)) |
| 166 profile->SetInfo(PHONE_FAX_WHOLE_NUMBER, constructed_number); |
| 167 |
150 return has_non_empty_fields; | 168 return has_non_empty_fields; |
151 } | 169 } |
152 | 170 |
153 // Imports profiles from the IE toolbar and stores them. Asynchronous | 171 // Imports profiles from the IE toolbar and stores them. Asynchronous |
154 // if PersonalDataManager has not been loaded yet. Deletes itself on completion. | 172 // if PersonalDataManager has not been loaded yet. Deletes itself on completion. |
155 class AutofillImporter : public PersonalDataManager::Observer { | 173 class AutofillImporter : public PersonalDataManager::Observer { |
156 public: | 174 public: |
157 explicit AutofillImporter(PersonalDataManager* personal_data_manager) | 175 explicit AutofillImporter(PersonalDataManager* personal_data_manager) |
158 : personal_data_manager_(personal_data_manager) { | 176 : personal_data_manager_(personal_data_manager) { |
159 personal_data_manager_->SetObserver(this); | 177 personal_data_manager_->SetObserver(this); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 base::win::RegistryKeyIterator iterator_profiles(HKEY_CURRENT_USER, | 230 base::win::RegistryKeyIterator iterator_profiles(HKEY_CURRENT_USER, |
213 kProfileKey); | 231 kProfileKey); |
214 for (; iterator_profiles.Valid(); ++iterator_profiles) { | 232 for (; iterator_profiles.Valid(); ++iterator_profiles) { |
215 std::wstring key_name(kProfileKey); | 233 std::wstring key_name(kProfileKey); |
216 key_name.append(L"\\"); | 234 key_name.append(L"\\"); |
217 key_name.append(iterator_profiles.Name()); | 235 key_name.append(iterator_profiles.Name()); |
218 RegKey key(HKEY_CURRENT_USER, key_name.c_str(), KEY_READ); | 236 RegKey key(HKEY_CURRENT_USER, key_name.c_str(), KEY_READ); |
219 AutofillProfile profile; | 237 AutofillProfile profile; |
220 if (ImportSingleProfile(&profile, &key, reg_to_field)) { | 238 if (ImportSingleProfile(&profile, &key, reg_to_field)) { |
221 // Combine phones into whole phone #. | 239 // Combine phones into whole phone #. |
222 string16 phone; | |
223 phone = profile.GetInfo(PHONE_HOME_COUNTRY_CODE); | |
224 phone.append(profile.GetInfo(PHONE_HOME_CITY_CODE)); | |
225 phone.append(profile.GetInfo(PHONE_HOME_NUMBER)); | |
226 profile.SetInfo(PHONE_HOME_WHOLE_NUMBER, phone); | |
227 phone = profile.GetInfo(PHONE_FAX_COUNTRY_CODE); | |
228 phone.append(profile.GetInfo(PHONE_FAX_CITY_CODE)); | |
229 phone.append(profile.GetInfo(PHONE_FAX_NUMBER)); | |
230 profile.SetInfo(PHONE_FAX_WHOLE_NUMBER, phone); | |
231 profiles->push_back(profile); | 240 profiles->push_back(profile); |
232 } | 241 } |
233 } | 242 } |
234 string16 password_hash; | 243 string16 password_hash; |
235 string16 salt; | 244 string16 salt; |
236 RegKey cc_key(HKEY_CURRENT_USER, kCreditCardKey, KEY_READ); | 245 RegKey cc_key(HKEY_CURRENT_USER, kCreditCardKey, KEY_READ); |
237 if (cc_key.Valid()) { | 246 if (cc_key.Valid()) { |
238 password_hash = ReadAndDecryptValue(&cc_key, kPasswordHashValue); | 247 password_hash = ReadAndDecryptValue(&cc_key, kPasswordHashValue); |
239 salt = ReadAndDecryptValue(&cc_key, kSaltValue); | 248 salt = ReadAndDecryptValue(&cc_key, kSaltValue); |
240 } | 249 } |
(...skipping 20 matching lines...) Expand all Loading... |
261 | 270 |
262 bool ImportAutofillDataWin(PersonalDataManager* pdm) { | 271 bool ImportAutofillDataWin(PersonalDataManager* pdm) { |
263 // In incognito mode we do not have PDM - and we should not import anything. | 272 // In incognito mode we do not have PDM - and we should not import anything. |
264 if (!pdm) | 273 if (!pdm) |
265 return false; | 274 return false; |
266 AutofillImporter *importer = new AutofillImporter(pdm); | 275 AutofillImporter *importer = new AutofillImporter(pdm); |
267 // importer will self delete. | 276 // importer will self delete. |
268 return importer->ImportProfiles(); | 277 return importer->ImportProfiles(); |
269 } | 278 } |
270 | 279 |
OLD | NEW |