mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-25 22:01:30 +00:00
a3256fcae8
Summary: We currently have a single WebAuthnManager instance per process that's shared between all CredentialContainers. That way the nsPIDOMWindowInner parent has to be tracked by the transaction, as multiple containers could kick off requests simultaneously. This patch lets us we have one WebAuthnManager instance per each CredentialsContainer and thus each nsPIDOMWindowInner. This matches the current U2F implementation where there is one instance per parent window too. This somewhat simplifies the communication diagram (at least in my head), as each U2F/WebAuthnManager instance also has their own TransactionChild/Parent pair for IPC protocol communication. The manager and child/parent pair are destroyed when the window is. Reviewers: jcj Reviewed By: jcj Bug #: 1421616 Differential Revision: https://phabricator.services.mozilla.com/D305
85 lines
2.4 KiB
C++
85 lines
2.4 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "mozilla/dom/WebAuthnTransactionChild.h"
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
WebAuthnTransactionChild::WebAuthnTransactionChild(WebAuthnManagerBase* aManager)
|
|
: mManager(aManager)
|
|
{
|
|
MOZ_ASSERT(aManager);
|
|
|
|
// Retain a reference so the task object isn't deleted without IPDL's
|
|
// knowledge. The reference will be released by
|
|
// mozilla::ipc::BackgroundChildImpl::DeallocPWebAuthnTransactionChild.
|
|
NS_ADDREF_THIS();
|
|
}
|
|
|
|
mozilla::ipc::IPCResult
|
|
WebAuthnTransactionChild::RecvConfirmRegister(const uint64_t& aTransactionId,
|
|
nsTArray<uint8_t>&& aRegBuffer)
|
|
{
|
|
if (NS_WARN_IF(!mManager)) {
|
|
return IPC_FAIL_NO_REASON(this);
|
|
}
|
|
|
|
mManager->FinishMakeCredential(aTransactionId, aRegBuffer);
|
|
return IPC_OK();
|
|
}
|
|
|
|
mozilla::ipc::IPCResult
|
|
WebAuthnTransactionChild::RecvConfirmSign(const uint64_t& aTransactionId,
|
|
nsTArray<uint8_t>&& aCredentialId,
|
|
nsTArray<uint8_t>&& aBuffer)
|
|
{
|
|
if (NS_WARN_IF(!mManager)) {
|
|
return IPC_FAIL_NO_REASON(this);
|
|
}
|
|
|
|
mManager->FinishGetAssertion(aTransactionId, aCredentialId, aBuffer);
|
|
return IPC_OK();
|
|
}
|
|
|
|
mozilla::ipc::IPCResult
|
|
WebAuthnTransactionChild::RecvAbort(const uint64_t& aTransactionId,
|
|
const nsresult& aError)
|
|
{
|
|
if (NS_WARN_IF(!mManager)) {
|
|
return IPC_FAIL_NO_REASON(this);
|
|
}
|
|
|
|
mManager->RequestAborted(aTransactionId, aError);
|
|
return IPC_OK();
|
|
}
|
|
|
|
void
|
|
WebAuthnTransactionChild::ActorDestroy(ActorDestroyReason why)
|
|
{
|
|
// Called by either a __delete__ message from the parent, or when the
|
|
// channel disconnects. Clear out the child actor reference to be sure.
|
|
if (mManager) {
|
|
mManager->ActorDestroyed();
|
|
mManager = nullptr;
|
|
}
|
|
}
|
|
|
|
void
|
|
WebAuthnTransactionChild::Disconnect()
|
|
{
|
|
mManager = nullptr;
|
|
|
|
// The WebAuthnManager released us, but we're going to be held alive by the
|
|
// IPC layer. The parent will explicitly destroy us via Send__delete__(),
|
|
// after receiving the DestroyMe message.
|
|
|
|
SendDestroyMe();
|
|
}
|
|
|
|
}
|
|
}
|