Chromium Code Reviews| 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/internal_api/sync_manager.h" | 5 #include "chrome/browser/sync/internal_api/sync_manager.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/base64.h" | 9 #include "base/base64.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 836 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 847 Cryptographer::UpdateResult result = cryptographer->Update(nigori); | 847 Cryptographer::UpdateResult result = cryptographer->Update(nigori); |
| 848 if (result == Cryptographer::NEEDS_PASSPHRASE) { | 848 if (result == Cryptographer::NEEDS_PASSPHRASE) { |
| 849 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 849 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
| 850 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); | 850 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); |
| 851 } | 851 } |
| 852 | 852 |
| 853 // Due to http://crbug.com/102526, we must check if the encryption keys | 853 // Due to http://crbug.com/102526, we must check if the encryption keys |
| 854 // are present in the nigori node. If they're not, we write the current set of | 854 // are present in the nigori node. If they're not, we write the current set of |
| 855 // keys. | 855 // keys. |
| 856 if (!nigori.has_encrypted() && cryptographer->is_ready()) { | 856 if (!nigori.has_encrypted() && cryptographer->is_ready()) { |
| 857 cryptographer->GetKeys(nigori.mutable_encrypted()); | 857 DCHECK(cryptographer->GetKeys(nigori.mutable_encrypted())); |
|
akalin
2011/12/09 23:52:42
Change to a CHECK, or rewrite as:
if (!...) {
N
Nicolas Zea
2011/12/12 20:12:26
Done.
| |
| 858 } | 858 } |
| 859 | 859 |
| 860 // Ensure the nigori node reflects the most recent set of sensitive types | 860 // Ensure the nigori node reflects the most recent set of sensitive types |
| 861 // and properly sets encrypt_everything. This is a no-op if nothing changes. | 861 // and properly sets encrypt_everything. This is a no-op if nothing changes. |
| 862 cryptographer->UpdateNigoriFromEncryptedTypes(&nigori); | 862 cryptographer->UpdateNigoriFromEncryptedTypes(&nigori); |
| 863 node.SetNigoriSpecifics(nigori); | 863 node.SetNigoriSpecifics(nigori); |
| 864 | 864 |
| 865 allstatus_.SetCryptographerReady(cryptographer->is_ready()); | 865 allstatus_.SetCryptographerReady(cryptographer->is_ready()); |
| 866 allstatus_.SetCryptoHasPendingKeys(cryptographer->has_pending_keys()); | 866 allstatus_.SetCryptoHasPendingKeys(cryptographer->has_pending_keys()); |
| 867 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes()); | 867 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes()); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1054 RequestNudge(FROM_HERE); | 1054 RequestNudge(FROM_HERE); |
| 1055 } else { | 1055 } else { |
| 1056 DVLOG(1) << "No pending keys, adding provided passphrase."; | 1056 DVLOG(1) << "No pending keys, adding provided passphrase."; |
| 1057 | 1057 |
| 1058 // Prevent an implicit SetPassphrase request from changing an explicitly | 1058 // Prevent an implicit SetPassphrase request from changing an explicitly |
| 1059 // set passphrase. | 1059 // set passphrase. |
| 1060 if (!is_explicit && node.GetNigoriSpecifics().using_explicit_passphrase()) | 1060 if (!is_explicit && node.GetNigoriSpecifics().using_explicit_passphrase()) |
| 1061 return; | 1061 return; |
| 1062 | 1062 |
| 1063 cryptographer->AddKey(params); | 1063 cryptographer->AddKey(params); |
| 1064 } | |
| 1064 | 1065 |
| 1065 // TODO(tim): Bug 58231. It would be nice if SetPassphrase didn't require | 1066 // TODO(tim): Bug 58231. It would be nice if SetPassphrase didn't require |
| 1066 // messing with the Nigori node, because we can't call SetPassphrase until | 1067 // messing with the Nigori node, because we can't call SetPassphrase until |
| 1067 // download conditions are met vs Cryptographer init. It seems like it's | 1068 // download conditions are met vs Cryptographer init. It seems like it's |
| 1068 // safe to defer this work. | 1069 // safe to defer this work. |
| 1069 sync_pb::NigoriSpecifics specifics(node.GetNigoriSpecifics()); | 1070 sync_pb::NigoriSpecifics specifics(node.GetNigoriSpecifics()); |
| 1070 specifics.clear_encrypted(); | 1071 // Does not modify specifics.encrypted() if the original decrypted data was |
| 1071 cryptographer->GetKeys(specifics.mutable_encrypted()); | 1072 // the same. |
| 1072 specifics.set_using_explicit_passphrase(is_explicit); | 1073 DCHECK(cryptographer->GetKeys(specifics.mutable_encrypted())); |
|
akalin
2011/12/09 23:52:42
here, too
Nicolas Zea
2011/12/12 20:12:26
Done.
| |
| 1073 node.SetNigoriSpecifics(specifics); | 1074 specifics.set_using_explicit_passphrase(is_explicit); |
| 1074 } | 1075 node.SetNigoriSpecifics(specifics); |
| 1075 | 1076 |
| 1076 // Does nothing if everything is already encrypted or the cryptographer has | 1077 // Does nothing if everything is already encrypted or the cryptographer has |
| 1077 // pending keys. | 1078 // pending keys. |
| 1078 ReEncryptEverything(&trans); | 1079 ReEncryptEverything(&trans); |
| 1079 | 1080 |
| 1080 DVLOG(1) << "Passphrase accepted, bootstrapping encryption."; | 1081 DVLOG(1) << "Passphrase accepted, bootstrapping encryption."; |
| 1081 std::string bootstrap_token; | 1082 std::string bootstrap_token; |
| 1082 cryptographer->GetBootstrapToken(&bootstrap_token); | 1083 cryptographer->GetBootstrapToken(&bootstrap_token); |
| 1083 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 1084 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
| 1084 OnPassphraseAccepted(bootstrap_token)); | 1085 OnPassphraseAccepted(bootstrap_token)); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1126 nigori.CopyFrom(node.GetNigoriSpecifics()); | 1127 nigori.CopyFrom(node.GetNigoriSpecifics()); |
| 1127 cryptographer->UpdateNigoriFromEncryptedTypes(&nigori); | 1128 cryptographer->UpdateNigoriFromEncryptedTypes(&nigori); |
| 1128 node.SetNigoriSpecifics(nigori); | 1129 node.SetNigoriSpecifics(nigori); |
| 1129 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes()); | 1130 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes()); |
| 1130 | 1131 |
| 1131 // We reencrypt everything regardless of whether the set of encrypted | 1132 // We reencrypt everything regardless of whether the set of encrypted |
| 1132 // types changed to ensure that any stray unencrypted entries are overwritten. | 1133 // types changed to ensure that any stray unencrypted entries are overwritten. |
| 1133 ReEncryptEverything(&trans); | 1134 ReEncryptEverything(&trans); |
| 1134 } | 1135 } |
| 1135 | 1136 |
| 1136 // TODO(zea): Add unit tests that ensure no sync changes are made when not | |
| 1137 // needed. | |
| 1138 void SyncManager::SyncInternal::ReEncryptEverything(WriteTransaction* trans) { | 1137 void SyncManager::SyncInternal::ReEncryptEverything(WriteTransaction* trans) { |
| 1139 Cryptographer* cryptographer = trans->GetCryptographer(); | 1138 Cryptographer* cryptographer = trans->GetCryptographer(); |
| 1140 if (!cryptographer || !cryptographer->is_ready()) | 1139 if (!cryptographer || !cryptographer->is_ready()) |
| 1141 return; | 1140 return; |
| 1142 syncable::ModelTypeSet encrypted_types = GetEncryptedTypes(trans); | 1141 syncable::ModelTypeSet encrypted_types = GetEncryptedTypes(trans); |
| 1143 ModelSafeRoutingInfo routes; | 1142 ModelSafeRoutingInfo routes; |
| 1144 registrar_->GetModelSafeRoutingInfo(&routes); | 1143 registrar_->GetModelSafeRoutingInfo(&routes); |
| 1145 std::string tag; | 1144 std::string tag; |
| 1146 for (syncable::ModelTypeSet::iterator iter = encrypted_types.begin(); | 1145 for (syncable::ModelTypeSet::iterator iter = encrypted_types.begin(); |
| 1147 iter != encrypted_types.end(); ++iter) { | 1146 iter != encrypted_types.end(); ++iter) { |
| (...skipping 934 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2082 lookup->GetDownloadProgress(*i, &marker); | 2081 lookup->GetDownloadProgress(*i, &marker); |
| 2083 | 2082 |
| 2084 if (marker.token().empty()) | 2083 if (marker.token().empty()) |
| 2085 result.insert(*i); | 2084 result.insert(*i); |
| 2086 | 2085 |
| 2087 } | 2086 } |
| 2088 return result; | 2087 return result; |
| 2089 } | 2088 } |
| 2090 | 2089 |
| 2091 } // namespace sync_api | 2090 } // namespace sync_api |
| OLD | NEW |