1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
// Copyright 2023 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/webauthn/passkey_model_factory.h"
#include <memory>
#include "base/check.h"
#include "base/no_destructor.h"
#include "chrome/browser/affiliations/affiliation_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sync/data_type_store_service_factory.h"
#include "components/affiliations/core/browser/affiliation_service.h"
#include "components/password_manager/core/browser/affiliation/passkey_affiliation_source_adapter.h"
#include "components/password_manager/core/browser/features/password_features.h"
#include "components/sync/model/data_type_store.h"
#include "components/sync/model/data_type_store_service.h"
#include "components/webauthn/core/browser/passkey_sync_bridge.h"
PasskeyModelFactory* PasskeyModelFactory::GetInstance() {
static base::NoDestructor<PasskeyModelFactory> instance;
return instance.get();
}
webauthn::PasskeyModel* PasskeyModelFactory::GetForProfile(Profile* profile) {
return static_cast<webauthn::PasskeyModel*>(
GetInstance()->GetServiceForBrowserContext(profile, true));
}
PasskeyModelFactory::PasskeyModelFactory()
: ProfileKeyedServiceFactory(
"PasskeyModel",
ProfileSelections::Builder()
.WithRegular(ProfileSelection::kRedirectedToOriginal)
// Enable PasskeyModel for guest profiles. Guest profiles are
// never signed in so they don't have have access to GPM passkeys,
// but this simplifies handling by clients.
.WithGuest(ProfileSelection::kOffTheRecordOnly)
// TODO(crbug.com/41488885): Check if this service is needed for
// Ash Internals.
.WithAshInternals(ProfileSelection::kRedirectedToOriginal)
.Build()) {
DependsOn(AffiliationServiceFactory::GetInstance());
DependsOn(DataTypeStoreServiceFactory::GetInstance());
}
PasskeyModelFactory::~PasskeyModelFactory() = default;
std::unique_ptr<KeyedService>
PasskeyModelFactory::BuildServiceInstanceForBrowserContext(
content::BrowserContext* context) const {
Profile* profile = Profile::FromBrowserContext(context);
auto sync_bridge = std::make_unique<webauthn::PasskeySyncBridge>(
DataTypeStoreServiceFactory::GetForProfile(profile)->GetStoreFactory());
// Do not instantiate the affiliation service for guest profiles, since the
// password manager does not run for them.
if (!profile->IsGuestSession()) {
std::unique_ptr<password_manager::PasskeyAffiliationSourceAdapter> adapter =
std::make_unique<password_manager::PasskeyAffiliationSourceAdapter>(
sync_bridge.get());
AffiliationServiceFactory::GetForProfile(profile)->RegisterSource(
std::move(adapter));
}
return sync_bridge;
}
|