From 593e46c8586da5fcce8a185194edea5e51bf0131 Mon Sep 17 00:00:00 2001 From: Francis Tsui Date: Thu, 19 Mar 2026 16:30:59 -0700 Subject: [PATCH] Use new QuerySharedCredentials rpc when file sync is enabled. PiperOrigin-RevId: 886435458 --- sharing/certificates/BUILD | 4 + .../nearby_share_certificate_manager_impl.cc | 62 +++++++++++- .../nearby_share_certificate_manager_impl.h | 1 + ...rby_share_certificate_manager_impl_test.cc | 99 ++++++++++++++++++- 4 files changed, 164 insertions(+), 2 deletions(-) diff --git a/sharing/certificates/BUILD b/sharing/certificates/BUILD index 0b2a6f1f..b0073e37 100644 --- a/sharing/certificates/BUILD +++ b/sharing/certificates/BUILD @@ -48,10 +48,12 @@ cc_library( "//internal/base", "//internal/base:file_path", "//internal/crypto_cros", + "//internal/flags:nearby_flags", "//internal/platform:mac_address", "//internal/platform:types", "//location/nearby/sharing/lib/account:account_manager", "//location/nearby/sharing/lib/rpc:sharing_rpc_client", + "//sharing/flags/generated:generated_flags", "//sharing/internal/api:platform", "//sharing/internal/base", "//sharing/internal/public:logging", @@ -126,12 +128,14 @@ cc_test( ":test_support", "//google/nearby/identity/v1:resources_cc_proto", "//google/nearby/identity/v1:rpcs_cc_proto", + "//internal/flags:nearby_flags", "//internal/platform:mac_address", "//internal/platform/implementation:platform_impl", "//location/nearby/sharing/lib/account:account_manager", "//location/nearby/sharing/lib/account:fake_account_manager", "//location/nearby/sharing/lib/rpc:fake_nearby_share_client", "//sharing/common:enum", + "//sharing/flags/generated:generated_flags", "//sharing/internal/api:mock_sharing_platform", "//sharing/internal/api:platform", "//sharing/internal/public:pref_names", diff --git a/sharing/certificates/nearby_share_certificate_manager_impl.cc b/sharing/certificates/nearby_share_certificate_manager_impl.cc index 35984b59..5797059a 100644 --- a/sharing/certificates/nearby_share_certificate_manager_impl.cc +++ b/sharing/certificates/nearby_share_certificate_manager_impl.cc @@ -45,6 +45,7 @@ #include "absl/time/time.h" #include "absl/types/span.h" #include "internal/base/file_path.h" +#include "internal/flags/nearby_flags.h" #include "internal/platform/mac_address.h" #include "sharing/certificates/common.h" #include "sharing/certificates/constants.h" @@ -54,6 +55,7 @@ #include "sharing/certificates/nearby_share_decrypted_public_certificate.h" #include "sharing/certificates/nearby_share_encrypted_metadata_key.h" #include "sharing/certificates/nearby_share_private_certificate.h" +#include "sharing/flags/generated/nearby_sharing_feature_flags.h" #include "sharing/internal/api/bluetooth_adapter.h" #include "sharing/internal/api/preference_manager.h" #include "sharing/internal/api/public_certificate_database.h" @@ -82,6 +84,10 @@ using ::google::nearby::identity::v1::PublishDeviceRequest; using ::google::nearby::identity::v1::PublishDeviceResponse; using ::google::nearby::identity::v1::QuerySharedCredentialsRequest; using ::google::nearby::identity::v1::QuerySharedCredentialsResponse; +using ::google::nearby::identity::v1:: + QuerySharedCredentialsWithBindingIdsRequest; +using ::google::nearby::identity::v1:: + QuerySharedCredentialsWithBindingIdsResponse; using ::google::nearby::identity::v1::SharedCredential; using ::nearby::sharing::api::PreferenceManager; using ::nearby::sharing::api::PublicCertificateDatabase; @@ -372,6 +378,55 @@ void NearbyShareCertificateManagerImpl::CertificateDownloadContext:: }); } + +void NearbyShareCertificateManagerImpl::CertificateDownloadContext:: + QuerySharedCredentialsWithBindingIdsFetchNextPage() { + LOG(INFO) << __func__ + << ": Downloading public certificates with binding ids page=" + << page_number_; + page_number_++; + QuerySharedCredentialsWithBindingIdsRequest request; + request.set_name(absl::StrCat("devices/", device_id_)); + if (next_page_token_.has_value()) { + request.set_page_token(*next_page_token_); + } + nearby_identity_client_->QuerySharedCredentialsWithBindingIds( + std::move(request), api::IdentityRpcClient::kTimeout, + [this](const absl::StatusOr& + response) mutable { + if (!response.ok()) { + LOG(WARNING) << "Failed to download public certificates: " + << response.status(); + std::move(download_callback_)(response.status()); + return; + } + for (const auto& credential : response->shared_credentials()) { + if (credential.data_type() != + SharedCredential::DATA_TYPE_PUBLIC_CERTIFICATE) { + continue; + } + PublicCertificate certificate; + if (!certificate.ParseFromString(credential.data())) { + LOG(ERROR) << "Failed parsing to PublicCertificate, credential.id: " + << credential.id() << " data: " + << absl::BytesToHexString(credential.data()); + continue; + } + VLOG(1) << "Successfully parsed credential: " << credential.id(); + certificates_.push_back(certificate); + } + + if (response->next_page_token().empty()) { + LOG(INFO) << "Completed download of " << certificates_.size() + << " certificates"; + std::move(download_callback_)(std::move(certificates_)); + return; + } + next_page_token_ = response->next_page_token(); + QuerySharedCredentialsWithBindingIdsFetchNextPage(); + }); +} + bool NearbyShareCertificateManagerImpl::UpdatePublicCertificates( const std::vector& certificates) { // Save certificates to store. @@ -437,7 +492,12 @@ bool NearbyShareCertificateManagerImpl::DownloadPublicCertificatesInExecutor() { } notification.Notify(); }); - context->QuerySharedCredentialsFetchNextPage(); + if (NearbyFlags::GetInstance().GetBoolFlag( + config_package_nearby::nearby_sharing_feature::kEnableFileSync)) { + context->QuerySharedCredentialsWithBindingIdsFetchNextPage(); + } else { + context->QuerySharedCredentialsFetchNextPage(); + } // Wait for all pages of certificates to be downloaded. // MUST not terminate early, otherwise notification will go out of scope, and // the callback will call Notify on a destroyed object. diff --git a/sharing/certificates/nearby_share_certificate_manager_impl.h b/sharing/certificates/nearby_share_certificate_manager_impl.h index f3ca9a58..5f93cad6 100644 --- a/sharing/certificates/nearby_share_certificate_manager_impl.h +++ b/sharing/certificates/nearby_share_certificate_manager_impl.h @@ -118,6 +118,7 @@ class NearbyShareCertificateManagerImpl // On successful download, if page token in the response is empty, the // |download_success_callback_| is invoked with all downloaded certificates. void QuerySharedCredentialsFetchNextPage(); + void QuerySharedCredentialsWithBindingIdsFetchNextPage(); private: nearby::sharing::api::IdentityRpcClient* absl_nonnull const diff --git a/sharing/certificates/nearby_share_certificate_manager_impl_test.cc b/sharing/certificates/nearby_share_certificate_manager_impl_test.cc index 5db57f16..ebd994a6 100644 --- a/sharing/certificates/nearby_share_certificate_manager_impl_test.cc +++ b/sharing/certificates/nearby_share_certificate_manager_impl_test.cc @@ -39,6 +39,7 @@ #include "absl/strings/string_view.h" #include "absl/time/time.h" #include "absl/types/span.h" +#include "internal/flags/nearby_flags.h" #include "internal/platform/mac_address.h" #include "sharing/certificates/constants.h" #include "sharing/certificates/fake_nearby_share_certificate_storage.h" @@ -48,6 +49,7 @@ #include "sharing/certificates/nearby_share_encrypted_metadata_key.h" #include "sharing/certificates/nearby_share_private_certificate.h" #include "sharing/certificates/test_util.h" +#include "sharing/flags/generated/nearby_sharing_feature_flags.h" #include "sharing/internal/api/mock_sharing_platform.h" #include "sharing/internal/public/pref_names.h" #include "sharing/internal/test/fake_bluetooth_adapter.h" @@ -70,6 +72,10 @@ using ::google::nearby::identity::v1::PublishDeviceRequest; using ::google::nearby::identity::v1::PublishDeviceResponse; using ::google::nearby::identity::v1::QuerySharedCredentialsRequest; using ::google::nearby::identity::v1::QuerySharedCredentialsResponse; +using ::google::nearby::identity::v1:: + QuerySharedCredentialsWithBindingIdsRequest; +using ::google::nearby::identity::v1:: + QuerySharedCredentialsWithBindingIdsResponse; using ::nearby::sharing::proto::DeviceVisibility; using ::nearby::sharing::proto::PublicCertificate; using ::testing::Not; @@ -100,6 +106,7 @@ class NearbyShareCertificateManagerImplTest ~NearbyShareCertificateManagerImplTest() override = default; void SetUp() override { + NearbyFlags::GetInstance().ResetOverridedValues(); ON_CALL(mock_sharing_platform_, GetPreferenceManager) .WillByDefault(ReturnRef(preference_manager_)); ON_CALL(mock_sharing_platform_, GetAccountManager) @@ -304,7 +311,7 @@ class NearbyShareCertificateManagerImplTest std::max(max_not_after_self_share, cert.not_after()); break; default: - DCHECK(false); + FAIL() << "Unexpected visibility: " << cert.visibility(); break; } @@ -423,6 +430,78 @@ class NearbyShareCertificateManagerImplTest return response; } + void QuerySharedCredentialsWithBindingIdsFlow( + size_t num_pages, DownloadPublicCertificatesResult result) { + size_t prev_num_results = download_scheduler_->handled_results().size(); + cert_store_->SetPublicCertificateIds(kPublicCertificateIds); + + size_t initial_num_notifications = + num_public_certs_downloaded_notifications_; + size_t initial_num_public_cert_exp_reschedules = + public_cert_exp_scheduler_->num_reschedule_calls(); + + std::vector> + responses; + std::string page_token; + for (size_t page_number = 0; page_number < num_pages; ++page_number) { + bool last_page = page_number == num_pages - 1; + if (last_page && result == DownloadPublicCertificatesResult::kHttpError) { + responses.push_back(absl::InternalError("")); + break; + } + page_token = last_page ? std::string() + : absl::StrCat(kPageTokenPrefix, page_number); + responses.push_back(BuildQuerySharedCredentialsWithBindingIdsResponse( + page_number, page_token)); + } + + identity_client_.SetQuerySharedCredentialsWithBindingIdsResponses( + responses); + cert_store_->SetAddPublicCertificatesResult( + result != DownloadPublicCertificatesResult::kStorageError); + download_scheduler_->InvokeRequestCallback(); + Sync(); + + std::vector requests = + identity_client_.query_shared_credentials_with_binding_ids_requests(); + EXPECT_EQ(requests.size(), num_pages); + EXPECT_EQ(requests.back().name(), absl::StrCat("devices/", kDeviceId)); + ASSERT_EQ(download_scheduler_->handled_results().size(), + prev_num_results + 1); + + bool success = result == DownloadPublicCertificatesResult::kSuccess; + EXPECT_EQ(download_scheduler_->handled_results().back(), success); + EXPECT_EQ(num_public_certs_downloaded_notifications_, + initial_num_notifications + (success ? 1u : 0u)); + EXPECT_EQ(public_cert_exp_scheduler_->num_reschedule_calls(), + initial_num_public_cert_exp_reschedules + (success ? 1u : 0u)); + } + + QuerySharedCredentialsWithBindingIdsResponse + BuildQuerySharedCredentialsWithBindingIdsResponse( + size_t page_number, absl::string_view page_token) { + QuerySharedCredentialsWithBindingIdsResponse response; + int i = 0; + for (auto public_certificate : public_certificates_) { + auto* shared_credential = response.add_shared_credentials(); + shared_credential->set_id(page_number * 100 + i); + if (i % 2 == 0) { + shared_credential->set_data_type( + google::nearby::identity::v1::SharedCredential:: + DATA_TYPE_PUBLIC_CERTIFICATE); + } else { + shared_credential->set_data_type( + google::nearby::identity::v1::SharedCredential:: + DATA_TYPE_SHARED_CREDENTIAL); + } + *shared_credential->mutable_data() = + public_certificate.SerializeAsString(); + i++; + } + response.set_next_page_token(page_token); + return response; + } + void CheckStorageAddCertificates( const FakeNearbyShareCertificateStorage::AddPublicCertificatesCall& add_cert_call) { @@ -700,6 +779,24 @@ TEST_F(NearbyShareCertificateManagerImplTest, /*num_pages=*/2, DownloadPublicCertificatesResult::kHttpError)); } +TEST_F(NearbyShareCertificateManagerImplTest, + QuerySharedCredentialsWithBindingIdsSuccess) { + NearbyFlags::GetInstance().OverrideBoolFlagValue( + config_package_nearby::nearby_sharing_feature::kEnableFileSync, true); + Initialize(); + ASSERT_NO_FATAL_FAILURE(QuerySharedCredentialsWithBindingIdsFlow( + /*num_pages=*/2, DownloadPublicCertificatesResult::kSuccess)); +} + +TEST_F(NearbyShareCertificateManagerImplTest, + QuerySharedCredentialsWithBindingIdsRPCFailure) { + NearbyFlags::GetInstance().OverrideBoolFlagValue( + config_package_nearby::nearby_sharing_feature::kEnableFileSync, true); + Initialize(); + ASSERT_NO_FATAL_FAILURE(QuerySharedCredentialsWithBindingIdsFlow( + /*num_pages=*/2, DownloadPublicCertificatesResult::kHttpError)); +} + TEST_F(NearbyShareCertificateManagerImplTest, ClearPublicCertificates) { Initialize(); cert_manager_->ClearPublicCertificates([&](bool result) {});