blob: 36fc9ce443df8b28525e74c845a47e637883a65e [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_WEBID_FEDERATED_IDENTITY_PERMISSION_CONTEXT_H_
#define CHROME_BROWSER_WEBID_FEDERATED_IDENTITY_PERMISSION_CONTEXT_H_
#include <string>
#include <vector>
#include "base/memory/scoped_refptr.h"
#include "base/observer_list.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/permissions/object_permission_context_base.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/webid/federated_identity_data_model.h"
#include "content/public/browser/webid/federated_identity_permission_context_delegate.h"
#include "net/base/schemeful_site.h"
#include "third_party/blink/public/mojom/webid/federated_auth_request.mojom-forward.h"
namespace content {
class BrowserContext;
} // namespace content
namespace blink::common::webid {
struct LoginStatusOptions;
} // namespace blink::common::webid
class FederatedIdentityAccountKeyedPermissionContext;
class FederatedIdentityIdentityProviderRegistrationContext;
class FederatedIdentityIdentityProviderSigninStatusContext;
// Context for storing permissions associated with the ability for a relying
// party site to pass an identity request to an identity provider through a
// Javascript API.
class FederatedIdentityPermissionContext
: public content::FederatedIdentityPermissionContextDelegate,
public signin::IdentityManager::Observer,
public KeyedService,
public webid::FederatedIdentityDataModel {
public:
explicit FederatedIdentityPermissionContext(
content::BrowserContext* browser_context);
~FederatedIdentityPermissionContext() override;
FederatedIdentityPermissionContext(
const FederatedIdentityPermissionContext&) = delete;
FederatedIdentityPermissionContext& operator=(
const FederatedIdentityPermissionContext&) = delete;
// KeyedService:
void Shutdown() override;
// content::FederatedIdentityPermissionContextDelegate:
void AddIdpSigninStatusObserver(IdpSigninStatusObserver* observer) override;
void RemoveIdpSigninStatusObserver(
IdpSigninStatusObserver* observer) override;
bool HasSharingPermission(const url::Origin& relying_party_requester,
const url::Origin& relying_party_embedder,
const url::Origin& identity_provider) override;
std::optional<base::Time> GetLastUsedTimestamp(
const url::Origin& relying_party_requester,
const url::Origin& relying_party_embedder,
const url::Origin& identity_provider,
const std::string& account_id) override;
bool HasSharingPermission(
const url::Origin& relying_party_requester) override;
void GrantSharingPermission(const url::Origin& relying_party_requester,
const url::Origin& relying_party_embedder,
const url::Origin& identity_provider,
const std::string& account_id) override;
void RevokeSharingPermission(const url::Origin& relying_party_requester,
const url::Origin& relying_party_embedder,
const url::Origin& identity_provider,
const std::string& account_id) override;
void RefreshExistingSharingPermission(
const url::Origin& relying_party_requester,
const url::Origin& relying_party_embedder,
const url::Origin& identity_provider,
const std::string& account_id) override;
std::optional<bool> GetIdpSigninStatus(
const url::Origin& idp_origin) override;
base::Value::List GetAccounts(const url::Origin& identity_provider) override;
void SetIdpSigninStatus(
const url::Origin& idp_origin,
bool idp_signin_status,
base::optional_ref<const blink::common::webid::LoginStatusOptions>)
override;
std::vector<GURL> GetRegisteredIdPs() override;
void RegisterIdP(const GURL& url) override;
void UnregisterIdP(const GURL& url) override;
void OnSetRequiresUserMediation(const url::Origin& relying_party,
base::OnceClosure callback) override;
// signin::IdentityManager::Observer:
void OnAccountsInCookieUpdated(
const signin::AccountsInCookieJarInfo& accounts_in_cookie_jar_info,
const GoogleServiceAuthError& error) override;
// FederatedIdentityDataModel:
void GetAllDataKeys(
base::OnceCallback<void(std::vector<DataKey>)> callback) override;
void RemoveFederatedIdentityDataByDataKey(
const DataKey& data_key,
base::OnceClosure callback) override;
void FlushScheduledSaveSettingsCalls();
// Returns whether there is an existing sharing permission for the given
// (relying party embedder site, identity provider site) pair.
bool HasSharingPermission(const net::SchemefulSite& relying_party_embedder,
const net::SchemefulSite& identity_provider);
// Marks the given (site, site) pair as eligible to use FedCM sharing
// permission as a signal for the Storage Access API. This is only valid to
// call for pairs that already have sharing permission.
void MarkStorageAccessEligible(
const net::SchemefulSite& relying_party_embedder,
const net::SchemefulSite& identity_provider,
base::OnceClosure callback);
// Converts existing sharing permission grants into (site, site)-keyed content
// settings.
ContentSettingsForOneType GetSharingPermissionGrantsAsContentSettings();
private:
std::unique_ptr<FederatedIdentityAccountKeyedPermissionContext>
sharing_context_;
std::unique_ptr<FederatedIdentityIdentityProviderSigninStatusContext>
idp_signin_context_;
std::unique_ptr<FederatedIdentityIdentityProviderRegistrationContext>
idp_registration_context_;
base::ScopedObservation<signin::IdentityManager,
signin::IdentityManager::Observer>
obs_{this};
base::ObserverList<IdpSigninStatusObserver> idp_signin_status_observer_list_;
};
#endif // CHROME_BROWSER_WEBID_FEDERATED_IDENTITY_PERMISSION_CONTEXT_H_