Commit ba9ef9f8 authored by Marijn Kruisselbrink's avatar Marijn Kruisselbrink Committed by Commit Bot

[FS] Add a GetPath method to NFSPermissionGrant.

Rather than relying on the root of an isolated file system to determine
the scope of permission grants, explicitly expose the scope of
permission grants. This will make it easier to support special volumes
on Chrome OS.

Bug: 1093653
Change-Id: I17ef72864af6441a9f5f4392d537f7d7f7328cb3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2391384Reviewed-by: default avatarVictor Costan <pwnall@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Auto-Submit: Marijn Kruisselbrink <mek@chromium.org>
Commit-Queue: Avi Drissman <avi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#804073}
parent f5eaea65
...@@ -50,11 +50,21 @@ class OriginScopedNativeFileSystemPermissionContext::PermissionGrantImpl ...@@ -50,11 +50,21 @@ class OriginScopedNativeFileSystemPermissionContext::PermissionGrantImpl
type_(type) {} type_(type) {}
// NativeFileSystemPermissionGrant: // NativeFileSystemPermissionGrant:
PermissionStatus GetStatus() override { return status_; } PermissionStatus GetStatus() override {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return status_;
}
base::FilePath GetPath() override {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return path_;
}
void RequestPermission( void RequestPermission(
content::GlobalFrameRoutingId frame_id, content::GlobalFrameRoutingId frame_id,
UserActivationState user_activation_state, UserActivationState user_activation_state,
base::OnceCallback<void(PermissionRequestOutcome)> callback) override { base::OnceCallback<void(PermissionRequestOutcome)> callback) override {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// Check if a permission request has already been processed previously. This // Check if a permission request has already been processed previously. This
// check is done first because we don't want to reset the status of a // check is done first because we don't want to reset the status of a
// permission if it has already been granted. // permission if it has already been granted.
......
...@@ -432,7 +432,7 @@ IN_PROC_BROWSER_TEST_F(FileSystemChooserBrowserTest, OpenDirectory_DenyAccess) { ...@@ -432,7 +432,7 @@ IN_PROC_BROWSER_TEST_F(FileSystemChooserBrowserTest, OpenDirectory_DenyAccess) {
auto read_grant = base::MakeRefCounted< auto read_grant = base::MakeRefCounted<
testing::StrictMock<MockNativeFileSystemPermissionGrant>>(); testing::StrictMock<MockNativeFileSystemPermissionGrant>>();
auto write_grant = base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>( auto write_grant = base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>(
PermissionStatus::ASK); PermissionStatus::ASK, base::FilePath());
EXPECT_CALL(permission_context, EXPECT_CALL(permission_context,
CanObtainReadPermission(url::Origin::Create( CanObtainReadPermission(url::Origin::Create(
......
...@@ -7,8 +7,9 @@ ...@@ -7,8 +7,9 @@
namespace content { namespace content {
FixedNativeFileSystemPermissionGrant::FixedNativeFileSystemPermissionGrant( FixedNativeFileSystemPermissionGrant::FixedNativeFileSystemPermissionGrant(
PermissionStatus status) PermissionStatus status,
: status_(status) {} base::FilePath path)
: status_(status), path_(std::move(path)) {}
FixedNativeFileSystemPermissionGrant::~FixedNativeFileSystemPermissionGrant() = FixedNativeFileSystemPermissionGrant::~FixedNativeFileSystemPermissionGrant() =
default; default;
...@@ -18,6 +19,10 @@ FixedNativeFileSystemPermissionGrant::GetStatus() { ...@@ -18,6 +19,10 @@ FixedNativeFileSystemPermissionGrant::GetStatus() {
return status_; return status_;
} }
base::FilePath FixedNativeFileSystemPermissionGrant::GetPath() {
return path_;
}
void FixedNativeFileSystemPermissionGrant::RequestPermission( void FixedNativeFileSystemPermissionGrant::RequestPermission(
GlobalFrameRoutingId frame_id, GlobalFrameRoutingId frame_id,
UserActivationState user_activation_state, UserActivationState user_activation_state,
......
...@@ -19,10 +19,12 @@ namespace content { ...@@ -19,10 +19,12 @@ namespace content {
class CONTENT_EXPORT FixedNativeFileSystemPermissionGrant class CONTENT_EXPORT FixedNativeFileSystemPermissionGrant
: public NativeFileSystemPermissionGrant { : public NativeFileSystemPermissionGrant {
public: public:
explicit FixedNativeFileSystemPermissionGrant(PermissionStatus status); explicit FixedNativeFileSystemPermissionGrant(PermissionStatus status,
base::FilePath path);
// NativeFileSystemPermissionGrant: // NativeFileSystemPermissionGrant:
PermissionStatus GetStatus() override; PermissionStatus GetStatus() override;
base::FilePath GetPath() override;
void RequestPermission( void RequestPermission(
GlobalFrameRoutingId frame_id, GlobalFrameRoutingId frame_id,
UserActivationState user_activation_state, UserActivationState user_activation_state,
...@@ -33,6 +35,7 @@ class CONTENT_EXPORT FixedNativeFileSystemPermissionGrant ...@@ -33,6 +35,7 @@ class CONTENT_EXPORT FixedNativeFileSystemPermissionGrant
private: private:
const PermissionStatus status_; const PermissionStatus status_;
const base::FilePath path_;
}; };
} // namespace content } // namespace content
......
...@@ -17,6 +17,7 @@ class MockNativeFileSystemPermissionGrant ...@@ -17,6 +17,7 @@ class MockNativeFileSystemPermissionGrant
MockNativeFileSystemPermissionGrant(); MockNativeFileSystemPermissionGrant();
MOCK_METHOD0(GetStatus, PermissionStatus()); MOCK_METHOD0(GetStatus, PermissionStatus());
MOCK_METHOD0(GetPath, base::FilePath());
void RequestPermission( void RequestPermission(
GlobalFrameRoutingId frame_id, GlobalFrameRoutingId frame_id,
UserActivationState user_activation_state, UserActivationState user_activation_state,
......
...@@ -115,7 +115,8 @@ class NativeFileSystemFileHandleImplTest : public testing::Test { ...@@ -115,7 +115,8 @@ class NativeFileSystemFileHandleImplTest : public testing::Test {
scoped_refptr<FixedNativeFileSystemPermissionGrant> allow_grant_ = scoped_refptr<FixedNativeFileSystemPermissionGrant> allow_grant_ =
base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>( base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>(
FixedNativeFileSystemPermissionGrant::PermissionStatus::GRANTED); FixedNativeFileSystemPermissionGrant::PermissionStatus::GRANTED,
base::FilePath());
std::unique_ptr<NativeFileSystemFileHandleImpl> handle_; std::unique_ptr<NativeFileSystemFileHandleImpl> handle_;
}; };
......
...@@ -340,7 +340,8 @@ class NativeFileSystemFileWriterImplTest : public testing::Test { ...@@ -340,7 +340,8 @@ class NativeFileSystemFileWriterImplTest : public testing::Test {
scoped_refptr<FixedNativeFileSystemPermissionGrant> permission_grant_ = scoped_refptr<FixedNativeFileSystemPermissionGrant> permission_grant_ =
base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>( base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>(
FixedNativeFileSystemPermissionGrant::PermissionStatus::GRANTED); FixedNativeFileSystemPermissionGrant::PermissionStatus::GRANTED,
base::FilePath());
std::unique_ptr<NativeFileSystemFileWriterImpl> handle_; std::unique_ptr<NativeFileSystemFileWriterImpl> handle_;
}; };
......
...@@ -448,9 +448,10 @@ void NativeFileSystemManagerImpl::DidResolveForSerializeHandle( ...@@ -448,9 +448,10 @@ void NativeFileSystemManagerImpl::DidResolveForSerializeHandle(
switch (url.type()) { switch (url.type()) {
case storage::kFileSystemTypeNativeLocal: { case storage::kFileSystemTypeNativeLocal: {
DCHECK_EQ(url.mount_type(), storage::kFileSystemTypeIsolated); DCHECK_EQ(url.mount_type(), storage::kFileSystemTypeIsolated);
base::FilePath root_path; base::FilePath root_path = resolved_token->GetWriteGrant()->GetPath();
storage::IsolatedContext::GetInstance()->GetRegisteredPath( if (root_path.empty())
url.filesystem_id(), &root_path); root_path = url.path();
data.mutable_native()->set_root_path(SerializePath(root_path)); data.mutable_native()->set_root_path(SerializePath(root_path));
base::FilePath relative_path; base::FilePath relative_path;
...@@ -512,7 +513,7 @@ void NativeFileSystemManagerImpl::DeserializeHandle( ...@@ -512,7 +513,7 @@ void NativeFileSystemManagerImpl::DeserializeHandle(
auto permission_grant = auto permission_grant =
base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>( base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>(
PermissionStatus::GRANTED); PermissionStatus::GRANTED, base::FilePath());
CreateTransferTokenImpl( CreateTransferTokenImpl(
url, origin, url, origin,
SharedHandleState(permission_grant, permission_grant, {}), SharedHandleState(permission_grant, permission_grant, {}),
...@@ -754,7 +755,7 @@ void NativeFileSystemManagerImpl::DidOpenSandboxedFileSystem( ...@@ -754,7 +755,7 @@ void NativeFileSystemManagerImpl::DidOpenSandboxedFileSystem(
auto permission_grant = auto permission_grant =
base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>( base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>(
PermissionStatus::GRANTED); PermissionStatus::GRANTED, base::FilePath());
std::move(callback).Run( std::move(callback).Run(
native_file_system_error::Ok(), native_file_system_error::Ok(),
...@@ -1037,7 +1038,8 @@ NativeFileSystemManagerImpl::GetSharedHandleStateForPath( ...@@ -1037,7 +1038,8 @@ NativeFileSystemManagerImpl::GetSharedHandleStateForPath(
base::CommandLine::ForCurrentProcess()->HasSwitch( base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableExperimentalWebPlatformFeatures) switches::kEnableExperimentalWebPlatformFeatures)
? PermissionStatus::GRANTED ? PermissionStatus::GRANTED
: PermissionStatus::DENIED); : PermissionStatus::DENIED,
path);
if (user_action == if (user_action ==
NativeFileSystemPermissionContext::UserAction::kLoadFromStorage) { NativeFileSystemPermissionContext::UserAction::kLoadFromStorage) {
read_grant = write_grant; read_grant = write_grant;
...@@ -1045,7 +1047,7 @@ NativeFileSystemManagerImpl::GetSharedHandleStateForPath( ...@@ -1045,7 +1047,7 @@ NativeFileSystemManagerImpl::GetSharedHandleStateForPath(
// Grant read permission even without a permission_context_, as the picker // Grant read permission even without a permission_context_, as the picker
// itself is enough UI to assume user intent. // itself is enough UI to assume user intent.
read_grant = base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>( read_grant = base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>(
PermissionStatus::GRANTED); PermissionStatus::GRANTED, path);
} }
} }
return SharedHandleState(std::move(read_grant), std::move(write_grant), return SharedHandleState(std::move(read_grant), std::move(write_grant),
......
...@@ -150,16 +150,19 @@ class NativeFileSystemManagerImplTest : public testing::Test { ...@@ -150,16 +150,19 @@ class NativeFileSystemManagerImplTest : public testing::Test {
mojo::Remote<blink::mojom::NativeFileSystemDirectoryHandle> mojo::Remote<blink::mojom::NativeFileSystemDirectoryHandle>
GetHandleForDirectory(const base::FilePath& path) { GetHandleForDirectory(const base::FilePath& path) {
auto grant = base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>(
FixedNativeFileSystemPermissionGrant::PermissionStatus::GRANTED, path);
EXPECT_CALL(permission_context_, EXPECT_CALL(permission_context_,
GetReadPermissionGrant( GetReadPermissionGrant(
kTestOrigin, path, HandleType::kDirectory, kTestOrigin, path, HandleType::kDirectory,
NativeFileSystemPermissionContext::UserAction::kOpen)) NativeFileSystemPermissionContext::UserAction::kOpen))
.WillOnce(testing::Return(allow_grant_)); .WillOnce(testing::Return(grant));
EXPECT_CALL(permission_context_, EXPECT_CALL(permission_context_,
GetWritePermissionGrant( GetWritePermissionGrant(
kTestOrigin, path, HandleType::kDirectory, kTestOrigin, path, HandleType::kDirectory,
NativeFileSystemPermissionContext::UserAction::kOpen)) NativeFileSystemPermissionContext::UserAction::kOpen))
.WillOnce(testing::Return(allow_grant_)); .WillOnce(testing::Return(grant));
blink::mojom::NativeFileSystemEntryPtr entry = blink::mojom::NativeFileSystemEntryPtr entry =
manager_->CreateDirectoryEntryFromPath(kBindingContext, path); manager_->CreateDirectoryEntryFromPath(kBindingContext, path);
...@@ -219,13 +222,16 @@ class NativeFileSystemManagerImplTest : public testing::Test { ...@@ -219,13 +222,16 @@ class NativeFileSystemManagerImplTest : public testing::Test {
scoped_refptr<FixedNativeFileSystemPermissionGrant> ask_grant_ = scoped_refptr<FixedNativeFileSystemPermissionGrant> ask_grant_ =
base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>( base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>(
FixedNativeFileSystemPermissionGrant::PermissionStatus::ASK); FixedNativeFileSystemPermissionGrant::PermissionStatus::ASK,
base::FilePath());
scoped_refptr<FixedNativeFileSystemPermissionGrant> ask_grant2_ = scoped_refptr<FixedNativeFileSystemPermissionGrant> ask_grant2_ =
base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>( base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>(
FixedNativeFileSystemPermissionGrant::PermissionStatus::ASK); FixedNativeFileSystemPermissionGrant::PermissionStatus::ASK,
base::FilePath());
scoped_refptr<FixedNativeFileSystemPermissionGrant> allow_grant_ = scoped_refptr<FixedNativeFileSystemPermissionGrant> allow_grant_ =
base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>( base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>(
FixedNativeFileSystemPermissionGrant::PermissionStatus::GRANTED); FixedNativeFileSystemPermissionGrant::PermissionStatus::GRANTED,
base::FilePath());
}; };
TEST_F(NativeFileSystemManagerImplTest, GetSandboxedFileSystem_Permissions) { TEST_F(NativeFileSystemManagerImplTest, GetSandboxedFileSystem_Permissions) {
...@@ -454,17 +460,21 @@ TEST_F(NativeFileSystemManagerImplTest, SerializeHandle_SandboxedDirectory) { ...@@ -454,17 +460,21 @@ TEST_F(NativeFileSystemManagerImplTest, SerializeHandle_SandboxedDirectory) {
TEST_F(NativeFileSystemManagerImplTest, SerializeHandle_Native_SingleFile) { TEST_F(NativeFileSystemManagerImplTest, SerializeHandle_Native_SingleFile) {
const base::FilePath kTestPath(dir_.GetPath().AppendASCII("foo")); const base::FilePath kTestPath(dir_.GetPath().AppendASCII("foo"));
auto grant = base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>(
FixedNativeFileSystemPermissionGrant::PermissionStatus::GRANTED,
kTestPath);
// Expect calls to get grants when creating the initial handle. // Expect calls to get grants when creating the initial handle.
EXPECT_CALL(permission_context_, EXPECT_CALL(permission_context_,
GetReadPermissionGrant( GetReadPermissionGrant(
kTestOrigin, kTestPath, HandleType::kFile, kTestOrigin, kTestPath, HandleType::kFile,
NativeFileSystemPermissionContext::UserAction::kOpen)) NativeFileSystemPermissionContext::UserAction::kOpen))
.WillOnce(testing::Return(allow_grant_)); .WillOnce(testing::Return(grant));
EXPECT_CALL(permission_context_, EXPECT_CALL(permission_context_,
GetWritePermissionGrant( GetWritePermissionGrant(
kTestOrigin, kTestPath, HandleType::kFile, kTestOrigin, kTestPath, HandleType::kFile,
NativeFileSystemPermissionContext::UserAction::kOpen)) NativeFileSystemPermissionContext::UserAction::kOpen))
.WillOnce(testing::Return(allow_grant_)); .WillOnce(testing::Return(grant));
blink::mojom::NativeFileSystemEntryPtr entry = blink::mojom::NativeFileSystemEntryPtr entry =
manager_->CreateFileEntryFromPath(kBindingContext, kTestPath); manager_->CreateFileEntryFromPath(kBindingContext, kTestPath);
......
...@@ -34,6 +34,11 @@ class CONTENT_EXPORT NativeFileSystemPermissionGrant ...@@ -34,6 +34,11 @@ class CONTENT_EXPORT NativeFileSystemPermissionGrant
virtual PermissionStatus GetStatus() = 0; virtual PermissionStatus GetStatus() = 0;
// Returns the path this permission grant is associated with. Can return an
// empty FilePath if the permission grant isn't associated with any specific
// path.
virtual base::FilePath GetPath() = 0;
// These values are persisted to logs. Entries should not be renumbered and // These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused. // numeric values should never be reused.
enum class PermissionRequestOutcome { enum class PermissionRequestOutcome {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment