// // 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