Files
tubestation/toolkit/components/credentialmanagement/IdentityCredentialRequestManager.h
Benjamin VanderSloot 5528947587 Bug 1892021, part 5 - Rearchitect IPC for discovery - r=anti-tracking-reviewers,pbz
I'm sorry. This is a big change to recent stuff, and worst of all is a big commit.

Decisions I made while implementing credential discovery backed me into a corner
where I couldn't have the UI actually get rendered. Particularly around where the
IPCs needed to happen and at what point we called into the main process and when
we returned.

The way it works now is that we do ONE IPC for a credentials.get call, doing most of
the work in the main process and only maybe doing one IPC down to the content process
to tell it to navigate.

This is neater and more secure to a compromised content process. However, a lot happens in
this patch.

Differential Revision: https://phabricator.services.mozilla.com/D215009
2024-07-26 16:53:21 +00:00

77 lines
3.0 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/. */
#ifndef MOZILLA_IDENTITYCREDENTIALREQUESTMANAGER_H_
#define MOZILLA_IDENTITYCREDENTIALREQUESTMANAGER_H_
#include "mozilla/ClearOnShutdown.h"
#include "mozilla/PrincipalHashKey.h"
#include "mozilla/dom/IdentityCredential.h"
#include "mozilla/dom/IdentityCredentialBinding.h"
#include "mozilla/dom/IPCIdentityCredential.h"
#include "nsIPrincipal.h"
#include "nsTHashMap.h"
namespace mozilla {
class IdentityCredentialRequestManager final : nsISupports {
public:
NS_DECL_ISUPPORTS
static IdentityCredentialRequestManager* GetInstance();
// Store an active cross origin identity credential request happening from the
// given principal and inner window ID. These accumulate forever, but if the
// window goes away, we will be unable to notify of a store.
nsresult StorePendingRequest(
const nsCOMPtr<nsIPrincipal>& aRPPrincipal,
const dom::IdentityCredentialRequestOptions& aRequest,
const RefPtr<
dom::IdentityCredential::GetIPCIdentityCredentialPromise::Private>&
aPromise,
const RefPtr<dom::CanonicalBrowsingContext>& aBrowsingContext);
// If the given credential stored by the given principal would be effective
// for a previously stored request, notify the window that stored that request
// with the credential so it can resolve a promise with that credential data.
void NotifyOfStoredCredential(const nsCOMPtr<nsIPrincipal>& aIDPPrincipal,
const dom::IPCIdentityCredential& aCredential);
IdentityCredentialRequestManager(IdentityCredentialRequestManager& other) =
delete;
void operator=(const IdentityCredentialRequestManager&) = delete;
private:
static StaticRefPtr<IdentityCredentialRequestManager> sSingleton;
IdentityCredentialRequestManager() {};
~IdentityCredentialRequestManager() = default;
struct PendingRequestEntry {
nsCOMPtr<nsIPrincipal> mRPPrincipal;
dom::IdentityCredentialRequestOptions mRequestOptions;
RefPtr<dom::IdentityCredential::GetIPCIdentityCredentialPromise::Private>
mPromise;
RefPtr<dom::CanonicalBrowsingContext> mBrowsingContext;
PendingRequestEntry(
nsIPrincipal* aRPPrincipal,
const dom::IdentityCredentialRequestOptions& aRequestOptions,
const RefPtr<
dom::IdentityCredential::GetIPCIdentityCredentialPromise::Private>&
aPromise,
const RefPtr<dom::CanonicalBrowsingContext>& aBrowsingContext)
: mRPPrincipal(aRPPrincipal),
mRequestOptions(aRequestOptions),
mPromise(aPromise),
mBrowsingContext(aBrowsingContext) {}
};
nsTHashMap<PrincipalHashKey, nsTArray<PendingRequestEntry>> mPendingRequests;
};
} // namespace mozilla
#endif /* MOZILLA_IDENTITYCREDENTIALSTORAGESERVICE_H_ */