blob: a32e4faca28e9c775bba508c1ff8bac5d51581a6 [file]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/web_view/internal/sync/web_view_trusted_vault_client.h"
#import <vector>
#import "base/apple/foundation_util.h"
#import "base/check.h"
#import "base/functional/callback.h"
#import "base/functional/callback_helpers.h"
#import "base/logging.h"
#import "base/notreached.h"
#import "base/strings/sys_string_conversions.h"
#import "components/signin/public/identity_manager/account_info.h"
#import "google_apis/gaia/gaia_id.h"
#import "ios/web_view/internal/sync/cwv_sync_controller_internal.h"
#import "ios/web_view/internal/sync/cwv_trusted_vault_observer_internal.h"
#import "ios/web_view/public/cwv_identity.h"
#import "ios/web_view/public/cwv_trusted_vault_provider.h"
namespace ios_web_view {
namespace {
// Converts `account_info` to a CWVIdentity instance.
CWVIdentity* CWVIdentityFromCoreAccountInfo(
const CoreAccountInfo& account_info) {
return [[CWVIdentity alloc]
initWithEmail:base::SysUTF8ToNSString(account_info.email)
fullName:nil
gaiaID:account_info.gaia.ToNSString()];
}
// Converts `shared_keys` to std::vector<std::vector<uint8_t>>.
std::vector<std::vector<uint8_t>> ConvertKeys(NSArray<NSData*>* shared_keys,
NSError*) {
std::vector<std::vector<uint8_t>> result;
for (NSData* data in shared_keys) {
auto span = base::apple::NSDataToSpan(data);
result.emplace_back(span.begin(), span.end());
}
return result;
}
} // namespace
WebViewTrustedVaultClient::WebViewTrustedVaultClient() {}
WebViewTrustedVaultClient::~WebViewTrustedVaultClient() = default;
void WebViewTrustedVaultClient::AddObserver(Observer* observer) {
id<CWVTrustedVaultProvider> provider = CWVSyncController.trustedVaultProvider;
if (!provider) {
DLOG(ERROR) << "Please set CWVSyncController.trustedVaultProvider to "
"enable trusted vault.";
return;
}
CWVTrustedVaultObserver* wrappedObserver =
[[CWVTrustedVaultObserver alloc] initWithTrustedVaultObserver:observer];
[provider addTrustedVaultObserver:wrappedObserver];
}
void WebViewTrustedVaultClient::RemoveObserver(Observer* observer) {
id<CWVTrustedVaultProvider> provider = CWVSyncController.trustedVaultProvider;
if (!provider) {
DLOG(ERROR) << "Please set CWVSyncController.trustedVaultProvider to "
"enable trusted vault.";
return;
}
CWVTrustedVaultObserver* wrappedObserver =
[[CWVTrustedVaultObserver alloc] initWithTrustedVaultObserver:observer];
[provider removeTrustedVaultObserver:wrappedObserver];
}
void WebViewTrustedVaultClient::FetchKeys(
const CoreAccountInfo& account_info,
base::OnceCallback<void(const std::vector<std::vector<uint8_t>>&)>
callback) {
id<CWVTrustedVaultProvider> provider = CWVSyncController.trustedVaultProvider;
if (!provider) {
DLOG(ERROR) << "Please set CWVSyncController.trustedVaultProvider to "
"enable trusted vault.";
return;
}
[provider fetchKeysForIdentity:CWVIdentityFromCoreAccountInfo(account_info)
completion:base::CallbackToBlock(
base::BindOnce(&ConvertKeys)
.Then(std::move(callback)))];
}
void WebViewTrustedVaultClient::StoreKeys(
const GaiaId& gaia_id,
const std::vector<std::vector<uint8_t>>& keys,
int last_key_version,
std::optional<trusted_vault::TrustedVaultUserActionTriggerForUMA> trigger) {
// Not used on iOS.
NOTREACHED();
}
void WebViewTrustedVaultClient::MarkLocalKeysAsStale(
const CoreAccountInfo& account_info,
base::OnceCallback<void(bool)> callback) {
id<CWVTrustedVaultProvider> provider = CWVSyncController.trustedVaultProvider;
if (!provider) {
DLOG(ERROR) << "Please set CWVSyncController.trustedVaultProvider to "
"enable trusted vault.";
return;
}
__block auto blockCallback = std::move(callback);
[provider markLocalKeysAsStaleForIdentity:CWVIdentityFromCoreAccountInfo(
account_info)
completion:^(NSError* error) {
std::move(blockCallback).Run(!error);
}];
}
void WebViewTrustedVaultClient::GetIsRecoverabilityDegraded(
const CoreAccountInfo& account_info,
base::OnceCallback<void(bool)> callback) {
id<CWVTrustedVaultProvider> provider = CWVSyncController.trustedVaultProvider;
if (!provider) {
DLOG(ERROR) << "Please set CWVSyncController.trustedVaultProvider to "
"enable trusted vault.";
return;
}
__block auto blockCallback = std::move(callback);
[provider
isRecoverabilityDegradedForIdentity:CWVIdentityFromCoreAccountInfo(
account_info)
completion:^(BOOL degraded, NSError* error) {
std::move(blockCallback).Run(degraded);
}];
}
void WebViewTrustedVaultClient::AddTrustedRecoveryMethod(
const GaiaId& gaia_id,
const std::vector<uint8_t>& public_key,
int method_type_hint,
base::OnceClosure callback) {
// Not used on iOS.
NOTREACHED();
}
void WebViewTrustedVaultClient::ClearLocalDataForAccount(
const CoreAccountInfo& account_info) {
id<CWVTrustedVaultProvider> provider = CWVSyncController.trustedVaultProvider;
if (!provider) {
DLOG(ERROR) << "Please set CWVSyncController.trustedVaultProvider to "
"enable trusted vault.";
return;
}
[provider clearLocalDataForForIdentity:CWVIdentityFromCoreAccountInfo(
account_info)];
}
} // namespace ios_web_view