| 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 if (!cryptographer->GetKeys(nigori.mutable_encrypted())) { |
| 858 NOTREACHED(); |
| 859 return false; |
| 860 } |
| 858 } | 861 } |
| 859 | 862 |
| 860 // Ensure the nigori node reflects the most recent set of sensitive types | 863 // 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. | 864 // and properly sets encrypt_everything. This is a no-op if nothing changes. |
| 862 cryptographer->UpdateNigoriFromEncryptedTypes(&nigori); | 865 cryptographer->UpdateNigoriFromEncryptedTypes(&nigori); |
| 863 node.SetNigoriSpecifics(nigori); | 866 node.SetNigoriSpecifics(nigori); |
| 864 | 867 |
| 865 allstatus_.SetCryptographerReady(cryptographer->is_ready()); | 868 allstatus_.SetCryptographerReady(cryptographer->is_ready()); |
| 866 allstatus_.SetCryptoHasPendingKeys(cryptographer->has_pending_keys()); | 869 allstatus_.SetCryptoHasPendingKeys(cryptographer->has_pending_keys()); |
| 867 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes()); | 870 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes()); |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1050 RequestNudge(FROM_HERE); | 1053 RequestNudge(FROM_HERE); |
| 1051 } else { | 1054 } else { |
| 1052 DVLOG(1) << "No pending keys, adding provided passphrase."; | 1055 DVLOG(1) << "No pending keys, adding provided passphrase."; |
| 1053 | 1056 |
| 1054 // Prevent an implicit SetPassphrase request from changing an explicitly | 1057 // Prevent an implicit SetPassphrase request from changing an explicitly |
| 1055 // set passphrase. | 1058 // set passphrase. |
| 1056 if (!is_explicit && node.GetNigoriSpecifics().using_explicit_passphrase()) | 1059 if (!is_explicit && node.GetNigoriSpecifics().using_explicit_passphrase()) |
| 1057 return; | 1060 return; |
| 1058 | 1061 |
| 1059 cryptographer->AddKey(params); | 1062 cryptographer->AddKey(params); |
| 1063 } |
| 1060 | 1064 |
| 1061 // TODO(tim): Bug 58231. It would be nice if SetPassphrase didn't require | 1065 // TODO(tim): Bug 58231. It would be nice if SetPassphrase didn't require |
| 1062 // messing with the Nigori node, because we can't call SetPassphrase until | 1066 // messing with the Nigori node, because we can't call SetPassphrase until |
| 1063 // download conditions are met vs Cryptographer init. It seems like it's | 1067 // download conditions are met vs Cryptographer init. It seems like it's |
| 1064 // safe to defer this work. | 1068 // safe to defer this work. |
| 1065 sync_pb::NigoriSpecifics specifics(node.GetNigoriSpecifics()); | 1069 sync_pb::NigoriSpecifics specifics(node.GetNigoriSpecifics()); |
| 1066 specifics.clear_encrypted(); | 1070 // Does not modify specifics.encrypted() if the original decrypted data was |
| 1067 cryptographer->GetKeys(specifics.mutable_encrypted()); | 1071 // the same. |
| 1068 specifics.set_using_explicit_passphrase(is_explicit); | 1072 if (!cryptographer->GetKeys(specifics.mutable_encrypted())) { |
| 1069 node.SetNigoriSpecifics(specifics); | 1073 NOTREACHED(); |
| 1074 return; |
| 1070 } | 1075 } |
| 1076 specifics.set_using_explicit_passphrase(is_explicit); |
| 1077 node.SetNigoriSpecifics(specifics); |
| 1071 | 1078 |
| 1072 // Does nothing if everything is already encrypted or the cryptographer has | 1079 // Does nothing if everything is already encrypted or the cryptographer has |
| 1073 // pending keys. | 1080 // pending keys. |
| 1074 ReEncryptEverything(&trans); | 1081 ReEncryptEverything(&trans); |
| 1075 | 1082 |
| 1076 DVLOG(1) << "Passphrase accepted, bootstrapping encryption."; | 1083 DVLOG(1) << "Passphrase accepted, bootstrapping encryption."; |
| 1077 std::string bootstrap_token; | 1084 std::string bootstrap_token; |
| 1078 cryptographer->GetBootstrapToken(&bootstrap_token); | 1085 cryptographer->GetBootstrapToken(&bootstrap_token); |
| 1079 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 1086 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
| 1080 OnPassphraseAccepted(bootstrap_token)); | 1087 OnPassphraseAccepted(bootstrap_token)); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1122 nigori.CopyFrom(node.GetNigoriSpecifics()); | 1129 nigori.CopyFrom(node.GetNigoriSpecifics()); |
| 1123 cryptographer->UpdateNigoriFromEncryptedTypes(&nigori); | 1130 cryptographer->UpdateNigoriFromEncryptedTypes(&nigori); |
| 1124 node.SetNigoriSpecifics(nigori); | 1131 node.SetNigoriSpecifics(nigori); |
| 1125 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes()); | 1132 allstatus_.SetEncryptedTypes(cryptographer->GetEncryptedTypes()); |
| 1126 | 1133 |
| 1127 // We reencrypt everything regardless of whether the set of encrypted | 1134 // We reencrypt everything regardless of whether the set of encrypted |
| 1128 // types changed to ensure that any stray unencrypted entries are overwritten. | 1135 // types changed to ensure that any stray unencrypted entries are overwritten. |
| 1129 ReEncryptEverything(&trans); | 1136 ReEncryptEverything(&trans); |
| 1130 } | 1137 } |
| 1131 | 1138 |
| 1132 // TODO(zea): Add unit tests that ensure no sync changes are made when not | |
| 1133 // needed. | |
| 1134 void SyncManager::SyncInternal::ReEncryptEverything(WriteTransaction* trans) { | 1139 void SyncManager::SyncInternal::ReEncryptEverything(WriteTransaction* trans) { |
| 1135 Cryptographer* cryptographer = trans->GetCryptographer(); | 1140 Cryptographer* cryptographer = trans->GetCryptographer(); |
| 1136 if (!cryptographer || !cryptographer->is_ready()) | 1141 if (!cryptographer || !cryptographer->is_ready()) |
| 1137 return; | 1142 return; |
| 1138 syncable::ModelTypeSet encrypted_types = GetEncryptedTypes(trans); | 1143 syncable::ModelTypeSet encrypted_types = GetEncryptedTypes(trans); |
| 1139 ModelSafeRoutingInfo routes; | 1144 ModelSafeRoutingInfo routes; |
| 1140 registrar_->GetModelSafeRoutingInfo(&routes); | 1145 registrar_->GetModelSafeRoutingInfo(&routes); |
| 1141 std::string tag; | 1146 std::string tag; |
| 1142 for (syncable::ModelTypeSet::iterator iter = encrypted_types.begin(); | 1147 for (syncable::ModelTypeSet::iterator iter = encrypted_types.begin(); |
| 1143 iter != encrypted_types.end(); ++iter) { | 1148 iter != encrypted_types.end(); ++iter) { |
| (...skipping 932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2076 lookup->GetDownloadProgress(*i, &marker); | 2081 lookup->GetDownloadProgress(*i, &marker); |
| 2077 | 2082 |
| 2078 if (marker.token().empty()) | 2083 if (marker.token().empty()) |
| 2079 result.insert(*i); | 2084 result.insert(*i); |
| 2080 | 2085 |
| 2081 } | 2086 } |
| 2082 return result; | 2087 return result; |
| 2083 } | 2088 } |
| 2084 | 2089 |
| 2085 } // namespace sync_api | 2090 } // namespace sync_api |
| OLD | NEW |