mirror of
https://github.com/kidfromjupiter/nearby.git
synced 2026-09-14 14:46:12 -04:00
Prevent crash if CallNearbyIdentityApi flag updated during process lifetime.
PiperOrigin-RevId: 733485303
This commit is contained in:
committed by
Copybara-Service
parent
dec2ff910a
commit
270c23cb7f
@@ -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
|
||||
|
||||
@@ -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__
|
||||
|
||||
Reference in New Issue
Block a user