| Index: chrome/browser/chromeos/login/easy_unlock/easy_unlock_get_keys_operation.cc
|
| diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_get_keys_operation.cc b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_get_keys_operation.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8d6ac812fa3b243a698e904c5a3ec91388afa426
|
| --- /dev/null
|
| +++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_get_keys_operation.cc
|
| @@ -0,0 +1,108 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_get_keys_operation.h"
|
| +
|
| +#include <vector>
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/logging.h"
|
| +#include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.h"
|
| +#include "google_apis/gaia/gaia_auth_util.h"
|
| +
|
| +namespace chromeos {
|
| +
|
| +EasyUnlockGetKeysOperation::EasyUnlockGetKeysOperation(
|
| + const UserContext& user_context,
|
| + const GetKeysCallback& callback)
|
| + : user_context_(user_context),
|
| + callback_(callback),
|
| + key_index_(0),
|
| + weak_ptr_factory_(this) {
|
| +}
|
| +
|
| +EasyUnlockGetKeysOperation::~EasyUnlockGetKeysOperation() {
|
| +}
|
| +
|
| +void EasyUnlockGetKeysOperation::Start() {
|
| + // TODO(xiyuan): Use ListKeyEx.
|
| + key_index_ = 0;
|
| + GetKeyData();
|
| +}
|
| +
|
| +void EasyUnlockGetKeysOperation::GetKeyData() {
|
| + std::string canonicalized =
|
| + gaia::CanonicalizeEmail(user_context_.GetUserID());
|
| + cryptohome::Identification id(canonicalized);
|
| + cryptohome::HomedirMethods::GetInstance()->GetKeyDataEx(
|
| + id,
|
| + EasyUnlockKeyManager::GetKeyLabel(key_index_),
|
| + base::Bind(&EasyUnlockGetKeysOperation::OnGetKeyData,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| +
|
| +}
|
| +
|
| +void EasyUnlockGetKeysOperation::OnGetKeyData(
|
| + bool success,
|
| + cryptohome::MountError return_code,
|
| + ScopedVector<cryptohome::RetrievedKeyData> retrieved_data) {
|
| + if (!success || retrieved_data.empty()) {
|
| + // MOUNT_ERROR_KEY_FAILURE is considered as success. Other error codes are
|
| + // treated as failures.
|
| + if (return_code == cryptohome::MOUNT_ERROR_NONE ||
|
| + return_code == cryptohome::MOUNT_ERROR_KEY_FAILURE) {
|
| + callback_.Run(true, devices_);
|
| + return;
|
| + }
|
| +
|
| + LOG(ERROR) << "Easy unlock failed to get key data, code=" << return_code;
|
| + callback_.Run(false, EasyUnlockDeviceKeyDataList());
|
| + return;
|
| + }
|
| +
|
| + DCHECK_EQ(1u, retrieved_data.size());
|
| +
|
| + const std::vector<cryptohome::ProviderDataEntry>& provider_data =
|
| + retrieved_data.front()->provider_data;
|
| +
|
| + EasyUnlockDeviceKeyData device;
|
| + for (size_t i = 0; i < provider_data.size(); ++i) {
|
| + const cryptohome::ProviderDataEntry& entry = provider_data[i];
|
| + if (entry.name == kEasyUnlockKeyMetaNameBluetoothAddress) {
|
| + if (entry.has_bytes)
|
| + device.bluetooth_address = entry.bytes;
|
| + else
|
| + NOTREACHED();
|
| + } else if (entry.name == kEasyUnlockKeyMetaNamePubKey) {
|
| + if (entry.has_bytes)
|
| + device.public_key = entry.bytes;
|
| + else
|
| + NOTREACHED();
|
| + } else if (entry.name == kEasyUnlockKeyMetaNamePsk) {
|
| + if (entry.has_bytes)
|
| + device.psk = entry.bytes;
|
| + else
|
| + NOTREACHED();
|
| + } else if (entry.name == kEasyUnlockKeyMetaNameChallenge) {
|
| + if (entry.has_bytes)
|
| + device.challenge = entry.bytes;
|
| + else
|
| + NOTREACHED();
|
| + } else if (entry.name == kEasyUnlockKeyMetaNameWrappedSecret) {
|
| + if (entry.has_bytes)
|
| + device.wrapped_secret = entry.bytes;
|
| + else
|
| + NOTREACHED();
|
| + } else {
|
| + LOG(WARNING) << "Unknown Easy unlock key data entry, name="
|
| + << entry.name;
|
| + }
|
| + }
|
| + devices_.push_back(device);
|
| +
|
| + ++key_index_;
|
| + GetKeyData();
|
| +}
|
| +
|
| +} // namespace chromeos
|
|
|