dbus_service.cc revision b48a50fc394b9c8a1059463c9eaba4c8d1985b9b
1b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn// Copyright 2014 The Chromium OS Authors. All rights reserved.
2b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn// Use of this source code is governed by a BSD-style license that can be
3b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn// found in the LICENSE file.
4b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
5b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include "attestation/server/dbus_service.h"
6b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
739f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn#include <memory>
8b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <string>
9b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
100752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn#include <chromeos/bind_lambda.h>
11b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <dbus/bus.h>
12b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <dbus/object_path.h>
13b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
14b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include "attestation/common/dbus_interface.h"
15b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
160752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahnusing chromeos::dbus_utils::DBusMethodResponse;
170752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn
18b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnnamespace attestation {
19b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
20b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren KrahnDBusService::DBusService(const scoped_refptr<dbus::Bus>& bus,
21b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn                         AttestationInterface* service)
22b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    : dbus_object_(nullptr, bus, dbus::ObjectPath(kAttestationServicePath)),
23b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn      service_(service) {
24b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}
25b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
26b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnvoid DBusService::Register(const CompletionAction& callback) {
27b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  chromeos::dbus_utils::DBusInterface* dbus_interface =
28b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn      dbus_object_.AddOrGetInterface(kAttestationInterface);
29b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
300752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  dbus_interface->AddMethodHandler(
31b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn      kCreateGoogleAttestedKey,
32b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn      base::Unretained(this),
33b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn      &DBusService::HandleCreateGoogleAttestedKey);
34b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
35b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  dbus_object_.RegisterAsync(callback);
36b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}
37b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
380752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahnvoid DBusService::HandleCreateGoogleAttestedKey(
399bb29b0861b022a9c89bff02401efbdfa884edd9Alex Vakulenko    std::unique_ptr<DBusMethodResponse<const CreateGoogleAttestedKeyReply&>>
400752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn        response,
410752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    const CreateGoogleAttestedKeyRequest& request) {
42b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  VLOG(1) << __func__;
4339f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  // Convert |response| to a shared_ptr so |service_| can safely copy the
4439f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  // callback.
4539f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  using SharedResponsePointer = std::shared_ptr<
4639f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn      DBusMethodResponse<const CreateGoogleAttestedKeyReply&>>;
470752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  // A callback that fills the reply protobuf and sends it.
4839f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  auto callback = [](const SharedResponsePointer& response,
49b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn                     const CreateGoogleAttestedKeyReply& reply) {
500752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    response->Return(reply);
510752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  };
5239f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  service_->CreateGoogleAttestedKey(
53b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn      request,
5439f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn      base::Bind(callback, SharedResponsePointer(response.release())));
55b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}
56b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
57b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}  // namespace attestation
58