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

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: Address review comments. Created 7 years, 9 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/browser/view_type_utils.h" 45 #include "chrome/browser/view_type_utils.h"
(...skipping 30 matching lines...) Expand all
75 76
76 77
77 using content::RenderViewHost; 78 using content::RenderViewHost;
78 using content::WebContents; 79 using content::WebContents;
79 using extensions::Extension; 80 using extensions::Extension;
80 using extensions::ExtensionUpdater; 81 using extensions::ExtensionUpdater;
81 using extensions::ExtensionWarning; 82 using extensions::ExtensionWarning;
82 using extensions::ManagementPolicy; 83 using extensions::ManagementPolicy;
83 using extensions::Manifest; 84 using extensions::Manifest;
84 85
86 namespace {
Bernhard Bauer 2013/03/27 16:23:13 Nit: newline
87 // Used to allow managed users to install extensions if they are currently in
88 // elevated state.
89 class ScopedExtensionElevation {
90 public:
91 ScopedExtensionElevation(ManagedUserService* service,
92 std::string extension_id);
93 ~ScopedExtensionElevation();
94
95 private:
96 ManagedUserService* service_;
97 std::string extension_id_;
Bernhard Bauer 2013/03/27 16:23:13 You could have a vector of extension IDs and a met
Adrian Kuegel 2013/03/27 16:52:25 Done.
98 };
99
100 ScopedExtensionElevation::ScopedExtensionElevation(ManagedUserService* service,
101 std::string extension_id)
102 : service_(service), extension_id_(extension_id) {
103 service_->AddElevationForExtension(extension_id_);
104 }
105
106 ScopedExtensionElevation::~ScopedExtensionElevation() {
107 service_->RemoveElevationForExtension(extension_id_);
108 }
109
110 } // namespace
111
85 /////////////////////////////////////////////////////////////////////////////// 112 ///////////////////////////////////////////////////////////////////////////////
86 // 113 //
87 // ExtensionSettingsHandler 114 // ExtensionSettingsHandler
88 // 115 //
89 /////////////////////////////////////////////////////////////////////////////// 116 ///////////////////////////////////////////////////////////////////////////////
90 117
91 ExtensionSettingsHandler::ExtensionSettingsHandler() 118 ExtensionSettingsHandler::ExtensionSettingsHandler()
92 : extension_service_(NULL), 119 : extension_service_(NULL),
93 management_policy_(NULL), 120 management_policy_(NULL),
94 ignore_notifications_(false), 121 ignore_notifications_(false),
(...skipping 29 matching lines...) Expand all
124 151
125 DictionaryValue* ExtensionSettingsHandler::CreateExtensionDetailValue( 152 DictionaryValue* ExtensionSettingsHandler::CreateExtensionDetailValue(
126 const Extension* extension, 153 const Extension* extension,
127 const std::vector<ExtensionPage>& pages, 154 const std::vector<ExtensionPage>& pages,
128 const extensions::ExtensionWarningService* warning_service) { 155 const extensions::ExtensionWarningService* warning_service) {
129 DictionaryValue* extension_data = new DictionaryValue(); 156 DictionaryValue* extension_data = new DictionaryValue();
130 bool enabled = extension_service_->IsExtensionEnabled(extension->id()); 157 bool enabled = extension_service_->IsExtensionEnabled(extension->id());
131 extension->GetBasicInfo(enabled, extension_data); 158 extension->GetBasicInfo(enabled, extension_data);
132 159
133 extension_data->SetBoolean("userModifiable", 160 extension_data->SetBoolean("userModifiable",
134 management_policy_->UserMayModifySettings(extension, NULL)); 161 CheckUserMayModifySettings(extension));
135 162
136 GURL icon = 163 GURL icon =
137 ExtensionIconSource::GetIconURL(extension, 164 ExtensionIconSource::GetIconURL(extension,
138 extension_misc::EXTENSION_ICON_MEDIUM, 165 extension_misc::EXTENSION_ICON_MEDIUM,
139 ExtensionIconSet::MATCH_BIGGER, 166 ExtensionIconSet::MATCH_BIGGER,
140 !enabled, NULL); 167 !enabled, NULL);
141 if (Manifest::IsUnpackedLocation(extension->location())) 168 if (Manifest::IsUnpackedLocation(extension->location()))
142 extension_data->SetString("path", extension->path().value()); 169 extension_data->SetString("path", extension->path().value());
143 extension_data->SetString("icon", icon.spec()); 170 extension_data->SetString("icon", icon.spec());
144 extension_data->SetBoolean("isUnpacked", 171 extension_data->SetBoolean("isUnpacked",
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 574
548 for (std::vector<const Extension*>::iterator iter = 575 for (std::vector<const Extension*>::iterator iter =
549 unpacked_extensions.begin(); iter != unpacked_extensions.end(); ++iter) { 576 unpacked_extensions.begin(); iter != unpacked_extensions.end(); ++iter) {
550 extension_service_->ReloadExtension((*iter)->id()); 577 extension_service_->ReloadExtension((*iter)->id());
551 } 578 }
552 } 579 }
553 580
554 void ExtensionSettingsHandler::PassphraseDialogCallback(bool success) { 581 void ExtensionSettingsHandler::PassphraseDialogCallback(bool success) {
555 if (!success) 582 if (!success)
556 return; 583 return;
557 Profile* profile = Profile::FromWebUI(web_ui()); 584 ManagedModeNavigationObserver* observer =
558 ManagedUserServiceFactory::GetForProfile(profile)->SetElevated(true); 585 ManagedModeNavigationObserver::FromWebContents(
586 web_ui()->GetWebContents());
587 observer->set_elevated(true);
559 HandleRequestExtensionsData(NULL); 588 HandleRequestExtensionsData(NULL);
560 } 589 }
561 590
562 void ExtensionSettingsHandler::ManagedUserSetElevated(const ListValue* args) { 591 void ExtensionSettingsHandler::ManagedUserSetElevated(const ListValue* args) {
563 ManagedUserService* service = ManagedUserServiceFactory::GetForProfile( 592 ManagedUserService* service = ManagedUserServiceFactory::GetForProfile(
564 Profile::FromWebUI(web_ui())); 593 Profile::FromWebUI(web_ui()));
565 bool elevated; 594 bool elevated;
566 CHECK(args->GetBoolean(0, &elevated)); 595 CHECK(args->GetBoolean(0, &elevated));
567 if (elevated) { 596 if (elevated) {
568 service->RequestAuthorization( 597 service->RequestAuthorization(
569 web_ui()->GetWebContents(), 598 web_ui()->GetWebContents(),
570 base::Bind(&ExtensionSettingsHandler::PassphraseDialogCallback, 599 base::Bind(&ExtensionSettingsHandler::PassphraseDialogCallback,
571 base::Unretained(this))); 600 base::Unretained(this)));
572 } else { 601 } else {
573 service->SetElevated(false); 602 ManagedModeNavigationObserver* observer =
603 ManagedModeNavigationObserver::FromWebContents(
604 web_ui()->GetWebContents());
605 observer->set_elevated(false);
574 HandleRequestExtensionsData(NULL); 606 HandleRequestExtensionsData(NULL);
575 } 607 }
576 } 608 }
577 609
610 bool ExtensionSettingsHandler::CheckUserMayModifySettings(
611 const Extension* extension) {
612 ManagedUserService* service = ManagedUserServiceFactory::GetForProfile(
613 Profile::FromWebUI(web_ui()));
614 scoped_ptr<ScopedExtensionElevation> elevation;
615 if (service->ProfileIsManaged() &&
616 service->IsElevatedForWebContents(web_ui()->GetWebContents())) {
617 elevation.reset(new ScopedExtensionElevation(service, extension->id()));
618 }
619 return management_policy_->UserMayModifySettings(extension, NULL);
620 }
621
578 void ExtensionSettingsHandler::HandleRequestExtensionsData( 622 void ExtensionSettingsHandler::HandleRequestExtensionsData(
579 const ListValue* args) { 623 const ListValue* args) {
580 DictionaryValue results; 624 DictionaryValue results;
581 625
582 Profile* profile = Profile::FromWebUI(web_ui()); 626 Profile* profile = Profile::FromWebUI(web_ui());
583 627
584 // Add the extensions to the results structure. 628 // Add the extensions to the results structure.
585 ListValue *extensions_list = new ListValue(); 629 ListValue *extensions_list = new ListValue();
586 630
587 extensions::ExtensionWarningService* warnings = 631 extensions::ExtensionWarningService* warnings =
(...skipping 29 matching lines...) Expand all
617 empty_pages, // Terminated process has no active pages. 661 empty_pages, // Terminated process has no active pages.
618 warnings)); 662 warnings));
619 } 663 }
620 } 664 }
621 results.Set("extensions", extensions_list); 665 results.Set("extensions", extensions_list);
622 666
623 ManagedUserService* service = 667 ManagedUserService* service =
624 ManagedUserServiceFactory::GetForProfile(profile); 668 ManagedUserServiceFactory::GetForProfile(profile);
625 669
626 bool is_managed = service->ProfileIsManaged(); 670 bool is_managed = service->ProfileIsManaged();
627 bool is_elevated = service->IsElevated(); 671 bool is_elevated =
672 service->IsElevatedForWebContents(web_ui()->GetWebContents());
628 bool developer_mode = 673 bool developer_mode =
629 (!is_managed || is_elevated) && 674 (!is_managed || is_elevated) &&
630 profile->GetPrefs()->GetBoolean(prefs::kExtensionsUIDeveloperMode); 675 profile->GetPrefs()->GetBoolean(prefs::kExtensionsUIDeveloperMode);
631 results.SetBoolean("profileIsManaged", is_managed); 676 results.SetBoolean("profileIsManaged", is_managed);
632 results.SetBoolean("profileIsElevated", is_elevated); 677 results.SetBoolean("profileIsElevated", is_elevated);
633 results.SetBoolean("developerMode", developer_mode); 678 results.SetBoolean("developerMode", developer_mode);
634 679
635 // Check to see if we have any wiped out extensions. 680 // Check to see if we have any wiped out extensions.
636 ExtensionService* extension_service = 681 ExtensionService* extension_service =
637 extensions::ExtensionSystem::Get(profile)->extension_service(); 682 extensions::ExtensionSystem::Get(profile)->extension_service();
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 } 773 }
729 774
730 void ExtensionSettingsHandler::HandleEnableMessage(const ListValue* args) { 775 void ExtensionSettingsHandler::HandleEnableMessage(const ListValue* args) {
731 CHECK_EQ(2U, args->GetSize()); 776 CHECK_EQ(2U, args->GetSize());
732 std::string extension_id, enable_str; 777 std::string extension_id, enable_str;
733 CHECK(args->GetString(0, &extension_id)); 778 CHECK(args->GetString(0, &extension_id));
734 CHECK(args->GetString(1, &enable_str)); 779 CHECK(args->GetString(1, &enable_str));
735 780
736 const Extension* extension = 781 const Extension* extension =
737 extension_service_->GetInstalledExtension(extension_id); 782 extension_service_->GetInstalledExtension(extension_id);
738 if (!extension || 783 if (!extension || !CheckUserMayModifySettings(extension)) {
739 !management_policy_->UserMayModifySettings(extension, NULL)) {
740 LOG(ERROR) << "Attempt to enable an extension that is non-usermanagable was" 784 LOG(ERROR) << "Attempt to enable an extension that is non-usermanagable was"
741 << "made. Extension id: " << extension->id(); 785 << "made. Extension id: " << extension->id();
742 return; 786 return;
743 } 787 }
744 788
745 if (enable_str == "true") { 789 if (enable_str == "true") {
746 extensions::ExtensionPrefs* prefs = extension_service_->extension_prefs(); 790 extensions::ExtensionPrefs* prefs = extension_service_->extension_prefs();
747 if (prefs->DidExtensionEscalatePermissions(extension_id)) { 791 if (prefs->DidExtensionEscalatePermissions(extension_id)) {
748 extensions::ShowExtensionDisabledDialog( 792 extensions::ShowExtensionDisabledDialog(
749 extension_service_, web_ui()->GetWebContents(), extension); 793 extension_service_, web_ui()->GetWebContents(), extension);
750 } else if ((prefs->GetDisableReasons(extension_id) & 794 } else if ((prefs->GetDisableReasons(extension_id) &
751 Extension::DISABLE_UNSUPPORTED_REQUIREMENT) && 795 Extension::DISABLE_UNSUPPORTED_REQUIREMENT) &&
752 !requirements_checker_.get()) { 796 !requirements_checker_.get()) {
753 // Recheck the requirements. 797 // Recheck the requirements.
754 scoped_refptr<const Extension> extension = 798 scoped_refptr<const Extension> extension =
755 extension_service_->GetExtensionById(extension_id, 799 extension_service_->GetExtensionById(extension_id,
756 true /* include disabled */); 800 true /* include disabled */);
757 requirements_checker_.reset(new extensions::RequirementsChecker()); 801 requirements_checker_.reset(new extensions::RequirementsChecker());
758 requirements_checker_->Check( 802 requirements_checker_->Check(
759 extension, 803 extension,
760 base::Bind(&ExtensionSettingsHandler::OnRequirementsChecked, 804 base::Bind(&ExtensionSettingsHandler::OnRequirementsChecked,
761 AsWeakPtr(), extension_id)); 805 AsWeakPtr(), extension_id));
762 } else { 806 } else {
763 extension_service_->EnableExtension(extension_id); 807 extension_service_->EnableExtension(extension_id);
764 808
765 // Make sure any browser action contained within it is not hidden. 809 // Make sure any browser action contained within it is not hidden.
766 prefs->SetBrowserActionVisibility(extension, true); 810 prefs->SetBrowserActionVisibility(extension, true);
767 } 811 }
768 } else { 812 } else {
813 ManagedUserService* service = ManagedUserServiceFactory::GetForProfile(
814 Profile::FromWebUI(web_ui()));
815 scoped_ptr<ScopedExtensionElevation> elevation;
816 if (service->ProfileIsManaged() &&
817 service->IsElevatedForWebContents(web_ui()->GetWebContents())) {
818 elevation.reset(new ScopedExtensionElevation(service, extension_id));
819 }
769 extension_service_->DisableExtension( 820 extension_service_->DisableExtension(
770 extension_id, Extension::DISABLE_USER_ACTION); 821 extension_id, Extension::DISABLE_USER_ACTION);
771 } 822 }
772 } 823 }
773 824
774 void ExtensionSettingsHandler::HandleEnableIncognitoMessage( 825 void ExtensionSettingsHandler::HandleEnableIncognitoMessage(
775 const ListValue* args) { 826 const ListValue* args) {
776 CHECK_EQ(2U, args->GetSize()); 827 CHECK_EQ(2U, args->GetSize());
777 std::string extension_id, enable_str; 828 std::string extension_id, enable_str;
778 CHECK(args->GetString(0, &extension_id)); 829 CHECK(args->GetString(0, &extension_id));
(...skipping 24 matching lines...) Expand all
803 const ListValue* args) { 854 const ListValue* args) {
804 CHECK_EQ(2U, args->GetSize()); 855 CHECK_EQ(2U, args->GetSize());
805 std::string extension_id, allow_str; 856 std::string extension_id, allow_str;
806 CHECK(args->GetString(0, &extension_id)); 857 CHECK(args->GetString(0, &extension_id));
807 CHECK(args->GetString(1, &allow_str)); 858 CHECK(args->GetString(1, &allow_str));
808 const Extension* extension = 859 const Extension* extension =
809 extension_service_->GetInstalledExtension(extension_id); 860 extension_service_->GetInstalledExtension(extension_id);
810 if (!extension) 861 if (!extension)
811 return; 862 return;
812 863
813 if (!management_policy_->UserMayModifySettings(extension, NULL)) { 864 if (!CheckUserMayModifySettings(extension)) {
814 LOG(ERROR) << "Attempt to change allow file access of an extension that is " 865 LOG(ERROR) << "Attempt to change allow file access of an extension that is "
815 << "non-usermanagable was made. Extension id : " 866 << "non-usermanagable was made. Extension id : "
816 << extension->id(); 867 << extension->id();
817 return; 868 return;
818 } 869 }
819 870
820 extension_service_->SetAllowFileAccess(extension, allow_str == "true"); 871 extension_service_->SetAllowFileAccess(extension, allow_str == "true");
821 } 872 }
822 873
823 void ExtensionSettingsHandler::HandleUninstallMessage(const ListValue* args) { 874 void ExtensionSettingsHandler::HandleUninstallMessage(const ListValue* args) {
824 CHECK_EQ(1U, args->GetSize()); 875 CHECK_EQ(1U, args->GetSize());
825 std::string extension_id; 876 std::string extension_id;
826 CHECK(args->GetString(0, &extension_id)); 877 CHECK(args->GetString(0, &extension_id));
827 const Extension* extension = 878 const Extension* extension =
828 extension_service_->GetInstalledExtension(extension_id); 879 extension_service_->GetInstalledExtension(extension_id);
829 if (!extension) 880 if (!extension)
830 return; 881 return;
831 882
832 if (!management_policy_->UserMayModifySettings(extension, NULL)) { 883 if (!CheckUserMayModifySettings(extension)) {
833 LOG(ERROR) << "Attempt to uninstall an extension that is non-usermanagable " 884 LOG(ERROR) << "Attempt to uninstall an extension that is non-usermanagable "
834 << "was made. Extension id : " << extension->id(); 885 << "was made. Extension id : " << extension->id();
835 return; 886 return;
836 } 887 }
837 888
838 if (!extension_id_prompting_.empty()) 889 if (!extension_id_prompting_.empty())
839 return; // Only one prompt at a time. 890 return; // Only one prompt at a time.
840 891
841 extension_id_prompting_ = extension_id; 892 extension_id_prompting_ = extension_id;
842 893
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
1077 std::vector<std::string> requirement_errors) { 1128 std::vector<std::string> requirement_errors) {
1078 if (requirement_errors.empty()) { 1129 if (requirement_errors.empty()) {
1079 extension_service_->EnableExtension(extension_id); 1130 extension_service_->EnableExtension(extension_id);
1080 } else { 1131 } else {
1081 ExtensionErrorReporter::GetInstance()->ReportError( 1132 ExtensionErrorReporter::GetInstance()->ReportError(
1082 UTF8ToUTF16(JoinString(requirement_errors, ' ')), 1133 UTF8ToUTF16(JoinString(requirement_errors, ' ')),
1083 true /* be noisy */); 1134 true /* be noisy */);
1084 } 1135 }
1085 requirements_checker_.reset(); 1136 requirements_checker_.reset();
1086 } 1137 }
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