fix: ensure extensions w/o a background page have file access (#29123)

This commit is contained in:
Shelley Vohr 2021-05-14 14:06:55 +02:00 committed by GitHub
parent b7a23450b7
commit cba6626af8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -27,6 +27,7 @@
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process.h"
#include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/chrome_version.h" #include "chrome/common/chrome_version.h"
#include "components/net_log/chrome_net_log.h" #include "components/net_log/chrome_net_log.h"
#include "components/network_hints/common/network_hints.mojom.h" #include "components/network_hints/common/network_hints.mojom.h"
@ -144,6 +145,7 @@
#include "extensions/browser/extension_message_filter.h" #include "extensions/browser/extension_message_filter.h"
#include "extensions/browser/extension_navigation_throttle.h" #include "extensions/browser/extension_navigation_throttle.h"
#include "extensions/browser/extension_navigation_ui_data.h" #include "extensions/browser/extension_navigation_ui_data.h"
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_protocols.h" #include "extensions/browser/extension_protocols.h"
#include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_registry.h"
#include "extensions/browser/extensions_browser_client.h" #include "extensions/browser/extensions_browser_client.h"
@ -225,6 +227,15 @@ enum class RenderProcessHostPrivilege {
kExtension, kExtension,
}; };
// Copied from chrome/browser/extensions/extension_util.cc.
bool AllowFileAccess(const std::string& extension_id,
content::BrowserContext* context) {
return base::CommandLine::ForCurrentProcess()->HasSwitch(
::switches::kDisableExtensionsFileAccessCheck) ||
extensions::ExtensionPrefs::Get(context)->AllowFileAccess(
extension_id);
}
RenderProcessHostPrivilege GetPrivilegeRequiredByUrl( RenderProcessHostPrivilege GetPrivilegeRequiredByUrl(
const GURL& url, const GURL& url,
extensions::ExtensionRegistry* registry) { extensions::ExtensionRegistry* registry) {
@ -1182,12 +1193,12 @@ void ElectronBrowserClient::RegisterNonNetworkSubresourceURLLoaderFactories(
{content::kChromeUIResourcesHost})); {content::kChromeUIResourcesHost}));
} }
// Extension with a background page get file access that gets approval from // Extensions with the necessary permissions get access to file:// URLs that
// ChildProcessSecurityPolicy. // gets approval from ChildProcessSecurityPolicy. Keep this logic in sync with
extensions::ExtensionHost* host = // ExtensionWebContentsObserver::RenderFrameCreated.
extensions::ProcessManager::Get(web_contents->GetBrowserContext()) extensions::Manifest::Type type = extension->GetType();
->GetBackgroundHostForExtension(extension->id()); if (type == extensions::Manifest::TYPE_EXTENSION &&
if (host) { AllowFileAccess(extension->id(), web_contents->GetBrowserContext())) {
factories->emplace(url::kFileScheme, factories->emplace(url::kFileScheme,
FileURLLoaderFactory::Create(render_process_id)); FileURLLoaderFactory::Create(render_process_id));
} }