OLD | NEW |
---|---|
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 Loading... | |
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" |
38 #include "chrome/browser/managed_mode/scoped_extension_elevation.h" | |
37 #include "chrome/browser/profiles/profile.h" | 39 #include "chrome/browser/profiles/profile.h" |
38 #include "chrome/browser/tab_contents/background_contents.h" | 40 #include "chrome/browser/tab_contents/background_contents.h" |
39 #include "chrome/browser/ui/browser_finder.h" | 41 #include "chrome/browser/ui/browser_finder.h" |
40 #include "chrome/browser/ui/chrome_select_file_policy.h" | 42 #include "chrome/browser/ui/chrome_select_file_policy.h" |
41 #include "chrome/browser/ui/extensions/application_launch.h" | 43 #include "chrome/browser/ui/extensions/application_launch.h" |
42 #include "chrome/browser/ui/extensions/shell_window.h" | 44 #include "chrome/browser/ui/extensions/shell_window.h" |
43 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" | 45 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" |
44 #include "chrome/browser/view_type_utils.h" | 46 #include "chrome/browser/view_type_utils.h" |
45 #include "chrome/common/chrome_notification_types.h" | 47 #include "chrome/common/chrome_notification_types.h" |
46 #include "chrome/common/chrome_switches.h" | 48 #include "chrome/common/chrome_switches.h" |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
124 | 126 |
125 DictionaryValue* ExtensionSettingsHandler::CreateExtensionDetailValue( | 127 DictionaryValue* ExtensionSettingsHandler::CreateExtensionDetailValue( |
126 const Extension* extension, | 128 const Extension* extension, |
127 const std::vector<ExtensionPage>& pages, | 129 const std::vector<ExtensionPage>& pages, |
128 const extensions::ExtensionWarningService* warning_service) { | 130 const extensions::ExtensionWarningService* warning_service) { |
129 DictionaryValue* extension_data = new DictionaryValue(); | 131 DictionaryValue* extension_data = new DictionaryValue(); |
130 bool enabled = extension_service_->IsExtensionEnabled(extension->id()); | 132 bool enabled = extension_service_->IsExtensionEnabled(extension->id()); |
131 extension->GetBasicInfo(enabled, extension_data); | 133 extension->GetBasicInfo(enabled, extension_data); |
132 | 134 |
133 extension_data->SetBoolean("userModifiable", | 135 extension_data->SetBoolean("userModifiable", |
134 management_policy_->UserMayModifySettings(extension, NULL)); | 136 CheckUserMayModifySettings(extension)); |
135 | 137 |
136 GURL icon = | 138 GURL icon = |
137 ExtensionIconSource::GetIconURL(extension, | 139 ExtensionIconSource::GetIconURL(extension, |
138 extension_misc::EXTENSION_ICON_MEDIUM, | 140 extension_misc::EXTENSION_ICON_MEDIUM, |
139 ExtensionIconSet::MATCH_BIGGER, | 141 ExtensionIconSet::MATCH_BIGGER, |
140 !enabled, NULL); | 142 !enabled, NULL); |
141 if (Manifest::IsUnpackedLocation(extension->location())) | 143 if (Manifest::IsUnpackedLocation(extension->location())) |
142 extension_data->SetString("path", extension->path().value()); | 144 extension_data->SetString("path", extension->path().value()); |
143 extension_data->SetString("icon", icon.spec()); | 145 extension_data->SetString("icon", icon.spec()); |
144 extension_data->SetBoolean("isUnpacked", | 146 extension_data->SetBoolean("isUnpacked", |
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
547 | 549 |
548 for (std::vector<const Extension*>::iterator iter = | 550 for (std::vector<const Extension*>::iterator iter = |
549 unpacked_extensions.begin(); iter != unpacked_extensions.end(); ++iter) { | 551 unpacked_extensions.begin(); iter != unpacked_extensions.end(); ++iter) { |
550 extension_service_->ReloadExtension((*iter)->id()); | 552 extension_service_->ReloadExtension((*iter)->id()); |
551 } | 553 } |
552 } | 554 } |
553 | 555 |
554 void ExtensionSettingsHandler::PassphraseDialogCallback(bool success) { | 556 void ExtensionSettingsHandler::PassphraseDialogCallback(bool success) { |
555 if (!success) | 557 if (!success) |
556 return; | 558 return; |
557 Profile* profile = Profile::FromWebUI(web_ui()); | 559 ManagedModeNavigationObserver* observer = |
558 ManagedUserServiceFactory::GetForProfile(profile)->SetElevated(true); | 560 ManagedModeNavigationObserver::FromWebContents( |
561 web_ui()->GetWebContents()); | |
562 observer->set_elevated(true); | |
559 HandleRequestExtensionsData(NULL); | 563 HandleRequestExtensionsData(NULL); |
560 } | 564 } |
561 | 565 |
562 void ExtensionSettingsHandler::ManagedUserSetElevated(const ListValue* args) { | 566 void ExtensionSettingsHandler::ManagedUserSetElevated(const ListValue* args) { |
563 ManagedUserService* service = ManagedUserServiceFactory::GetForProfile( | 567 ManagedUserService* service = ManagedUserServiceFactory::GetForProfile( |
564 Profile::FromWebUI(web_ui())); | 568 Profile::FromWebUI(web_ui())); |
565 bool elevated; | 569 bool elevated; |
566 CHECK(args->GetBoolean(0, &elevated)); | 570 CHECK(args->GetBoolean(0, &elevated)); |
567 if (elevated) { | 571 if (elevated) { |
568 service->RequestAuthorization( | 572 service->RequestAuthorization( |
569 web_ui()->GetWebContents(), | 573 web_ui()->GetWebContents(), |
570 base::Bind(&ExtensionSettingsHandler::PassphraseDialogCallback, | 574 base::Bind(&ExtensionSettingsHandler::PassphraseDialogCallback, |
571 base::Unretained(this))); | 575 base::Unretained(this))); |
572 } else { | 576 } else { |
573 service->SetElevated(false); | 577 ManagedModeNavigationObserver* observer = |
578 ManagedModeNavigationObserver::FromWebContents( | |
579 web_ui()->GetWebContents()); | |
580 observer->set_elevated(false); | |
574 HandleRequestExtensionsData(NULL); | 581 HandleRequestExtensionsData(NULL); |
575 } | 582 } |
576 } | 583 } |
577 | 584 |
585 bool ExtensionSettingsHandler::CheckUserMayModifySettings( | |
586 const Extension* extension) { | |
587 ManagedUserService* service = ManagedUserServiceFactory::GetForProfile( | |
588 Profile::FromWebUI(web_ui())); | |
589 ScopedExtensionElevation elevation(service); | |
590 if (service->ProfileIsManaged() && | |
591 service->IsElevatedForWebContents(web_ui()->GetWebContents())) { | |
592 elevation.AddExtension(extension->id()); | |
593 } | |
594 return management_policy_->UserMayModifySettings(extension, NULL); | |
595 } | |
596 | |
578 void ExtensionSettingsHandler::HandleRequestExtensionsData( | 597 void ExtensionSettingsHandler::HandleRequestExtensionsData( |
579 const ListValue* args) { | 598 const ListValue* args) { |
580 DictionaryValue results; | 599 DictionaryValue results; |
581 | 600 |
582 Profile* profile = Profile::FromWebUI(web_ui()); | 601 Profile* profile = Profile::FromWebUI(web_ui()); |
583 | 602 |
584 // Add the extensions to the results structure. | 603 // Add the extensions to the results structure. |
585 ListValue *extensions_list = new ListValue(); | 604 ListValue *extensions_list = new ListValue(); |
586 | 605 |
587 extensions::ExtensionWarningService* warnings = | 606 extensions::ExtensionWarningService* warnings = |
(...skipping 29 matching lines...) Expand all Loading... | |
617 empty_pages, // Terminated process has no active pages. | 636 empty_pages, // Terminated process has no active pages. |
618 warnings)); | 637 warnings)); |
619 } | 638 } |
620 } | 639 } |
621 results.Set("extensions", extensions_list); | 640 results.Set("extensions", extensions_list); |
622 | 641 |
623 ManagedUserService* service = | 642 ManagedUserService* service = |
624 ManagedUserServiceFactory::GetForProfile(profile); | 643 ManagedUserServiceFactory::GetForProfile(profile); |
625 | 644 |
626 bool is_managed = service->ProfileIsManaged(); | 645 bool is_managed = service->ProfileIsManaged(); |
627 bool is_elevated = service->IsElevated(); | 646 bool is_elevated = |
647 service->IsElevatedForWebContents(web_ui()->GetWebContents()); | |
628 bool developer_mode = | 648 bool developer_mode = |
629 (!is_managed || is_elevated) && | 649 (!is_managed || is_elevated) && |
630 profile->GetPrefs()->GetBoolean(prefs::kExtensionsUIDeveloperMode); | 650 profile->GetPrefs()->GetBoolean(prefs::kExtensionsUIDeveloperMode); |
631 results.SetBoolean("profileIsManaged", is_managed); | 651 results.SetBoolean("profileIsManaged", is_managed); |
632 results.SetBoolean("profileIsElevated", is_elevated); | 652 results.SetBoolean("profileIsElevated", is_elevated); |
633 results.SetBoolean("developerMode", developer_mode); | 653 results.SetBoolean("developerMode", developer_mode); |
634 | 654 |
635 // Check to see if we have any wiped out extensions. | 655 // Check to see if we have any wiped out extensions. |
636 ExtensionService* extension_service = | 656 ExtensionService* extension_service = |
637 extensions::ExtensionSystem::Get(profile)->extension_service(); | 657 extensions::ExtensionSystem::Get(profile)->extension_service(); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
728 } | 748 } |
729 | 749 |
730 void ExtensionSettingsHandler::HandleEnableMessage(const ListValue* args) { | 750 void ExtensionSettingsHandler::HandleEnableMessage(const ListValue* args) { |
731 CHECK_EQ(2U, args->GetSize()); | 751 CHECK_EQ(2U, args->GetSize()); |
732 std::string extension_id, enable_str; | 752 std::string extension_id, enable_str; |
733 CHECK(args->GetString(0, &extension_id)); | 753 CHECK(args->GetString(0, &extension_id)); |
734 CHECK(args->GetString(1, &enable_str)); | 754 CHECK(args->GetString(1, &enable_str)); |
735 | 755 |
736 const Extension* extension = | 756 const Extension* extension = |
737 extension_service_->GetInstalledExtension(extension_id); | 757 extension_service_->GetInstalledExtension(extension_id); |
738 if (!extension || | 758 if (!extension || !CheckUserMayModifySettings(extension)) { |
739 !management_policy_->UserMayModifySettings(extension, NULL)) { | |
740 LOG(ERROR) << "Attempt to enable an extension that is non-usermanagable was" | 759 LOG(ERROR) << "Attempt to enable an extension that is non-usermanagable was" |
741 << "made. Extension id: " << extension->id(); | 760 << "made. Extension id: " << extension->id(); |
742 return; | 761 return; |
743 } | 762 } |
744 | 763 |
745 if (enable_str == "true") { | 764 if (enable_str == "true") { |
746 extensions::ExtensionPrefs* prefs = extension_service_->extension_prefs(); | 765 extensions::ExtensionPrefs* prefs = extension_service_->extension_prefs(); |
747 if (prefs->DidExtensionEscalatePermissions(extension_id)) { | 766 if (prefs->DidExtensionEscalatePermissions(extension_id)) { |
748 extensions::ShowExtensionDisabledDialog( | 767 extensions::ShowExtensionDisabledDialog( |
749 extension_service_, web_ui()->GetWebContents(), extension); | 768 extension_service_, web_ui()->GetWebContents(), extension); |
750 } else if ((prefs->GetDisableReasons(extension_id) & | 769 } else if ((prefs->GetDisableReasons(extension_id) & |
751 Extension::DISABLE_UNSUPPORTED_REQUIREMENT) && | 770 Extension::DISABLE_UNSUPPORTED_REQUIREMENT) && |
752 !requirements_checker_.get()) { | 771 !requirements_checker_.get()) { |
753 // Recheck the requirements. | 772 // Recheck the requirements. |
754 scoped_refptr<const Extension> extension = | 773 scoped_refptr<const Extension> extension = |
755 extension_service_->GetExtensionById(extension_id, | 774 extension_service_->GetExtensionById(extension_id, |
756 true /* include disabled */); | 775 true /* include disabled */); |
757 requirements_checker_.reset(new extensions::RequirementsChecker()); | 776 requirements_checker_.reset(new extensions::RequirementsChecker()); |
758 requirements_checker_->Check( | 777 requirements_checker_->Check( |
759 extension, | 778 extension, |
760 base::Bind(&ExtensionSettingsHandler::OnRequirementsChecked, | 779 base::Bind(&ExtensionSettingsHandler::OnRequirementsChecked, |
761 AsWeakPtr(), extension_id)); | 780 AsWeakPtr(), extension_id)); |
762 } else { | 781 } else { |
763 extension_service_->EnableExtension(extension_id); | 782 extension_service_->EnableExtension(extension_id); |
764 | 783 |
765 // Make sure any browser action contained within it is not hidden. | 784 // Make sure any browser action contained within it is not hidden. |
766 prefs->SetBrowserActionVisibility(extension, true); | 785 prefs->SetBrowserActionVisibility(extension, true); |
767 } | 786 } |
768 } else { | 787 } else { |
788 ManagedUserService* service = ManagedUserServiceFactory::GetForProfile( | |
James Hawkins
2013/04/02 16:03:39
This looks identical to the code block starting on
Adrian Kuegel
2013/04/02 16:44:30
Done.
| |
789 Profile::FromWebUI(web_ui())); | |
790 ScopedExtensionElevation elevation(service); | |
791 if (service->ProfileIsManaged() && | |
792 service->IsElevatedForWebContents(web_ui()->GetWebContents())) { | |
793 elevation.AddExtension(extension_id); | |
794 } | |
769 extension_service_->DisableExtension( | 795 extension_service_->DisableExtension( |
770 extension_id, Extension::DISABLE_USER_ACTION); | 796 extension_id, Extension::DISABLE_USER_ACTION); |
771 } | 797 } |
772 } | 798 } |
773 | 799 |
774 void ExtensionSettingsHandler::HandleEnableIncognitoMessage( | 800 void ExtensionSettingsHandler::HandleEnableIncognitoMessage( |
775 const ListValue* args) { | 801 const ListValue* args) { |
776 CHECK_EQ(2U, args->GetSize()); | 802 CHECK_EQ(2U, args->GetSize()); |
777 std::string extension_id, enable_str; | 803 std::string extension_id, enable_str; |
778 CHECK(args->GetString(0, &extension_id)); | 804 CHECK(args->GetString(0, &extension_id)); |
(...skipping 24 matching lines...) Expand all Loading... | |
803 const ListValue* args) { | 829 const ListValue* args) { |
804 CHECK_EQ(2U, args->GetSize()); | 830 CHECK_EQ(2U, args->GetSize()); |
805 std::string extension_id, allow_str; | 831 std::string extension_id, allow_str; |
806 CHECK(args->GetString(0, &extension_id)); | 832 CHECK(args->GetString(0, &extension_id)); |
807 CHECK(args->GetString(1, &allow_str)); | 833 CHECK(args->GetString(1, &allow_str)); |
808 const Extension* extension = | 834 const Extension* extension = |
809 extension_service_->GetInstalledExtension(extension_id); | 835 extension_service_->GetInstalledExtension(extension_id); |
810 if (!extension) | 836 if (!extension) |
811 return; | 837 return; |
812 | 838 |
813 if (!management_policy_->UserMayModifySettings(extension, NULL)) { | 839 if (!CheckUserMayModifySettings(extension)) { |
814 LOG(ERROR) << "Attempt to change allow file access of an extension that is " | 840 LOG(ERROR) << "Attempt to change allow file access of an extension that is " |
815 << "non-usermanagable was made. Extension id : " | 841 << "non-usermanagable was made. Extension id : " |
816 << extension->id(); | 842 << extension->id(); |
817 return; | 843 return; |
818 } | 844 } |
819 | 845 |
820 extension_service_->SetAllowFileAccess(extension, allow_str == "true"); | 846 extension_service_->SetAllowFileAccess(extension, allow_str == "true"); |
821 } | 847 } |
822 | 848 |
823 void ExtensionSettingsHandler::HandleUninstallMessage(const ListValue* args) { | 849 void ExtensionSettingsHandler::HandleUninstallMessage(const ListValue* args) { |
824 CHECK_EQ(1U, args->GetSize()); | 850 CHECK_EQ(1U, args->GetSize()); |
825 std::string extension_id; | 851 std::string extension_id; |
826 CHECK(args->GetString(0, &extension_id)); | 852 CHECK(args->GetString(0, &extension_id)); |
827 const Extension* extension = | 853 const Extension* extension = |
828 extension_service_->GetInstalledExtension(extension_id); | 854 extension_service_->GetInstalledExtension(extension_id); |
829 if (!extension) | 855 if (!extension) |
830 return; | 856 return; |
831 | 857 |
832 if (!management_policy_->UserMayModifySettings(extension, NULL)) { | 858 if (!CheckUserMayModifySettings(extension)) { |
833 LOG(ERROR) << "Attempt to uninstall an extension that is non-usermanagable " | 859 LOG(ERROR) << "Attempt to uninstall an extension that is non-usermanagable " |
834 << "was made. Extension id : " << extension->id(); | 860 << "was made. Extension id : " << extension->id(); |
835 return; | 861 return; |
836 } | 862 } |
837 | 863 |
838 if (!extension_id_prompting_.empty()) | 864 if (!extension_id_prompting_.empty()) |
839 return; // Only one prompt at a time. | 865 return; // Only one prompt at a time. |
840 | 866 |
841 extension_id_prompting_ = extension_id; | 867 extension_id_prompting_ = extension_id; |
842 | 868 |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1077 std::vector<std::string> requirement_errors) { | 1103 std::vector<std::string> requirement_errors) { |
1078 if (requirement_errors.empty()) { | 1104 if (requirement_errors.empty()) { |
1079 extension_service_->EnableExtension(extension_id); | 1105 extension_service_->EnableExtension(extension_id); |
1080 } else { | 1106 } else { |
1081 ExtensionErrorReporter::GetInstance()->ReportError( | 1107 ExtensionErrorReporter::GetInstance()->ReportError( |
1082 UTF8ToUTF16(JoinString(requirement_errors, ' ')), | 1108 UTF8ToUTF16(JoinString(requirement_errors, ' ')), |
1083 true /* be noisy */); | 1109 true /* be noisy */); |
1084 } | 1110 } |
1085 requirements_checker_.reset(); | 1111 requirements_checker_.reset(); |
1086 } | 1112 } |
OLD | NEW |