[go: nahoru, domu]

blob: 98b586611d0450fb756a51424d13fd44ea16bd64 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/trusted_vault/recovery_key_store_connection_impl.h"
#include <memory>
#include "base/notreached.h"
#include "base/time/time.h"
#include "components/signin/public/identity_manager/account_info.h"
#include "components/trusted_vault/proto/recovery_key_store.pb.h"
#include "components/trusted_vault/trusted_vault_access_token_fetcher.h"
#include "components/trusted_vault/trusted_vault_connection.h"
#include "components/trusted_vault/trusted_vault_request.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "url/gurl.h"
namespace trusted_vault {
namespace {
constexpr char kUpdateVaultUrl[] =
"https://cryptauthvault.googleapis.com/v1/vaults/";
void ProcessUpdateVaultResponseResponse(
RecoveryKeyStoreConnection::UpdateRecoveryKeyStoreCallback callback,
TrustedVaultRequest::HttpStatus http_status,
const std::string& response_body) {
switch (http_status) {
case TrustedVaultRequest::HttpStatus::kSuccess:
std::move(callback).Run(UpdateRecoveryKeyStoreStatus::kSuccess);
return;
case TrustedVaultRequest::HttpStatus::kBadRequest:
case TrustedVaultRequest::HttpStatus::kNotFound:
case TrustedVaultRequest::HttpStatus::kConflict:
case TrustedVaultRequest::HttpStatus::kOtherError:
std::move(callback).Run(UpdateRecoveryKeyStoreStatus::kOtherError);
return;
case TrustedVaultRequest::HttpStatus::kNetworkError:
std::move(callback).Run(UpdateRecoveryKeyStoreStatus::kNetworkError);
return;
case TrustedVaultRequest::HttpStatus::kTransientAccessTokenFetchError:
std::move(callback).Run(
UpdateRecoveryKeyStoreStatus::kTransientAccessTokenFetchError);
return;
case TrustedVaultRequest::HttpStatus::kPersistentAccessTokenFetchError:
std::move(callback).Run(
UpdateRecoveryKeyStoreStatus::kPersistentAccessTokenFetchError);
return;
case TrustedVaultRequest::HttpStatus::
kPrimaryAccountChangeAccessTokenFetchError:
std::move(callback).Run(UpdateRecoveryKeyStoreStatus::
kPrimaryAccountChangeAccessTokenFetchError);
return;
}
NOTREACHED_NORETURN();
}
} // namespace
RecoveryKeyStoreConnectionImpl::RecoveryKeyStoreConnectionImpl(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
std::unique_ptr<TrustedVaultAccessTokenFetcher> access_token_fetcher)
: url_loader_factory_(url_loader_factory),
access_token_fetcher_(std::move(access_token_fetcher)) {}
RecoveryKeyStoreConnectionImpl::~RecoveryKeyStoreConnectionImpl() = default;
std::unique_ptr<RecoveryKeyStoreConnectionImpl::Request>
RecoveryKeyStoreConnectionImpl::UpdateRecoveryKeyStore(
const CoreAccountInfo& account_info,
const trusted_vault_pb::UpdateVaultRequest& update_vault_request,
UpdateRecoveryKeyStoreCallback callback) {
TrustedVaultRequest::RecordFetchStatusCallback record_fetch_status_to_uma =
base::BindRepeating(
&RecordRecoveryKeyStoreURLFetchResponse,
RecoveryKeyStoreURLFetchReasonForUMA::kUpdateRecoveryKeyStore);
auto request = std::make_unique<TrustedVaultRequest>(
account_info.account_id, TrustedVaultRequest::HttpMethod::kPatch,
GURL(kUpdateVaultUrl), update_vault_request.SerializeAsString(),
/*max_retry_duration=*/base::Seconds(0), url_loader_factory_,
access_token_fetcher_->Clone(), std::move(record_fetch_status_to_uma));
request->FetchAccessTokenAndSendRequest(
base::BindOnce(&ProcessUpdateVaultResponseResponse, std::move(callback)));
return request;
}
} // namespace trusted_vault