diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc index 3591fab967e7a..15a0ecd718c7f 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc @@ -193,7 +193,7 @@ void FileManagerPrivateAddMountFunction::RunAfterMarkCacheFileAsMounted( disk_mount_manager->MountPath( file_path.AsUTF8Unsafe(), base::FilePath(display_name.Extension()).AsUTF8Unsafe(), - display_name.AsUTF8Unsafe(), chromeos::MOUNT_TYPE_ARCHIVE, + display_name.AsUTF8Unsafe(), {}, chromeos::MOUNT_TYPE_ARCHIVE, chromeos::MOUNT_ACCESS_MODE_READ_WRITE); } diff --git a/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.cc b/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.cc index 4f78bda1e9367..0e4c7b6748936 100644 --- a/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.cc +++ b/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.cc @@ -10,17 +10,21 @@ FakeDiskMountManager::MountRequest::MountRequest( const std::string& source_path, const std::string& source_format, const std::string& mount_label, + const std::vector<std::string>& mount_options, chromeos::MountType type, chromeos::MountAccessMode access_mode) : source_path(source_path), source_format(source_format), mount_label(mount_label), + mount_options(mount_options), type(type), access_mode(access_mode) {} FakeDiskMountManager::MountRequest::MountRequest(const MountRequest& other) = default; +FakeDiskMountManager::MountRequest::~MountRequest() = default; + FakeDiskMountManager::UnmountRequest::UnmountRequest( const std::string& mount_path, chromeos::UnmountOptions options) @@ -69,13 +73,15 @@ void FakeDiskMountManager::EnsureMountInfoRefreshed( callback.Run(true); } -void FakeDiskMountManager::MountPath(const std::string& source_path, - const std::string& source_format, - const std::string& mount_label, - chromeos::MountType type, - chromeos::MountAccessMode access_mode) { - mount_requests_.emplace_back(source_path, source_format, mount_label, type, - access_mode); +void FakeDiskMountManager::MountPath( + const std::string& source_path, + const std::string& source_format, + const std::string& mount_label, + const std::vector<std::string>& mount_options, + chromeos::MountType type, + chromeos::MountAccessMode access_mode) { + mount_requests_.emplace_back(source_path, source_format, mount_label, + mount_options, type, access_mode); const MountPointInfo mount_point( source_path, diff --git a/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h b/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h index de9e77df5cdd1..892a94b6a90fb 100644 --- a/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h +++ b/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h @@ -24,13 +24,16 @@ class FakeDiskMountManager : public chromeos::disks::DiskMountManager { MountRequest(const std::string& source_path, const std::string& source_format, const std::string& mount_label, + const std::vector<std::string>& mount_options, chromeos::MountType type, chromeos::MountAccessMode access_mode); MountRequest(const MountRequest& other); + ~MountRequest(); std::string source_path; std::string source_format; std::string mount_label; + std::vector<std::string> mount_options; chromeos::MountType type; chromeos::MountAccessMode access_mode; }; @@ -44,7 +47,7 @@ class FakeDiskMountManager : public chromeos::disks::DiskMountManager { }; struct RemountAllRequest { - RemountAllRequest(chromeos::MountAccessMode access_mode); + explicit RemountAllRequest(chromeos::MountAccessMode access_mode); chromeos::MountAccessMode access_mode; }; @@ -79,6 +82,7 @@ class FakeDiskMountManager : public chromeos::disks::DiskMountManager { void MountPath(const std::string& source_path, const std::string& source_format, const std::string& mount_label, + const std::vector<std::string>& mount_options, chromeos::MountType type, chromeos::MountAccessMode access_mode) override; // In order to simulate asynchronous invocation of callbacks after unmount diff --git a/chrome/browser/chromeos/file_manager/volume_manager.cc b/chrome/browser/chromeos/file_manager/volume_manager.cc index 2a4739b27b44b..63d190a7acae9 100644 --- a/chrome/browser/chromeos/file_manager/volume_manager.cc +++ b/chrome/browser/chromeos/file_manager/volume_manager.cc @@ -560,7 +560,8 @@ void VolumeManager::OnAutoMountableDiskEvent( // format if the second argument is empty. The third argument (mount // label) is not used in a disk mount operation. disk_mount_manager_->MountPath(disk.device_path(), std::string(), - mount_label, chromeos::MOUNT_TYPE_DEVICE, + mount_label, {}, + chromeos::MOUNT_TYPE_DEVICE, GetExternalStorageAccessMode(profile_)); mounting = true; } @@ -677,7 +678,7 @@ void VolumeManager::OnFormatEvent( // empty. The third argument (mount label) is not used in a disk mount // operation. disk_mount_manager_->MountPath(device_path, std::string(), - std::string(), + std::string(), {}, chromeos::MOUNT_TYPE_DEVICE, GetExternalStorageAccessMode(profile_)); } @@ -723,7 +724,7 @@ void VolumeManager::OnRenameEvent( // disk when it was first time mounted (to preserve mount point regardless // of the volume name). disk_mount_manager_->MountPath(device_path, std::string(), mount_label, - chromeos::MOUNT_TYPE_DEVICE, + {}, chromeos::MOUNT_TYPE_DEVICE, GetExternalStorageAccessMode(profile_)); bool successfully_renamed = error_code == chromeos::RENAME_ERROR_NONE; diff --git a/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc b/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc index 117b3bf09dce9..b3d0006a91980 100644 --- a/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc +++ b/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc @@ -594,7 +594,8 @@ TEST_F(VolumeManagerTest, OnMountEvent_Remounting) { chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false, false, "", "")); disk_mount_manager_->AddDiskForTest(std::move(disk)); - disk_mount_manager_->MountPath("device1", "", "", chromeos::MOUNT_TYPE_DEVICE, + disk_mount_manager_->MountPath("device1", "", "", {}, + chromeos::MOUNT_TYPE_DEVICE, chromeos::MOUNT_ACCESS_MODE_READ_WRITE); const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint( @@ -745,9 +746,11 @@ TEST_F(VolumeManagerTest, OnFormatEvent_CompletedFailed) { TEST_F(VolumeManagerTest, OnExternalStorageDisabledChanged) { // Here create two mount points. - disk_mount_manager_->MountPath("mount1", "", "", chromeos::MOUNT_TYPE_DEVICE, + disk_mount_manager_->MountPath("mount1", "", "", {}, + chromeos::MOUNT_TYPE_DEVICE, chromeos::MOUNT_ACCESS_MODE_READ_WRITE); - disk_mount_manager_->MountPath("mount2", "", "", chromeos::MOUNT_TYPE_DEVICE, + disk_mount_manager_->MountPath("mount2", "", "", {}, + chromeos::MOUNT_TYPE_DEVICE, chromeos::MOUNT_ACCESS_MODE_READ_ONLY); // Initially, there are two mount points. diff --git a/chrome/browser/chromeos/login/kiosk_browsertest.cc b/chrome/browser/chromeos/login/kiosk_browsertest.cc index f7cc1a3ce7fe4..1017a86f90779 100644 --- a/chrome/browser/chromeos/login/kiosk_browsertest.cc +++ b/chrome/browser/chromeos/login/kiosk_browsertest.cc @@ -369,7 +369,7 @@ class KioskFakeDiskMountManager : public file_manager::FakeDiskMountManager { void MountUsbStick() { DCHECK(!usb_mount_path_.empty()); - MountPath(usb_mount_path_, "", "", chromeos::MOUNT_TYPE_DEVICE, + MountPath(usb_mount_path_, "", "", {}, chromeos::MOUNT_TYPE_DEVICE, chromeos::MOUNT_ACCESS_MODE_READ_ONLY); } diff --git a/chromeos/components/drivefs/drivefs_host.cc b/chromeos/components/drivefs/drivefs_host.cc index 28ec470e87eec..9269bc8e74fed 100644 --- a/chromeos/components/drivefs/drivefs_host.cc +++ b/chromeos/components/drivefs/drivefs_host.cc @@ -88,7 +88,7 @@ class DriveFsHost::MountState : public mojom::DriveFsDelegate, // TODO(sammc): Switch the mount type once a more appropriate mount type // exists. chromeos::disks::DiskMountManager::GetInstance()->MountPath( - source_path_, "", "", chromeos::MOUNT_TYPE_ARCHIVE, + source_path_, "", "", {}, chromeos::MOUNT_TYPE_ARCHIVE, chromeos::MOUNT_ACCESS_MODE_READ_WRITE); auto bootstrap = diff --git a/chromeos/components/drivefs/drivefs_host_unittest.cc b/chromeos/components/drivefs/drivefs_host_unittest.cc index 51b6e8f9470b4..31d3b2d9caae9 100644 --- a/chromeos/components/drivefs/drivefs_host_unittest.cc +++ b/chromeos/components/drivefs/drivefs_host_unittest.cc @@ -252,7 +252,7 @@ class DriveFsHostTest : public ::testing::Test, MountPath(testing::AllOf( testing::StartsWith("drivefs://"), testing::EndsWith("@/path/to/profile/GCache/v2/g-ID")), - "", "", _, chromeos::MOUNT_ACCESS_MODE_READ_WRITE)) + "", "", _, _, chromeos::MOUNT_ACCESS_MODE_READ_WRITE)) .WillOnce(testing::SaveArg<0>(&source)); mojom::DriveFsBootstrapPtrInfo bootstrap; @@ -445,7 +445,7 @@ TEST_F(DriveFsHostTest, MountWhileAlreadyMounted) { } TEST_F(DriveFsHostTest, UnsupportedAccountTypes) { - EXPECT_CALL(*disk_manager_, MountPath(_, _, _, _, _)).Times(0); + EXPECT_CALL(*disk_manager_, MountPath(_, _, _, _, _, _)).Times(0); const AccountId unsupported_accounts[] = { AccountId::FromGaiaId("ID"), AccountId::FromUserEmail("test2@example.com"), diff --git a/chromeos/dbus/cros_disks_client.cc b/chromeos/dbus/cros_disks_client.cc index 3b7d4ad267c34..81f7958272e33 100644 --- a/chromeos/dbus/cros_disks_client.cc +++ b/chromeos/dbus/cros_disks_client.cc @@ -112,6 +112,7 @@ class CrosDisksClientImpl : public CrosDisksClient { void Mount(const std::string& source_path, const std::string& source_format, const std::string& mount_label, + const std::vector<std::string>& mount_options, MountAccessMode access_mode, RemountOption remount, VoidDBusMethodCallback callback) override { @@ -120,9 +121,9 @@ class CrosDisksClientImpl : public CrosDisksClient { dbus::MessageWriter writer(&method_call); writer.AppendString(source_path); writer.AppendString(source_format); - std::vector<std::string> mount_options = - ComposeMountOptions(mount_label, access_mode, remount); - writer.AppendArrayOfStrings(mount_options); + std::vector<std::string> options = + ComposeMountOptions(mount_options, mount_label, access_mode, remount); + writer.AppendArrayOfStrings(options); proxy_->CallMethod( &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, base::BindOnce(&CrosDisksClientImpl::OnVoidMethod, @@ -674,12 +675,13 @@ base::FilePath CrosDisksClient::GetRemovableDiskMountPoint() { // static std::vector<std::string> CrosDisksClient::ComposeMountOptions( + const std::vector<std::string>& options, const std::string& mount_label, MountAccessMode access_mode, RemountOption remount) { - std::vector<std::string> mount_options( - kDefaultMountOptions, - kDefaultMountOptions + arraysize(kDefaultMountOptions)); + std::vector<std::string> mount_options = options; + mount_options.insert(mount_options.end(), kDefaultMountOptions, + kDefaultMountOptions + base::size(kDefaultMountOptions)); switch (access_mode) { case MOUNT_ACCESS_MODE_READ_ONLY: mount_options.push_back(kReadOnlyOption); @@ -697,6 +699,7 @@ std::vector<std::string> CrosDisksClient::ComposeMountOptions( base::StringPrintf("%s=%s", kMountLabelOption, mount_label.c_str()); mount_options.push_back(mount_label_option); } + return mount_options; } diff --git a/chromeos/dbus/cros_disks_client.h b/chromeos/dbus/cros_disks_client.h index 96308d96b9d2f..1dcec5284544b 100644 --- a/chromeos/dbus/cros_disks_client.h +++ b/chromeos/dbus/cros_disks_client.h @@ -322,6 +322,7 @@ class CHROMEOS_EXPORT CrosDisksClient : public DBusClient { virtual void Mount(const std::string& source_path, const std::string& source_format, const std::string& mount_label, + const std::vector<std::string>& mount_options, MountAccessMode access_mode, RemountOption remount, VoidDBusMethodCallback callback) = 0; @@ -379,6 +380,7 @@ class CHROMEOS_EXPORT CrosDisksClient : public DBusClient { // Composes a list of mount options. static std::vector<std::string> ComposeMountOptions( + const std::vector<std::string>& options, const std::string& mount_label, MountAccessMode access_mode, RemountOption remount); diff --git a/chromeos/dbus/cros_disks_client_unittest.cc b/chromeos/dbus/cros_disks_client_unittest.cc index 11c18e04fa9c0..c4ae26cb7766f 100644 --- a/chromeos/dbus/cros_disks_client_unittest.cc +++ b/chromeos/dbus/cros_disks_client_unittest.cc @@ -163,7 +163,7 @@ TEST(CrosDisksClientTest, ComposeMountOptions) { std::string kExpectedMountLabelOption = std::string("mountlabel=") + kMountLabel; std::vector<std::string> rw_mount_options = - CrosDisksClient::ComposeMountOptions(kMountLabel, + CrosDisksClient::ComposeMountOptions({}, kMountLabel, MOUNT_ACCESS_MODE_READ_WRITE, REMOUNT_OPTION_MOUNT_NEW_DEVICE); ASSERT_EQ(5U, rw_mount_options.size()); @@ -174,7 +174,7 @@ TEST(CrosDisksClientTest, ComposeMountOptions) { EXPECT_EQ(kExpectedMountLabelOption, rw_mount_options[4]); std::vector<std::string> ro_mount_options = - CrosDisksClient::ComposeMountOptions(kMountLabel, + CrosDisksClient::ComposeMountOptions({}, kMountLabel, MOUNT_ACCESS_MODE_READ_ONLY, REMOUNT_OPTION_MOUNT_NEW_DEVICE); ASSERT_EQ(5U, ro_mount_options.size()); @@ -186,7 +186,7 @@ TEST(CrosDisksClientTest, ComposeMountOptions) { std::vector<std::string> remount_mount_options = CrosDisksClient::ComposeMountOptions( - kMountLabel, MOUNT_ACCESS_MODE_READ_WRITE, + {}, kMountLabel, MOUNT_ACCESS_MODE_READ_WRITE, REMOUNT_OPTION_REMOUNT_EXISTING_DEVICE); ASSERT_EQ(6U, remount_mount_options.size()); EXPECT_EQ("nodev", remount_mount_options[0]); @@ -195,6 +195,19 @@ TEST(CrosDisksClientTest, ComposeMountOptions) { EXPECT_EQ("rw", remount_mount_options[3]); EXPECT_EQ("remount", remount_mount_options[4]); EXPECT_EQ(kExpectedMountLabelOption, remount_mount_options[5]); + + std::vector<std::string> custom_mount_options = + CrosDisksClient::ComposeMountOptions({"foo", "bar=baz"}, kMountLabel, + MOUNT_ACCESS_MODE_READ_WRITE, + REMOUNT_OPTION_MOUNT_NEW_DEVICE); + ASSERT_EQ(7U, custom_mount_options.size()); + EXPECT_EQ("foo", custom_mount_options[0]); + EXPECT_EQ("bar=baz", custom_mount_options[1]); + EXPECT_EQ("nodev", custom_mount_options[2]); + EXPECT_EQ("noexec", custom_mount_options[3]); + EXPECT_EQ("nosuid", custom_mount_options[4]); + EXPECT_EQ("rw", custom_mount_options[5]); + EXPECT_EQ(kExpectedMountLabelOption, custom_mount_options[6]); } } // namespace chromeos diff --git a/chromeos/dbus/fake_cros_disks_client.cc b/chromeos/dbus/fake_cros_disks_client.cc index 6c96f6b580705..990c5a724985b 100644 --- a/chromeos/dbus/fake_cros_disks_client.cc +++ b/chromeos/dbus/fake_cros_disks_client.cc @@ -69,6 +69,7 @@ void FakeCrosDisksClient::RemoveObserver(Observer* observer) { void FakeCrosDisksClient::Mount(const std::string& source_path, const std::string& source_format, const std::string& mount_label, + const std::vector<std::string>& mount_options, MountAccessMode access_mode, RemountOption remount, VoidDBusMethodCallback callback) { diff --git a/chromeos/dbus/fake_cros_disks_client.h b/chromeos/dbus/fake_cros_disks_client.h index ec9a8b23fbdc1..b78d3a4f13c15 100644 --- a/chromeos/dbus/fake_cros_disks_client.h +++ b/chromeos/dbus/fake_cros_disks_client.h @@ -35,6 +35,7 @@ class CHROMEOS_EXPORT FakeCrosDisksClient : public CrosDisksClient { void Mount(const std::string& source_path, const std::string& source_format, const std::string& mount_label, + const std::vector<std::string>& mount_options, MountAccessMode access_mode, RemountOption remount, VoidDBusMethodCallback callback) override; diff --git a/chromeos/disks/disk_mount_manager.cc b/chromeos/disks/disk_mount_manager.cc index 90bdc2e3e1f77..366482f9d0c98 100644 --- a/chromeos/disks/disk_mount_manager.cc +++ b/chromeos/disks/disk_mount_manager.cc @@ -67,6 +67,7 @@ class DiskMountManagerImpl : public DiskMountManager, void MountPath(const std::string& source_path, const std::string& source_format, const std::string& mount_label, + const std::vector<std::string>& mount_options, MountType type, MountAccessMode access_mode) override { // Hidden and non-existent devices should not be mounted. @@ -79,7 +80,7 @@ class DiskMountManagerImpl : public DiskMountManager, } } cros_disks_client_->Mount( - source_path, source_format, mount_label, access_mode, + source_path, source_format, mount_label, mount_options, access_mode, REMOUNT_OPTION_MOUNT_NEW_DEVICE, base::BindOnce(&DiskMountManagerImpl::OnMount, weak_ptr_factory_.GetWeakPtr(), source_path, type)); @@ -356,7 +357,7 @@ class DiskMountManagerImpl : public DiskMountManager, access_modes_[source_path] = access_mode; cros_disks_client_->Mount( - mount_point->second.source_path, std::string(), std::string(), + mount_point->second.source_path, std::string(), std::string(), {}, access_mode, REMOUNT_OPTION_REMOUNT_EXISTING_DEVICE, base::BindOnce(&DiskMountManagerImpl::OnMount, weak_ptr_factory_.GetWeakPtr(), source_path, diff --git a/chromeos/disks/disk_mount_manager.h b/chromeos/disks/disk_mount_manager.h index f8be5edfe44af..e65a5c08cb261 100644 --- a/chromeos/disks/disk_mount_manager.h +++ b/chromeos/disks/disk_mount_manager.h @@ -311,6 +311,7 @@ class CHROMEOS_EXPORT DiskMountManager { virtual void MountPath(const std::string& source_path, const std::string& source_format, const std::string& mount_label, + const std::vector<std::string>& mount_options, MountType type, MountAccessMode access_mode) = 0; diff --git a/chromeos/disks/disk_mount_manager_unittest.cc b/chromeos/disks/disk_mount_manager_unittest.cc index da0da3394578a..4219b47056016 100644 --- a/chromeos/disks/disk_mount_manager_unittest.cc +++ b/chromeos/disks/disk_mount_manager_unittest.cc @@ -953,10 +953,10 @@ TEST_F(DiskMountManagerTest, MountPath_RecordAccessMode) { const std::string kMountPath1 = "/media/foo"; const std::string kMountPath2 = "/media/bar"; - manager->MountPath(kSourcePath1, kSourceFormat, std::string(), + manager->MountPath(kSourcePath1, kSourceFormat, std::string(), {}, chromeos::MOUNT_TYPE_DEVICE, chromeos::MOUNT_ACCESS_MODE_READ_WRITE); - manager->MountPath(kSourcePath2, kSourceFormat, std::string(), + manager->MountPath(kSourcePath2, kSourceFormat, std::string(), {}, chromeos::MOUNT_TYPE_DEVICE, chromeos::MOUNT_ACCESS_MODE_READ_ONLY); // Simulate cros_disks reporting mount completed. @@ -999,7 +999,7 @@ TEST_F(DiskMountManagerTest, MountPath_ReadOnlyDevice) { // Attempt to mount a read-only device in read-write mode. manager->MountPath(kReadOnlyDeviceSourcePath, kSourceFormat, std::string(), - chromeos::MOUNT_TYPE_DEVICE, + {}, chromeos::MOUNT_TYPE_DEVICE, chromeos::MOUNT_ACCESS_MODE_READ_WRITE); // Simulate cros_disks reporting mount completed. fake_cros_disks_client_->NotifyMountCompleted( diff --git a/chromeos/disks/mock_disk_mount_manager.cc b/chromeos/disks/mock_disk_mount_manager.cc index 07c3a1d83939c..2a35ec053fa55 100644 --- a/chromeos/disks/mock_disk_mount_manager.cc +++ b/chromeos/disks/mock_disk_mount_manager.cc @@ -156,7 +156,7 @@ void MockDiskMountManager::SetupDefaultReplies() { EXPECT_CALL(*this, FindDiskBySourcePath(_)) .Times(AnyNumber()); EXPECT_CALL(*this, EnsureMountInfoRefreshed(_, _)).Times(AnyNumber()); - EXPECT_CALL(*this, MountPath(_, _, _, _, _)).Times(AnyNumber()); + EXPECT_CALL(*this, MountPath(_, _, _, _, _, _)).Times(AnyNumber()); EXPECT_CALL(*this, UnmountPath(_, _, _)) .Times(AnyNumber()); EXPECT_CALL(*this, RemountAllRemovableDrives(_)).Times(AnyNumber()); diff --git a/chromeos/disks/mock_disk_mount_manager.h b/chromeos/disks/mock_disk_mount_manager.h index 598d920e67e6f..48e6b72e392c9 100644 --- a/chromeos/disks/mock_disk_mount_manager.h +++ b/chromeos/disks/mock_disk_mount_manager.h @@ -37,10 +37,11 @@ class MockDiskMountManager : public DiskMountManager { const DiskMountManager::MountPointMap&(void)); MOCK_METHOD2(EnsureMountInfoRefreshed, void(const EnsureMountInfoRefreshedCallback&, bool)); - MOCK_METHOD5(MountPath, + MOCK_METHOD6(MountPath, void(const std::string&, const std::string&, const std::string&, + const std::vector<std::string>&, MountType, MountAccessMode)); MOCK_METHOD3(UnmountPath, void(const std::string&,