| 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/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 2086 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2097 WriteNode node(&trans); | 2097 WriteNode node(&trans); |
| 2098 if (!node.InitByTagLookup(kNigoriTag)) { | 2098 if (!node.InitByTagLookup(kNigoriTag)) { |
| 2099 NOTREACHED() << "Unable to set encrypted datatypes because Nigori node not " | 2099 NOTREACHED() << "Unable to set encrypted datatypes because Nigori node not " |
| 2100 << "found."; | 2100 << "found."; |
| 2101 return; | 2101 return; |
| 2102 } | 2102 } |
| 2103 | 2103 |
| 2104 Cryptographer* cryptographer = trans.GetCryptographer(); | 2104 Cryptographer* cryptographer = trans.GetCryptographer(); |
| 2105 | 2105 |
| 2106 if (!cryptographer->is_initialized()) { | 2106 if (!cryptographer->is_initialized()) { |
| 2107 NOTREACHED() << "Attempting to encrypt datatypes when cryptographer not " | 2107 VLOG(1) << "Attempting to encrypt datatypes when cryptographer not " |
| 2108 << "initialized."; | 2108 << "initialized, prompting for passphrase."; |
| 2109 ObserverList<SyncManager::Observer> temp_obs_list; |
| 2110 CopyObservers(&temp_obs_list); |
| 2111 // TODO(zea): this isn't really decryption, but that's the only way we have |
| 2112 // to prompt the user for a passsphrase. See http://crbug.com/91379. |
| 2113 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, |
| 2114 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); |
| 2109 return; | 2115 return; |
| 2110 } | 2116 } |
| 2111 | 2117 |
| 2112 // Update the Nigori node set of encrypted datatypes so other machines notice. | 2118 // Update the Nigori node's set of encrypted datatypes. |
| 2113 // Note, we merge the current encrypted types with those requested. Once a | 2119 // Note, we merge the current encrypted types with those requested. Once a |
| 2114 // datatypes is marked as needing encryption, it is never unmarked. | 2120 // datatypes is marked as needing encryption, it is never unmarked. |
| 2115 sync_pb::NigoriSpecifics nigori; | 2121 sync_pb::NigoriSpecifics nigori; |
| 2116 nigori.CopyFrom(node.GetNigoriSpecifics()); | 2122 nigori.CopyFrom(node.GetNigoriSpecifics()); |
| 2117 syncable::ModelTypeSet current_encrypted_types = GetEncryptedTypes(&trans); | 2123 syncable::ModelTypeSet current_encrypted_types = GetEncryptedTypes(&trans); |
| 2118 syncable::ModelTypeSet newly_encrypted_types; | 2124 syncable::ModelTypeSet newly_encrypted_types; |
| 2119 std::set_union(current_encrypted_types.begin(), current_encrypted_types.end(), | 2125 std::set_union(current_encrypted_types.begin(), current_encrypted_types.end(), |
| 2120 encrypted_types.begin(), encrypted_types.end(), | 2126 encrypted_types.begin(), encrypted_types.end(), |
| 2121 std::inserter(newly_encrypted_types, | 2127 std::inserter(newly_encrypted_types, |
| 2122 newly_encrypted_types.begin())); | 2128 newly_encrypted_types.begin())); |
| 2123 if (newly_encrypted_types == current_encrypted_types) | 2129 if (newly_encrypted_types == current_encrypted_types) { |
| 2124 return; // Set of encrypted types did not change. | 2130 // Set of encrypted types has not changed, just notify and return. |
| 2131 ObserverList<SyncManager::Observer> temp_obs_list; |
| 2132 CopyObservers(&temp_obs_list); |
| 2133 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, |
| 2134 OnEncryptionComplete(current_encrypted_types)); |
| 2135 return; |
| 2136 } |
| 2125 syncable::FillNigoriEncryptedTypes(newly_encrypted_types, &nigori); | 2137 syncable::FillNigoriEncryptedTypes(newly_encrypted_types, &nigori); |
| 2126 node.SetNigoriSpecifics(nigori); | 2138 node.SetNigoriSpecifics(nigori); |
| 2127 | 2139 |
| 2128 cryptographer->SetEncryptedTypes(nigori); | 2140 cryptographer->SetEncryptedTypes(nigori); |
| 2129 | 2141 |
| 2130 // TODO(zea): only reencrypt this datatype? ReEncrypting everything is a | 2142 // TODO(zea): only reencrypt this datatype? ReEncrypting everything is a |
| 2131 // safer approach, and should not impact anything that is already encrypted | 2143 // safer approach, and should not impact anything that is already encrypted |
| 2132 // (redundant changes are ignored). | 2144 // (redundant changes are ignored). |
| 2133 ReEncryptEverything(&trans); | 2145 ReEncryptEverything(&trans); |
| 2134 return; | 2146 return; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 2159 to_visit.push(child_id); | 2171 to_visit.push(child_id); |
| 2160 while (!to_visit.empty()) { | 2172 while (!to_visit.empty()) { |
| 2161 child_id = to_visit.front(); | 2173 child_id = to_visit.front(); |
| 2162 to_visit.pop(); | 2174 to_visit.pop(); |
| 2163 if (child_id == kInvalidId) | 2175 if (child_id == kInvalidId) |
| 2164 continue; | 2176 continue; |
| 2165 | 2177 |
| 2166 WriteNode child(trans); | 2178 WriteNode child(trans); |
| 2167 if (!child.InitByIdLookup(child_id)) { | 2179 if (!child.InitByIdLookup(child_id)) { |
| 2168 NOTREACHED(); | 2180 NOTREACHED(); |
| 2169 return; | 2181 continue; |
| 2170 } | 2182 } |
| 2171 if (child.GetIsFolder()) { | 2183 if (child.GetIsFolder()) { |
| 2172 to_visit.push(child.GetFirstChildId()); | 2184 to_visit.push(child.GetFirstChildId()); |
| 2173 } | 2185 } |
| 2174 if (child.GetEntry()->Get(syncable::UNIQUE_SERVER_TAG).empty()) { | 2186 if (child.GetEntry()->Get(syncable::UNIQUE_SERVER_TAG).empty()) { |
| 2175 // Rewrite the specifics of the node with encrypted data if necessary | 2187 // Rewrite the specifics of the node with encrypted data if necessary |
| 2176 // (only rewrite the non-unique folders). | 2188 // (only rewrite the non-unique folders). |
| 2177 child.ResetFromSpecifics(); | 2189 child.ResetFromSpecifics(); |
| 2178 } | 2190 } |
| 2179 to_visit.push(child.GetSuccessorId()); | 2191 to_visit.push(child.GetSuccessorId()); |
| 2180 } | 2192 } |
| 2181 } | 2193 } |
| 2182 | 2194 |
| 2183 if (routes.count(syncable::PASSWORDS) > 0) { | 2195 if (routes.count(syncable::PASSWORDS) > 0) { |
| 2184 // Passwords are encrypted with their own legacy scheme. | 2196 // Passwords are encrypted with their own legacy scheme. |
| 2185 ReadNode passwords_root(trans); | 2197 ReadNode passwords_root(trans); |
| 2186 std::string passwords_tag = | 2198 std::string passwords_tag = |
| 2187 syncable::ModelTypeToRootTag(syncable::PASSWORDS); | 2199 syncable::ModelTypeToRootTag(syncable::PASSWORDS); |
| 2188 if (!passwords_root.InitByTagLookup(passwords_tag)) { | 2200 // It's possible we'll have the password routing info and not the password |
| 2189 LOG(WARNING) << "No passwords to reencrypt."; | 2201 // root if we attempted to SetPassphrase before passwords was enabled. |
| 2190 return; | 2202 if (passwords_root.InitByTagLookup(passwords_tag)) { |
| 2191 } | 2203 int64 child_id = passwords_root.GetFirstChildId(); |
| 2192 | 2204 while (child_id != kInvalidId) { |
| 2193 int64 child_id = passwords_root.GetFirstChildId(); | 2205 WriteNode child(trans); |
| 2194 while (child_id != kInvalidId) { | 2206 if (!child.InitByIdLookup(child_id)) { |
| 2195 WriteNode child(trans); | 2207 NOTREACHED(); |
| 2196 if (!child.InitByIdLookup(child_id)) { | 2208 return; |
| 2197 NOTREACHED(); | 2209 } |
| 2198 return; | 2210 child.SetPasswordSpecifics(child.GetPasswordSpecifics()); |
| 2211 child_id = child.GetSuccessorId(); |
| 2199 } | 2212 } |
| 2200 child.SetPasswordSpecifics(child.GetPasswordSpecifics()); | |
| 2201 child_id = child.GetSuccessorId(); | |
| 2202 } | 2213 } |
| 2203 } | 2214 } |
| 2204 | 2215 |
| 2205 ObserverList<SyncManager::Observer> temp_obs_list; | 2216 ObserverList<SyncManager::Observer> temp_obs_list; |
| 2206 CopyObservers(&temp_obs_list); | 2217 CopyObservers(&temp_obs_list); |
| 2207 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, | 2218 FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list, |
| 2208 OnEncryptionComplete(encrypted_types)); | 2219 OnEncryptionComplete(encrypted_types)); |
| 2209 } | 2220 } |
| 2210 | 2221 |
| 2211 SyncManager::~SyncManager() { | 2222 SyncManager::~SyncManager() { |
| (...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3074 void SyncManager::TriggerOnIncomingNotificationForTest( | 3085 void SyncManager::TriggerOnIncomingNotificationForTest( |
| 3075 const syncable::ModelTypeBitSet& model_types) { | 3086 const syncable::ModelTypeBitSet& model_types) { |
| 3076 syncable::ModelTypePayloadMap model_types_with_payloads = | 3087 syncable::ModelTypePayloadMap model_types_with_payloads = |
| 3077 syncable::ModelTypePayloadMapFromBitSet(model_types, | 3088 syncable::ModelTypePayloadMapFromBitSet(model_types, |
| 3078 std::string()); | 3089 std::string()); |
| 3079 | 3090 |
| 3080 data_->OnIncomingNotification(model_types_with_payloads); | 3091 data_->OnIncomingNotification(model_types_with_payloads); |
| 3081 } | 3092 } |
| 3082 | 3093 |
| 3083 } // namespace sync_api | 3094 } // namespace sync_api |
| OLD | NEW |