0

SAA: Query for embargoed StorageAccess permissions

Ensure that embargoed permissions are correctly displayed by querying
for the embedder and requester origin of blocked permissions.
The main change is page_info.cc and chrome_page_info_delegate.cc.
Everything else is adding a second parameter to a PermissionManager
function that is implemented a dozen times.

Bug: 1433644
Change-Id: Ib75b4cc0785764bee9f1c68998233cc62e65e2f6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4746465
Reviewed-by: Eric Seckler <eseckler@chromium.org>
Reviewed-by: Rakina Zata Amni <rakina@chromium.org>
Commit-Queue: Christian Dullweber <dullweber@chromium.org>
Reviewed-by: Elias Klim <elklm@chromium.org>
Reviewed-by: Peter Beverloo <peter@chromium.org>
Reviewed-by: Sergey Ulanov <sergeyu@chromium.org>
Reviewed-by: Sean Topping <seantopping@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1180362}
This commit is contained in:
Christian Dullweber
2023-08-07 17:04:13 +00:00
committed by Chromium LUCI CQ
parent 498fe62760
commit a475f4a3c1
31 changed files with 110 additions and 79 deletions

@ -481,9 +481,10 @@ PermissionStatus AwPermissionManager::GetPermissionStatus(
content::PermissionResult
AwPermissionManager::GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& origin) {
blink::mojom::PermissionStatus status =
GetPermissionStatus(permission, origin.GetURL(), origin.GetURL());
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) {
blink::mojom::PermissionStatus status = GetPermissionStatus(
permission, requesting_origin.GetURL(), embedding_origin.GetURL());
return content::PermissionResult(
status, content::PermissionStatusSource::UNSPECIFIED);

@ -64,7 +64,8 @@ class AwPermissionManager : public content::PermissionControllerDelegate {
const GURL& embedding_origin) override;
content::PermissionResult GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& origin) override;
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) override;
blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument(
blink::PermissionType permission,
content::RenderFrameHost* render_frame_host) override;

@ -93,7 +93,8 @@ class GeolocationPermissionContextDelegateTests
blink::PermissionType permission,
const url::Origin& origin) {
return PermissionManagerFactory::GetForProfile(profile)
->GetPermissionResultForOriginWithoutContext(permission, origin);
->GetPermissionResultForOriginWithoutContext(permission, origin,
origin);
}
};

@ -52,8 +52,9 @@ class TestingProfileWithPermissionManager : public TestingProfile {
// Sets the notification permission status to |permission_status|.
void SetNotificationPermissionStatus(
blink::mojom::PermissionStatus permission_status) {
ON_CALL(*permission_manager_, GetPermissionResultForOriginWithoutContext(
blink::PermissionType::NOTIFICATIONS, _))
ON_CALL(*permission_manager_,
GetPermissionResultForOriginWithoutContext(
blink::PermissionType::NOTIFICATIONS, _, _))
.WillByDefault(Return(content::PermissionResult(
permission_status, content::PermissionStatusSource::UNSPECIFIED)));
}

@ -177,12 +177,19 @@ std::u16string ChromePageInfoDelegate::GetWarningDetailText() {
permissions::PermissionResult ChromePageInfoDelegate::GetPermissionResult(
blink::PermissionType permission,
const url::Origin& origin) {
content::PermissionResult permission_result =
GetProfile()
->GetPermissionController()
->GetPermissionResultForOriginWithoutContext(permission, origin);
return permissions::PermissionUtil::ToPermissionResult(permission_result);
const url::Origin& origin,
const absl::optional<url::Origin>& requesting_origin) {
auto* controller = GetProfile()->GetPermissionController();
if (requesting_origin.has_value()) {
return permissions::PermissionUtil::ToPermissionResult(
controller->GetPermissionResultForOriginWithoutContext(
permission, *requesting_origin, origin));
} else {
return permissions::PermissionUtil::ToPermissionResult(
controller->GetPermissionResultForOriginWithoutContext(permission,
origin));
}
}
#if !BUILDFLAG(IS_ANDROID)

@ -50,7 +50,8 @@ class ChromePageInfoDelegate : public PageInfoDelegate {
#endif
permissions::PermissionResult GetPermissionResult(
blink::PermissionType permission,
const url::Origin& origin) override;
const url::Origin& origin,
const absl::optional<url::Origin>& requesting_origin) override;
#if !BUILDFLAG(IS_ANDROID)
absl::optional<std::u16string> GetFpsOwner(const GURL& site_url) override;
bool IsFpsManaged() override;

@ -189,9 +189,10 @@ blink::mojom::PermissionStatus CastPermissionManager::GetPermissionStatus(
content::PermissionResult
CastPermissionManager::GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& origin) {
blink::mojom::PermissionStatus status =
GetPermissionStatus(permission, origin.GetURL(), origin.GetURL());
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) {
blink::mojom::PermissionStatus status = GetPermissionStatus(
permission, requesting_origin.GetURL(), embedding_origin.GetURL());
return content::PermissionResult(
status, content::PermissionStatusSource::UNSPECIFIED);

@ -59,7 +59,8 @@ class CastPermissionManager : public content::PermissionControllerDelegate {
const GURL& embedding_origin) override;
content::PermissionResult GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& origin) override;
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) override;
blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument(
blink::PermissionType permission,
content::RenderFrameHost* render_frame_host) override;

@ -45,6 +45,7 @@
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/permission_controller.h"
#include "content/public/browser/permission_result.h"
#include "content/public/browser/storage_partition.h"
#include "net/cookies/cookie_util.h"
#include "net/extras/shared_dictionary/shared_dictionary_isolation_key.h"
@ -222,14 +223,14 @@ ContentSetting GetPermissionSettingForOrigin(
BrowserContext* browser_context = unwrap(jbrowser_context_handle);
content::PermissionController* permission_controller =
browser_context->GetPermissionController();
blink::mojom::PermissionStatus status =
permission_controller->GetPermissionStatusForOriginWithoutContext(
content::PermissionResult result =
permission_controller->GetPermissionResultForOriginWithoutContext(
permissions::PermissionUtil::ContentSettingTypeToPermissionType(
content_type),
url::Origin::Create(requesting_origin),
url::Origin::Create(embedding_origin));
return permissions::PermissionUtil::PermissionStatusToContentSetting(
status);
result.status);
} else {
// If `content_type` is not permission, then we can directly read its value
// from `HostContentSettingsMap`.

@ -1204,7 +1204,7 @@ void PageInfo::PopulatePermissionInfo(PermissionInfo& permission_info,
permission_result = delegate_->GetPermissionResult(
permissions::PermissionUtil::ContentSettingTypeToPermissionType(
permission_info.type),
url::Origin::Create(site_url_));
url::Origin::Create(site_url_), permission_info.requesting_origin);
} else if (permission_info.type ==
ContentSettingsType::FEDERATED_IDENTITY_API) {
absl::optional<permissions::PermissionResult> embargo_result =

@ -16,6 +16,7 @@
#include "components/safe_browsing/buildflags.h"
#include "components/safe_browsing/core/browser/password_protection/metrics_util.h"
#include "components/security_state/core/security_state.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace blink {
enum class PermissionType;
@ -64,7 +65,8 @@ class PageInfoDelegate {
// type |type|.
virtual permissions::PermissionResult GetPermissionResult(
blink::PermissionType permission,
const url::Origin& origin) = 0;
const url::Origin& origin,
const absl::optional<url::Origin>& requesting_origin) = 0;
#if !BUILDFLAG(IS_ANDROID)
// Returns absl::nullopt if `site_url` is not recognised as a member of any
// FPS or if FPS functionality is not allowed .

@ -349,12 +349,14 @@ PermissionStatus PermissionManager::GetPermissionStatus(
content::PermissionResult
PermissionManager::GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& origin) {
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
PermissionResult result = GetPermissionStatusInternal(
PermissionUtil::PermissionTypeToContentSettingType(permission),
/*render_process_host=*/nullptr,
/*render_frame_host=*/nullptr, origin.GetURL(), origin.GetURL());
/*render_frame_host=*/nullptr, requesting_origin.GetURL(),
embedding_origin.GetURL());
return PermissionUtil::ToContentPermissionResult(result);
}

@ -135,7 +135,8 @@ class PermissionManager : public KeyedService,
const GURL& embedding_origin) override;
content::PermissionResult GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& origin) override;
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) override;
blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument(
blink::PermissionType permission,
content::RenderFrameHost* render_frame_host) override;

@ -98,7 +98,8 @@ class PermissionManagerTest : public content::RenderViewHostTestHarness {
void CheckPermissionStatus(PermissionType type, PermissionStatus expected) {
EXPECT_EQ(expected, GetPermissionManager()
->GetPermissionResultForOriginWithoutContext(
type, url::Origin::Create(url_))
type, url::Origin::Create(url_),
url::Origin::Create(url_))
.status);
}
@ -108,7 +109,7 @@ class PermissionManagerTest : public content::RenderViewHostTestHarness {
content::PermissionStatusSource expected_status_source) {
content::PermissionResult result =
GetPermissionManager()->GetPermissionResultForOriginWithoutContext(
type, url::Origin::Create(url_));
type, url::Origin::Create(url_), url::Origin::Create(url_));
EXPECT_EQ(expected_status, result.status);
EXPECT_EQ(expected_status_source, result.source);
}

@ -212,9 +212,10 @@ class PlatformNotificationContextTest : public ::testing::Test {
void SetPermissionStatus(const GURL& origin,
blink::mojom::PermissionStatus permission_status) {
ON_CALL(*permission_manager_, GetPermissionResultForOriginWithoutContext(
blink::PermissionType::NOTIFICATIONS,
url::Origin::Create(origin)))
ON_CALL(*permission_manager_,
GetPermissionResultForOriginWithoutContext(
blink::PermissionType::NOTIFICATIONS,
url::Origin::Create(origin), url::Origin::Create(origin)))
.WillByDefault(Return(content::PermissionResult(
permission_status, PermissionStatusSource::UNSPECIFIED)));
}

@ -74,7 +74,7 @@ class PaymentAppProviderTest : public PaymentAppContentUnitTestBase {
new testing::NiceMock<MockPermissionManager>());
ON_CALL(*mock_permission_manager,
GetPermissionResultForOriginWithoutContext(
blink::PermissionType::PAYMENT_HANDLER, testing::_))
blink::PermissionType::PAYMENT_HANDLER, testing::_, testing::_))
.WillByDefault(testing::Return(
PermissionResult(blink::mojom::PermissionStatus::GRANTED,
PermissionStatusSource::UNSPECIFIED)));

@ -578,28 +578,29 @@ PermissionResult
PermissionControllerImpl::GetPermissionResultForOriginWithoutContext(
PermissionType permission,
const url::Origin& origin) {
absl::optional<blink::mojom::PermissionStatus> status =
permission_overrides_.Get(origin, permission);
if (status)
return PermissionResult(*status, PermissionStatusSource::UNSPECIFIED);
PermissionControllerDelegate* delegate =
browser_context_->GetPermissionControllerDelegate();
if (!delegate)
return PermissionResult(blink::mojom::PermissionStatus::DENIED,
PermissionStatusSource::UNSPECIFIED);
return delegate->GetPermissionResultForOriginWithoutContext(permission,
origin);
return GetPermissionResultForOriginWithoutContext(permission, origin, origin);
}
blink::mojom::PermissionStatus
PermissionControllerImpl::GetPermissionStatusForOriginWithoutContext(
PermissionResult
PermissionControllerImpl::GetPermissionResultForOriginWithoutContext(
PermissionType permission,
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) {
return GetPermissionStatusInternal(permission, requesting_origin.GetURL(),
embedding_origin.GetURL());
absl::optional<blink::mojom::PermissionStatus> status =
permission_overrides_.Get(requesting_origin, permission);
if (status) {
return PermissionResult(*status, PermissionStatusSource::UNSPECIFIED);
}
PermissionControllerDelegate* delegate =
browser_context_->GetPermissionControllerDelegate();
if (!delegate) {
return PermissionResult(blink::mojom::PermissionStatus::DENIED,
PermissionStatusSource::UNSPECIFIED);
}
return delegate->GetPermissionResultForOriginWithoutContext(
permission, requesting_origin, embedding_origin);
}
blink::mojom::PermissionStatus

@ -135,7 +135,7 @@ class CONTENT_EXPORT PermissionControllerImpl : public PermissionController {
PermissionResult GetPermissionResultForOriginWithoutContext(
PermissionType permission,
const url::Origin& origin) override;
blink::mojom::PermissionStatus GetPermissionStatusForOriginWithoutContext(
PermissionResult GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) override;

@ -166,8 +166,8 @@ class PendingBeaconHostTestBase : public RenderViewHostTestHarness {
browser_context()->GetPermissionControllerDelegate());
ON_CALL(*mock_permission_manager,
GetPermissionResultForOriginWithoutContext(permission_type,
::testing::_))
GetPermissionResultForOriginWithoutContext(
permission_type, ::testing::_, ::testing::_))
.WillByDefault(::testing::Return(PermissionResult(
permission_status, PermissionStatusSource::UNSPECIFIED)));
}

@ -68,9 +68,8 @@ class CONTENT_EXPORT PermissionController
// The method does the same as `GetPermissionResultForOriginWithoutContext`
// but it can be used for `PermissionType` that are keyed on a combination of
// requesting and embedding origins, e.g., Notifications.
virtual blink::mojom::PermissionStatus
GetPermissionStatusForOriginWithoutContext(
// requesting and embedding origins, e.g., Notifications or StorageAccess.
virtual PermissionResult GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) = 0;

@ -82,7 +82,8 @@ class CONTENT_EXPORT PermissionControllerDelegate {
virtual PermissionResult GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& origin) = 0;
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) = 0;
// Returns the permission status for the current document in the given
// RenderFrameHost. Use this over `GetPermissionStatus` whenever possible as

@ -45,11 +45,10 @@ class MockPermissionController : public PermissionController {
MOCK_METHOD2(GetPermissionResultForOriginWithoutContext,
content::PermissionResult(blink::PermissionType permission,
const url::Origin& requesting_origin));
MOCK_METHOD3(
GetPermissionStatusForOriginWithoutContext,
blink::mojom::PermissionStatus(blink::PermissionType permission,
const url::Origin& requesting_origin,
const url::Origin& embedding_origin));
MOCK_METHOD3(GetPermissionResultForOriginWithoutContext,
content::PermissionResult(blink::PermissionType permission,
const url::Origin& requesting_origin,
const url::Origin& embedding_origin));
MOCK_METHOD3(
GetPermissionStatusForEmbeddedRequester,
blink::mojom::PermissionStatus(blink::PermissionType permission,

@ -32,9 +32,10 @@ class MockPermissionManager : public PermissionControllerDelegate {
blink::mojom::PermissionStatus(blink::PermissionType permission,
const GURL& requesting_origin,
const GURL& embedding_origin));
MOCK_METHOD2(GetPermissionResultForOriginWithoutContext,
MOCK_METHOD3(GetPermissionResultForOriginWithoutContext,
content::PermissionResult(blink::PermissionType permission,
const url::Origin& origin));
const url::Origin& requesting_origin,
const url::Origin& embedding_origin));
MOCK_METHOD2(GetPermissionStatusForCurrentDocument,
blink::mojom::PermissionStatus(
blink::PermissionType permission,

@ -161,9 +161,10 @@ blink::mojom::PermissionStatus ShellPermissionManager::GetPermissionStatus(
PermissionResult
ShellPermissionManager::GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& origin) {
blink::mojom::PermissionStatus status =
GetPermissionStatus(permission, origin.GetURL(), origin.GetURL());
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) {
blink::mojom::PermissionStatus status = GetPermissionStatus(
permission, requesting_origin.GetURL(), embedding_origin.GetURL());
return PermissionResult(status, content::PermissionStatusSource::UNSPECIFIED);
}

@ -56,7 +56,8 @@ class ShellPermissionManager : public PermissionControllerDelegate {
const GURL& embedding_origin) override;
PermissionResult GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& origin) override;
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) override;
blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument(
blink::PermissionType permission,
content::RenderFrameHost* render_frame_host) override;

@ -250,9 +250,10 @@ blink::mojom::PermissionStatus WebTestPermissionManager::GetPermissionStatus(
PermissionResult
WebTestPermissionManager::GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& origin) {
blink::mojom::PermissionStatus status =
GetPermissionStatus(permission, origin.GetURL(), origin.GetURL());
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) {
blink::mojom::PermissionStatus status = GetPermissionStatus(
permission, requesting_origin.GetURL(), embedding_origin.GetURL());
return PermissionResult(status, content::PermissionStatusSource::UNSPECIFIED);
}

@ -69,7 +69,8 @@ class WebTestPermissionManager
const GURL& embedding_origin) override;
PermissionResult GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& origin) override;
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) override;
blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument(
blink::PermissionType permission,
content::RenderFrameHost* render_frame_host) override;

@ -87,9 +87,10 @@ blink::mojom::PermissionStatus WebEnginePermissionDelegate::GetPermissionStatus(
content::PermissionResult
WebEnginePermissionDelegate::GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& origin) {
blink::mojom::PermissionStatus status =
GetPermissionStatus(permission, origin.GetURL(), origin.GetURL());
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) {
blink::mojom::PermissionStatus status = GetPermissionStatus(
permission, requesting_origin.GetURL(), embedding_origin.GetURL());
return content::PermissionResult(
status, content::PermissionStatusSource::UNSPECIFIED);

@ -56,7 +56,8 @@ class WebEnginePermissionDelegate
const GURL& embedding_origin) override;
content::PermissionResult GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& origin) override;
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) override;
blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument(
blink::PermissionType permission,
content::RenderFrameHost* render_frame_host) override;

@ -80,9 +80,10 @@ blink::mojom::PermissionStatus HeadlessPermissionManager::GetPermissionStatus(
content::PermissionResult
HeadlessPermissionManager::GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& origin) {
blink::mojom::PermissionStatus status =
GetPermissionStatus(permission, origin.GetURL(), origin.GetURL());
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) {
blink::mojom::PermissionStatus status = GetPermissionStatus(
permission, requesting_origin.GetURL(), embedding_origin.GetURL());
return content::PermissionResult(
status, content::PermissionStatusSource::UNSPECIFIED);

@ -62,7 +62,8 @@ class HeadlessPermissionManager : public content::PermissionControllerDelegate {
const GURL& embedding_origin) override;
content::PermissionResult GetPermissionResultForOriginWithoutContext(
blink::PermissionType permission,
const url::Origin& origin) override;
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) override;
blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument(
blink::PermissionType permission,
content::RenderFrameHost* render_frame_host) override;