ExtensionSyncService: listen for relevant changes instead of being explicitly called...
[chromium-blink-merge.git] / chrome / browser / chromeos / login / easy_unlock / easy_unlock_get_keys_operation.cc
blobe0789c8005fe615bf03e3f46fb0c7b8ae497ee8c
1 // Copyright 2014 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.
5 #include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_get_keys_operation.h"
7 #include <vector>
9 #include "base/bind.h"
10 #include "base/logging.h"
11 #include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.h"
12 #include "google_apis/gaia/gaia_auth_util.h"
14 namespace chromeos {
16 EasyUnlockGetKeysOperation::EasyUnlockGetKeysOperation(
17 const UserContext& user_context,
18 const GetKeysCallback& callback)
19 : user_context_(user_context),
20 callback_(callback),
21 key_index_(0),
22 weak_ptr_factory_(this) {
25 EasyUnlockGetKeysOperation::~EasyUnlockGetKeysOperation() {
28 void EasyUnlockGetKeysOperation::Start() {
29 // TODO(xiyuan): Use ListKeyEx.
30 key_index_ = 0;
31 GetKeyData();
34 void EasyUnlockGetKeysOperation::GetKeyData() {
35 std::string canonicalized =
36 gaia::CanonicalizeEmail(user_context_.GetUserID());
37 cryptohome::Identification id(canonicalized);
38 cryptohome::HomedirMethods::GetInstance()->GetKeyDataEx(
39 id,
40 EasyUnlockKeyManager::GetKeyLabel(key_index_),
41 base::Bind(&EasyUnlockGetKeysOperation::OnGetKeyData,
42 weak_ptr_factory_.GetWeakPtr()));
46 void EasyUnlockGetKeysOperation::OnGetKeyData(
47 bool success,
48 cryptohome::MountError return_code,
49 const std::vector<cryptohome::KeyDefinition>& key_definitions) {
50 if (!success || key_definitions.empty()) {
51 // MOUNT_ERROR_KEY_FAILURE is considered as success. Other error codes are
52 // treated as failures.
53 if (return_code == cryptohome::MOUNT_ERROR_NONE ||
54 return_code == cryptohome::MOUNT_ERROR_KEY_FAILURE) {
55 callback_.Run(true, devices_);
56 return;
59 LOG(ERROR) << "Easy unlock failed to get key data, code=" << return_code;
60 callback_.Run(false, EasyUnlockDeviceKeyDataList());
61 return;
64 DCHECK_EQ(1u, key_definitions.size());
66 const std::vector<cryptohome::KeyDefinition::ProviderData>& provider_data =
67 key_definitions.front().provider_data;
69 EasyUnlockDeviceKeyData device;
70 for (size_t i = 0; i < provider_data.size(); ++i) {
71 const cryptohome::KeyDefinition::ProviderData& entry = provider_data[i];
72 if (entry.name == kEasyUnlockKeyMetaNameBluetoothAddress) {
73 if (entry.bytes)
74 device.bluetooth_address = *entry.bytes;
75 else
76 NOTREACHED();
77 } else if (entry.name == kEasyUnlockKeyMetaNamePubKey) {
78 if (entry.bytes)
79 device.public_key = *entry.bytes;
80 else
81 NOTREACHED();
82 } else if (entry.name == kEasyUnlockKeyMetaNamePsk) {
83 if (entry.bytes)
84 device.psk = *entry.bytes;
85 else
86 NOTREACHED();
87 } else if (entry.name == kEasyUnlockKeyMetaNameChallenge) {
88 if (entry.bytes)
89 device.challenge = *entry.bytes;
90 else
91 NOTREACHED();
92 } else if (entry.name == kEasyUnlockKeyMetaNameWrappedSecret) {
93 if (entry.bytes)
94 device.wrapped_secret = *entry.bytes;
95 else
96 NOTREACHED();
97 } else {
98 LOG(WARNING) << "Unknown Easy unlock key data entry, name="
99 << entry.name;
102 devices_.push_back(device);
104 ++key_index_;
105 GetKeyData();
108 } // namespace chromeos