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

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

Issue 7551024: [Sync] Fix encryption/passphrase handling. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase + fix allstatus 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 1623 matching lines...) Expand 10 before | Expand all | Expand 10 after
1634 JsTransactionObserver js_transaction_observer_; 1634 JsTransactionObserver js_transaction_observer_;
1635 }; 1635 };
1636 const int SyncManager::SyncInternal::kDefaultNudgeDelayMilliseconds = 200; 1636 const int SyncManager::SyncInternal::kDefaultNudgeDelayMilliseconds = 200;
1637 const int SyncManager::SyncInternal::kPreferencesNudgeDelayMilliseconds = 2000; 1637 const int SyncManager::SyncInternal::kPreferencesNudgeDelayMilliseconds = 2000;
1638 1638
1639 SyncManager::Observer::~Observer() {} 1639 SyncManager::Observer::~Observer() {}
1640 1640
1641 SyncManager::SyncManager(const std::string& name) 1641 SyncManager::SyncManager(const std::string& name)
1642 : data_(new SyncInternal(name)) {} 1642 : data_(new SyncInternal(name)) {}
1643 1643
1644 SyncManager::Status::Status() { 1644 SyncManager::Status::Status()
1645 : summary(INVALID),
1646 authenticated(false),
1647 server_up(false),
1648 server_reachable(false),
1649 server_broken(false),
1650 notifications_enabled(false),
1651 notifications_received(0),
1652 notifiable_commits(0),
1653 max_consecutive_errors(0),
1654 unsynced_count(0),
1655 conflicting_count(0),
1656 syncing(false),
1657 initial_sync_ended(false),
1658 syncer_stuck(false),
1659 updates_available(0),
1660 updates_received(0),
1661 tombstone_updates_received(0),
1662 disk_full(false),
1663 num_local_overwrites_total(0),
1664 num_server_overwrites_total(0),
1665 nonempty_get_updates(0),
1666 empty_get_updates(0),
1667 useless_sync_cycles(0),
1668 useful_sync_cycles(0),
1669 cryptographer_ready(false),
1670 crypto_has_pending_keys(false) {
1645 } 1671 }
1646 1672
1647 SyncManager::Status::~Status() { 1673 SyncManager::Status::~Status() {
1648 } 1674 }
1649 1675
1650 bool SyncManager::Init( 1676 bool SyncManager::Init(
1651 const FilePath& database_location, 1677 const FilePath& database_location,
1652 const WeakHandle<JsEventHandler>& event_handler, 1678 const WeakHandle<JsEventHandler>& event_handler,
1653 const std::string& sync_server_and_path, 1679 const std::string& sync_server_and_path,
1654 int sync_server_port, 1680 int sync_server_port,
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
2089 WriteNode node(&trans); 2115 WriteNode node(&trans);
2090 if (!node.InitByTagLookup(kNigoriTag)) { 2116 if (!node.InitByTagLookup(kNigoriTag)) {
2091 NOTREACHED() << "Unable to set encrypted datatypes because Nigori node not " 2117 NOTREACHED() << "Unable to set encrypted datatypes because Nigori node not "
2092 << "found."; 2118 << "found.";
2093 return; 2119 return;
2094 } 2120 }
2095 2121
2096 Cryptographer* cryptographer = trans.GetCryptographer(); 2122 Cryptographer* cryptographer = trans.GetCryptographer();
2097 2123
2098 if (!cryptographer->is_initialized()) { 2124 if (!cryptographer->is_initialized()) {
2099 NOTREACHED() << "Attempting to encrypt datatypes when cryptographer not " 2125 VLOG(1) << "Attempting to encrypt datatypes when cryptographer not "
2100 << "initialized."; 2126 << "initialized, prompting for passphrase.";
2127 ObserverList<SyncManager::Observer> temp_obs_list;
2128 CopyObservers(&temp_obs_list);
2129 // TODO(zea): this isn't really decryption, but that's the only way we have
2130 // to prompt the user for a passsphrase. See http://crbug.com/91379.
2131 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list,
2132 OnPassphraseRequired(sync_api::REASON_DECRYPTION));
2101 return; 2133 return;
2102 } 2134 }
2103 2135
2104 // Update the Nigori node set of encrypted datatypes so other machines notice. 2136 // Update the Nigori node's set of encrypted datatypes.
2105 // Note, we merge the current encrypted types with those requested. Once a 2137 // Note, we merge the current encrypted types with those requested. Once a
2106 // datatypes is marked as needing encryption, it is never unmarked. 2138 // datatypes is marked as needing encryption, it is never unmarked.
2107 sync_pb::NigoriSpecifics nigori; 2139 sync_pb::NigoriSpecifics nigori;
2108 nigori.CopyFrom(node.GetNigoriSpecifics()); 2140 nigori.CopyFrom(node.GetNigoriSpecifics());
2109 syncable::ModelTypeSet current_encrypted_types = GetEncryptedTypes(&trans); 2141 syncable::ModelTypeSet current_encrypted_types = GetEncryptedTypes(&trans);
2110 syncable::ModelTypeSet newly_encrypted_types; 2142 syncable::ModelTypeSet newly_encrypted_types;
2111 std::set_union(current_encrypted_types.begin(), current_encrypted_types.end(), 2143 std::set_union(current_encrypted_types.begin(), current_encrypted_types.end(),
2112 encrypted_types.begin(), encrypted_types.end(), 2144 encrypted_types.begin(), encrypted_types.end(),
2113 std::inserter(newly_encrypted_types, 2145 std::inserter(newly_encrypted_types,
2114 newly_encrypted_types.begin())); 2146 newly_encrypted_types.begin()));
2115 allstatus_.SetEncryptedTypes(newly_encrypted_types); 2147 allstatus_.SetEncryptedTypes(newly_encrypted_types);
2116 if (newly_encrypted_types == current_encrypted_types) 2148 if (newly_encrypted_types == current_encrypted_types) {
2117 return; // Set of encrypted types did not change. 2149 // Set of encrypted types has not changed, just notify and return.
2150 ObserverList<SyncManager::Observer> temp_obs_list;
2151 CopyObservers(&temp_obs_list);
2152 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list,
2153 OnEncryptionComplete(current_encrypted_types));
2154 return;
2155 }
2118 syncable::FillNigoriEncryptedTypes(newly_encrypted_types, &nigori); 2156 syncable::FillNigoriEncryptedTypes(newly_encrypted_types, &nigori);
2119 node.SetNigoriSpecifics(nigori); 2157 node.SetNigoriSpecifics(nigori);
2120 2158
2121 cryptographer->SetEncryptedTypes(nigori); 2159 cryptographer->SetEncryptedTypes(nigori);
2122 2160
2123 // TODO(zea): only reencrypt this datatype? ReEncrypting everything is a 2161 // TODO(zea): only reencrypt this datatype? ReEncrypting everything is a
2124 // safer approach, and should not impact anything that is already encrypted 2162 // safer approach, and should not impact anything that is already encrypted
2125 // (redundant changes are ignored). 2163 // (redundant changes are ignored).
2126 ReEncryptEverything(&trans); 2164 ReEncryptEverything(&trans);
2127 return; 2165 return;
(...skipping 24 matching lines...) Expand all
2152 to_visit.push(child_id); 2190 to_visit.push(child_id);
2153 while (!to_visit.empty()) { 2191 while (!to_visit.empty()) {
2154 child_id = to_visit.front(); 2192 child_id = to_visit.front();
2155 to_visit.pop(); 2193 to_visit.pop();
2156 if (child_id == kInvalidId) 2194 if (child_id == kInvalidId)
2157 continue; 2195 continue;
2158 2196
2159 WriteNode child(trans); 2197 WriteNode child(trans);
2160 if (!child.InitByIdLookup(child_id)) { 2198 if (!child.InitByIdLookup(child_id)) {
2161 NOTREACHED(); 2199 NOTREACHED();
2162 return; 2200 continue;
2163 } 2201 }
2164 if (child.GetIsFolder()) { 2202 if (child.GetIsFolder()) {
2165 to_visit.push(child.GetFirstChildId()); 2203 to_visit.push(child.GetFirstChildId());
2166 } 2204 }
2167 if (child.GetEntry()->Get(syncable::UNIQUE_SERVER_TAG).empty()) { 2205 if (child.GetEntry()->Get(syncable::UNIQUE_SERVER_TAG).empty()) {
2168 // Rewrite the specifics of the node with encrypted data if necessary 2206 // Rewrite the specifics of the node with encrypted data if necessary
2169 // (only rewrite the non-unique folders). 2207 // (only rewrite the non-unique folders).
2170 child.ResetFromSpecifics(); 2208 child.ResetFromSpecifics();
2171 } 2209 }
2172 to_visit.push(child.GetSuccessorId()); 2210 to_visit.push(child.GetSuccessorId());
2173 } 2211 }
2174 } 2212 }
2175 2213
2176 if (routes.count(syncable::PASSWORDS) > 0) { 2214 if (routes.count(syncable::PASSWORDS) > 0) {
2177 // Passwords are encrypted with their own legacy scheme. 2215 // Passwords are encrypted with their own legacy scheme.
2178 ReadNode passwords_root(trans); 2216 ReadNode passwords_root(trans);
2179 std::string passwords_tag = 2217 std::string passwords_tag =
2180 syncable::ModelTypeToRootTag(syncable::PASSWORDS); 2218 syncable::ModelTypeToRootTag(syncable::PASSWORDS);
2181 if (!passwords_root.InitByTagLookup(passwords_tag)) { 2219 // It's possible we'll have the password routing info and not the password
2182 LOG(WARNING) << "No passwords to reencrypt."; 2220 // root if we attempted to SetPassphrase before passwords was enabled.
2183 return; 2221 if (passwords_root.InitByTagLookup(passwords_tag)) {
2184 } 2222 int64 child_id = passwords_root.GetFirstChildId();
2185 2223 while (child_id != kInvalidId) {
2186 int64 child_id = passwords_root.GetFirstChildId(); 2224 WriteNode child(trans);
2187 while (child_id != kInvalidId) { 2225 if (!child.InitByIdLookup(child_id)) {
2188 WriteNode child(trans); 2226 NOTREACHED();
2189 if (!child.InitByIdLookup(child_id)) { 2227 return;
2190 NOTREACHED(); 2228 }
2191 return; 2229 child.SetPasswordSpecifics(child.GetPasswordSpecifics());
2230 child_id = child.GetSuccessorId();
2192 } 2231 }
2193 child.SetPasswordSpecifics(child.GetPasswordSpecifics());
2194 child_id = child.GetSuccessorId();
2195 } 2232 }
2196 } 2233 }
2197 2234
2198 ObserverList<SyncManager::Observer> temp_obs_list; 2235 ObserverList<SyncManager::Observer> temp_obs_list;
2199 CopyObservers(&temp_obs_list); 2236 CopyObservers(&temp_obs_list);
2200 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, 2237 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list,
2201 OnEncryptionComplete(encrypted_types)); 2238 OnEncryptionComplete(encrypted_types));
2202 } 2239 }
2203 2240
2204 SyncManager::~SyncManager() { 2241 SyncManager::~SyncManager() {
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after
3026 void SyncManager::TriggerOnIncomingNotificationForTest( 3063 void SyncManager::TriggerOnIncomingNotificationForTest(
3027 const syncable::ModelTypeBitSet& model_types) { 3064 const syncable::ModelTypeBitSet& model_types) {
3028 syncable::ModelTypePayloadMap model_types_with_payloads = 3065 syncable::ModelTypePayloadMap model_types_with_payloads =
3029 syncable::ModelTypePayloadMapFromBitSet(model_types, 3066 syncable::ModelTypePayloadMapFromBitSet(model_types,
3030 std::string()); 3067 std::string());
3031 3068
3032 data_->OnIncomingNotification(model_types_with_payloads); 3069 data_->OnIncomingNotification(model_types_with_payloads);
3033 } 3070 }
3034 3071
3035 } // namespace sync_api 3072 } // 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