mirror of
https://github.com/kidfromjupiter/nearby.git
synced 2026-09-16 15:36:12 -04:00
Merge remote-tracking branch 'nearby/main'
# Conflicts: # connections/implementation/bwu_manager_test.cc # sharing/BUILD # sharing/certificates/fake_nearby_share_certificate_manager.cc # sharing/certificates/fake_nearby_share_certificate_manager.h # sharing/internal/base/utf_string_conversions.h
This commit is contained in:
@@ -63,8 +63,11 @@ cc_library(
|
||||
"//sharing/proto:enums_cc_proto",
|
||||
"//sharing/proto:share_cc_proto",
|
||||
"//sharing/scheduling",
|
||||
"//third_party/gloop/util/time:protoutil",
|
||||
"//util/hash:highway_fingerprint",
|
||||
"@com_google_absl//absl/algorithm",
|
||||
"@com_google_absl//absl/algorithm:container",
|
||||
"@com_google_absl//absl/base:core_headers",
|
||||
"@com_google_absl//absl/base:nullability",
|
||||
"@com_google_absl//absl/container:btree",
|
||||
"@com_google_absl//absl/container:flat_hash_map",
|
||||
@@ -145,6 +148,7 @@ cc_test(
|
||||
"//sharing/proto:share_cc_proto",
|
||||
"//sharing/scheduling",
|
||||
"//sharing/scheduling:test_support",
|
||||
"//third_party/gloop/util/time:protoutil",
|
||||
"@com_github_protobuf_matchers//protobuf-matchers",
|
||||
"@com_google_absl//absl/functional:any_invocable",
|
||||
"@com_google_absl//absl/status",
|
||||
|
||||
@@ -20,9 +20,11 @@
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
#include <queue>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "internal/base/file_path.h"
|
||||
#include "sharing/certificates/nearby_share_certificate_manager.h"
|
||||
#include "sharing/certificates/nearby_share_encrypted_metadata_key.h"
|
||||
@@ -102,6 +104,12 @@ void FakeNearbyShareCertificateManager::ClearPublicCertificates(
|
||||
callback(true);
|
||||
}
|
||||
|
||||
void FakeNearbyShareCertificateManager::AddBindingToPublicCertificate(
|
||||
absl::string_view certificate_id, absl::string_view binding_id) {
|
||||
add_binding_to_public_certificate_calls_.push_back(
|
||||
{std::string(certificate_id), std::string(binding_id)});
|
||||
}
|
||||
|
||||
std::optional<NearbySharePrivateCertificate>
|
||||
FakeNearbyShareCertificateManager::GetValidPrivateCertificate(
|
||||
DeviceVisibility visibility) const {
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/time/time.h"
|
||||
#include "internal/base/file_path.h"
|
||||
#include "sharing/certificates/nearby_share_certificate_manager.h"
|
||||
#include "sharing/certificates/nearby_share_certificate_manager_impl.h"
|
||||
@@ -89,6 +90,11 @@ class FakeNearbyShareCertificateManager : public NearbyShareCertificateManager {
|
||||
CertDecryptedCallback callback;
|
||||
};
|
||||
|
||||
struct AddBindingToPublicCertificateCall {
|
||||
std::string certificate_id;
|
||||
std::string binding_id;
|
||||
};
|
||||
|
||||
FakeNearbyShareCertificateManager();
|
||||
~FakeNearbyShareCertificateManager() override;
|
||||
|
||||
@@ -100,6 +106,13 @@ class FakeNearbyShareCertificateManager : public NearbyShareCertificateManager {
|
||||
void ForceUploadPrivateCertificates() override {};
|
||||
void ClearPublicCertificates(std::function<void(bool)> callback) override;
|
||||
void SetVendorId(int32_t vendor_id) override {}
|
||||
void AddBindingToPublicCertificate(
|
||||
absl::string_view certificate_id, absl::string_view binding_id) override;
|
||||
void SetJoinBindingTime(absl::Time join_binding_time,
|
||||
absl::Duration life_time) override {
|
||||
join_binding_time_ = join_binding_time;
|
||||
join_binding_life_time_ = life_time;
|
||||
}
|
||||
std::string Dump() const override { return ""; }
|
||||
|
||||
// Make protected methods from base class public in this fake class.
|
||||
@@ -125,6 +138,11 @@ class FakeNearbyShareCertificateManager : public NearbyShareCertificateManager {
|
||||
return get_decrypted_public_certificate_calls_;
|
||||
}
|
||||
|
||||
const std::vector<AddBindingToPublicCertificateCall>&
|
||||
add_binding_to_public_certificate_calls() const {
|
||||
return add_binding_to_public_certificate_calls_;
|
||||
}
|
||||
|
||||
private:
|
||||
// NearbyShareCertificateManager:
|
||||
void OnStartScheduledTasks() override {}
|
||||
@@ -139,7 +157,11 @@ class FakeNearbyShareCertificateManager : public NearbyShareCertificateManager {
|
||||
size_t num_clear_public_certificates_calls_ = 0;
|
||||
std::vector<GetDecryptedPublicCertificateCall>
|
||||
get_decrypted_public_certificate_calls_;
|
||||
std::vector<AddBindingToPublicCertificateCall>
|
||||
add_binding_to_public_certificate_calls_;
|
||||
std::vector<uint8_t> next_salt_;
|
||||
absl::Time join_binding_time_;
|
||||
absl::Duration join_binding_life_time_;
|
||||
};
|
||||
|
||||
} // namespace sharing
|
||||
|
||||
@@ -106,7 +106,16 @@ void FakeNearbyShareCertificateStorage::GetPublicCertificate(
|
||||
std::function<
|
||||
void(bool, std::unique_ptr<nearby::sharing::proto::PublicCertificate>)>
|
||||
callback) {
|
||||
get_public_certificate_callback_ = std::move(callback);
|
||||
get_public_certificate_callback_ = callback;
|
||||
if (is_sync_mode_) {
|
||||
for (const auto& cert : public_certificates_) {
|
||||
if (cert.secret_id() == id) {
|
||||
callback(true, std::make_unique<PublicCertificate>(cert));
|
||||
return;
|
||||
}
|
||||
}
|
||||
callback(false, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<NearbySharePrivateCertificate>
|
||||
@@ -135,6 +144,19 @@ void FakeNearbyShareCertificateStorage::AddPublicCertificates(
|
||||
public_certificates.end()),
|
||||
callback);
|
||||
if (is_sync_mode_) {
|
||||
for (const auto& cert : public_certificates) {
|
||||
bool found = false;
|
||||
for (auto& existing_cert : public_certificates_) {
|
||||
if (existing_cert.secret_id() == cert.secret_id()) {
|
||||
existing_cert = cert;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
public_certificates_.push_back(cert);
|
||||
}
|
||||
}
|
||||
callback(add_public_certificates_result_);
|
||||
}
|
||||
}
|
||||
@@ -152,6 +174,12 @@ void FakeNearbyShareCertificateStorage::ClearPublicCertificates(
|
||||
clear_public_certificates_callbacks_.push_back(std::move(callback));
|
||||
}
|
||||
|
||||
void FakeNearbyShareCertificateStorage::SetPublicCertificates(
|
||||
absl::Span<const PublicCertificate> public_certificates) {
|
||||
public_certificates_ = std::vector<PublicCertificate>(
|
||||
public_certificates.begin(), public_certificates.end());
|
||||
}
|
||||
|
||||
void FakeNearbyShareCertificateStorage::SetPublicCertificateIds(
|
||||
absl::Span<const absl::string_view> ids) {
|
||||
public_certificate_ids_ = std::vector<std::string>(ids.begin(), ids.end());
|
||||
|
||||
@@ -123,6 +123,9 @@ class FakeNearbyShareCertificateStorage : public NearbyShareCertificateStorage {
|
||||
void ClearPublicCertificates(ResultCallback callback) override;
|
||||
|
||||
void SetPublicCertificateIds(absl::Span<const absl::string_view> ids);
|
||||
void SetPublicCertificates(
|
||||
absl::Span<const nearby::sharing::proto::PublicCertificate>
|
||||
public_certificates);
|
||||
void SetNextPublicCertificateExpirationTime(absl::Time time);
|
||||
|
||||
std::vector<PublicCertificateCallback>& get_public_certificates_callbacks() {
|
||||
@@ -156,6 +159,7 @@ class FakeNearbyShareCertificateStorage : public NearbyShareCertificateStorage {
|
||||
absl::Mutex mutex_;
|
||||
absl::Time next_public_certificate_expiration_time_ = absl::InfiniteFuture();
|
||||
std::vector<std::string> public_certificate_ids_;
|
||||
std::vector<nearby::sharing::proto::PublicCertificate> public_certificates_;
|
||||
std::vector<NearbySharePrivateCertificate> private_certificates_
|
||||
ABSL_GUARDED_BY(mutex_);
|
||||
std::vector<PublicCertificateCallback> get_public_certificates_callbacks_;
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/types/span.h"
|
||||
@@ -73,6 +74,15 @@ NearbyShareCertificateManager::EncryptPrivateCertificateMetadataKey(
|
||||
return encrypted_key;
|
||||
}
|
||||
|
||||
std::optional<std::string>
|
||||
NearbyShareCertificateManager::GetPrivateCertificateId(
|
||||
DeviceVisibility visibility) {
|
||||
std::optional<NearbySharePrivateCertificate> cert =
|
||||
GetValidPrivateCertificate(visibility);
|
||||
if (!cert) return std::nullopt;
|
||||
return std::string(cert->id().begin(), cert->id().end());
|
||||
}
|
||||
|
||||
std::optional<std::vector<uint8_t>>
|
||||
NearbyShareCertificateManager::SignWithPrivateCertificate(
|
||||
DeviceVisibility visibility, absl::Span<const uint8_t> payload) const {
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "absl/time/time.h"
|
||||
#include "absl/types/span.h"
|
||||
#include "internal/base/observer_list.h"
|
||||
#include "sharing/certificates/nearby_share_decrypted_public_certificate.h"
|
||||
@@ -80,6 +82,12 @@ class NearbyShareCertificateManager {
|
||||
std::optional<NearbyShareEncryptedMetadataKey>
|
||||
EncryptPrivateCertificateMetadataKey(proto::DeviceVisibility visibility);
|
||||
|
||||
// Returns the id of the currently valid private certificate with
|
||||
// |visibility|, or absl::nullopt if there is no valid private certificate
|
||||
// with |visibility|.
|
||||
std::optional<std::string> GetPrivateCertificateId(
|
||||
proto::DeviceVisibility visibility);
|
||||
|
||||
// Signs the input |payload| using the currently valid private certificate
|
||||
// with |visibility|. Returns absl::nullopt if there is no valid private
|
||||
// certificate with |visibility| or if the signing was unsuccessful.
|
||||
@@ -119,9 +127,18 @@ class NearbyShareCertificateManager {
|
||||
// Sets the vendor ID to generate certificates for.
|
||||
virtual void SetVendorId(int32_t vendor_id) = 0;
|
||||
|
||||
// Sets the timestamp of the join binding rpc. This is used to ensure that the
|
||||
// requested public certificates contain the ids of the binding.
|
||||
// `life_time` determines how long this join_binding_time will be used.
|
||||
virtual void SetJoinBindingTime(absl::Time join_binding_time,
|
||||
absl::Duration life_time) = 0;
|
||||
|
||||
// Dump certificates ID information for troubleshooting.
|
||||
virtual std::string Dump() const = 0;
|
||||
|
||||
virtual void AddBindingToPublicCertificate(
|
||||
absl::string_view certificate_id, absl::string_view binding_id) = 0;
|
||||
|
||||
protected:
|
||||
virtual void OnStartScheduledTasks() = 0;
|
||||
virtual void OnStopScheduledTasks() = 0;
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "location/nearby/sharing/lib/account/account_manager.h"
|
||||
#include "location/nearby/sharing/lib/rpc/sharing_rpc_client.h"
|
||||
#include "absl/algorithm/algorithm.h"
|
||||
#include "absl/algorithm/container.h"
|
||||
#include "absl/base/nullability.h"
|
||||
#include "absl/container/flat_hash_map.h"
|
||||
#include "absl/memory/memory.h"
|
||||
@@ -41,9 +42,11 @@
|
||||
#include "absl/strings/escaping.h"
|
||||
#include "absl/strings/str_cat.h"
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "absl/synchronization/mutex.h"
|
||||
#include "absl/synchronization/notification.h"
|
||||
#include "absl/time/time.h"
|
||||
#include "absl/types/span.h"
|
||||
#include "third_party/gloop/util/time/protoutil.h"
|
||||
#include "internal/base/file_path.h"
|
||||
#include "internal/flags/nearby_flags.h"
|
||||
#include "internal/platform/mac_address.h"
|
||||
@@ -383,6 +386,13 @@ void NearbyShareCertificateManagerImpl::CertificateDownloadContext::
|
||||
page_number_++;
|
||||
QuerySharedCredentialsWithBindingIdsRequest request;
|
||||
request.set_name(absl::StrCat("devices/", device_id_));
|
||||
if (join_time_.has_value()) {
|
||||
absl::StatusOr<google::protobuf::Timestamp> join_time =
|
||||
util_time::EncodeGoogleApiProto(*join_time_);
|
||||
if (join_time.ok()) {
|
||||
*request.mutable_join_binding_time() = *join_time;
|
||||
}
|
||||
}
|
||||
if (next_page_token_.has_value()) {
|
||||
request.set_page_token(*next_page_token_);
|
||||
}
|
||||
@@ -408,7 +418,8 @@ void NearbyShareCertificateManagerImpl::CertificateDownloadContext::
|
||||
<< absl::BytesToHexString(credential.data());
|
||||
continue;
|
||||
}
|
||||
VLOG(1) << "Successfully parsed credential: " << credential.id();
|
||||
VLOG(1) << "Successfully parsed credential: " << credential.id()
|
||||
<< " with binding id: " << certificate.binding_id();
|
||||
certificates_.push_back(certificate);
|
||||
}
|
||||
|
||||
@@ -466,10 +477,20 @@ bool NearbyShareCertificateManagerImpl::DownloadPublicCertificatesInExecutor() {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Clear join_time if it is expired.
|
||||
std::optional<absl::Time> join_time;
|
||||
{
|
||||
absl::MutexLock lock(join_time_mutex_);
|
||||
if (join_time_.has_value() &&
|
||||
context_->GetClock()->Now() > join_time_discard_time_) {
|
||||
join_time_.reset();
|
||||
}
|
||||
join_time = join_time_;
|
||||
}
|
||||
bool download_succeeded = false;
|
||||
absl::Notification notification;
|
||||
auto context = std::make_unique<CertificateDownloadContext>(
|
||||
nearby_identity_client_, std::move(device_id),
|
||||
nearby_identity_client_, std::move(device_id), join_time,
|
||||
[this, &download_succeeded, ¬ification](
|
||||
absl::StatusOr<std::vector<PublicCertificate>> certificates_status) {
|
||||
if (!certificates_status.ok()) {
|
||||
@@ -489,7 +510,7 @@ bool NearbyShareCertificateManagerImpl::DownloadPublicCertificatesInExecutor() {
|
||||
notification.Notify();
|
||||
});
|
||||
if (NearbyFlags::GetInstance().GetBoolFlag(
|
||||
config_package_nearby::nearby_sharing_feature::kEnableFileSync)) {
|
||||
config_package_nearby::nearby_sharing_feature::kEnableBackup)) {
|
||||
context->QuerySharedCredentialsWithBindingIdsFetchNextPage();
|
||||
} else {
|
||||
context->QuerySharedCredentialsFetchNextPage();
|
||||
@@ -744,6 +765,13 @@ void NearbyShareCertificateManagerImpl::SetVendorId(int32_t vendor_id) {
|
||||
RegeneratePrivateCertificates();
|
||||
}
|
||||
|
||||
void NearbyShareCertificateManagerImpl::SetJoinBindingTime(
|
||||
absl::Time join_binding_time, absl::Duration life_time) {
|
||||
absl::MutexLock lock(join_time_mutex_);
|
||||
join_time_ = join_binding_time;
|
||||
join_time_discard_time_ = context_->GetClock()->Now() + life_time;
|
||||
}
|
||||
|
||||
std::string NearbyShareCertificateManagerImpl::Dump() const {
|
||||
std::stringstream sstream;
|
||||
sstream << "Public Certificates" << std::endl;
|
||||
@@ -892,6 +920,32 @@ bool NearbyShareCertificateManagerImpl::RefreshPrivateCertificatesInExecutor(
|
||||
return true;
|
||||
}
|
||||
|
||||
void NearbyShareCertificateManagerImpl::AddBindingToPublicCertificate(
|
||||
absl::string_view certificate_id, absl::string_view binding_id) {
|
||||
LOG(INFO) << "Adding binding to public certificate: "
|
||||
<< absl::BytesToHexString(certificate_id);
|
||||
absl::Notification notification;
|
||||
certificate_storage_->GetPublicCertificate(
|
||||
certificate_id,
|
||||
[this, id = std::string(binding_id), ¬ification](
|
||||
bool success, std::unique_ptr<PublicCertificate> certificate) {
|
||||
if (success && certificate != nullptr) {
|
||||
certificate->set_binding_id(id);
|
||||
certificate_storage_->AddPublicCertificates(
|
||||
{*certificate}, [](bool success) {
|
||||
if (!success) {
|
||||
LOG(WARNING)
|
||||
<< "Failed to add binding to public certificate.";
|
||||
}
|
||||
});
|
||||
} else {
|
||||
LOG(WARNING) << "Failed to add binding to public certificate.";
|
||||
}
|
||||
notification.Notify();
|
||||
});
|
||||
notification.WaitForNotification();
|
||||
}
|
||||
|
||||
void NearbyShareCertificateManagerImpl::ForceUploadPrivateCertificates() {
|
||||
executor_->PostTask([this]() {
|
||||
private_certificate_expiration_scheduler_->HandleResult(
|
||||
@@ -942,9 +996,9 @@ bool NearbyShareCertificateManagerImpl::UpdateAccountInfoInExecutor() {
|
||||
get_account_info_succeeded = true;
|
||||
const auto& capabilities = response->account_info().capabilities();
|
||||
bool has_titanium_capability =
|
||||
(std::find(capabilities.begin(), capabilities.end(),
|
||||
google::nearby::identity::v1::AccountInfo::
|
||||
CAPABILITY_TITANIUM) != capabilities.end());
|
||||
(absl::c_find(capabilities,
|
||||
google::nearby::identity::v1::AccountInfo::
|
||||
CAPABILITY_TITANIUM) != capabilities.end());
|
||||
preference_manager_.SetBoolean(PrefNames::kAdvancedProtectionEnabled,
|
||||
has_titanium_capability);
|
||||
LOG(INFO) << "GetAccountInfo succeeded, advanced protection enabled: "
|
||||
|
||||
@@ -26,8 +26,11 @@
|
||||
#include "location/nearby/sharing/lib/account/account_manager.h"
|
||||
#include "location/nearby/sharing/lib/rpc/sharing_rpc_client.h"
|
||||
#include "absl/base/nullability.h"
|
||||
#include "absl/base/thread_annotations.h"
|
||||
#include "absl/functional/any_invocable.h"
|
||||
#include "absl/status/statusor.h"
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "absl/synchronization/mutex.h"
|
||||
#include "absl/time/time.h"
|
||||
#include "internal/base/file_path.h"
|
||||
#include "internal/platform/task_runner.h"
|
||||
@@ -92,7 +95,12 @@ class NearbyShareCertificateManagerImpl
|
||||
void ForceUploadPrivateCertificates() override;
|
||||
void ClearPublicCertificates(std::function<void(bool)> callback) override;
|
||||
void SetVendorId(int32_t vendor_id) override;
|
||||
void SetJoinBindingTime(absl::Time join_binding_time,
|
||||
absl::Duration life_time)
|
||||
ABSL_LOCKS_EXCLUDED(join_time_mutex_) override;
|
||||
std::string Dump() const override;
|
||||
void AddBindingToPublicCertificate(
|
||||
absl::string_view certificate_id, absl::string_view binding_id) override;
|
||||
|
||||
private:
|
||||
// Class for maintaining a single instance of public certificate download
|
||||
@@ -104,12 +112,14 @@ class NearbyShareCertificateManagerImpl
|
||||
nearby::sharing::api::IdentityRpcClient* absl_nonnull
|
||||
nearby_identity_client,
|
||||
std::string device_id,
|
||||
std::optional<absl::Time> join_time,
|
||||
absl::AnyInvocable<void(absl::StatusOr<std::vector<
|
||||
nearby::sharing::proto::PublicCertificate>>
|
||||
certificates_status) &&>
|
||||
download_callback)
|
||||
: nearby_identity_client_(nearby_identity_client),
|
||||
device_id_(std::move(device_id)),
|
||||
join_time_(join_time),
|
||||
download_callback_(std::move(download_callback)) {}
|
||||
|
||||
// Fetches the next page of certificates by calling Identity API
|
||||
@@ -123,7 +133,8 @@ class NearbyShareCertificateManagerImpl
|
||||
private:
|
||||
nearby::sharing::api::IdentityRpcClient* absl_nonnull const
|
||||
nearby_identity_client_;
|
||||
std::string device_id_;
|
||||
const std::string device_id_;
|
||||
const std::optional<absl::Time> join_time_;
|
||||
std::optional<std::string> next_page_token_;
|
||||
int page_number_ = 1;
|
||||
std::vector<nearby::sharing::proto::PublicCertificate> certificates_;
|
||||
@@ -219,6 +230,12 @@ class NearbyShareCertificateManagerImpl
|
||||
account_info_update_scheduler_;
|
||||
|
||||
std::unique_ptr<TaskRunner> executor_;
|
||||
absl::Mutex join_time_mutex_;
|
||||
// Set to the transaction timestamp of the last successful pairing if
|
||||
// available. This is returned from the phone in the BindingResponse message.
|
||||
std::optional<absl::Time> join_time_ ABSL_GUARDED_BY(join_time_mutex_);
|
||||
// The time when the join_time_ will be discarded.
|
||||
absl::Time join_time_discard_time_ ABSL_GUARDED_BY(join_time_mutex_);
|
||||
};
|
||||
|
||||
} // namespace nearby::sharing
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "absl/time/time.h"
|
||||
#include "absl/types/span.h"
|
||||
#include "third_party/gloop/util/time/protoutil.h"
|
||||
#include "internal/flags/nearby_flags.h"
|
||||
#include "internal/platform/mac_address.h"
|
||||
#include "sharing/certificates/constants.h"
|
||||
@@ -78,6 +79,7 @@ using ::google::nearby::identity::v1::
|
||||
QuerySharedCredentialsWithBindingIdsResponse;
|
||||
using ::nearby::sharing::proto::DeviceVisibility;
|
||||
using ::nearby::sharing::proto::PublicCertificate;
|
||||
using ::protobuf_matchers::EqualsProto;
|
||||
using ::testing::Not;
|
||||
using ::testing::ReturnRef;
|
||||
using ::testing::UnorderedElementsAreArray;
|
||||
@@ -634,6 +636,31 @@ TEST_F(NearbyShareCertificateManagerImplTest,
|
||||
DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS));
|
||||
}
|
||||
|
||||
TEST_F(NearbyShareCertificateManagerImplTest,
|
||||
GetPrivateCertificateIdWithNoCertificates) {
|
||||
Initialize();
|
||||
cert_store_->ReplacePrivateCertificates({});
|
||||
EXPECT_FALSE(cert_manager_->GetPrivateCertificateId(
|
||||
DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS).has_value());
|
||||
}
|
||||
|
||||
TEST_F(NearbyShareCertificateManagerImplTest,
|
||||
GetPrivateCertificateIdWithValidCertificate) {
|
||||
Initialize();
|
||||
NearbySharePrivateCertificate private_certificate =
|
||||
GetNearbyShareTestPrivateCertificate(
|
||||
DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS);
|
||||
cert_store_->ReplacePrivateCertificates({private_certificate});
|
||||
FastForward(GetNearbyShareTestNotBefore() +
|
||||
kNearbyShareCertificateValidityPeriod * 0.5 - Now());
|
||||
ASSERT_TRUE(cert_manager_->GetPrivateCertificateId(
|
||||
DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS).has_value());
|
||||
EXPECT_EQ(cert_manager_->GetPrivateCertificateId(
|
||||
DeviceVisibility::DEVICE_VISIBILITY_ALL_CONTACTS).value(),
|
||||
std::string(private_certificate.id().begin(),
|
||||
private_certificate.id().end()));
|
||||
}
|
||||
|
||||
TEST_F(NearbyShareCertificateManagerImplTest, SignWithPrivateCertificate) {
|
||||
Initialize();
|
||||
NearbySharePrivateCertificate private_certificate =
|
||||
@@ -782,7 +809,7 @@ TEST_F(NearbyShareCertificateManagerImplTest,
|
||||
TEST_F(NearbyShareCertificateManagerImplTest,
|
||||
QuerySharedCredentialsWithBindingIdsSuccess) {
|
||||
NearbyFlags::GetInstance().OverrideBoolFlagValue(
|
||||
config_package_nearby::nearby_sharing_feature::kEnableFileSync, true);
|
||||
config_package_nearby::nearby_sharing_feature::kEnableBackup, true);
|
||||
Initialize();
|
||||
ASSERT_NO_FATAL_FAILURE(QuerySharedCredentialsWithBindingIdsFlow(
|
||||
/*num_pages=*/2, DownloadPublicCertificatesResult::kSuccess));
|
||||
@@ -791,12 +818,48 @@ TEST_F(NearbyShareCertificateManagerImplTest,
|
||||
TEST_F(NearbyShareCertificateManagerImplTest,
|
||||
QuerySharedCredentialsWithBindingIdsRPCFailure) {
|
||||
NearbyFlags::GetInstance().OverrideBoolFlagValue(
|
||||
config_package_nearby::nearby_sharing_feature::kEnableFileSync, true);
|
||||
config_package_nearby::nearby_sharing_feature::kEnableBackup, true);
|
||||
Initialize();
|
||||
ASSERT_NO_FATAL_FAILURE(QuerySharedCredentialsWithBindingIdsFlow(
|
||||
/*num_pages=*/2, DownloadPublicCertificatesResult::kHttpError));
|
||||
}
|
||||
|
||||
TEST_F(NearbyShareCertificateManagerImplTest,
|
||||
QuerySharedCredentialsWithBindingIdsWithJoinTime) {
|
||||
NearbyFlags::GetInstance().OverrideBoolFlagValue(
|
||||
config_package_nearby::nearby_sharing_feature::kEnableBackup, true);
|
||||
Initialize();
|
||||
cert_manager_->SetJoinBindingTime(absl::FromUnixSeconds(123456789),
|
||||
absl::Seconds(30));
|
||||
ASSERT_NO_FATAL_FAILURE(QuerySharedCredentialsWithBindingIdsFlow(
|
||||
/*num_pages=*/2, DownloadPublicCertificatesResult::kSuccess));
|
||||
std::vector<QuerySharedCredentialsWithBindingIdsRequest> requests =
|
||||
identity_client_.query_shared_credentials_with_binding_ids_requests();
|
||||
for (const auto& request : requests) {
|
||||
ASSERT_OK_AND_ASSIGN(
|
||||
auto expected_time,
|
||||
util_time::EncodeGoogleApiProto(absl::FromUnixSeconds(123456789)));
|
||||
EXPECT_THAT(request.join_binding_time(), EqualsProto(expected_time));
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(NearbyShareCertificateManagerImplTest,
|
||||
QuerySharedCredentialsWithBindingIdsWithJoinTimeExpiration) {
|
||||
NearbyFlags::GetInstance().OverrideBoolFlagValue(
|
||||
config_package_nearby::nearby_sharing_feature::kEnableBackup, true);
|
||||
Initialize();
|
||||
cert_manager_->SetJoinBindingTime(absl::FromUnixSeconds(123456789),
|
||||
absl::Seconds(30));
|
||||
FastForward(absl::Seconds(31));
|
||||
ASSERT_NO_FATAL_FAILURE(QuerySharedCredentialsWithBindingIdsFlow(
|
||||
/*num_pages=*/2, DownloadPublicCertificatesResult::kSuccess));
|
||||
std::vector<QuerySharedCredentialsWithBindingIdsRequest> requests =
|
||||
identity_client_.query_shared_credentials_with_binding_ids_requests();
|
||||
for (const auto& request : requests) {
|
||||
EXPECT_FALSE(request.has_join_binding_time());
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(NearbyShareCertificateManagerImplTest, ClearPublicCertificates) {
|
||||
Initialize();
|
||||
cert_manager_->ClearPublicCertificates([&](bool result) {});
|
||||
@@ -1110,4 +1173,24 @@ TEST_F(NearbyShareCertificateManagerImplTest,
|
||||
PrefNames::kAdvancedProtectionEnabled, /*default_value=*/false));
|
||||
}
|
||||
|
||||
TEST_F(NearbyShareCertificateManagerImplTest, AddBindingToPublicCertificate) {
|
||||
Initialize();
|
||||
|
||||
PublicCertificate cert;
|
||||
cert.set_secret_id("test_cert_id");
|
||||
cert.set_binding_id("old_binding_id");
|
||||
|
||||
cert_store_->SetPublicCertificates({cert});
|
||||
cert_store_->SetAddPublicCertificatesResult(true);
|
||||
|
||||
cert_manager_->AddBindingToPublicCertificate("test_cert_id",
|
||||
"new_binding_id");
|
||||
|
||||
ASSERT_EQ(cert_store_->add_public_certificates_calls().size(), 1u);
|
||||
const auto& call = cert_store_->add_public_certificates_calls().back();
|
||||
ASSERT_EQ(call.public_certificates.size(), 1u);
|
||||
EXPECT_EQ(call.public_certificates[0].secret_id(), "test_cert_id");
|
||||
EXPECT_EQ(call.public_certificates[0].binding_id(), "new_binding_id");
|
||||
}
|
||||
|
||||
} // namespace nearby::sharing
|
||||
|
||||
@@ -342,7 +342,8 @@ void NearbyShareCertificateStorageImpl::GetPublicCertificate(
|
||||
});
|
||||
return;
|
||||
}
|
||||
VLOG(1) << __func__ << ": Calling LoadCertificate on database, key: " << id;
|
||||
VLOG(1) << __func__ << ": Calling LoadCertificate on database, key: "
|
||||
<< absl::BytesToHexString(id);
|
||||
public_certificate_database_->LoadCertificate(id, std::move(callback));
|
||||
}
|
||||
|
||||
|
||||
@@ -211,20 +211,20 @@ TEST_F(NearbyShareCertificateStorageImplTest, InitializeRetrySucceed) {
|
||||
auto db = std::make_unique<StrictMock<MockPublicCertificateDb>>();
|
||||
MockPublicCertificateDb* mock_db = db.get();
|
||||
EXPECT_CALL(*mock_db, Initialize(_))
|
||||
.WillOnce(Invoke(
|
||||
[](absl::AnyInvocable<void(MockPublicCertificateDb::InitStatus)&&>
|
||||
.WillOnce(
|
||||
[](absl::AnyInvocable<void(MockPublicCertificateDb::InitStatus) &&>
|
||||
callback) {
|
||||
std::move(callback)(MockPublicCertificateDb::InitStatus::kError);
|
||||
}))
|
||||
.WillRepeatedly(Invoke(
|
||||
[](absl::AnyInvocable<void(MockPublicCertificateDb::InitStatus)&&>
|
||||
})
|
||||
.WillRepeatedly(
|
||||
[](absl::AnyInvocable<void(MockPublicCertificateDb::InitStatus) &&>
|
||||
callback) {
|
||||
std::move(callback)(MockPublicCertificateDb::InitStatus::kOk);
|
||||
}));
|
||||
});
|
||||
EXPECT_CALL(*mock_db, Destroy(_))
|
||||
.WillOnce(Invoke([](absl::AnyInvocable<void(bool)&&> callback) {
|
||||
.WillOnce([](absl::AnyInvocable<void(bool) &&> callback) {
|
||||
std::move(callback)(true);
|
||||
}));
|
||||
});
|
||||
|
||||
auto cert_store = NearbyShareCertificateStorageImpl::Factory::Create(
|
||||
preference_manager_, std::move(db));
|
||||
@@ -243,11 +243,11 @@ TEST_F(NearbyShareCertificateStorageImplTest, InitializeRetryFailed) {
|
||||
auto db = std::make_unique<StrictMock<MockPublicCertificateDb>>();
|
||||
MockPublicCertificateDb* mock_db = db.get();
|
||||
EXPECT_CALL(*mock_db, Initialize(_))
|
||||
.WillRepeatedly(Invoke(
|
||||
[](absl::AnyInvocable<void(MockPublicCertificateDb::InitStatus)&&>
|
||||
.WillRepeatedly(
|
||||
[](absl::AnyInvocable<void(MockPublicCertificateDb::InitStatus) &&>
|
||||
callback) {
|
||||
std::move(callback)(MockPublicCertificateDb::InitStatus::kError);
|
||||
}));
|
||||
});
|
||||
|
||||
auto cert_store = NearbyShareCertificateStorageImpl::Factory::Create(
|
||||
preference_manager_, std::move(db));
|
||||
@@ -267,23 +267,23 @@ TEST_F(NearbyShareCertificateStorageImplTest,
|
||||
auto db = std::make_unique<StrictMock<MockPublicCertificateDb>>();
|
||||
MockPublicCertificateDb* mock_db = db.get();
|
||||
EXPECT_CALL(*mock_db, Initialize(_))
|
||||
.WillOnce(Invoke(
|
||||
[](absl::AnyInvocable<void(MockPublicCertificateDb::InitStatus)&&>
|
||||
.WillOnce(
|
||||
[](absl::AnyInvocable<void(MockPublicCertificateDb::InitStatus) &&>
|
||||
callback) {
|
||||
std::move(callback)(MockPublicCertificateDb::InitStatus::kCorrupt);
|
||||
}))
|
||||
.WillRepeatedly(Invoke(
|
||||
[](absl::AnyInvocable<void(MockPublicCertificateDb::InitStatus)&&>
|
||||
})
|
||||
.WillRepeatedly(
|
||||
[](absl::AnyInvocable<void(MockPublicCertificateDb::InitStatus) &&>
|
||||
callback) {
|
||||
std::move(callback)(MockPublicCertificateDb::InitStatus::kOk);
|
||||
}));
|
||||
});
|
||||
// Destroy called once from corrupted initialization and once from cal to
|
||||
// ClearPublicCertificates.
|
||||
EXPECT_CALL(*mock_db, Destroy(_))
|
||||
.Times(2)
|
||||
.WillRepeatedly(Invoke([](absl::AnyInvocable<void(bool)&&> callback) {
|
||||
.WillRepeatedly([](absl::AnyInvocable<void(bool) &&> callback) {
|
||||
std::move(callback)(true);
|
||||
}));
|
||||
});
|
||||
|
||||
auto cert_store = NearbyShareCertificateStorageImpl::Factory::Create(
|
||||
preference_manager_, std::move(db));
|
||||
@@ -301,15 +301,15 @@ TEST_F(NearbyShareCertificateStorageImplTest, InitializeCorruptDestroyFails) {
|
||||
auto db = std::make_unique<StrictMock<MockPublicCertificateDb>>();
|
||||
MockPublicCertificateDb* mock_db = db.get();
|
||||
EXPECT_CALL(*mock_db, Initialize(_))
|
||||
.WillOnce(Invoke(
|
||||
[](absl::AnyInvocable<void(MockPublicCertificateDb::InitStatus)&&>
|
||||
.WillOnce(
|
||||
[](absl::AnyInvocable<void(MockPublicCertificateDb::InitStatus) &&>
|
||||
callback) {
|
||||
std::move(callback)(MockPublicCertificateDb::InitStatus::kCorrupt);
|
||||
}));
|
||||
});
|
||||
EXPECT_CALL(*mock_db, Destroy(_))
|
||||
.WillOnce(Invoke([](absl::AnyInvocable<void(bool)&&> callback) {
|
||||
.WillOnce([](absl::AnyInvocable<void(bool) &&> callback) {
|
||||
std::move(callback)(false);
|
||||
}));
|
||||
});
|
||||
|
||||
auto cert_store = NearbyShareCertificateStorageImpl::Factory::Create(
|
||||
preference_manager_, std::move(db));
|
||||
@@ -333,18 +333,18 @@ TEST_F(NearbyShareCertificateStorageImplTest, DeferredCallbackQueue) {
|
||||
auto db = std::make_unique<StrictMock<MockPublicCertificateDb>>();
|
||||
MockPublicCertificateDb* mock_db = db.get();
|
||||
EXPECT_CALL(*mock_db, Initialize(_))
|
||||
.WillOnce(Invoke(
|
||||
[&](absl::AnyInvocable<void(MockPublicCertificateDb::InitStatus)&&>
|
||||
callback) { init_status_callback = std::move(callback); }));
|
||||
.WillOnce(
|
||||
[&](absl::AnyInvocable<void(MockPublicCertificateDb::InitStatus) &&>
|
||||
callback) { init_status_callback = std::move(callback); });
|
||||
EXPECT_CALL(*mock_db, Destroy(_))
|
||||
.WillOnce(Invoke([&](absl::AnyInvocable<void(bool)&&> callback) {
|
||||
.WillOnce([&](absl::AnyInvocable<void(bool) &&> callback) {
|
||||
destroy_callback = std::move(callback);
|
||||
}));
|
||||
});
|
||||
EXPECT_CALL(*mock_db, LoadEntries(_))
|
||||
.WillOnce(Invoke(
|
||||
.WillOnce(
|
||||
[&](absl::AnyInvocable<void(
|
||||
bool, std::unique_ptr<std::vector<PublicCertificate>>)&&>
|
||||
callback) { load_callback = std::move(callback); }));
|
||||
bool, std::unique_ptr<std::vector<PublicCertificate>>) &&>
|
||||
callback) { load_callback = std::move(callback); });
|
||||
|
||||
auto cert_store = NearbyShareCertificateStorageImpl::Factory::Create(
|
||||
preference_manager_, std::move(db));
|
||||
|
||||
Reference in New Issue
Block a user