Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3682)

Unified Diff: chrome/browser/chromeos/attestation/attestation_policy_observer.cc

Issue 12556004: Created AttestationPolicyObserver. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/attestation/attestation_policy_observer.cc
diff --git a/chrome/browser/chromeos/attestation/attestation_policy_observer.cc b/chrome/browser/chromeos/attestation/attestation_policy_observer.cc
new file mode 100644
index 0000000000000000000000000000000000000000..21664cde31c1188311062f51478bc9a4f81ce67d
--- /dev/null
+++ b/chrome/browser/chromeos/attestation/attestation_policy_observer.cc
@@ -0,0 +1,187 @@
+// Copyright (c) 2013 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/attestation/attestation_policy_observer.h"
+
+#include <string>
+
+#include "base/bind.h"
+#include "chrome/browser/chromeos/attestation/attestation_ca_client.h"
+#include "chrome/browser/chromeos/settings/cros_settings.h"
+#include "chrome/browser/policy/cloud/cloud_policy_client.h"
+#include "chrome/browser/policy/cloud/cloud_policy_manager.h"
+#include "chrome/common/chrome_notification_types.h"
+#include "chromeos/attestation/attestation_flow.h"
+#include "chromeos/cryptohome/async_method_caller.h"
+#include "chromeos/dbus/cryptohome_client.h"
+#include "chromeos/dbus/dbus_method_call_status.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/notification_details.h"
+
+namespace {
+
+// A dbus callback which handles a boolean result.
+//
+// Parameters
+// on_true - Called when status=success and value=true.
+// on_false - Called when status=success and value=false.
+// status - The dbus operation status.
+// value - The value returned by the dbus operation.
+void DBusBoolRedirectCallback(const base::Closure& on_true,
+ const base::Closure& on_false,
+ chromeos::DBusMethodCallStatus status,
+ bool value) {
+ if (status != chromeos::DBUS_METHOD_CALL_SUCCESS)
+ return;
+ const base::Closure& task = value ? on_true : on_false;
+ if (!task.is_null())
+ task.Run();
+}
+
+// A dbus callback which handles a string result.
+//
+// Parameters
+// on_success - Called when status=success and result=true.
+// status - The dbus operation status.
+// result - The result returned by the dbus operation.
+// data - The data returned by the dbus operation.
+void DBusStringCallback(
+ const base::Callback<void(const std::string&)> on_success,
+ chromeos::DBusMethodCallStatus status,
+ bool result,
+ const std::string& data) {
+ if (status != chromeos::DBUS_METHOD_CALL_SUCCESS || !result)
+ return;
+ on_success.Run(data);
+}
+
+} // namespace
+
+namespace chromeos {
+namespace attestation {
+
+const char AttestationPolicyObserver::kEnterpriseMachineKey[] =
+ "attest-ent-machine";
+
+AttestationPolicyObserver::AttestationPolicyObserver(
+ policy::CloudPolicyClient* policy_client)
+ : cros_settings_(CrosSettings::Get()),
+ policy_client_(policy_client),
+ cryptohome_client_(NULL),
+ attestation_flow_(NULL),
+ ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+ cros_settings_->AddSettingsObserver(kDeviceAttestationEnabled, this);
+ Start();
+}
+
+AttestationPolicyObserver::AttestationPolicyObserver(
+ policy::CloudPolicyClient* policy_client,
+ CryptohomeClient* cryptohome_client,
+ AttestationFlow* attestation_flow)
+ : cros_settings_(CrosSettings::Get()),
+ policy_client_(policy_client),
+ cryptohome_client_(cryptohome_client),
+ attestation_flow_(attestation_flow),
+ ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+ cros_settings_->AddSettingsObserver(kDeviceAttestationEnabled, this);
+ Start();
+}
+
+AttestationPolicyObserver::~AttestationPolicyObserver() {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+ cros_settings_->RemoveSettingsObserver(kDeviceAttestationEnabled, this);
+}
+
+void AttestationPolicyObserver::Observe(
+ int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+ std::string* path = content::Details<std::string>(details).ptr();
+ if (type != chrome::NOTIFICATION_SYSTEM_SETTING_CHANGED ||
+ *path != kDeviceAttestationEnabled) {
+ LOG(WARNING) << "AttestationPolicyObserver: Unexpected event received.";
+ return;
+ }
+ Start();
+}
+
+void AttestationPolicyObserver::Start() {
+ // If attestation is not enabled, there is nothing to do.
+ bool enabled = false;
+ if (!cros_settings_->GetBoolean(kDeviceAttestationEnabled, &enabled) ||
+ !enabled)
+ return;
+
+ // We expect a registered CloudPolicyClient.
+ if (!policy_client_->is_registered()) {
+ LOG(ERROR) << "AttestationPolicyObserver: Invalid CloudPolicyClient.";
+ return;
+ }
+
+ if (!cryptohome_client_)
+ cryptohome_client_ = DBusThreadManager::Get()->GetCryptohomeClient();
+
+ if (!attestation_flow_) {
+ scoped_ptr<ServerProxy> attestation_ca_client(new AttestationCAClient());
+ default_attestation_flow_.reset(new AttestationFlow(
+ cryptohome::AsyncMethodCaller::GetInstance(),
+ cryptohome_client_,
+ attestation_ca_client.Pass()));
+ attestation_flow_ = default_attestation_flow_.get();
+ }
+
+ // Start a dbus call to check if an Enterprise Machine Key already exists.
+ base::Closure on_does_exist =
+ base::Bind(&AttestationPolicyObserver::GetExistingCertificate,
+ weak_factory_.GetWeakPtr());
+ base::Closure on_does_not_exist =
+ base::Bind(&AttestationPolicyObserver::GetNewCertificate,
+ weak_factory_.GetWeakPtr());
+ cryptohome_client_->TpmAttestationDoesKeyExist(
+ CryptohomeClient::DEVICE_KEY,
+ kEnterpriseMachineKey,
+ base::Bind(DBusBoolRedirectCallback, on_does_exist, on_does_not_exist));
+}
+
+void AttestationPolicyObserver::GetNewCertificate() {
+ // We can reuse the dbus callback handler logic.
+ attestation_flow_->GetCertificate(
+ kEnterpriseMachineKey,
+ base::Bind(DBusStringCallback,
+ base::Bind(&AttestationPolicyObserver::UploadCertificate,
+ weak_factory_.GetWeakPtr()),
+ DBUS_METHOD_CALL_SUCCESS));
+}
+
+void AttestationPolicyObserver::GetExistingCertificate() {
+ cryptohome_client_->TpmAttestationGetCertificate(
+ CryptohomeClient::DEVICE_KEY,
+ kEnterpriseMachineKey,
+ base::Bind(DBusStringCallback,
+ base::Bind(&AttestationPolicyObserver::CheckCertificateExpiry,
+ weak_factory_.GetWeakPtr())));
+}
+
+void AttestationPolicyObserver::CheckCertificateExpiry(
+ const std::string& certificate) {
+ // TODO(dkrahn): Check if the certificate will expire soon, for now assume no.
+ CheckIfUploaded(certificate);
+}
+
+void AttestationPolicyObserver::UploadCertificate(
+ const std::string& certificate) {
+ // TODO(dkrahn): Upload the certificate.
+}
+
+void AttestationPolicyObserver::CheckIfUploaded(
+ const std::string& certificate) {
+ // TODO(dkrahn): Check if we've already uploaded the certificate.
+}
+
+} // namespace attestation
+} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698