普通文本  |  174行  |  5.94 KB

//
// Copyright (C) 2015 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#include "tpm_manager/server/dbus_service.h"

#include <memory>
#include <string>

#include <brillo/bind_lambda.h>
#include <dbus/bus.h>
#include <dbus/object_path.h>

#include "tpm_manager/common/tpm_manager_constants.h"
#include "tpm_manager/common/tpm_nvram_dbus_interface.h"
#include "tpm_manager/common/tpm_ownership_dbus_interface.h"

namespace tpm_manager {

DBusService::DBusService(const scoped_refptr<dbus::Bus>& bus,
                         TpmNvramInterface* nvram_service,
                         TpmOwnershipInterface* ownership_service)
    : dbus_object_(nullptr, bus, dbus::ObjectPath(kTpmManagerServicePath)),
      nvram_service_(nvram_service),
      ownership_service_(ownership_service) {}

void DBusService::Register(const CompletionAction& callback) {
  brillo::dbus_utils::DBusInterface* ownership_dbus_interface =
      dbus_object_.AddOrGetInterface(kTpmOwnershipInterface);

  ownership_dbus_interface->AddMethodHandler(
      kGetTpmStatus,
      base::Unretained(this),
      &DBusService::HandleOwnershipDBusMethod<
          GetTpmStatusRequest,
          GetTpmStatusReply,
          &TpmOwnershipInterface::GetTpmStatus>);

  ownership_dbus_interface->AddMethodHandler(
      kTakeOwnership,
      base::Unretained(this),
      &DBusService::HandleOwnershipDBusMethod<
          TakeOwnershipRequest,
          TakeOwnershipReply,
          &TpmOwnershipInterface::TakeOwnership>);

  ownership_dbus_interface->AddMethodHandler(
      kRemoveOwnerDependency,
      base::Unretained(this),
      &DBusService::HandleOwnershipDBusMethod<
          RemoveOwnerDependencyRequest,
          RemoveOwnerDependencyReply,
          &TpmOwnershipInterface::RemoveOwnerDependency>);

  brillo::dbus_utils::DBusInterface* nvram_dbus_interface =
      dbus_object_.AddOrGetInterface(kTpmNvramInterface);

  nvram_dbus_interface->AddMethodHandler(
      kDefineNvram,
      base::Unretained(this),
      &DBusService::HandleNvramDBusMethod<
          DefineNvramRequest,
          DefineNvramReply,
          &TpmNvramInterface::DefineNvram>);

  nvram_dbus_interface->AddMethodHandler(
      kDestroyNvram,
      base::Unretained(this),
      &DBusService::HandleNvramDBusMethod<
          DestroyNvramRequest,
          DestroyNvramReply,
          &TpmNvramInterface::DestroyNvram>);

  nvram_dbus_interface->AddMethodHandler(
      kWriteNvram,
      base::Unretained(this),
      &DBusService::HandleNvramDBusMethod<
          WriteNvramRequest,
          WriteNvramReply,
          &TpmNvramInterface::WriteNvram>);

  nvram_dbus_interface->AddMethodHandler(
      kReadNvram,
      base::Unretained(this),
      &DBusService::HandleNvramDBusMethod<
          ReadNvramRequest,
          ReadNvramReply,
          &TpmNvramInterface::ReadNvram>);

  nvram_dbus_interface->AddMethodHandler(
      kIsNvramDefined,
      base::Unretained(this),
      &DBusService::HandleNvramDBusMethod<
          IsNvramDefinedRequest,
          IsNvramDefinedReply,
          &TpmNvramInterface::IsNvramDefined>);

  nvram_dbus_interface->AddMethodHandler(
      kIsNvramLocked,
      base::Unretained(this),
      &DBusService::HandleNvramDBusMethod<
          IsNvramLockedRequest,
          IsNvramLockedReply,
          &TpmNvramInterface::IsNvramLocked>);

  nvram_dbus_interface->AddMethodHandler(
      kGetNvramSize,
      base::Unretained(this),
      &DBusService::HandleNvramDBusMethod<
          GetNvramSizeRequest,
          GetNvramSizeReply,
          &TpmNvramInterface::GetNvramSize>);

  dbus_object_.RegisterAsync(callback);
}

template<typename RequestProtobufType,
         typename ReplyProtobufType,
         DBusService::HandlerFunction<RequestProtobufType,
                                      ReplyProtobufType,
                                      TpmNvramInterface> func>
void DBusService::HandleNvramDBusMethod(
    std::unique_ptr<DBusMethodResponse<const ReplyProtobufType&>> response,
    const RequestProtobufType& request) {
  // Convert |response| to a shared_ptr so |nvram_service_| can safely copy the
  // callback.
  using SharedResponsePointer = std::shared_ptr<
      DBusMethodResponse<const ReplyProtobufType&>>;
  // A callback that sends off the reply protobuf.
  auto callback = [](const SharedResponsePointer& response,
                     const ReplyProtobufType& reply) {
    response->Return(reply);
  };
  (nvram_service_->*func)(
      request,
      base::Bind(callback, SharedResponsePointer(std::move(response))));
}

template<typename RequestProtobufType,
         typename ReplyProtobufType,
         DBusService::HandlerFunction<RequestProtobufType,
                                      ReplyProtobufType,
                                      TpmOwnershipInterface> func>
void DBusService::HandleOwnershipDBusMethod(
    std::unique_ptr<DBusMethodResponse<const ReplyProtobufType&>> response,
    const RequestProtobufType& request) {
  // Convert |response| to a shared_ptr so |ownership_service_| can safely
  // copy the callback.
  using SharedResponsePointer = std::shared_ptr<
      DBusMethodResponse<const ReplyProtobufType&>>;
  // A callback that sends off the reply protobuf.
  auto callback = [](const SharedResponsePointer& response,
                     const ReplyProtobufType& reply) {
    response->Return(reply);
  };
  (ownership_service_->*func)(
      request,
      base::Bind(callback, SharedResponsePointer(std::move(response))));
}

}  // namespace tpm_manager