Prevent crash if CallNearbyIdentityApi flag updated during process lifetime.

PiperOrigin-RevId: 733485303
This commit is contained in:
Francis Tsui
2025-03-04 15:24:21 -08:00
committed by Copybara-Service
parent dec2ff910a
commit 270c23cb7f
12 changed files with 47 additions and 39 deletions
@@ -102,6 +102,7 @@ class FakeNearbyShareCertificateManager : public NearbyShareCertificateManager {
void ClearPublicCertificates(std::function<void(bool)> callback) override;
void SetVendorId(int32_t vendor_id) override {}
std::string Dump() const override { return ""; }
bool UsingIdentityRpc() override { return true; }
// Make protected methods from base class public in this fake class.
using NearbyShareCertificateManager::NotifyPrivateCertificatesChanged;
@@ -133,6 +133,9 @@ class NearbyShareCertificateManager {
// Dump certificates ID information for troubleshooting.
virtual std::string Dump() const = 0;
// Returns true if configured to use Identity RPC.
virtual bool UsingIdentityRpc() = 0;
protected:
virtual void OnStart() = 0;
virtual void OnStop() = 0;
@@ -280,9 +280,7 @@ NearbyShareCertificateManagerImpl::NearbyShareCertificateManagerImpl(
})),
executor_(context->CreateSequencedTaskRunner()) {
local_device_data_manager_->AddObserver(this);
if (!NearbyFlags::GetInstance().GetBoolFlag(
sharing::config_package_nearby::nearby_sharing_feature::
kCallNearbyIdentityApi)) {
if (!UsingIdentityRpc()) {
contact_manager_->AddObserver(this);
}
}
@@ -325,6 +323,10 @@ void NearbyShareCertificateManagerImpl::CertificateDownloadContext::
});
}
bool NearbyShareCertificateManagerImpl::UsingIdentityRpc() {
return local_device_data_manager_->UsingIdentityRpc();
}
void NearbyShareCertificateManagerImpl::CertificateDownloadContext::
QuerySharedCredentialsFetchNextPage() {
page_number_++;
@@ -439,9 +441,7 @@ void NearbyShareCertificateManagerImpl::DownloadPublicCertificates() {
absl::bind_front(&NearbyShareCertificateManagerImpl::
OnPublicCertificatesDownloadSuccess,
this));
if (NearbyFlags::GetInstance().GetBoolFlag(
config_package_nearby::nearby_sharing_feature::
kCallNearbyIdentityApi)) {
if (UsingIdentityRpc()) {
context->QuerySharedCredentialsFetchNextPage();
} else {
context->FetchNextPage();
@@ -479,9 +479,7 @@ void NearbyShareCertificateManagerImpl::UploadLocalDeviceCertificates() {
<< " local device certificates.";
bool upload_certificates_result = false;
absl::Notification notification;
if (NearbyFlags::GetInstance().GetBoolFlag(
config_package_nearby::nearby_sharing_feature::
kCallNearbyIdentityApi)) {
if (local_device_data_manager_->UsingIdentityRpc()) {
LOG(INFO) << __func__ << ": [Call Identity API] PublishDevice: upload "
<< public_certs.size() << " local device certificates.";
local_device_data_manager_->PublishDevice(
@@ -511,10 +509,7 @@ void NearbyShareCertificateManagerImpl::UploadLocalDeviceCertificates() {
// TODO(b/373780923): add Unit test for the two RPC calls and add a cap to
// the number of time you can keep calling PublishDevice due to contacts
// changes (it could indicate a server bug).
if (call_publish_device_after_certs_regen_ &&
NearbyFlags::GetInstance().GetBoolFlag(
config_package_nearby::nearby_sharing_feature::
kCallNearbyIdentityApi)) {
if (call_publish_device_after_certs_regen_ && UsingIdentityRpc()) {
LOG(INFO) << __func__
<< ": [Call Identity API] Another call to PublishDevice after "
"regenerating all Private certificates: ";
@@ -177,6 +177,8 @@ class NearbyShareCertificateManagerImpl
// Dump certs information.
std::string Dump() const override;
bool UsingIdentityRpc() override;
// Used by the private certificate expiration scheduler to determine the next
// private certificate expiration time. Returns base::Time::Min() if
// certificates are missing. This function never returns absl::nullopt.
@@ -132,6 +132,8 @@ class NearbyShareCertificateManagerImplTest
// Set default device data.
local_device_data_manager_->SetDeviceName(
GetNearbyShareTestMetadata().device_name());
// Disable Identity API.
local_device_data_manager_->SetUsingIdentityRpc(false);
SetBluetoothMacAddress(kTestUnparsedBluetoothMacAddress);
SetMockBluetoothAddress(kTestUnparsedBluetoothMacAddress);
@@ -173,7 +175,6 @@ class NearbyShareCertificateManagerImplTest
cert_manager_->RemoveObserver(this);
NearbyShareSchedulerFactory::SetFactoryForTesting(nullptr);
NearbyShareCertificateStorageImpl::Factory::SetFactoryForTesting(nullptr);
NearbyFlags::GetInstance().ResetOverridedValues();
}
void SetBluetoothMacAddress(absl::string_view bluetooth_mac_address) {
@@ -775,18 +776,16 @@ TEST_F(NearbyShareCertificateManagerImplTest,
}
TEST_F(NearbyShareCertificateManagerImplTest, QuerySharedCredentialsSuccess) {
NearbyFlags::GetInstance().OverrideBoolFlagValue(
config_package_nearby::nearby_sharing_feature::kCallNearbyIdentityApi,
true);
// Enable Identity API.
local_device_data_manager_->SetUsingIdentityRpc(true);
ASSERT_NO_FATAL_FAILURE(QuerySharedCredentialsFlow(
/*num_pages=*/2, DownloadPublicCertificatesResult::kSuccess));
}
TEST_F(NearbyShareCertificateManagerImplTest,
QuerySharedCredentialsRPCFailure) {
NearbyFlags::GetInstance().OverrideBoolFlagValue(
config_package_nearby::nearby_sharing_feature::kCallNearbyIdentityApi,
true);
// Enable Identity API.
local_device_data_manager_->SetUsingIdentityRpc(true);
ASSERT_NO_FATAL_FAILURE(QuerySharedCredentialsFlow(
/*num_pages=*/2, DownloadPublicCertificatesResult::kHttpError));
}
@@ -824,9 +823,8 @@ TEST_F(NearbyShareCertificateManagerImplTest,
TEST_F(NearbyShareCertificateManagerImplTest,
RefreshPrivateCertificates_PublishDevice_NoCertificates_UploadSuccess) {
NearbyFlags::GetInstance().OverrideBoolFlagValue(
config_package_nearby::nearby_sharing_feature::kCallNearbyIdentityApi,
true);
// Enable Identity API.
local_device_data_manager_->SetUsingIdentityRpc(true);
cert_store_->ReplacePrivateCertificates({});
HandlePrivateCertificateRefresh(/*expect_private_cert_refresh=*/true,
@@ -837,9 +835,8 @@ TEST_F(NearbyShareCertificateManagerImplTest,
TEST_F(NearbyShareCertificateManagerImplTest,
RefreshPrivateCertificates_PublishDevice_ForceUploadSuccess) {
NearbyFlags::GetInstance().OverrideBoolFlagValue(
config_package_nearby::nearby_sharing_feature::kCallNearbyIdentityApi,
true);
// Enable Identity API.
local_device_data_manager_->SetUsingIdentityRpc(true);
// All private certificates are valid.
cert_store_->ReplacePrivateCertificates(private_certificates_);
cert_manager_->PrivateCertificateRefresh(/*force_upload=*/true);
@@ -858,9 +855,8 @@ TEST_F(NearbyShareCertificateManagerImplTest,
TEST_F(NearbyShareCertificateManagerImplTest,
RefreshPrivateCertificates_NotLoggedIn_DoesNotCallPublishDevice) {
NearbyFlags::GetInstance().OverrideBoolFlagValue(
config_package_nearby::nearby_sharing_feature::kCallNearbyIdentityApi,
true);
// Enable Identity API.
local_device_data_manager_->SetUsingIdentityRpc(true);
fake_account_manager_.SetAccount(std::nullopt);
// All private certificates are valid.
cert_store_->ReplacePrivateCertificates({});
@@ -1052,9 +1048,8 @@ TEST_F(NearbyShareCertificateManagerImplTest,
TEST_F(
NearbyShareCertificateManagerImplTest,
RefreshPrivateCertificates_NotLoggedIn_DisablesPrivateCertExpirationTimer) {
NearbyFlags::GetInstance().OverrideBoolFlagValue(
config_package_nearby::nearby_sharing_feature::kCallNearbyIdentityApi,
true);
// Enable Identity API.
local_device_data_manager_->SetUsingIdentityRpc(true);
fake_account_manager_.SetAccount(std::nullopt);
// All private certificates are valid.
cert_store_->ReplacePrivateCertificates({});
@@ -175,9 +175,7 @@ NearbyShareContactManagerImpl::NearbyShareContactManagerImpl(
prefs::kNearbySharingSchedulerContactDownloadAndUploadName,
[&] { DownloadContacts(); })),
executor_(context->CreateSequencedTaskRunner()),
use_identity_api_(NearbyFlags::GetInstance().GetBoolFlag(
config_package_nearby::nearby_sharing_feature::
kCallNearbyIdentityApi)) {}
use_identity_api_(local_device_data_manager_->UsingIdentityRpc()) {}
NearbyShareContactManagerImpl::~NearbyShareContactManagerImpl() = default;
@@ -166,6 +166,7 @@ class NearbyShareContactManagerImplTest
NearbyShareContactManagerImplTest()
: local_device_data_manager_(kTestDefaultDeviceName) {
local_device_data_manager_.set_is_sync_mode(true);
local_device_data_manager_.SetUsingIdentityRpc(false);
}
~NearbyShareContactManagerImplTest() override = default;
@@ -18,7 +18,6 @@
#include <stddef.h>
#include <memory>
#include <optional>
#include <string>
#include <vector>
@@ -123,6 +122,11 @@ class FakeNearbyShareLocalDeviceDataManager
std::vector<nearby::sharing::proto::PublicCertificate> certificates,
bool is_second_call, PublishDeviceCallback callback) override;
bool UsingIdentityRpc() override { return using_identity_rpc_; }
void SetUsingIdentityRpc(bool using_identity_rpc) {
using_identity_rpc_ = using_identity_rpc;
}
// Make protected observer-notification methods from the base class public in
// this fake class.
using NearbyShareLocalDeviceDataManager::NotifyLocalDeviceDataChanged;
@@ -176,6 +180,7 @@ class FakeNearbyShareLocalDeviceDataManager
bool upload_contact_result_ = false;
bool upload_certificate_result_ = false;
bool publish_device_result_ = false;
bool using_identity_rpc_ = true;
};
} // namespace sharing
@@ -104,6 +104,9 @@ class NearbyShareLocalDeviceDataManager {
std::vector<nearby::sharing::proto::PublicCertificate> certificates,
bool force_update_contacts, PublishDeviceCallback callback) = 0;
// Returns true if configured to use Identity RPC.
virtual bool UsingIdentityRpc() = 0;
protected:
void NotifyLocalDeviceDataChanged(bool did_device_name_change,
bool did_full_name_change,
@@ -233,6 +233,11 @@ void NearbyShareLocalDeviceDataManagerImpl::UploadContacts(
});
});
}
bool NearbyShareLocalDeviceDataManagerImpl::UsingIdentityRpc() {
return nearby_identity_client_ != nullptr;
}
void NearbyShareLocalDeviceDataManagerImpl::PublishDevice(
std::vector<nearby::sharing::proto::PublicCertificate> certificates,
bool force_update_contacts, PublishDeviceCallback callback) {
@@ -90,6 +90,8 @@ class NearbyShareLocalDeviceDataManagerImpl
std::vector<nearby::sharing::proto::PublicCertificate> certificates,
bool force_update_contacts, PublishDeviceCallback callback) override;
bool UsingIdentityRpc() override;
// Creates a default device name of the form "<given name>'s <device type>."
// For example, "Josh's Chromebook." If a given name cannot be found, returns
// just the device type. If the resulting name is too long the user's name
+1 -3
View File
@@ -651,9 +651,7 @@ void NearbySharingServiceImpl::RegisterReceiveSurface(
<< background_receive_callbacks_map_.size();
if (IsVisibleInBackground(settings_->GetVisibility())) {
if (NearbyFlags::GetInstance().GetBoolFlag(
config_package_nearby::nearby_sharing_feature::
kCallNearbyIdentityApi)) {
if (certificate_manager_->UsingIdentityRpc()) {
// The Identity API does not support contact manager which triggers
// Certificate refresh in DownloadContacts. Force upload explicitly.
VLOG(1) << __func__