| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/sync/glue/password_model_associator.h" | 5 #include "chrome/browser/sync/glue/password_model_associator.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 "Could not get the password entries.", | 67 "Could not get the password entries.", |
| 68 model_type()); | 68 model_type()); |
| 69 } | 69 } |
| 70 | 70 |
| 71 std::set<std::string> current_passwords; | 71 std::set<std::string> current_passwords; |
| 72 PasswordVector new_passwords; | 72 PasswordVector new_passwords; |
| 73 PasswordVector updated_passwords; | 73 PasswordVector updated_passwords; |
| 74 { | 74 { |
| 75 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); | 75 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); |
| 76 sync_api::ReadNode password_root(&trans); | 76 sync_api::ReadNode password_root(&trans); |
| 77 if (!password_root.InitByTagLookup(kPasswordTag)) { | 77 if (password_root.InitByTagLookup(kPasswordTag) != |
| 78 sync_api::BaseNode::INIT_OK) { |
| 78 return error_handler_->CreateAndUploadError( | 79 return error_handler_->CreateAndUploadError( |
| 79 FROM_HERE, | 80 FROM_HERE, |
| 80 "Server did not create the top-level password node. We " | 81 "Server did not create the top-level password node. We " |
| 81 "might be running against an out-of-date server.", | 82 "might be running against an out-of-date server.", |
| 82 model_type()); | 83 model_type()); |
| 83 } | 84 } |
| 84 | 85 |
| 85 for (std::vector<webkit::forms::PasswordForm*>::iterator ix = | 86 for (std::vector<webkit::forms::PasswordForm*>::iterator ix = |
| 86 passwords.begin(); | 87 passwords.begin(); |
| 87 ix != passwords.end(); ++ix) { | 88 ix != passwords.end(); ++ix) { |
| 88 if (IsAbortPending()) { | 89 if (IsAbortPending()) { |
| 89 return SyncError(); | 90 return SyncError(); |
| 90 } | 91 } |
| 91 std::string tag = MakeTag(**ix); | 92 std::string tag = MakeTag(**ix); |
| 92 | 93 |
| 93 sync_api::ReadNode node(&trans); | 94 sync_api::ReadNode node(&trans); |
| 94 if (node.InitByClientTagLookup(syncable::PASSWORDS, tag)) { | 95 if (node.InitByClientTagLookup(syncable::PASSWORDS, tag) == |
| 96 sync_api::BaseNode::INIT_OK) { |
| 95 const sync_pb::PasswordSpecificsData& password = | 97 const sync_pb::PasswordSpecificsData& password = |
| 96 node.GetPasswordSpecifics(); | 98 node.GetPasswordSpecifics(); |
| 97 DCHECK_EQ(tag, MakeTag(password)); | 99 DCHECK_EQ(tag, MakeTag(password)); |
| 98 | 100 |
| 99 webkit::forms::PasswordForm new_password; | 101 webkit::forms::PasswordForm new_password; |
| 100 | 102 |
| 101 if (MergePasswords(password, **ix, &new_password)) { | 103 if (MergePasswords(password, **ix, &new_password)) { |
| 102 sync_api::WriteNode write_node(&trans); | 104 sync_api::WriteNode write_node(&trans); |
| 103 if (!write_node.InitByClientTagLookup(syncable::PASSWORDS, tag)) { | 105 if (write_node.InitByClientTagLookup(syncable::PASSWORDS, tag) != |
| 106 sync_api::BaseNode::INIT_OK) { |
| 104 STLDeleteElements(&passwords); | 107 STLDeleteElements(&passwords); |
| 105 return error_handler_->CreateAndUploadError( | 108 return error_handler_->CreateAndUploadError( |
| 106 FROM_HERE, | 109 FROM_HERE, |
| 107 "Failed to edit password sync node.", | 110 "Failed to edit password sync node.", |
| 108 model_type()); | 111 model_type()); |
| 109 } | 112 } |
| 110 WriteToSyncNode(new_password, &write_node); | 113 WriteToSyncNode(new_password, &write_node); |
| 111 updated_passwords.push_back(new_password); | 114 updated_passwords.push_back(new_password); |
| 112 } | 115 } |
| 113 | 116 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 129 } | 132 } |
| 130 | 133 |
| 131 current_passwords.insert(tag); | 134 current_passwords.insert(tag); |
| 132 } | 135 } |
| 133 | 136 |
| 134 STLDeleteElements(&passwords); | 137 STLDeleteElements(&passwords); |
| 135 | 138 |
| 136 int64 sync_child_id = password_root.GetFirstChildId(); | 139 int64 sync_child_id = password_root.GetFirstChildId(); |
| 137 while (sync_child_id != sync_api::kInvalidId) { | 140 while (sync_child_id != sync_api::kInvalidId) { |
| 138 sync_api::ReadNode sync_child_node(&trans); | 141 sync_api::ReadNode sync_child_node(&trans); |
| 139 if (!sync_child_node.InitByIdLookup(sync_child_id)) { | 142 if (sync_child_node.InitByIdLookup(sync_child_id) != |
| 143 sync_api::BaseNode::INIT_OK) { |
| 140 return error_handler_->CreateAndUploadError( | 144 return error_handler_->CreateAndUploadError( |
| 141 FROM_HERE, | 145 FROM_HERE, |
| 142 "Failed to fetch child node.", | 146 "Failed to fetch child node.", |
| 143 model_type()); | 147 model_type()); |
| 144 } | 148 } |
| 145 const sync_pb::PasswordSpecificsData& password = | 149 const sync_pb::PasswordSpecificsData& password = |
| 146 sync_child_node.GetPasswordSpecifics(); | 150 sync_child_node.GetPasswordSpecifics(); |
| 147 std::string tag = MakeTag(password); | 151 std::string tag = MakeTag(password); |
| 148 | 152 |
| 149 // The password only exists on the server. Add it to the local | 153 // The password only exists on the server. Add it to the local |
| (...skipping 22 matching lines...) Expand all Loading... |
| 172 | 176 |
| 173 return error; | 177 return error; |
| 174 } | 178 } |
| 175 | 179 |
| 176 bool PasswordModelAssociator::DeleteAllNodes( | 180 bool PasswordModelAssociator::DeleteAllNodes( |
| 177 sync_api::WriteTransaction* trans) { | 181 sync_api::WriteTransaction* trans) { |
| 178 DCHECK(expected_loop_ == MessageLoop::current()); | 182 DCHECK(expected_loop_ == MessageLoop::current()); |
| 179 for (PasswordToSyncIdMap::iterator node_id = id_map_.begin(); | 183 for (PasswordToSyncIdMap::iterator node_id = id_map_.begin(); |
| 180 node_id != id_map_.end(); ++node_id) { | 184 node_id != id_map_.end(); ++node_id) { |
| 181 sync_api::WriteNode sync_node(trans); | 185 sync_api::WriteNode sync_node(trans); |
| 182 if (!sync_node.InitByIdLookup(node_id->second)) { | 186 if (sync_node.InitByIdLookup(node_id->second) != |
| 187 sync_api::BaseNode::INIT_OK) { |
| 183 LOG(ERROR) << "Typed url node lookup failed."; | 188 LOG(ERROR) << "Typed url node lookup failed."; |
| 184 return false; | 189 return false; |
| 185 } | 190 } |
| 186 sync_node.Remove(); | 191 sync_node.Remove(); |
| 187 } | 192 } |
| 188 | 193 |
| 189 id_map_.clear(); | 194 id_map_.clear(); |
| 190 id_map_inverse_.clear(); | 195 id_map_inverse_.clear(); |
| 191 return true; | 196 return true; |
| 192 } | 197 } |
| 193 | 198 |
| 194 SyncError PasswordModelAssociator::DisassociateModels() { | 199 SyncError PasswordModelAssociator::DisassociateModels() { |
| 195 id_map_.clear(); | 200 id_map_.clear(); |
| 196 id_map_inverse_.clear(); | 201 id_map_inverse_.clear(); |
| 197 return SyncError(); | 202 return SyncError(); |
| 198 } | 203 } |
| 199 | 204 |
| 200 bool PasswordModelAssociator::SyncModelHasUserCreatedNodes(bool* has_nodes) { | 205 bool PasswordModelAssociator::SyncModelHasUserCreatedNodes(bool* has_nodes) { |
| 201 DCHECK(has_nodes); | 206 DCHECK(has_nodes); |
| 202 *has_nodes = false; | 207 *has_nodes = false; |
| 203 int64 password_sync_id; | 208 int64 password_sync_id; |
| 204 if (!GetSyncIdForTaggedNode(kPasswordTag, &password_sync_id)) { | 209 if (!GetSyncIdForTaggedNode(kPasswordTag, &password_sync_id)) { |
| 205 LOG(ERROR) << "Server did not create the top-level password node. We " | 210 LOG(ERROR) << "Server did not create the top-level password node. We " |
| 206 << "might be running against an out-of-date server."; | 211 << "might be running against an out-of-date server."; |
| 207 return false; | 212 return false; |
| 208 } | 213 } |
| 209 sync_api::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare()); | 214 sync_api::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare()); |
| 210 | 215 |
| 211 sync_api::ReadNode password_node(&trans); | 216 sync_api::ReadNode password_node(&trans); |
| 212 if (!password_node.InitByIdLookup(password_sync_id)) { | 217 if (password_node.InitByIdLookup(password_sync_id) != |
| 218 sync_api::BaseNode::INIT_OK) { |
| 213 LOG(ERROR) << "Server did not create the top-level password node. We " | 219 LOG(ERROR) << "Server did not create the top-level password node. We " |
| 214 << "might be running against an out-of-date server."; | 220 << "might be running against an out-of-date server."; |
| 215 return false; | 221 return false; |
| 216 } | 222 } |
| 217 | 223 |
| 218 // The sync model has user created nodes if the password folder has any | 224 // The sync model has user created nodes if the password folder has any |
| 219 // children. | 225 // children. |
| 220 *has_nodes = password_node.HasChildren(); | 226 *has_nodes = password_node.HasChildren(); |
| 221 return true; | 227 return true; |
| 222 } | 228 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 if (iter == id_map_inverse_.end()) | 278 if (iter == id_map_inverse_.end()) |
| 273 return; | 279 return; |
| 274 CHECK(id_map_.erase(iter->second)); | 280 CHECK(id_map_.erase(iter->second)); |
| 275 id_map_inverse_.erase(iter); | 281 id_map_inverse_.erase(iter); |
| 276 } | 282 } |
| 277 | 283 |
| 278 bool PasswordModelAssociator::GetSyncIdForTaggedNode(const std::string& tag, | 284 bool PasswordModelAssociator::GetSyncIdForTaggedNode(const std::string& tag, |
| 279 int64* sync_id) { | 285 int64* sync_id) { |
| 280 sync_api::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare()); | 286 sync_api::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare()); |
| 281 sync_api::ReadNode sync_node(&trans); | 287 sync_api::ReadNode sync_node(&trans); |
| 282 if (!sync_node.InitByTagLookup(tag.c_str())) | 288 if (sync_node.InitByTagLookup(tag.c_str()) != sync_api::BaseNode::INIT_OK) |
| 283 return false; | 289 return false; |
| 284 *sync_id = sync_node.GetId(); | 290 *sync_id = sync_node.GetId(); |
| 285 return true; | 291 return true; |
| 286 } | 292 } |
| 287 | 293 |
| 288 SyncError PasswordModelAssociator::WriteToPasswordStore( | 294 SyncError PasswordModelAssociator::WriteToPasswordStore( |
| 289 const PasswordVector* new_passwords, | 295 const PasswordVector* new_passwords, |
| 290 const PasswordVector* updated_passwords, | 296 const PasswordVector* updated_passwords, |
| 291 const PasswordVector* deleted_passwords) { | 297 const PasswordVector* deleted_passwords) { |
| 292 if (new_passwords) { | 298 if (new_passwords) { |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 429 const std::string& password_element, | 435 const std::string& password_element, |
| 430 const std::string& signon_realm) { | 436 const std::string& signon_realm) { |
| 431 return net::EscapePath(origin_url) + "|" + | 437 return net::EscapePath(origin_url) + "|" + |
| 432 net::EscapePath(username_element) + "|" + | 438 net::EscapePath(username_element) + "|" + |
| 433 net::EscapePath(username_value) + "|" + | 439 net::EscapePath(username_value) + "|" + |
| 434 net::EscapePath(password_element) + "|" + | 440 net::EscapePath(password_element) + "|" + |
| 435 net::EscapePath(signon_realm); | 441 net::EscapePath(signon_realm); |
| 436 } | 442 } |
| 437 | 443 |
| 438 } // namespace browser_sync | 444 } // namespace browser_sync |
| OLD | NEW |