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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/webui/extensions/extension_settings_handler.h" 5 #include "chrome/browser/ui/webui/extensions/extension_settings_handler.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/base64.h" 8 #include "base/base64.h"
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 14 matching lines...) Expand all
25 #include "chrome/browser/extensions/extension_host.h" 25 #include "chrome/browser/extensions/extension_host.h"
26 #include "chrome/browser/extensions/extension_service.h" 26 #include "chrome/browser/extensions/extension_service.h"
27 #include "chrome/browser/extensions/extension_system.h" 27 #include "chrome/browser/extensions/extension_system.h"
28 #include "chrome/browser/extensions/extension_warning_set.h" 28 #include "chrome/browser/extensions/extension_warning_set.h"
29 #include "chrome/browser/extensions/lazy_background_task_queue.h" 29 #include "chrome/browser/extensions/lazy_background_task_queue.h"
30 #include "chrome/browser/extensions/management_policy.h" 30 #include "chrome/browser/extensions/management_policy.h"
31 #include "chrome/browser/extensions/shell_window_registry.h" 31 #include "chrome/browser/extensions/shell_window_registry.h"
32 #include "chrome/browser/extensions/unpacked_installer.h" 32 #include "chrome/browser/extensions/unpacked_installer.h"
33 #include "chrome/browser/extensions/updater/extension_updater.h" 33 #include "chrome/browser/extensions/updater/extension_updater.h"
34 #include "chrome/browser/google/google_util.h" 34 #include "chrome/browser/google/google_util.h"
35 #include "chrome/browser/managed_mode/managed_mode_navigation_observer.h"
35 #include "chrome/browser/managed_mode/managed_user_service.h" 36 #include "chrome/browser/managed_mode/managed_user_service.h"
36 #include "chrome/browser/managed_mode/managed_user_service_factory.h" 37 #include "chrome/browser/managed_mode/managed_user_service_factory.h"
37 #include "chrome/browser/profiles/profile.h" 38 #include "chrome/browser/profiles/profile.h"
38 #include "chrome/browser/tab_contents/background_contents.h" 39 #include "chrome/browser/tab_contents/background_contents.h"
39 #include "chrome/browser/ui/browser_finder.h" 40 #include "chrome/browser/ui/browser_finder.h"
40 #include "chrome/browser/ui/chrome_select_file_policy.h" 41 #include "chrome/browser/ui/chrome_select_file_policy.h"
41 #include "chrome/browser/ui/extensions/application_launch.h" 42 #include "chrome/browser/ui/extensions/application_launch.h"
42 #include "chrome/browser/ui/extensions/shell_window.h" 43 #include "chrome/browser/ui/extensions/shell_window.h"
43 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" 44 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h"
44 #include "chrome/common/chrome_notification_types.h" 45 #include "chrome/common/chrome_notification_types.h"
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 125
125 DictionaryValue* ExtensionSettingsHandler::CreateExtensionDetailValue( 126 DictionaryValue* ExtensionSettingsHandler::CreateExtensionDetailValue(
126 const Extension* extension, 127 const Extension* extension,
127 const std::vector<ExtensionPage>& pages, 128 const std::vector<ExtensionPage>& pages,
128 const extensions::ExtensionWarningService* warning_service) { 129 const extensions::ExtensionWarningService* warning_service) {
129 DictionaryValue* extension_data = new DictionaryValue(); 130 DictionaryValue* extension_data = new DictionaryValue();
130 bool enabled = extension_service_->IsExtensionEnabled(extension->id()); 131 bool enabled = extension_service_->IsExtensionEnabled(extension->id());
131 extension->GetBasicInfo(enabled, extension_data); 132 extension->GetBasicInfo(enabled, extension_data);
132 133
133 extension_data->SetBoolean("userModifiable", 134 extension_data->SetBoolean("userModifiable",
134 management_policy_->UserMayModifySettings(extension, NULL)); 135 CheckUserMayModifySettings(extension));
135 136
136 GURL icon = 137 GURL icon =
137 ExtensionIconSource::GetIconURL(extension, 138 ExtensionIconSource::GetIconURL(extension,
138 extension_misc::EXTENSION_ICON_MEDIUM, 139 extension_misc::EXTENSION_ICON_MEDIUM,
139 ExtensionIconSet::MATCH_BIGGER, 140 ExtensionIconSet::MATCH_BIGGER,
140 !enabled, NULL); 141 !enabled, NULL);
141 if (Manifest::IsUnpackedLocation(extension->location())) 142 if (Manifest::IsUnpackedLocation(extension->location()))
142 extension_data->SetString("path", extension->path().value()); 143 extension_data->SetString("path", extension->path().value());
143 extension_data->SetString("icon", icon.spec()); 144 extension_data->SetString("icon", icon.spec());
144 extension_data->SetBoolean("isUnpacked", 145 extension_data->SetBoolean("isUnpacked",
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 548
548 for (std::vector<const Extension*>::iterator iter = 549 for (std::vector<const Extension*>::iterator iter =
549 unpacked_extensions.begin(); iter != unpacked_extensions.end(); ++iter) { 550 unpacked_extensions.begin(); iter != unpacked_extensions.end(); ++iter) {
550 extension_service_->ReloadExtension((*iter)->id()); 551 extension_service_->ReloadExtension((*iter)->id());
551 } 552 }
552 } 553 }
553 554
554 void ExtensionSettingsHandler::PassphraseDialogCallback(bool success) { 555 void ExtensionSettingsHandler::PassphraseDialogCallback(bool success) {
555 if (!success) 556 if (!success)
556 return; 557 return;
557 Profile* profile = Profile::FromWebUI(web_ui()); 558 ManagedModeNavigationObserver* observer =
558 ManagedUserServiceFactory::GetForProfile(profile)->SetElevated(true); 559 ManagedModeNavigationObserver::FromWebContents(
560 web_ui()->GetWebContents());
561 observer->set_elevated(true);
559 HandleRequestExtensionsData(NULL); 562 HandleRequestExtensionsData(NULL);
560 } 563 }
561 564
562 void ExtensionSettingsHandler::ManagedUserSetElevated(const ListValue* args) { 565 void ExtensionSettingsHandler::ManagedUserSetElevated(const ListValue* args) {
563 ManagedUserService* service = ManagedUserServiceFactory::GetForProfile( 566 ManagedUserService* service = ManagedUserServiceFactory::GetForProfile(
564 Profile::FromWebUI(web_ui())); 567 Profile::FromWebUI(web_ui()));
565 bool elevated; 568 bool elevated;
566 CHECK(args->GetBoolean(0, &elevated)); 569 CHECK(args->GetBoolean(0, &elevated));
567 if (elevated) { 570 if (elevated) {
568 service->RequestAuthorization( 571 service->RequestAuthorization(
569 web_ui()->GetWebContents(), 572 web_ui()->GetWebContents(),
570 base::Bind(&ExtensionSettingsHandler::PassphraseDialogCallback, 573 base::Bind(&ExtensionSettingsHandler::PassphraseDialogCallback,
571 base::Unretained(this))); 574 base::Unretained(this)));
572 } else { 575 } else {
573 service->SetElevated(false); 576 ManagedModeNavigationObserver* observer =
577 ManagedModeNavigationObserver::FromWebContents(
578 web_ui()->GetWebContents());
579 observer->set_elevated(false);
574 HandleRequestExtensionsData(NULL); 580 HandleRequestExtensionsData(NULL);
575 } 581 }
576 } 582 }
577 583
584 scoped_ptr<ScopedExtensionElevation>
585 ExtensionSettingsHandler::GetScopedElevation(
586 const std::string& extension_id) {
587 // web_ui() can be NULL in a unit_test.
588 if (web_ui() == NULL)
589 return scoped_ptr<ScopedExtensionElevation>(NULL);
590 ManagedUserService* service = ManagedUserServiceFactory::GetForProfile(
591 Profile::FromWebUI(web_ui()));
592 scoped_ptr<ScopedExtensionElevation> elevation(
593 new ScopedExtensionElevation(service));
594 if (service->ProfileIsManaged() &&
595 service->IsElevatedForWebContents(web_ui()->GetWebContents())) {
596 elevation->AddExtension(extension_id);
597 }
598 return elevation.Pass();
599 }
600
601 bool ExtensionSettingsHandler::CheckUserMayModifySettings(
602 const Extension* extension) {
603 // Get managed user elevation for a specific extension id. The elevation will
604 // be removed automatically when |elevation| goes out of scope.
605 scoped_ptr<ScopedExtensionElevation> elevation =
606 GetScopedElevation(extension->id());
607 return management_policy_->UserMayModifySettings(extension, NULL);
608 }
609
578 void ExtensionSettingsHandler::HandleRequestExtensionsData( 610 void ExtensionSettingsHandler::HandleRequestExtensionsData(
579 const ListValue* args) { 611 const ListValue* args) {
580 DictionaryValue results; 612 DictionaryValue results;
581 613
582 Profile* profile = Profile::FromWebUI(web_ui()); 614 Profile* profile = Profile::FromWebUI(web_ui());
583 615
584 // Add the extensions to the results structure. 616 // Add the extensions to the results structure.
585 ListValue *extensions_list = new ListValue(); 617 ListValue *extensions_list = new ListValue();
586 618
587 extensions::ExtensionWarningService* warnings = 619 extensions::ExtensionWarningService* warnings =
(...skipping 29 matching lines...) Expand all
617 empty_pages, // Terminated process has no active pages. 649 empty_pages, // Terminated process has no active pages.
618 warnings)); 650 warnings));
619 } 651 }
620 } 652 }
621 results.Set("extensions", extensions_list); 653 results.Set("extensions", extensions_list);
622 654
623 ManagedUserService* service = 655 ManagedUserService* service =
624 ManagedUserServiceFactory::GetForProfile(profile); 656 ManagedUserServiceFactory::GetForProfile(profile);
625 657
626 bool is_managed = service->ProfileIsManaged(); 658 bool is_managed = service->ProfileIsManaged();
627 bool is_elevated = service->IsElevated(); 659 bool is_elevated =
660 service->IsElevatedForWebContents(web_ui()->GetWebContents());
628 bool developer_mode = 661 bool developer_mode =
629 (!is_managed || is_elevated) && 662 (!is_managed || is_elevated) &&
630 profile->GetPrefs()->GetBoolean(prefs::kExtensionsUIDeveloperMode); 663 profile->GetPrefs()->GetBoolean(prefs::kExtensionsUIDeveloperMode);
631 results.SetBoolean("profileIsManaged", is_managed); 664 results.SetBoolean("profileIsManaged", is_managed);
632 results.SetBoolean("profileIsElevated", is_elevated); 665 results.SetBoolean("profileIsElevated", is_elevated);
633 results.SetBoolean("developerMode", developer_mode); 666 results.SetBoolean("developerMode", developer_mode);
634 667
635 // Check to see if we have any wiped out extensions. 668 // Check to see if we have any wiped out extensions.
636 ExtensionService* extension_service = 669 ExtensionService* extension_service =
637 extensions::ExtensionSystem::Get(profile)->extension_service(); 670 extensions::ExtensionSystem::Get(profile)->extension_service();
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
727 } 760 }
728 761
729 void ExtensionSettingsHandler::HandleEnableMessage(const ListValue* args) { 762 void ExtensionSettingsHandler::HandleEnableMessage(const ListValue* args) {
730 CHECK_EQ(2U, args->GetSize()); 763 CHECK_EQ(2U, args->GetSize());
731 std::string extension_id, enable_str; 764 std::string extension_id, enable_str;
732 CHECK(args->GetString(0, &extension_id)); 765 CHECK(args->GetString(0, &extension_id));
733 CHECK(args->GetString(1, &enable_str)); 766 CHECK(args->GetString(1, &enable_str));
734 767
735 const Extension* extension = 768 const Extension* extension =
736 extension_service_->GetInstalledExtension(extension_id); 769 extension_service_->GetInstalledExtension(extension_id);
737 if (!extension || 770 if (!extension || !CheckUserMayModifySettings(extension)) {
738 !management_policy_->UserMayModifySettings(extension, NULL)) {
739 LOG(ERROR) << "Attempt to enable an extension that is non-usermanagable was" 771 LOG(ERROR) << "Attempt to enable an extension that is non-usermanagable was"
740 << "made. Extension id: " << extension->id(); 772 << "made. Extension id: " << extension->id();
741 return; 773 return;
742 } 774 }
743 775
744 if (enable_str == "true") { 776 if (enable_str == "true") {
745 extensions::ExtensionPrefs* prefs = extension_service_->extension_prefs(); 777 extensions::ExtensionPrefs* prefs = extension_service_->extension_prefs();
746 if (prefs->DidExtensionEscalatePermissions(extension_id)) { 778 if (prefs->DidExtensionEscalatePermissions(extension_id)) {
747 extensions::ShowExtensionDisabledDialog( 779 extensions::ShowExtensionDisabledDialog(
748 extension_service_, web_ui()->GetWebContents(), extension); 780 extension_service_, web_ui()->GetWebContents(), extension);
749 } else if ((prefs->GetDisableReasons(extension_id) & 781 } else if ((prefs->GetDisableReasons(extension_id) &
750 Extension::DISABLE_UNSUPPORTED_REQUIREMENT) && 782 Extension::DISABLE_UNSUPPORTED_REQUIREMENT) &&
751 !requirements_checker_.get()) { 783 !requirements_checker_.get()) {
752 // Recheck the requirements. 784 // Recheck the requirements.
753 scoped_refptr<const Extension> extension = 785 scoped_refptr<const Extension> extension =
754 extension_service_->GetExtensionById(extension_id, 786 extension_service_->GetExtensionById(extension_id,
755 true /* include disabled */); 787 true /* include disabled */);
756 requirements_checker_.reset(new extensions::RequirementsChecker()); 788 requirements_checker_.reset(new extensions::RequirementsChecker());
757 requirements_checker_->Check( 789 requirements_checker_->Check(
758 extension, 790 extension,
759 base::Bind(&ExtensionSettingsHandler::OnRequirementsChecked, 791 base::Bind(&ExtensionSettingsHandler::OnRequirementsChecked,
760 AsWeakPtr(), extension_id)); 792 AsWeakPtr(), extension_id));
761 } else { 793 } else {
762 extension_service_->EnableExtension(extension_id); 794 extension_service_->EnableExtension(extension_id);
763 795
764 // Make sure any browser action contained within it is not hidden. 796 // Make sure any browser action contained within it is not hidden.
765 prefs->SetBrowserActionVisibility(extension, true); 797 prefs->SetBrowserActionVisibility(extension, true);
766 } 798 }
767 } else { 799 } else {
800 // Get managed user elevation for a specific extension id. The elevation
801 // will be removed automatically when |elevation| goes out of scope.
802 scoped_ptr<ScopedExtensionElevation> elevation =
803 GetScopedElevation(extension_id);
768 extension_service_->DisableExtension( 804 extension_service_->DisableExtension(
769 extension_id, Extension::DISABLE_USER_ACTION); 805 extension_id, Extension::DISABLE_USER_ACTION);
770 } 806 }
771 } 807 }
772 808
773 void ExtensionSettingsHandler::HandleEnableIncognitoMessage( 809 void ExtensionSettingsHandler::HandleEnableIncognitoMessage(
774 const ListValue* args) { 810 const ListValue* args) {
775 CHECK_EQ(2U, args->GetSize()); 811 CHECK_EQ(2U, args->GetSize());
776 std::string extension_id, enable_str; 812 std::string extension_id, enable_str;
777 CHECK(args->GetString(0, &extension_id)); 813 CHECK(args->GetString(0, &extension_id));
(...skipping 24 matching lines...) Expand all
802 const ListValue* args) { 838 const ListValue* args) {
803 CHECK_EQ(2U, args->GetSize()); 839 CHECK_EQ(2U, args->GetSize());
804 std::string extension_id, allow_str; 840 std::string extension_id, allow_str;
805 CHECK(args->GetString(0, &extension_id)); 841 CHECK(args->GetString(0, &extension_id));
806 CHECK(args->GetString(1, &allow_str)); 842 CHECK(args->GetString(1, &allow_str));
807 const Extension* extension = 843 const Extension* extension =
808 extension_service_->GetInstalledExtension(extension_id); 844 extension_service_->GetInstalledExtension(extension_id);
809 if (!extension) 845 if (!extension)
810 return; 846 return;
811 847
812 if (!management_policy_->UserMayModifySettings(extension, NULL)) { 848 if (!CheckUserMayModifySettings(extension)) {
813 LOG(ERROR) << "Attempt to change allow file access of an extension that is " 849 LOG(ERROR) << "Attempt to change allow file access of an extension that is "
814 << "non-usermanagable was made. Extension id : " 850 << "non-usermanagable was made. Extension id : "
815 << extension->id(); 851 << extension->id();
816 return; 852 return;
817 } 853 }
818 854
819 extension_service_->SetAllowFileAccess(extension, allow_str == "true"); 855 extension_service_->SetAllowFileAccess(extension, allow_str == "true");
820 } 856 }
821 857
822 void ExtensionSettingsHandler::HandleUninstallMessage(const ListValue* args) { 858 void ExtensionSettingsHandler::HandleUninstallMessage(const ListValue* args) {
823 CHECK_EQ(1U, args->GetSize()); 859 CHECK_EQ(1U, args->GetSize());
824 std::string extension_id; 860 std::string extension_id;
825 CHECK(args->GetString(0, &extension_id)); 861 CHECK(args->GetString(0, &extension_id));
826 const Extension* extension = 862 const Extension* extension =
827 extension_service_->GetInstalledExtension(extension_id); 863 extension_service_->GetInstalledExtension(extension_id);
828 if (!extension) 864 if (!extension)
829 return; 865 return;
830 866
831 if (!management_policy_->UserMayModifySettings(extension, NULL)) { 867 if (!CheckUserMayModifySettings(extension)) {
832 LOG(ERROR) << "Attempt to uninstall an extension that is non-usermanagable " 868 LOG(ERROR) << "Attempt to uninstall an extension that is non-usermanagable "
833 << "was made. Extension id : " << extension->id(); 869 << "was made. Extension id : " << extension->id();
834 return; 870 return;
835 } 871 }
836 872
837 if (!extension_id_prompting_.empty()) 873 if (!extension_id_prompting_.empty())
838 return; // Only one prompt at a time. 874 return; // Only one prompt at a time.
839 875
840 extension_id_prompting_ = extension_id; 876 extension_id_prompting_ = extension_id;
841 877
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
1078 std::vector<std::string> requirement_errors) { 1114 std::vector<std::string> requirement_errors) {
1079 if (requirement_errors.empty()) { 1115 if (requirement_errors.empty()) {
1080 extension_service_->EnableExtension(extension_id); 1116 extension_service_->EnableExtension(extension_id);
1081 } else { 1117 } else {
1082 ExtensionErrorReporter::GetInstance()->ReportError( 1118 ExtensionErrorReporter::GetInstance()->ReportError(
1083 UTF8ToUTF16(JoinString(requirement_errors, ' ')), 1119 UTF8ToUTF16(JoinString(requirement_errors, ' ')),
1084 true /* be noisy */); 1120 true /* be noisy */);
1085 } 1121 }
1086 requirements_checker_.reset(); 1122 requirements_checker_.reset();
1087 } 1123 }
OLDNEW
« 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