| Index: chrome/browser/supervised_user/supervised_user_service.cc
|
| diff --git a/chrome/browser/supervised_user/supervised_user_service.cc b/chrome/browser/supervised_user/supervised_user_service.cc
|
| index fc2a174662bf2708e67875592c0a57711ee90635..23d7c9166f19519471346a849fabb816ee943a3e 100644
|
| --- a/chrome/browser/supervised_user/supervised_user_service.cc
|
| +++ b/chrome/browser/supervised_user/supervised_user_service.cc
|
| @@ -83,6 +83,42 @@ const char* const kCustodianInfoPrefs[] = {
|
| prefs::kSupervisedUserSecondCustodianProfileURL,
|
| };
|
|
|
| +#if defined(ENABLE_EXTENSIONS)
|
| +enum ExtensionState {
|
| + EXTENSION_FORCED,
|
| + EXTENSION_BLOCKED,
|
| + EXTENSION_ALLOWED
|
| +};
|
| +
|
| +ExtensionState GetExtensionState(const extensions::Extension* extension) {
|
| + if (extension->is_theme())
|
| + return EXTENSION_ALLOWED;
|
| +
|
| + bool was_installed_by_default = extension->was_installed_by_default();
|
| + bool was_installed_by_custodian = extension->was_installed_by_custodian();
|
| +#if defined(OS_CHROMEOS)
|
| + // On Chrome OS all external sources are controlled by us so it means that
|
| + // they are "default". Method was_installed_by_default returns false because
|
| + // extensions creation flags are ignored in case of default extensions with
|
| + // update URL(the flags aren't passed to OnExternalExtensionUpdateUrlFound).
|
| + // TODO(dpolukhin): remove this Chrome OS specific code as soon as creation
|
| + // flags are not ignored.
|
| + was_installed_by_default =
|
| + extensions::Manifest::IsExternalLocation(extension->location());
|
| +#endif
|
| + if (extensions::Manifest::IsComponentLocation(extension->location()) ||
|
| + was_installed_by_default ||
|
| + was_installed_by_custodian) {
|
| + // Enforce default extensions as well as custodian-installed extensions
|
| + // (if we'd allow the supervised user to uninstall them, there'd be no way
|
| + // to get them back).
|
| + return EXTENSION_FORCED;
|
| + }
|
| +
|
| + return EXTENSION_BLOCKED;
|
| +}
|
| +#endif
|
| +
|
| } // namespace
|
|
|
| base::FilePath SupervisedUserService::Delegate::GetBlacklistPath() const {
|
| @@ -349,54 +385,6 @@ void SupervisedUserService::AddPermissionRequestCreator(
|
| permissions_creators_.push_back(creator.release());
|
| }
|
|
|
| -#if defined(ENABLE_EXTENSIONS)
|
| -std::string SupervisedUserService::GetDebugPolicyProviderName() const {
|
| - // Save the string space in official builds.
|
| -#ifdef NDEBUG
|
| - NOTREACHED();
|
| - return std::string();
|
| -#else
|
| - return "Supervised User Service";
|
| -#endif
|
| -}
|
| -
|
| -bool SupervisedUserService::UserMayLoad(const extensions::Extension* extension,
|
| - base::string16* error) const {
|
| - base::string16 tmp_error;
|
| - if (ExtensionManagementPolicyImpl(extension, &tmp_error))
|
| - return true;
|
| -
|
| - bool was_installed_by_default = extension->was_installed_by_default();
|
| - bool was_installed_by_custodian = extension->was_installed_by_custodian();
|
| -#if defined(OS_CHROMEOS)
|
| - // On Chrome OS all external sources are controlled by us so it means that
|
| - // they are "default". Method was_installed_by_default returns false because
|
| - // extensions creation flags are ignored in case of default extensions with
|
| - // update URL(the flags aren't passed to OnExternalExtensionUpdateUrlFound).
|
| - // TODO(dpolukhin): remove this Chrome OS specific code as soon as creation
|
| - // flags are not ignored.
|
| - was_installed_by_default =
|
| - extensions::Manifest::IsExternalLocation(extension->location());
|
| -#endif
|
| - if (extensions::Manifest::IsComponentLocation(extension->location()) ||
|
| - was_installed_by_default ||
|
| - was_installed_by_custodian) {
|
| - return true;
|
| - }
|
| -
|
| - if (error)
|
| - *error = tmp_error;
|
| - return false;
|
| -}
|
| -
|
| -bool SupervisedUserService::UserMayModifySettings(
|
| - const extensions::Extension* extension,
|
| - base::string16* error) const {
|
| - return ExtensionManagementPolicyImpl(extension, error);
|
| -}
|
| -
|
| -#endif // defined(ENABLE_EXTENSIONS)
|
| -
|
| syncer::ModelTypeSet SupervisedUserService::GetPreferredDataTypes() const {
|
| if (!ProfileIsSupervised())
|
| return syncer::ModelTypeSet();
|
| @@ -486,16 +474,38 @@ void SupervisedUserService::FinishSetupSync() {
|
| }
|
|
|
| #if defined(ENABLE_EXTENSIONS)
|
| -bool SupervisedUserService::ExtensionManagementPolicyImpl(
|
| +std::string SupervisedUserService::GetDebugPolicyProviderName() const {
|
| + // Save the string space in official builds.
|
| +#ifdef NDEBUG
|
| + NOTREACHED();
|
| + return std::string();
|
| +#else
|
| + return "Supervised User Service";
|
| +#endif
|
| +}
|
| +
|
| +bool SupervisedUserService::UserMayLoad(const extensions::Extension* extension,
|
| + base::string16* error) const {
|
| + DCHECK(ProfileIsSupervised());
|
| + ExtensionState result = GetExtensionState(extension);
|
| + bool may_load = (result != EXTENSION_BLOCKED);
|
| + if (!may_load && error)
|
| + *error = l10n_util::GetStringUTF16(IDS_EXTENSIONS_LOCKED_SUPERVISED_USER);
|
| + return may_load;
|
| +}
|
| +
|
| +// Note: Having MustRemainInstalled always say "true" for custodian-installed
|
| +// extensions does NOT prevent remote uninstalls (which is a bit unexpected, but
|
| +// exactly what we want).
|
| +bool SupervisedUserService::MustRemainInstalled(
|
| const extensions::Extension* extension,
|
| base::string16* error) const {
|
| - // |extension| can be NULL in unit_tests.
|
| - if (!ProfileIsSupervised() || (extension && extension->is_theme()))
|
| - return true;
|
| -
|
| - if (error)
|
| + DCHECK(ProfileIsSupervised());
|
| + ExtensionState result = GetExtensionState(extension);
|
| + bool may_not_uninstall = (result == EXTENSION_FORCED);
|
| + if (may_not_uninstall && error)
|
| *error = l10n_util::GetStringUTF16(IDS_EXTENSIONS_LOCKED_SUPERVISED_USER);
|
| - return false;
|
| + return may_not_uninstall;
|
| }
|
|
|
| void SupervisedUserService::SetExtensionsActive() {
|
|
|