1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "sync/test/fake_sync_encryption_handler.h" 6 7#include "sync/protocol/nigori_specifics.pb.h" 8#include "sync/syncable/nigori_util.h" 9 10namespace syncer { 11 12FakeSyncEncryptionHandler::FakeSyncEncryptionHandler() 13 : encrypted_types_(SensitiveTypes()), 14 encrypt_everything_(false), 15 passphrase_type_(IMPLICIT_PASSPHRASE), 16 cryptographer_(&encryptor_) { 17} 18FakeSyncEncryptionHandler::~FakeSyncEncryptionHandler() {} 19 20void FakeSyncEncryptionHandler::Init() { 21 // Set up a basic cryptographer. 22 KeyParams keystore_params = {"localhost", "dummy", "keystore_key"}; 23 cryptographer_.AddKey(keystore_params); 24} 25 26void FakeSyncEncryptionHandler::ApplyNigoriUpdate( 27 const sync_pb::NigoriSpecifics& nigori, 28 syncable::BaseTransaction* const trans) { 29 if (nigori.encrypt_everything()) 30 EnableEncryptEverything(); 31 if (nigori.keybag_is_frozen()) 32 passphrase_type_ = CUSTOM_PASSPHRASE; 33 34 // TODO(zea): consider adding fake support for migration. 35 if (cryptographer_.CanDecrypt(nigori.encryption_keybag())) 36 cryptographer_.InstallKeys(nigori.encryption_keybag()); 37 else if (nigori.has_encryption_keybag()) 38 cryptographer_.SetPendingKeys(nigori.encryption_keybag()); 39 40 if (cryptographer_.has_pending_keys()) { 41 DVLOG(1) << "OnPassPhraseRequired Sent"; 42 sync_pb::EncryptedData pending_keys = cryptographer_.GetPendingKeys(); 43 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, 44 OnPassphraseRequired(REASON_DECRYPTION, 45 pending_keys)); 46 } else if (!cryptographer_.is_ready()) { 47 DVLOG(1) << "OnPassphraseRequired sent because cryptographer is not " 48 << "ready"; 49 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, 50 OnPassphraseRequired(REASON_ENCRYPTION, 51 sync_pb::EncryptedData())); 52 } 53} 54 55void FakeSyncEncryptionHandler::UpdateNigoriFromEncryptedTypes( 56 sync_pb::NigoriSpecifics* nigori, 57 syncable::BaseTransaction* const trans) const { 58 syncable::UpdateNigoriFromEncryptedTypes(encrypted_types_, 59 encrypt_everything_, 60 nigori); 61} 62 63bool FakeSyncEncryptionHandler::NeedKeystoreKey( 64 syncable::BaseTransaction* const trans) const { 65 return keystore_key_.empty(); 66} 67 68bool FakeSyncEncryptionHandler::SetKeystoreKeys( 69 const google::protobuf::RepeatedPtrField<google::protobuf::string>& keys, 70 syncable::BaseTransaction* const trans) { 71 if (keys.size() == 0) 72 return false; 73 std::string new_key = keys.Get(keys.size()-1); 74 if (new_key.empty()) 75 return false; 76 keystore_key_ = new_key; 77 78 79 DVLOG(1) << "Keystore bootstrap token updated."; 80 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, 81 OnBootstrapTokenUpdated(keystore_key_, 82 KEYSTORE_BOOTSTRAP_TOKEN)); 83 return true; 84} 85 86ModelTypeSet FakeSyncEncryptionHandler::GetEncryptedTypes( 87 syncable::BaseTransaction* const trans) const { 88 return encrypted_types_; 89} 90 91void FakeSyncEncryptionHandler::AddObserver(Observer* observer) { 92 observers_.AddObserver(observer); 93} 94 95void FakeSyncEncryptionHandler::RemoveObserver(Observer* observer) { 96 observers_.RemoveObserver(observer); 97} 98 99void FakeSyncEncryptionHandler::SetEncryptionPassphrase( 100 const std::string& passphrase, 101 bool is_explicit) { 102 if (is_explicit) 103 passphrase_type_ = CUSTOM_PASSPHRASE; 104} 105 106void FakeSyncEncryptionHandler::SetDecryptionPassphrase( 107 const std::string& passphrase) { 108 // Do nothing. 109} 110 111void FakeSyncEncryptionHandler::EnableEncryptEverything() { 112 if (encrypt_everything_) 113 return; 114 encrypt_everything_ = true; 115 encrypted_types_ = ModelTypeSet::All(); 116 FOR_EACH_OBSERVER( 117 Observer, observers_, 118 OnEncryptedTypesChanged(encrypted_types_, encrypt_everything_)); 119} 120 121bool FakeSyncEncryptionHandler::EncryptEverythingEnabled() const { 122 return encrypt_everything_; 123} 124 125PassphraseType FakeSyncEncryptionHandler::GetPassphraseType() const { 126 return passphrase_type_; 127} 128 129} // namespace syncer 130