gecko-dev/dom/webauthn/WebAuthnTransactionChild.cpp
Tim Taubert a3256fcae8 Bug 1421616 - Have one WebAuthnManager instance per CredentialsContainer r=jcj
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
2017-12-05 19:05:06 +01:00

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();
}
}
}