Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(84)

Side by Side Diff: chrome/browser/sync/engine/syncapi.cc

Issue 7583032: Merge 95693 - [Sync] Fix encryption/passphrase handling. (Closed) Base URL: svn://svn.chromium.org/chrome/branches/835/src/
Patch Set: Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/sync/engine/syncapi_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/sync/engine/syncapi.h" 5 #include "chrome/browser/sync/engine/syncapi.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <bitset> 8 #include <bitset>
9 #include <iomanip> 9 #include <iomanip>
10 #include <list> 10 #include <list>
(...skipping 1627 matching lines...) Expand 10 before | Expand all | Expand 10 after
1638 JsMessageHandlerMap js_message_handlers_; 1638 JsMessageHandlerMap js_message_handlers_;
1639 }; 1639 };
1640 const int SyncManager::SyncInternal::kDefaultNudgeDelayMilliseconds = 200; 1640 const int SyncManager::SyncInternal::kDefaultNudgeDelayMilliseconds = 200;
1641 const int SyncManager::SyncInternal::kPreferencesNudgeDelayMilliseconds = 2000; 1641 const int SyncManager::SyncInternal::kPreferencesNudgeDelayMilliseconds = 2000;
1642 1642
1643 SyncManager::Observer::~Observer() {} 1643 SyncManager::Observer::~Observer() {}
1644 1644
1645 SyncManager::SyncManager(const std::string& name) 1645 SyncManager::SyncManager(const std::string& name)
1646 : data_(new SyncInternal(name, ALLOW_THIS_IN_INITIALIZER_LIST(this))) {} 1646 : data_(new SyncInternal(name, ALLOW_THIS_IN_INITIALIZER_LIST(this))) {}
1647 1647
1648 SyncManager::Status::Status() { 1648 SyncManager::Status::Status()
1649 : summary(INVALID),
1650 authenticated(false),
1651 server_up(false),
1652 server_reachable(false),
1653 server_broken(false),
1654 notifications_enabled(false),
1655 notifications_received(0),
1656 notifiable_commits(0),
1657 max_consecutive_errors(0),
1658 unsynced_count(0),
1659 conflicting_count(0),
1660 syncing(false),
1661 initial_sync_ended(false),
1662 syncer_stuck(false),
1663 updates_available(0),
1664 updates_received(0),
1665 tombstone_updates_received(0),
1666 disk_full(false),
1667 num_local_overwrites_total(0),
1668 num_server_overwrites_total(0),
1669 nonempty_get_updates(0),
1670 empty_get_updates(0),
1671 useless_sync_cycles(0),
1672 useful_sync_cycles(0),
1673 cryptographer_ready(false),
1674 crypto_has_pending_keys(false) {
1649 } 1675 }
1650 1676
1651 SyncManager::Status::~Status() { 1677 SyncManager::Status::~Status() {
1652 } 1678 }
1653 1679
1654 bool SyncManager::Init(const FilePath& database_location, 1680 bool SyncManager::Init(const FilePath& database_location,
1655 const std::string& sync_server_and_path, 1681 const std::string& sync_server_and_path,
1656 int sync_server_port, 1682 int sync_server_port,
1657 bool use_ssl, 1683 bool use_ssl,
1658 HttpPostProviderFactory* post_factory, 1684 HttpPostProviderFactory* post_factory,
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
2087 WriteNode node(&trans); 2113 WriteNode node(&trans);
2088 if (!node.InitByTagLookup(kNigoriTag)) { 2114 if (!node.InitByTagLookup(kNigoriTag)) {
2089 NOTREACHED() << "Unable to set encrypted datatypes because Nigori node not " 2115 NOTREACHED() << "Unable to set encrypted datatypes because Nigori node not "
2090 << "found."; 2116 << "found.";
2091 return; 2117 return;
2092 } 2118 }
2093 2119
2094 Cryptographer* cryptographer = trans.GetCryptographer(); 2120 Cryptographer* cryptographer = trans.GetCryptographer();
2095 2121
2096 if (!cryptographer->is_initialized()) { 2122 if (!cryptographer->is_initialized()) {
2097 NOTREACHED() << "Attempting to encrypt datatypes when cryptographer not " 2123 VLOG(1) << "Attempting to encrypt datatypes when cryptographer not "
2098 << "initialized."; 2124 << "initialized, prompting for passphrase.";
2125 ObserverList<SyncManager::Observer> temp_obs_list;
2126 CopyObservers(&temp_obs_list);
2127 // TODO(zea): this isn't really decryption, but that's the only way we have
2128 // to prompt the user for a passsphrase. See http://crbug.com/91379.
2129 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list,
2130 OnPassphraseRequired(sync_api::REASON_DECRYPTION));
2099 return; 2131 return;
2100 } 2132 }
2101 2133
2102 // Update the Nigori node set of encrypted datatypes so other machines notice. 2134 // Update the Nigori node's set of encrypted datatypes.
2103 // Note, we merge the current encrypted types with those requested. Once a 2135 // Note, we merge the current encrypted types with those requested. Once a
2104 // datatypes is marked as needing encryption, it is never unmarked. 2136 // datatypes is marked as needing encryption, it is never unmarked.
2105 sync_pb::NigoriSpecifics nigori; 2137 sync_pb::NigoriSpecifics nigori;
2106 nigori.CopyFrom(node.GetNigoriSpecifics()); 2138 nigori.CopyFrom(node.GetNigoriSpecifics());
2107 syncable::ModelTypeSet current_encrypted_types = GetEncryptedTypes(&trans); 2139 syncable::ModelTypeSet current_encrypted_types = GetEncryptedTypes(&trans);
2108 syncable::ModelTypeSet newly_encrypted_types; 2140 syncable::ModelTypeSet newly_encrypted_types;
2109 std::set_union(current_encrypted_types.begin(), current_encrypted_types.end(), 2141 std::set_union(current_encrypted_types.begin(), current_encrypted_types.end(),
2110 encrypted_types.begin(), encrypted_types.end(), 2142 encrypted_types.begin(), encrypted_types.end(),
2111 std::inserter(newly_encrypted_types, 2143 std::inserter(newly_encrypted_types,
2112 newly_encrypted_types.begin())); 2144 newly_encrypted_types.begin()));
2113 allstatus_.SetEncryptedTypes(newly_encrypted_types); 2145 allstatus_.SetEncryptedTypes(newly_encrypted_types);
2114 if (newly_encrypted_types == current_encrypted_types) 2146 if (newly_encrypted_types == current_encrypted_types) {
2115 return; // Set of encrypted types did not change. 2147 // Set of encrypted types has not changed, just notify and return.
2148 ObserverList<SyncManager::Observer> temp_obs_list;
2149 CopyObservers(&temp_obs_list);
2150 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list,
2151 OnEncryptionComplete(current_encrypted_types));
2152 return;
2153 }
2116 syncable::FillNigoriEncryptedTypes(newly_encrypted_types, &nigori); 2154 syncable::FillNigoriEncryptedTypes(newly_encrypted_types, &nigori);
2117 node.SetNigoriSpecifics(nigori); 2155 node.SetNigoriSpecifics(nigori);
2118 2156
2119 cryptographer->SetEncryptedTypes(nigori); 2157 cryptographer->SetEncryptedTypes(nigori);
2120 2158
2121 // TODO(zea): only reencrypt this datatype? ReEncrypting everything is a 2159 // TODO(zea): only reencrypt this datatype? ReEncrypting everything is a
2122 // safer approach, and should not impact anything that is already encrypted 2160 // safer approach, and should not impact anything that is already encrypted
2123 // (redundant changes are ignored). 2161 // (redundant changes are ignored).
2124 ReEncryptEverything(&trans); 2162 ReEncryptEverything(&trans);
2125 return; 2163 return;
(...skipping 24 matching lines...) Expand all
2150 to_visit.push(child_id); 2188 to_visit.push(child_id);
2151 while (!to_visit.empty()) { 2189 while (!to_visit.empty()) {
2152 child_id = to_visit.front(); 2190 child_id = to_visit.front();
2153 to_visit.pop(); 2191 to_visit.pop();
2154 if (child_id == kInvalidId) 2192 if (child_id == kInvalidId)
2155 continue; 2193 continue;
2156 2194
2157 WriteNode child(trans); 2195 WriteNode child(trans);
2158 if (!child.InitByIdLookup(child_id)) { 2196 if (!child.InitByIdLookup(child_id)) {
2159 NOTREACHED(); 2197 NOTREACHED();
2160 return; 2198 continue;
2161 } 2199 }
2162 if (child.GetIsFolder()) { 2200 if (child.GetIsFolder()) {
2163 to_visit.push(child.GetFirstChildId()); 2201 to_visit.push(child.GetFirstChildId());
2164 } 2202 }
2165 if (child.GetEntry()->Get(syncable::UNIQUE_SERVER_TAG).empty()) { 2203 if (child.GetEntry()->Get(syncable::UNIQUE_SERVER_TAG).empty()) {
2166 // Rewrite the specifics of the node with encrypted data if necessary 2204 // Rewrite the specifics of the node with encrypted data if necessary
2167 // (only rewrite the non-unique folders). 2205 // (only rewrite the non-unique folders).
2168 child.ResetFromSpecifics(); 2206 child.ResetFromSpecifics();
2169 } 2207 }
2170 to_visit.push(child.GetSuccessorId()); 2208 to_visit.push(child.GetSuccessorId());
2171 } 2209 }
2172 } 2210 }
2173 2211
2174 if (routes.count(syncable::PASSWORDS) > 0) { 2212 if (routes.count(syncable::PASSWORDS) > 0) {
2175 // Passwords are encrypted with their own legacy scheme. 2213 // Passwords are encrypted with their own legacy scheme.
2176 ReadNode passwords_root(trans); 2214 ReadNode passwords_root(trans);
2177 std::string passwords_tag = 2215 std::string passwords_tag =
2178 syncable::ModelTypeToRootTag(syncable::PASSWORDS); 2216 syncable::ModelTypeToRootTag(syncable::PASSWORDS);
2179 if (!passwords_root.InitByTagLookup(passwords_tag)) { 2217 // It's possible we'll have the password routing info and not the password
2180 LOG(WARNING) << "No passwords to reencrypt."; 2218 // root if we attempted to SetPassphrase before passwords was enabled.
2181 return; 2219 if (passwords_root.InitByTagLookup(passwords_tag)) {
2182 } 2220 int64 child_id = passwords_root.GetFirstChildId();
2183 2221 while (child_id != kInvalidId) {
2184 int64 child_id = passwords_root.GetFirstChildId(); 2222 WriteNode child(trans);
2185 while (child_id != kInvalidId) { 2223 if (!child.InitByIdLookup(child_id)) {
2186 WriteNode child(trans); 2224 NOTREACHED();
2187 if (!child.InitByIdLookup(child_id)) { 2225 return;
2188 NOTREACHED(); 2226 }
2189 return; 2227 child.SetPasswordSpecifics(child.GetPasswordSpecifics());
2228 child_id = child.GetSuccessorId();
2190 } 2229 }
2191 child.SetPasswordSpecifics(child.GetPasswordSpecifics());
2192 child_id = child.GetSuccessorId();
2193 } 2230 }
2194 } 2231 }
2195 2232
2196 ObserverList<SyncManager::Observer> temp_obs_list; 2233 ObserverList<SyncManager::Observer> temp_obs_list;
2197 CopyObservers(&temp_obs_list); 2234 CopyObservers(&temp_obs_list);
2198 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, 2235 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list,
2199 OnEncryptionComplete(encrypted_types)); 2236 OnEncryptionComplete(encrypted_types));
2200 } 2237 }
2201 2238
2202 SyncManager::~SyncManager() { 2239 SyncManager::~SyncManager() {
(...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after
3064 void SyncManager::TriggerOnIncomingNotificationForTest( 3101 void SyncManager::TriggerOnIncomingNotificationForTest(
3065 const syncable::ModelTypeBitSet& model_types) { 3102 const syncable::ModelTypeBitSet& model_types) {
3066 syncable::ModelTypePayloadMap model_types_with_payloads = 3103 syncable::ModelTypePayloadMap model_types_with_payloads =
3067 syncable::ModelTypePayloadMapFromBitSet(model_types, 3104 syncable::ModelTypePayloadMapFromBitSet(model_types,
3068 std::string()); 3105 std::string());
3069 3106
3070 data_->OnIncomingNotification(model_types_with_payloads); 3107 data_->OnIncomingNotification(model_types_with_payloads);
3071 } 3108 }
3072 3109
3073 } // namespace sync_api 3110 } // namespace sync_api
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/sync/engine/syncapi_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698