1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// found in the LICENSE file. 4201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 5201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/sync/glue/autofill_profile_model_associator.h" 6201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 7201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/utf_string_conversions.h" 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/sync/glue/autofill_profile_change_processor.h" 921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/sync/glue/do_optimistic_refresh_task.h" 10201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/sync/profile_sync_service.h" 11201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/webdata/web_database.h" 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/guid.h" 13201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 14201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochusing sync_api::ReadNode; 15201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochnamespace browser_sync { 16201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst char kAutofillProfileTag[] = "google_chrome_autofill_profiles"; 18201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 19201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochAutofillProfileModelAssociator::AutofillProfileModelAssociator( 20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ProfileSyncService* sync_service, 21201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch WebDatabase* web_database, 22201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch PersonalDataManager* personal_data) 23201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch : sync_service_(sync_service), 24201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch web_database_(web_database), 25201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch personal_data_(personal_data), 26201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch autofill_node_id_(sync_api::kInvalidId), 2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen abort_association_pending_(false), 2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen number_of_profiles_created_(0) { 29201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 30201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(sync_service_); 31201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(web_database_); 32201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(personal_data_); 33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 34201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 35201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochAutofillProfileModelAssociator::~AutofillProfileModelAssociator() { 36201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 37201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 38201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 39dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenAutofillProfileModelAssociator::AutofillProfileModelAssociator() 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : sync_service_(NULL), 41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen web_database_(NULL), 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen personal_data_(NULL), 43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen autofill_node_id_(0), 44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen abort_association_pending_(false), 45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen number_of_profiles_created_(0) { 46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillProfileModelAssociator::TraverseAndAssociateChromeAutofillProfiles( 49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::WriteTransaction* write_trans, 50201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_api::ReadNode& autofill_root, 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<AutofillProfile*>& all_profiles_from_db, 52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::set<std::string>* current_profiles, 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillProfile*>* updated_profiles, 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillProfile*>* new_profiles, 55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::vector<std::string>* profiles_to_delete) { 56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (VLOG_IS_ON(2)) { 58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen VLOG(2) << "[AUTOFILL MIGRATION]" 5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << "Printing profiles from web db"; 6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (std::vector<AutofillProfile*>::const_iterator ix = 6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen all_profiles_from_db.begin(); ix != all_profiles_from_db.end(); ++ix) { 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* p = *ix; 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen VLOG(2) << "[AUTOFILL MIGRATION] " 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen << p->GetInfo(NAME_FIRST) 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen << p->GetInfo(NAME_LAST) 6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << p->guid(); 6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen VLOG(1) << "[AUTOFILL MIGRATION]" 723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << "Looking for the above data in sync db.."; 733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 74201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Alias the all_profiles_from_db so we fit in 80 characters 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<AutofillProfile*>& profiles(all_profiles_from_db); 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (std::vector<AutofillProfile*>::const_iterator ix = profiles.begin(); 77201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ix != profiles.end(); 78201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ++ix) { 79201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::string guid((*ix)->guid()); 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (guid::IsValidGUID(guid) == false) { 81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(false) << "Guid in the web db is invalid " << guid; 82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen continue; 83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ReadNode node(write_trans); 863f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen if (node.InitByClientTagLookup(syncable::AUTOFILL_PROFILE, guid) && 873f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // The following check is to ensure the given sync node is not already 883f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // associated with another profile. That could happen if the user has 893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // the same profile duplicated. 903f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen current_profiles->find(guid) == current_profiles->end()) { 91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen VLOG(2) << "[AUTOFILL MIGRATION]" 923f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " Found in sync db: " 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen << (*ix)->GetInfo(NAME_FIRST) 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen << (*ix)->GetInfo(NAME_LAST) 953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << (*ix)->guid() 963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " so associating with node id " << node.GetId(); 97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_pb::AutofillProfileSpecifics& autofill( 98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch node.GetAutofillProfileSpecifics()); 99201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (OverwriteProfileWithServerData(*ix, autofill)) { 100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch updated_profiles->push_back(*ix); 101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch Associate(&guid, node.GetId()); 103201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch current_profiles->insert(guid); 104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } else { 105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch MakeNewAutofillProfileSyncNodeIfNeeded(write_trans, 106201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch autofill_root, 107201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch (**ix), 108201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch new_profiles, 109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch current_profiles, 110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch profiles_to_delete); 111201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool AutofillProfileModelAssociator::GetSyncIdForTaggedNode( 11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& tag, 11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int64* sync_id) { 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_api::ReadTransaction trans(sync_service_->GetUserShare()); 12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen sync_api::ReadNode sync_node(&trans); 12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!sync_node.InitByTagLookup(tag.c_str())) 12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return false; 12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen *sync_id = sync_node.GetId(); 124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::LoadAutofillData( 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillProfile*>* profiles) { 129201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (IsAbortPending()) 130201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!web_database_->GetAutofillTable()->GetAutofillProfiles(profiles)) 133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 137201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 138201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::AssociateModels() { 139201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch VLOG(1) << "Associating Autofill Models"; 140201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 141201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch { 14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock lock(abort_association_pending_lock_); 143201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch abort_association_pending_ = false; 144201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 145201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ScopedVector<AutofillProfile> profiles; 147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!LoadAutofillData(&profiles.get())) { 149201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR) << "Could not get the autofill data from WebDatabase."; 150201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 151201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 1533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen VLOG(1) << "[AUTOFILL MIGRATION]" 1543f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " Now associating to the new autofill profile model associator" 1553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " root node"; 156201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DataBundle bundle; 157201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch { 158201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // The write transaction lock is held inside this block. 159201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // We do all the web db operations outside this block. 16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_api::WriteTransaction trans(sync_service_->GetUserShare()); 161201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 162201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::ReadNode autofill_root(&trans); 163201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!autofill_root.InitByTagLookup(kAutofillProfileTag)) { 164201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR) << "Server did not create the top-level autofill node. We " 165201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch << "might be running against an out-of-date server."; 166201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 167201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 168201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!TraverseAndAssociateChromeAutofillProfiles(&trans, autofill_root, 170201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch profiles.get(), &bundle.current_profiles, 171201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch &bundle.updated_profiles, 172201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch &bundle.new_profiles, 173201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch &bundle.profiles_to_delete) || 174201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch !TraverseAndAssociateAllSyncNodes(&trans, autofill_root, &bundle)) { 175201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 176201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 177201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 178201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 179201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!SaveChangesToWebData(bundle)) { 180201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR) << "Failed to update autofill entries."; 181201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 182201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 183201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (sync_service_->GetAutofillMigrationState() != 18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen syncable::MIGRATED) { 18621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen syncable::AutofillMigrationDebugInfo debug_info; 18721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen debug_info.autofill_profile_added_during_migration = 18821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen number_of_profiles_created_; 18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_service_->SetAutofillMigrationDebugInfo( 19021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen syncable::AutofillMigrationDebugInfo::PROFILES_ADDED, 19121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen debug_info); 19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_service_->SetAutofillMigrationState( 19321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen syncable::MIGRATED); 19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 19521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 19621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 19721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen new DoOptimisticRefreshForAutofill(personal_data_)); 198201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 199201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 200201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 201201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::DisassociateModels() { 202dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 203201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch id_map_.clear(); 204201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch id_map_inverse_.clear(); 205201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 206201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 207201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 208201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Helper to compare the local value and cloud value of a field, merge into 209201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// the local value if they differ, and return whether the merge happened. 210201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::MergeField(FormGroup* f, 211dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillFieldType t, 212201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const std::string& specifics_field) { 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (UTF16ToUTF8(f->GetInfo(t)) == specifics_field) 214201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen f->SetInfo(t, UTF8ToUTF16(specifics_field)); 216201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 217201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 218201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::SyncModelHasUserCreatedNodes( 219201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bool *has_nodes) { 220201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch CHECK_NE(has_nodes, reinterpret_cast<bool*>(NULL)); 22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_api::ReadTransaction trans(sync_service_->GetUserShare()); 222201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 223201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::ReadNode node(&trans); 224201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 22521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!node.InitByTagLookup(kAutofillProfileTag)) { 226201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR) << "Sever did not create a top level node" 227201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch << "Out of data server or autofill type not enabled"; 228201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 229201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 230201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 231201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch *has_nodes = sync_api::kInvalidId != node.GetFirstChildId(); 232201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 233201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 234201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// static 235201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::OverwriteProfileWithServerData( 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* merge_into, 237201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_pb::AutofillProfileSpecifics& specifics) { 238201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bool diff = false; 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* p = merge_into; 240201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_pb::AutofillProfileSpecifics& s(specifics); 241201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, NAME_FIRST, s.name_first()) || diff; 242201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, NAME_LAST, s.name_last()) || diff; 243201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, NAME_MIDDLE, s.name_middle()) || diff; 244201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, ADDRESS_HOME_LINE1, s.address_home_line1()) || diff; 245201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, ADDRESS_HOME_LINE2, s.address_home_line2()) || diff; 246201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, ADDRESS_HOME_CITY, s.address_home_city()) || diff; 247201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, ADDRESS_HOME_STATE, s.address_home_state()) || diff; 248201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, ADDRESS_HOME_COUNTRY, s.address_home_country()) || diff; 249201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, ADDRESS_HOME_ZIP, s.address_home_zip()) || diff; 250201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, EMAIL_ADDRESS, s.email_address()) || diff; 251201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, COMPANY_NAME, s.company_name()) || diff; 252201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, PHONE_FAX_WHOLE_NUMBER, s.phone_fax_whole_number()) 253201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch || diff; 254201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, PHONE_HOME_WHOLE_NUMBER, s.phone_home_whole_number()) 255201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch || diff; 256201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return diff; 257201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 258201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 259201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 260201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint64 AutofillProfileModelAssociator::FindSyncNodeWithProfile( 261201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::WriteTransaction* trans, 262201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_api::BaseNode& autofill_root, 263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const AutofillProfile& profile_from_db, 2643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen std::set<std::string>* current_profiles) { 265201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch int64 sync_child_id = autofill_root.GetFirstChildId(); 266201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch while (sync_child_id != sync_api::kInvalidId) { 267201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ReadNode read_node(trans); 268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile p; 26921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!read_node.InitByIdLookup(sync_child_id)) { 270201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR) << "unable to find the id given by getfirst child " << 271201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_child_id; 272201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return sync_api::kInvalidId; 273201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 274201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_pb::AutofillProfileSpecifics& autofill_specifics( 275201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch read_node.GetAutofillProfileSpecifics()); 2763f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 2773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // This find should be fast as the set uses tree. 2783f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen if (current_profiles->find(autofill_specifics.guid()) 2793f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen == current_profiles->end()) { 2803f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen OverwriteProfileWithServerData(&p, autofill_specifics); 2813f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen if (p.Compare(profile_from_db) == 0) { 2823f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen return sync_child_id; 2833f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen } 284201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 285201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_child_id = read_node.GetSuccessorId(); 286201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 287201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 288201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return sync_api::kInvalidId; 289201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 290201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::MakeNewAutofillProfileSyncNodeIfNeeded( 291201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::WriteTransaction* trans, 292201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_api::BaseNode& autofill_root, 293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const AutofillProfile& profile, 294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillProfile*>* new_profiles, 295201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::set<std::string>* current_profiles, 296201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::vector<std::string>* profiles_to_delete) { 297201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 2983f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen int64 sync_node_id = FindSyncNodeWithProfile(trans, 2993f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen autofill_root, 3003f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen profile, 3013f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen current_profiles); 302201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (sync_node_id != sync_api::kInvalidId) { 303201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // In case of duplicates throw away the local profile and apply the 304201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // server profile.(The only difference between the 2 profiles are the guids) 305201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch profiles_to_delete->push_back(profile.guid()); 306201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::ReadNode read_node(trans); 307201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!read_node.InitByIdLookup(sync_node_id)) { 308201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR); 309201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 310201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 311201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_pb::AutofillProfileSpecifics& autofill_specifics( 312201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch read_node.GetAutofillProfileSpecifics()); 313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (guid::IsValidGUID(autofill_specifics.guid()) == false) { 314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NOTREACHED() << "Guid in the web db is invalid " << 315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen autofill_specifics.guid(); 316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return false; 317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* p = new AutofillProfile(autofill_specifics.guid()); 319201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch OverwriteProfileWithServerData(p, autofill_specifics); 320201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch new_profiles->push_back(p); 321201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::string guid = autofill_specifics.guid(); 322201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch Associate(&guid, sync_node_id); 323201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch current_profiles->insert(autofill_specifics.guid()); 324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen VLOG(2) << "[AUTOFILL MIGRATION]" 3253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << "Found in sync db but with a different guid: " 326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen << UTF16ToUTF8(profile.GetInfo(NAME_FIRST)) 327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen << UTF16ToUTF8(profile.GetInfo(NAME_LAST)) 3283f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << "New guid " << autofill_specifics.guid() << " sync node id " 3293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << sync_node_id << " so associating. Profile to be deleted " 3303f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << profile.guid(); 331201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } else { 332201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::WriteNode node(trans); 333dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 334dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // The profile.guid() is expected to be a valid guid. The caller is expected 335dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // to pass in a valid profile object with a valid guid. Having to check in 336dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // 2 places(the caller and here) is not optimal. 337201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!node.InitUniqueByCreation( 338201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch syncable::AUTOFILL_PROFILE, autofill_root, profile.guid())) { 339201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR) << "Failed to create autofill sync node."; 340201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 341201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 342201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch node.SetTitle(UTF8ToWide(profile.guid())); 343dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen VLOG(2) << "[AUTOFILL MIGRATION]" 3443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << "NOT Found in sync db " 345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen << UTF16ToUTF8(profile.GetInfo(NAME_FIRST)) 346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen << UTF16ToUTF8(profile.GetInfo(NAME_LAST)) 3473f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << profile.guid() 3483f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " so creating a new sync node. Sync node id " 3493f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << node.GetId(); 35021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen AutofillProfileChangeProcessor::WriteAutofillProfile(profile, &node); 35121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen current_profiles->insert(profile.guid()); 3523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen std::string guid = profile.guid(); 3533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen Associate(&guid, node.GetId()); 35421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen number_of_profiles_created_++; 355201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 356201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 357201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 358201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 359201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::TraverseAndAssociateAllSyncNodes( 360201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::WriteTransaction* write_trans, 361201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_api::ReadNode& autofill_root, 362201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DataBundle* bundle) { 363201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 3643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen VLOG(1) << "[AUTOFILL MIGRATION] " 3653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " Iterating over sync nodes of autofill profile root node"; 366201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 367201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch int64 sync_child_id = autofill_root.GetFirstChildId(); 368201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch while (sync_child_id != sync_api::kInvalidId) { 369201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ReadNode sync_child(write_trans); 370201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!sync_child.InitByIdLookup(sync_child_id)) { 371201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR) << "Failed to fetch child node."; 372201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 373201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 374201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_pb::AutofillProfileSpecifics& autofill( 375201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_child.GetAutofillProfileSpecifics()); 376201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 377201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch AddNativeProfileIfNeeded(autofill, bundle, sync_child); 378201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 379201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_child_id = sync_child.GetSuccessorId(); 380201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 381201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 382201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 383201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 384201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::AddNativeProfileIfNeeded( 385201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_pb::AutofillProfileSpecifics& profile, 386201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DataBundle* bundle, 387201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_api::ReadNode& node) { 388201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 389201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 390dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen VLOG(2) << "[AUTOFILL MIGRATION] " 3913f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << "Trying to lookup " 3923f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << profile.name_first() 3933f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " " 3943f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << profile.name_last() 3953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << "sync node id " << node.GetId() 3963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " Guid " << profile.guid() 3973f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " in the web db"; 3983f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 399dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (guid::IsValidGUID(profile.guid()) == false) { 400dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(false) << "Guid in the sync db is invalid " << profile.guid(); 401dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return; 402dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 403dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 404201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (bundle->current_profiles.find(profile.guid()) == 405201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bundle->current_profiles.end()) { 406201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::string guid(profile.guid()); 407201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch Associate(&guid, node.GetId()); 408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* p = new AutofillProfile(profile.guid()); 409201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch OverwriteProfileWithServerData(p, profile); 410201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bundle->new_profiles.push_back(p); 411dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen VLOG(2) << "[AUTOFILL MIGRATION] " 4123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " Did not find one so creating it on web db"; 41321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } else { 414dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen VLOG(2) << "[AUTOFILL MIGRATION] " 4153f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " Found it on web db. Moving on "; 416201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 417201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 418201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 419201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::SaveChangesToWebData( 420201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const DataBundle& bundle) { 421201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 422201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 423201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (IsAbortPending()) 424201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 425201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 426201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch for (size_t i = 0; i < bundle.new_profiles.size(); i++) { 427201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (IsAbortPending()) 428201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!web_database_->GetAutofillTable()->AddAutofillProfile( 430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *bundle.new_profiles[i])) 431201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 432201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 433201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 434201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch for (size_t i = 0; i < bundle.updated_profiles.size(); i++) { 435201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (IsAbortPending()) 436201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!web_database_->GetAutofillTable()->UpdateAutofillProfile( 438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *bundle.updated_profiles[i])) 439201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 440201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 441201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 442201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch for (size_t i = 0; i< bundle.profiles_to_delete.size(); ++i) { 443201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (IsAbortPending()) 444201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!web_database_->GetAutofillTable()->RemoveAutofillProfile( 446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bundle.profiles_to_delete[i])) 447201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 448201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 449201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 450201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 451201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 45221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool AutofillProfileModelAssociator::InitSyncNodeFromChromeId( 45321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& node_id, 45421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen sync_api::BaseNode* sync_node) { 45521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return false; 45621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 45721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 458201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::Associate( 459201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const std::string* autofill, 460201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch int64 sync_id) { 461201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 462201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK_NE(sync_api::kInvalidId, sync_id); 463201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(id_map_.find(*autofill) == id_map_.end()); 464201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(id_map_inverse_.find(sync_id) == id_map_inverse_.end()); 465201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch id_map_[*autofill] = sync_id; 466201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch id_map_inverse_[sync_id] = *autofill; 467201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 468201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 469201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::Disassociate(int64 sync_id) { 470201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 471201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch SyncIdToAutofillMap::iterator iter = id_map_inverse_.find(sync_id); 472201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (iter == id_map_inverse_.end()) 473201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return; 474201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch CHECK(id_map_.erase(iter->second)); 475201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch id_map_inverse_.erase(iter); 476201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 477201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 478201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint64 AutofillProfileModelAssociator::GetSyncIdFromChromeId( 47921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& autofill) { 480201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch AutofillToSyncIdMap::const_iterator iter = id_map_.find(autofill); 481201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return iter == id_map_.end() ? sync_api::kInvalidId : iter->second; 482201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 483201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 484201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::AbortAssociation() { 485201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 48672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock lock(abort_association_pending_lock_); 487201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch abort_association_pending_ = true; 488201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 489201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 49021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst std::string* AutofillProfileModelAssociator::GetChromeNodeFromSyncId( 49121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int64 sync_id) { 49221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen SyncIdToAutofillMap::const_iterator iter = id_map_inverse_.find(sync_id); 49321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return iter == id_map_inverse_.end() ? NULL : &(iter->second); 49421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 49521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 496201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::IsAbortPending() { 49772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock lock(abort_association_pending_lock_); 498201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return abort_association_pending_; 499201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 500201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 50172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenAutofillProfileModelAssociator::DataBundle::DataBundle() {} 50272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 50372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenAutofillProfileModelAssociator::DataBundle::~DataBundle() { 50472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STLDeleteElements(&new_profiles); 50572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 50672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 507ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillProfileModelAssociator::CryptoReadyIfNecessary() { 508ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // We only access the cryptographer while holding a transaction. 509ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sync_api::ReadTransaction trans(sync_service_->GetUserShare()); 510ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen syncable::ModelTypeSet encrypted_types; 511ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sync_service_->GetEncryptedDataTypes(&encrypted_types); 512ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return encrypted_types.count(syncable::AUTOFILL_PROFILE) == 0 || 513ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sync_service_->IsCryptographerReady(&trans); 514ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 51572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 516201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} // namespace browser_sync 517201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 518