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

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

Issue 2499493004: Communicate ExtensionSettings policy to renderers (Closed)
Patch Set: URLPatternSets use shared memory for IPC. Default scope patterns sent once per renderer. Created 4 years 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..830d57cc223ff9414b1a4e41304ff9cc6803fcdd 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();
+// 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::IsRuntimeBlockedAllowedHostsDefault() const {
+ DCHECK(!thread_checker_ || thread_checker_->CalledOnValidThread());
+ return is_default_runtime_blocked_allowed_hosts_;
+}
+
+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 (is_default_runtime_blocked_allowed_hosts_)
+ return default_runtime_blocked_hosts_unsafe_;
+ return runtime_blocked_hosts_unsafe_;
+}
+
+const URLPatternSet& PermissionsData::runtime_allowed_hosts() const {
+ if (is_default_runtime_blocked_allowed_hosts_)
+ 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::SetRuntimeBlockedAllowedHosts(
+ const URLPatternSet runtime_blocked_hosts,
+ const URLPatternSet runtime_allowed_hosts,
+ const bool is_default_runtime_blocked_allowed_hosts) const {
+ AutoLockOnValidThread lock(runtime_lock_, thread_checker_.get());
+ runtime_blocked_hosts_unsafe_ = runtime_blocked_hosts;
+ runtime_allowed_hosts_unsafe_ = runtime_allowed_hosts;
+ is_default_runtime_blocked_allowed_hosts_ =
+ is_default_runtime_blocked_allowed_hosts;
+}
+
+// static
+void PermissionsData::SetDefaultRuntimeBlockedAllowedHosts(
+ 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,14 @@ bool PermissionsData::HasTabSpecificPermissionToExecuteScript(
return false;
}
+bool PermissionsData::IsRuntimeBlockedHost(const GURL& url) const {
+ if (runtime_blocked_hosts().MatchesURL(url)) {
+ if (!runtime_allowed_hosts().MatchesURL(url))
zmin 2016/12/22 22:15:39 Can we do: return runtime_blocked_hosts().MatchesU
nrpeter 2017/01/19 01:50:45 Done.
+ return true;
+ }
+ return false;
+}
+
PermissionsData::AccessType PermissionsData::CanRunOnPage(
const Extension* extension,
const GURL& document_url,
@@ -337,7 +402,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