blob: 527994c04d6eb87f3e8b6a3c44ca220ed8d04ebc [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/arc/keymaster/cert_store_bridge.h"
#include <cstdint>
#include <utility>
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/logging.h"
#include "mojo/core/embedder/embedder.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
namespace arc {
namespace keymaster {
CertStoreBridge::CertStoreBridge(content::BrowserContext* context)
: weak_ptr_factory_(this) {
VLOG(2) << "CertStoreBridge::CertStoreBridge";
}
CertStoreBridge::~CertStoreBridge() {
VLOG(2) << "CertStoreBridge::~CertStoreBridge";
}
void CertStoreBridge::UpdatePlaceholderKeysInKeymaster(
std::vector<mojom::ChromeOsKeyPtr> keys,
mojom::CertStoreInstance::UpdatePlaceholderKeysCallback callback) {
VLOG(2) << "CertStoreBridge::UpdatePlaceholderKeysInKeymaster";
if (cert_store_proxy_.is_bound()) {
cert_store_proxy_->UpdatePlaceholderKeys(std::move(keys),
std::move(callback));
} else {
LOG(ERROR) << "Tried to update placeholders but cert store is not bound";
std::move(callback).Run(/*success=*/false);
}
}
bool CertStoreBridge::IsProxyBound() const {
return cert_store_proxy_.is_bound();
}
void CertStoreBridge::BindToInvitation(mojo::OutgoingInvitation* invitation) {
VLOG(2) << "CertStoreBridge::BootstrapMojoConnection";
mojo::ScopedMessagePipeHandle pipe;
if (mojo::core::IsMojoIpczEnabled()) {
constexpr uint64_t kCertStorePipeAttachment = 1;
pipe = invitation->AttachMessagePipe(kCertStorePipeAttachment);
} else {
pipe = invitation->AttachMessagePipe("arc-cert-store-pipe");
}
if (!pipe.is_valid()) {
LOG(ERROR) << "CertStoreBridge could not bind to invitation";
return;
}
cert_store_proxy_.Bind(
mojo::PendingRemote<keymaster::mojom::CertStoreInstance>(std::move(pipe),
0u));
VLOG(2) << "Bound remote CertStoreInstance interface to pipe.";
cert_store_proxy_.set_disconnect_handler(
base::BindOnce(&mojo::Remote<keymaster::mojom::CertStoreInstance>::reset,
base::Unretained(&cert_store_proxy_)));
}
} // namespace keymaster
} // namespace arc