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

Unified Diff: chrome/browser/ui/webui/extensions/extension_settings_handler.cc

Issue 13119011: Enable WebContents elevation for managed users. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Check if web_ui() is NULL. Created 7 years, 8 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: chrome/browser/ui/webui/extensions/extension_settings_handler.cc
diff --git a/chrome/browser/ui/webui/extensions/extension_settings_handler.cc b/chrome/browser/ui/webui/extensions/extension_settings_handler.cc
index 1e4aa52b782335c5f92524ed60abd4686ff453bf..bd3bc6f2385d03b49b54b3f3869ee66ae680b817 100644
--- a/chrome/browser/ui/webui/extensions/extension_settings_handler.cc
+++ b/chrome/browser/ui/webui/extensions/extension_settings_handler.cc
@@ -32,6 +32,7 @@
#include "chrome/browser/extensions/unpacked_installer.h"
#include "chrome/browser/extensions/updater/extension_updater.h"
#include "chrome/browser/google/google_util.h"
+#include "chrome/browser/managed_mode/managed_mode_navigation_observer.h"
#include "chrome/browser/managed_mode/managed_user_service.h"
#include "chrome/browser/managed_mode/managed_user_service_factory.h"
#include "chrome/browser/profiles/profile.h"
@@ -131,7 +132,7 @@ DictionaryValue* ExtensionSettingsHandler::CreateExtensionDetailValue(
extension->GetBasicInfo(enabled, extension_data);
extension_data->SetBoolean("userModifiable",
- management_policy_->UserMayModifySettings(extension, NULL));
+ CheckUserMayModifySettings(extension));
GURL icon =
ExtensionIconSource::GetIconURL(extension,
@@ -554,8 +555,10 @@ void ExtensionSettingsHandler::ReloadUnpackedExtensions() {
void ExtensionSettingsHandler::PassphraseDialogCallback(bool success) {
if (!success)
return;
- Profile* profile = Profile::FromWebUI(web_ui());
- ManagedUserServiceFactory::GetForProfile(profile)->SetElevated(true);
+ ManagedModeNavigationObserver* observer =
+ ManagedModeNavigationObserver::FromWebContents(
+ web_ui()->GetWebContents());
+ observer->set_elevated(true);
HandleRequestExtensionsData(NULL);
}
@@ -570,11 +573,40 @@ void ExtensionSettingsHandler::ManagedUserSetElevated(const ListValue* args) {
base::Bind(&ExtensionSettingsHandler::PassphraseDialogCallback,
base::Unretained(this)));
} else {
- service->SetElevated(false);
+ ManagedModeNavigationObserver* observer =
+ ManagedModeNavigationObserver::FromWebContents(
+ web_ui()->GetWebContents());
+ observer->set_elevated(false);
HandleRequestExtensionsData(NULL);
}
}
+scoped_ptr<ScopedExtensionElevation>
+ ExtensionSettingsHandler::GetScopedElevation(
+ const std::string& extension_id) {
+ // web_ui() can be NULL in a unit_test.
+ if (web_ui() == NULL)
+ return scoped_ptr<ScopedExtensionElevation>(NULL);
+ ManagedUserService* service = ManagedUserServiceFactory::GetForProfile(
+ Profile::FromWebUI(web_ui()));
+ scoped_ptr<ScopedExtensionElevation> elevation(
+ new ScopedExtensionElevation(service));
+ if (service->ProfileIsManaged() &&
+ service->IsElevatedForWebContents(web_ui()->GetWebContents())) {
+ elevation->AddExtension(extension_id);
+ }
+ return elevation.Pass();
+}
+
+bool ExtensionSettingsHandler::CheckUserMayModifySettings(
+ const Extension* extension) {
+ // Get managed user elevation for a specific extension id. The elevation will
+ // be removed automatically when |elevation| goes out of scope.
+ scoped_ptr<ScopedExtensionElevation> elevation =
+ GetScopedElevation(extension->id());
+ return management_policy_->UserMayModifySettings(extension, NULL);
+}
+
void ExtensionSettingsHandler::HandleRequestExtensionsData(
const ListValue* args) {
DictionaryValue results;
@@ -624,7 +656,8 @@ void ExtensionSettingsHandler::HandleRequestExtensionsData(
ManagedUserServiceFactory::GetForProfile(profile);
bool is_managed = service->ProfileIsManaged();
- bool is_elevated = service->IsElevated();
+ bool is_elevated =
+ service->IsElevatedForWebContents(web_ui()->GetWebContents());
bool developer_mode =
(!is_managed || is_elevated) &&
profile->GetPrefs()->GetBoolean(prefs::kExtensionsUIDeveloperMode);
@@ -734,8 +767,7 @@ void ExtensionSettingsHandler::HandleEnableMessage(const ListValue* args) {
const Extension* extension =
extension_service_->GetInstalledExtension(extension_id);
- if (!extension ||
- !management_policy_->UserMayModifySettings(extension, NULL)) {
+ if (!extension || !CheckUserMayModifySettings(extension)) {
LOG(ERROR) << "Attempt to enable an extension that is non-usermanagable was"
<< "made. Extension id: " << extension->id();
return;
@@ -765,6 +797,10 @@ void ExtensionSettingsHandler::HandleEnableMessage(const ListValue* args) {
prefs->SetBrowserActionVisibility(extension, true);
}
} else {
+ // Get managed user elevation for a specific extension id. The elevation
+ // will be removed automatically when |elevation| goes out of scope.
+ scoped_ptr<ScopedExtensionElevation> elevation =
+ GetScopedElevation(extension_id);
extension_service_->DisableExtension(
extension_id, Extension::DISABLE_USER_ACTION);
}
@@ -809,7 +845,7 @@ void ExtensionSettingsHandler::HandleAllowFileAccessMessage(
if (!extension)
return;
- if (!management_policy_->UserMayModifySettings(extension, NULL)) {
+ if (!CheckUserMayModifySettings(extension)) {
LOG(ERROR) << "Attempt to change allow file access of an extension that is "
<< "non-usermanagable was made. Extension id : "
<< extension->id();
@@ -828,7 +864,7 @@ void ExtensionSettingsHandler::HandleUninstallMessage(const ListValue* args) {
if (!extension)
return;
- if (!management_policy_->UserMayModifySettings(extension, NULL)) {
+ if (!CheckUserMayModifySettings(extension)) {
LOG(ERROR) << "Attempt to uninstall an extension that is non-usermanagable "
<< "was made. Extension id : " << extension->id();
return;
« no previous file with comments | « chrome/browser/ui/webui/extensions/extension_settings_handler.h ('k') | chrome/browser/ui/webui/history_ui.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698