diff --git a/sharing/BUILD b/sharing/BUILD index 5ddd8793..409ed979 100644 --- a/sharing/BUILD +++ b/sharing/BUILD @@ -210,6 +210,7 @@ cc_library( "//sharing/analytics", "//sharing/certificates", "//sharing/common:compatible_u8_string", + "//sharing/internal/api:platform", "//sharing/internal/public:logging", "//sharing/proto:wire_format_cc_proto", "@com_google_absl//absl/container:flat_hash_map", @@ -604,6 +605,7 @@ cc_test( ":share_session", "//internal/base:files", "//internal/platform/implementation/g3", # fixdeps: keep + "//sharing/internal/api:mock_sharing_platform", "@com_github_protobuf_matchers//protobuf-matchers", "@com_google_absl//absl/synchronization", "@com_google_absl//absl/time", diff --git a/sharing/internal/api/mock_sharing_platform.h b/sharing/internal/api/mock_sharing_platform.h index 3b1707c9..bdcb0a36 100644 --- a/sharing/internal/api/mock_sharing_platform.h +++ b/sharing/internal/api/mock_sharing_platform.h @@ -15,8 +15,10 @@ #ifndef THIRD_PARTY_NEARBY_SHARING_INTERNAL_API_MOCK_SHARING_PLATFORM_H_ #define THIRD_PARTY_NEARBY_SHARING_INTERNAL_API_MOCK_SHARING_PLATFORM_H_ +#include // NOLINT #include #include +#include #include "gmock/gmock.h" #include "absl/status/status.h" @@ -101,6 +103,8 @@ class MockSharingPlatform : public SharingPlatform { (nearby::sharing::analytics::AnalyticsRecorder * analytics_recorder), (override)); + MOCK_METHOD(bool, UpdateFileOriginMetadata, ( + std::vector& file_paths), (override)); }; } // namespace nearby::sharing::api diff --git a/sharing/internal/api/sharing_platform.h b/sharing/internal/api/sharing_platform.h index 96766db3..04c6a383 100644 --- a/sharing/internal/api/sharing_platform.h +++ b/sharing/internal/api/sharing_platform.h @@ -15,8 +15,10 @@ #ifndef THIRD_PARTY_NEARBY_SHARING_INTERNAL_API_SHARING_PLATFORM_H_ #define THIRD_PARTY_NEARBY_SHARING_INTERNAL_API_SHARING_PLATFORM_H_ +#include // NOLINT #include #include +#include #include "absl/status/status.h" #include "absl/strings/string_view.h" @@ -96,6 +98,12 @@ class SharingPlatform { virtual std::unique_ptr CreateSharingRpcClientFactory( nearby::sharing::analytics::AnalyticsRecorder* analytics_recorder) = 0; + + // On platforms where it is supported, tag the transferred files as + // originating from an untrusted source. + // Returns true on success. + virtual bool UpdateFileOriginMetadata( + std::vector& file_paths) = 0; }; } // namespace nearby::sharing::api diff --git a/sharing/nearby_file_handler.cc b/sharing/nearby_file_handler.cc index 62f3f9bb..14f7dafd 100644 --- a/sharing/nearby_file_handler.cc +++ b/sharing/nearby_file_handler.cc @@ -29,12 +29,15 @@ #include "internal/base/files.h" #include "internal/platform/task_runner_impl.h" #include "sharing/common/compatible_u8_string.h" +#include "sharing/internal/api/sharing_platform.h" #include "sharing/internal/public/logging.h" namespace nearby { namespace sharing { namespace { +using ::nearby::sharing::api::SharingPlatform; + // Called on the FileTaskRunner to actually open the files passed. std::vector DoOpenFiles( absl::Span file_paths) { @@ -53,7 +56,8 @@ std::vector DoOpenFiles( } // namespace -NearbyFileHandler::NearbyFileHandler() { +NearbyFileHandler::NearbyFileHandler(SharingPlatform& platform) + : platform_(platform) { sequenced_task_runner_ = std::make_unique(1); } @@ -103,10 +107,9 @@ void NearbyFileHandler::UpdateFilesOriginMetadata( std::vector file_paths, absl::AnyInvocable callback) { sequenced_task_runner_->PostTask( - [callback = std::move(callback), + [this, callback = std::move(callback), file_paths = std::move(file_paths)]() mutable { - // TODO(b/350744369): Implement this. - std::move(callback)(true); + std::move(callback)(platform_.UpdateFileOriginMetadata(file_paths)); }); } diff --git a/sharing/nearby_file_handler.h b/sharing/nearby_file_handler.h index ab5b6350..54686bf0 100644 --- a/sharing/nearby_file_handler.h +++ b/sharing/nearby_file_handler.h @@ -24,6 +24,7 @@ #include "absl/functional/any_invocable.h" #include "internal/platform/task_runner.h" +#include "sharing/internal/api/sharing_platform.h" namespace nearby { namespace sharing { @@ -40,7 +41,7 @@ class NearbyFileHandler { using OpenFilesCallback = std::function)>; using DeleteFilesFromDiskCallback = std::function; - NearbyFileHandler(); + explicit NearbyFileHandler(nearby::sharing::api::SharingPlatform& platform); ~NearbyFileHandler(); // Open the files given in |file_paths| and return the opened files sizes via @@ -58,6 +59,7 @@ class NearbyFileHandler { absl::AnyInvocable callback); private: + nearby::sharing::api::SharingPlatform& platform_; std::unique_ptr sequenced_task_runner_; }; diff --git a/sharing/nearby_file_handler_test.cc b/sharing/nearby_file_handler_test.cc index 9bb46e4f..9b64f104 100644 --- a/sharing/nearby_file_handler_test.cc +++ b/sharing/nearby_file_handler_test.cc @@ -24,10 +24,12 @@ #include "absl/time/clock.h" #include "absl/time/time.h" #include "internal/base/files.h" +#include "sharing/internal/api/mock_sharing_platform.h" namespace nearby { namespace sharing { namespace { +using ::nearby::sharing::api::MockSharingPlatform; bool CreateFile(std::filesystem::path file_path) { std::FILE* file = std::fopen(file_path.string().c_str(), "w+"); @@ -39,7 +41,8 @@ bool CreateFile(std::filesystem::path file_path) { } TEST(NearbyFileHandler, OpenFiles) { - NearbyFileHandler nearby_file_handler; + MockSharingPlatform mock_platform; + NearbyFileHandler nearby_file_handler(mock_platform); absl::Notification notification; std::vector result; std::filesystem::path test_file = @@ -59,7 +62,8 @@ TEST(NearbyFileHandler, OpenFiles) { } TEST(NearbyFileHandler, DeleteAFileFromDisk) { - NearbyFileHandler nearby_file_handler; + MockSharingPlatform mock_platform; + NearbyFileHandler nearby_file_handler(mock_platform); std::filesystem::path test_file = std::filesystem::temp_directory_path() / "nearby_nfh_test_abc.jpg"; ASSERT_TRUE(CreateFile(test_file)); @@ -72,7 +76,8 @@ TEST(NearbyFileHandler, DeleteAFileFromDisk) { } TEST(NearbyFileHandler, DeleteMultipleFilesFromDisk) { - NearbyFileHandler nearby_file_handler; + MockSharingPlatform mock_platform; + NearbyFileHandler nearby_file_handler(mock_platform); std::filesystem::path test_file = std::filesystem::temp_directory_path() / "nearby_nfh_test_abc.jpg"; std::filesystem::path test_file2 = @@ -93,8 +98,9 @@ TEST(NearbyFileHandler, DeleteMultipleFilesFromDisk) { } TEST(NearbyFileHandler, TestCallback) { + MockSharingPlatform mock_platform; std::atomic_bool received_callback = false; - NearbyFileHandler nearby_file_handler; + NearbyFileHandler nearby_file_handler(mock_platform); std::filesystem::path test_file = std::filesystem::temp_directory_path() / "nearby_nfh_test_abc.jpg"; ASSERT_TRUE(CreateFile(test_file)); diff --git a/sharing/nearby_sharing_service_impl.cc b/sharing/nearby_sharing_service_impl.cc index 8c669eb1..2bf9f9da 100644 --- a/sharing/nearby_sharing_service_impl.cc +++ b/sharing/nearby_sharing_service_impl.cc @@ -226,6 +226,7 @@ NearbySharingServiceImpl::NearbySharingServiceImpl( local_device_data_manager_.get(), analytics_recorder_.get())), service_extension_(std::make_unique( context_, settings_.get())), + file_handler_(sharing_platform), app_info_(sharing_platform.CreateAppInfo()) { NL_DCHECK(decoder_); NL_DCHECK(nearby_connections_manager_); diff --git a/sharing/nearby_sharing_service_impl_test.cc b/sharing/nearby_sharing_service_impl_test.cc index 7abfc2c6..882148a8 100644 --- a/sharing/nearby_sharing_service_impl_test.cc +++ b/sharing/nearby_sharing_service_impl_test.cc @@ -115,6 +115,7 @@ using ::nearby::sharing::service::proto::TextMetadata; using ::nearby::sharing::service::proto::V1Frame; using ::testing::InSequence; using ::testing::NiceMock; +using ::testing::Return; using ::testing::ReturnRef; using ::testing::StrictMock; using ::testing::UnorderedElementsAre; @@ -380,6 +381,8 @@ class NearbySharingServiceImplTest : public testing::Test { .WillByDefault(ReturnRef(preference_manager_)); ON_CALL(mock_sharing_platform_, GetAccountManager) .WillByDefault(ReturnRef(fake_account_manager_)); + ON_CALL(mock_sharing_platform_, UpdateFileOriginMetadata) + .WillByDefault(Return(true)); auto mock_app_info = std::make_unique>(); mock_app_info_ = mock_app_info.get(); EXPECT_CALL(mock_sharing_platform_, CreateAppInfo())