Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(223)

Unified Diff: extensions/common/permissions/permissions_data.cc

Issue 2499493004: Communicate ExtensionSettings policy to renderers (Closed)
Patch Set: Add URLPattern effective TLD whitelisting, Switched IPC to UpdatePermissions, Removed shared memor… Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: extensions/common/permissions/permissions_data.cc
diff --git a/extensions/common/permissions/permissions_data.cc b/extensions/common/permissions/permissions_data.cc
index 4025d23c0ff0096e075b60521ae95bb0b0e5675c..da27718f4cf7d91f49a79c30ac1788b2d0451e15 100644
--- a/extensions/common/permissions/permissions_data.cc
+++ b/extensions/common/permissions/permissions_data.cc
@@ -29,6 +29,13 @@ namespace extensions {
namespace {
PermissionsData::PolicyDelegate* g_policy_delegate = nullptr;
+// URLs an extension can't interact with. Overridden by
+// runtime_blocked_hosts of an individual extension's PermissionsData.
+URLPatternSet default_runtime_blocked_hosts_unsafe_ = URLPatternSet();
Devlin 2017/01/26 22:47:40 non-pod statics aren't allowed
nrpeter 2017/02/03 19:32:24 Done.
+// URLs an extension can interact with regardless of
+// default_runtime_blocked_hosts_unsafe. Overridden by
+// runtime_allowed_hosts of an individual extension's PermissionsData.
+URLPatternSet default_runtime_allowed_hosts_unsafe_ = URLPatternSet();
class AutoLockOnValidThread {
public:
@@ -87,6 +94,11 @@ bool PermissionsData::ShouldSkipPermissionWarnings(
bool PermissionsData::IsRestrictedUrl(const GURL& document_url,
const Extension* extension,
std::string* error) {
+ if (extension &&
+ extension->permissions_data()->IsRuntimeBlockedHost(document_url)) {
+ *error = manifest_errors::kCannotAccessPage;
+ return true;
+ }
if (extension && CanExecuteScriptEverywhere(extension))
return false;
@@ -127,6 +139,31 @@ bool PermissionsData::IsRestrictedUrl(const GURL& document_url,
return false;
}
+bool PermissionsData::UsesDefaultPolicyHostRestrictions() const {
+ DCHECK(!thread_checker_ || thread_checker_->CalledOnValidThread());
+ return uses_default_policy_host_restrictions_;
+}
+
+const URLPatternSet& PermissionsData::default_runtime_blocked_hosts() {
+ return default_runtime_blocked_hosts_unsafe_;
+}
+
+const URLPatternSet& PermissionsData::default_runtime_allowed_hosts() {
+ return default_runtime_allowed_hosts_unsafe_;
+}
+
+const URLPatternSet& PermissionsData::runtime_blocked_hosts() const {
+ if (uses_default_policy_host_restrictions_)
+ return default_runtime_blocked_hosts_unsafe_;
+ return runtime_blocked_hosts_unsafe_;
+}
+
+const URLPatternSet& PermissionsData::runtime_allowed_hosts() const {
+ if (uses_default_policy_host_restrictions_)
+ return default_runtime_allowed_hosts_unsafe_;
+ return runtime_allowed_hosts_unsafe_;
+}
+
void PermissionsData::BindToCurrentThread() const {
DCHECK(!thread_checker_);
thread_checker_.reset(new base::ThreadChecker());
@@ -140,6 +177,25 @@ void PermissionsData::SetPermissions(
withheld_permissions_unsafe_ = std::move(withheld);
}
+void PermissionsData::SetPolicyHostRestrictions(
+ const URLPatternSet runtime_blocked_hosts,
+ const URLPatternSet runtime_allowed_hosts,
+ const bool uses_default_policy_host_restrictions) const {
+ AutoLockOnValidThread lock(runtime_lock_, thread_checker_.get());
+ runtime_blocked_hosts_unsafe_ = runtime_blocked_hosts;
+ runtime_allowed_hosts_unsafe_ = runtime_allowed_hosts;
+ uses_default_policy_host_restrictions_ =
+ uses_default_policy_host_restrictions;
+}
+
+// static
+void PermissionsData::SetDefaultPolicyHostRestrictions(
+ const URLPatternSet default_runtime_blocked_hosts,
+ const URLPatternSet default_runtime_allowed_hosts) {
+ default_runtime_blocked_hosts_unsafe_ = default_runtime_blocked_hosts;
+ default_runtime_allowed_hosts_unsafe_ = default_runtime_allowed_hosts;
+}
+
void PermissionsData::SetActivePermissions(
std::unique_ptr<const PermissionSet> active) const {
AutoLockOnValidThread lock(runtime_lock_, thread_checker_.get());
@@ -208,7 +264,8 @@ URLPatternSet PermissionsData::GetEffectiveHostPermissions() const {
bool PermissionsData::HasHostPermission(const GURL& url) const {
base::AutoLock auto_lock(runtime_lock_);
- return active_permissions_unsafe_->HasExplicitAccessToOrigin(url);
+ return active_permissions_unsafe_->HasExplicitAccessToOrigin(url) &&
+ !IsRuntimeBlockedHost(url);
}
bool PermissionsData::HasEffectiveAccessToAllHosts() const {
@@ -327,6 +384,11 @@ bool PermissionsData::HasTabSpecificPermissionToExecuteScript(
return false;
}
+bool PermissionsData::IsRuntimeBlockedHost(const GURL& url) const {
+ return runtime_blocked_hosts().MatchesURL(url) &&
+ !runtime_allowed_hosts().MatchesURL(url);
+}
+
PermissionsData::AccessType PermissionsData::CanRunOnPage(
const Extension* extension,
const GURL& document_url,
@@ -337,7 +399,13 @@ PermissionsData::AccessType PermissionsData::CanRunOnPage(
runtime_lock_.AssertAcquired();
if (g_policy_delegate &&
!g_policy_delegate->CanExecuteScriptOnPage(extension, document_url,
- tab_id, error)) {
+ tab_id, error))
+ return ACCESS_DENIED;
+
+ if (IsRuntimeBlockedHost(document_url)) {
+ if (error)
+ *error =
+ "This page cannot be scripted due to an ExtensionsSettings policy.";
return ACCESS_DENIED;
}

Powered by Google App Engine
This is Rietveld 408576698