diff --git a/app/generated_resources.grd b/app/generated_resources.grd
index 012e7dabbee..d59540d856b 100644
--- a/app/generated_resources.grd
+++ b/app/generated_resources.grd
@@ -15,7 +15,9 @@ If you update this file, be sure also to update google_chrome_strings.grd. -->
Brave Payments
-
+
+ $1 (extension ID "$2abacabadabacabaeabacabadabacabaf") is not allowed in Brave. Please see about:extensions to install extensions.
+
Close Chrome
diff --git a/browser/extensions/BUILD.gn b/browser/extensions/BUILD.gn
index 28aa1489691..0fd2f0a2e13 100644
--- a/browser/extensions/BUILD.gn
+++ b/browser/extensions/BUILD.gn
@@ -10,6 +10,8 @@ source_set("extensions") {
"brave_component_extension_resource_manager.h",
"brave_component_loader.cc",
"brave_component_loader.h",
+ "brave_extension_management.cc",
+ "brave_extension_management.h",
]
deps = [
"//brave/browser/resources:brave_extension_grit",
diff --git a/browser/extensions/brave_extension_management.cc b/browser/extensions/brave_extension_management.cc
new file mode 100644
index 00000000000..ad5f98d6152
--- /dev/null
+++ b/browser/extensions/brave_extension_management.cc
@@ -0,0 +1,22 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "brave/browser/extensions/brave_extension_management.h"
+
+#include "brave/extensions/browser/brave_extension_provider.h"
+
+namespace extensions {
+
+BraveExtensionManagement::BraveExtensionManagement(
+ PrefService* pref_service,
+ bool is_signin_profile)
+ : ExtensionManagement(pref_service, is_signin_profile) {
+ providers_.push_back(
+ std::make_unique());
+}
+
+BraveExtensionManagement::~BraveExtensionManagement() {
+}
+
+} // namespace extensions
diff --git a/browser/extensions/brave_extension_management.h b/browser/extensions/brave_extension_management.h
new file mode 100644
index 00000000000..3d33ff46e98
--- /dev/null
+++ b/browser/extensions/brave_extension_management.h
@@ -0,0 +1,21 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef BRAVE_BROWSER_EXTENSIONS_EXTENSION_MANAGEMENT_H_
+#define BRAVE_BROWSER_EXTENSIONS_EXTENSION_MANAGEMENT_H_
+
+#include "chrome/browser/extensions/extension_management.h"
+
+namespace extensions {
+
+class BraveExtensionManagement : public ExtensionManagement {
+ public:
+ BraveExtensionManagement(PrefService* pref_service, bool is_signin_profile);
+ ~BraveExtensionManagement() override;
+ DISALLOW_COPY_AND_ASSIGN(BraveExtensionManagement);
+};
+
+} // namespace extensions
+
+#endif // BRAVE_BROWSER_EXTENSIONS_EXTENSION_MANAGEMENT_H_
diff --git a/extensions/BUILD.gn b/extensions/BUILD.gn
index 8ddae52cea5..ff3f0f8274c 100644
--- a/extensions/BUILD.gn
+++ b/extensions/BUILD.gn
@@ -3,6 +3,8 @@ source_set("extensions") {
sources = [
"browser/brave_extension_prefs.cc",
"browser/brave_extension_prefs.h",
+ "browser/brave_extension_provider.cc",
+ "browser/brave_extension_provider.h",
]
public_deps = [
diff --git a/extensions/browser/brave_extension_provider.cc b/extensions/browser/brave_extension_provider.cc
new file mode 100644
index 00000000000..b70903b7606
--- /dev/null
+++ b/extensions/browser/brave_extension_provider.cc
@@ -0,0 +1,134 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "brave/extensions/browser/brave_extension_provider.h"
+
+#include
+#include
+#include
+
+#include "base/strings/utf_string_conversions.h"
+#include "brave/grit/generated_resources.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace {
+
+const char* brave_extension_id = "mnojpmjdmbbfmejpflffifhffcmidifd";
+
+bool IsWhitelisted(const std::string& id) {
+ static std::vector whitelist({
+ // Brave
+ brave_extension_id,
+ // CryptoTokenExtension
+ "kmendfapggjehodndflmmgagdbamhnfd",
+ // Cloud Print
+ "mfehgcgbbipciphmccgaenjidiccnmng",
+ // Chromium PDF Viewer
+ "mhjfbmdgcfjbbpaeojofohoefgiehjai",
+ // Web Store
+ "ahfgeienlihckogmohjhadlkjgocpleb",
+ // Grammarly for Chrome
+ "kbfnbcaeplbcioakkpcpgfkobkghlhen",
+ // Brave Ad Block Updater
+ "cffkpbalmllkdoenhmdmpbkajipdjfam",
+ // Brave Tracking Protection Updater
+ "afalakplffnnnlkncjhbmahjfjhmlkal",
+ // Brave HTTPS Everywhere Updater
+ "oofiananboodjbbmdelgdommihjbkfag",
+ // Test ID: Brave Ad Block Updater
+ "naccapggpomhlhoifnlebfoocegenbol",
+ // Test ID: Brave Tracking Protection Updater
+ "eclbkhjphkhalklhipiicaldjbnhdfkc",
+ // Test ID: Brave HTTPS Everywhere Updater
+ "bhlmpjhncoojbkemjkeppfahkglffilp",
+ // 1Password
+ "aomjjhallfgjeglblehebfpbcfeobpgk",
+ // Dashlane
+ "fdjamakpfbbddfjaooikfcpapjohcfmg",
+ // LastPass
+ "hdokiejnpimakedhajhdlcegeplioahd",
+ // Pocket
+ "niloccemoadcdkdjlinkgdfekeahmflj",
+ // Enpass
+ "kmcfomidfpdkfieipokbalgegidffkal",
+ // Vimium
+ "dbepggeogbaibhgnhhndojpepiihcmeb",
+ // bitwarden
+ "nngceckbapebfimnlniiiahkandclblb",
+ // Honey
+ "bmnlcjabgnpnenekpadlanbbkooimhnj",
+ // Pinterest
+ "gpdjojdkbbmdfjfahjcgigfpmkopogic",
+ // MetaMask
+ "nkbihfbeogaeaoehlefnkodbefgpgknn",
+ // Reddit Enhancement Suite
+ "kbmfpngjjgdllneeigpgjifpgocmfgmb",
+ // BetterTTV
+ "ajopnjidmegmdimjlfnijceegpefgped",
+ });
+ return std::find(whitelist.begin(), whitelist.end(), id) != whitelist.end();
+}
+
+} // namespace
+
+namespace extensions {
+
+BraveExtensionProvider::BraveExtensionProvider() {
+}
+
+BraveExtensionProvider::~BraveExtensionProvider() {
+}
+
+std::string BraveExtensionProvider::GetDebugPolicyProviderName() const {
+#if defined(NDEBUG)
+ NOTREACHED();
+ return std::string();
+#else
+ return "Brave Extension Provider";
+#endif
+}
+
+bool BraveExtensionProvider::UserMayLoad(const Extension* extension,
+ base::string16* error) const {
+ if (!IsWhitelisted(extension->id())) {
+ if (error) {
+ *error =
+ l10n_util::GetStringFUTF16(IDS_EXTENSION_CANT_INSTALL_ON_BRAVE,
+ base::UTF8ToUTF16(extension->name()),
+ base::UTF8ToUTF16(extension->id()));
+ }
+#if defined(NDEBUG)
+ LOG(ERROR) << "Extension will not install "
+ << " ID: " << base::UTF8ToUTF16(extension->id()) << ", "
+ << " Name: " << base::UTF8ToUTF16(extension->name());
+#endif
+ return false;
+ }
+ return true;
+}
+
+bool BraveExtensionProvider::UserMayModifySettings(
+ const Extension* extension,
+ base::string16* error) const {
+ return true;
+}
+
+bool BraveExtensionProvider::MustRemainEnabled(const Extension* extension,
+ base::string16* error) const {
+ return false;
+}
+
+bool BraveExtensionProvider::MustRemainDisabled(
+ const Extension* extension,
+ disable_reason::DisableReason* reason,
+ base::string16* error) const {
+ return extension->id() == brave_extension_id;
+}
+
+bool BraveExtensionProvider::MustRemainInstalled(const Extension* extension,
+ base::string16* error) const {
+ return extension->id() == brave_extension_id;
+}
+
+} // namespace extensions
diff --git a/extensions/browser/brave_extension_provider.h b/extensions/browser/brave_extension_provider.h
new file mode 100644
index 00000000000..c8e6bc948a1
--- /dev/null
+++ b/extensions/browser/brave_extension_provider.h
@@ -0,0 +1,34 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef BRAVE_EXTENSIONS_BROWSER_MANAGEMENT_POLICY_H_
+#define BRAVE_EXTENSIONS_BROWSER_MANAGEMENT_POLICY_H_
+
+#include "extensions/browser/management_policy.h"
+
+namespace extensions {
+
+class BraveExtensionProvider : public ManagementPolicy::Provider {
+ public:
+ BraveExtensionProvider();
+ ~BraveExtensionProvider() override;
+ std::string GetDebugPolicyProviderName() const override;
+ bool UserMayLoad(const Extension* extension,
+ base::string16* error) const override;
+ bool UserMayModifySettings(const Extension* extension,
+ base::string16* error) const override;
+ bool MustRemainEnabled(const Extension* extension,
+ base::string16* error) const override;
+ bool MustRemainDisabled(const Extension* extension,
+ disable_reason::DisableReason* reason,
+ base::string16* error) const override;
+ bool MustRemainInstalled(const Extension* extension,
+ base::string16* error) const override;
+ private:
+ DISALLOW_COPY_AND_ASSIGN(BraveExtensionProvider);
+};
+
+} // namespace extensions
+
+#endif
diff --git a/patches/chrome-browser-extensions-extension_management.cc.patch b/patches/chrome-browser-extensions-extension_management.cc.patch
new file mode 100644
index 00000000000..65f76ec6f2f
--- /dev/null
+++ b/patches/chrome-browser-extensions-extension_management.cc.patch
@@ -0,0 +1,21 @@
+diff --git a/chrome/browser/extensions/extension_management.cc b/chrome/browser/extensions/extension_management.cc
+index bc6fe02652cd98591180d3e3e5d794941abfb615..c0e7448bff844680c093d455153872b2cc38e9d6 100644
+--- a/chrome/browser/extensions/extension_management.cc
++++ b/chrome/browser/extensions/extension_management.cc
+@@ -15,6 +15,7 @@
+ #include "base/strings/string_util.h"
+ #include "base/trace_event/trace_event.h"
+ #include "base/version.h"
++#include "brave/browser/extensions/brave_extension_management.h"
+ #include "chrome/browser/extensions/extension_management_constants.h"
+ #include "chrome/browser/extensions/extension_management_internal.h"
+ #include "chrome/browser/extensions/external_policy_loader.h"
+@@ -551,7 +552,7 @@ KeyedService* ExtensionManagementFactory::BuildServiceInstanceFor(
+ #if defined(OS_CHROMEOS)
+ is_signin_profile = chromeos::ProfileHelper::IsSigninProfile(profile);
+ #endif
+- return new ExtensionManagement(profile->GetPrefs(), is_signin_profile);
++ return new BraveExtensionManagement(profile->GetPrefs(), is_signin_profile);
+ }
+
+ content::BrowserContext* ExtensionManagementFactory::GetBrowserContextToUse(
diff --git a/patches/chrome-browser-extensions-extension_management.h.patch b/patches/chrome-browser-extensions-extension_management.h.patch
new file mode 100644
index 00000000000..8b0ce8c8e35
--- /dev/null
+++ b/patches/chrome-browser-extensions-extension_management.h.patch
@@ -0,0 +1,12 @@
+diff --git a/chrome/browser/extensions/extension_management.h b/chrome/browser/extensions/extension_management.h
+index d7ffea9a5b7592821ef626326fbb7161173ae517..a6ca3e41d7d68329e8900480cf20032111509c81 100644
+--- a/chrome/browser/extensions/extension_management.h
++++ b/chrome/browser/extensions/extension_management.h
+@@ -163,6 +163,7 @@ class ExtensionManagement : public KeyedService {
+ std::string* required_version) const;
+
+ private:
++ friend class BraveExtensionManagement;
+ using SettingsIdMap =
+ std::unordered_map>;