#include "base/logging.h"
#include "base/memory/linked_ptr.h"
#include "base/metrics/field_trial.h"
-#include "base/path_service.h"
#include "base/strings/string_util.h"
#include "base/values.h"
#include "base/version.h"
#include "chrome/browser/app_mode/app_mode_utils.h"
#include "chrome/browser/browser_process.h"
+#include "chrome/browser/extensions/extension_management.h"
#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_system.h"
#include "chrome/browser/extensions/external_component_loader.h"
#include "chrome/browser/extensions/external_policy_loader.h"
#include "chrome/browser/extensions/external_pref_loader.h"
-#include "chrome/browser/extensions/external_provider_interface.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
-#include "chrome/common/extensions/extension.h"
-#include "chrome/common/pref_names.h"
+#include "components/crx_file/id_util.h"
#include "content/public/browser/browser_thread.h"
+#include "extensions/browser/extension_system.h"
+#include "extensions/browser/external_provider_interface.h"
+#include "extensions/common/extension.h"
#include "extensions/common/manifest.h"
#include "ui/base/l10n/l10n_util.h"
#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
+#include "chrome/browser/chromeos/customization_document.h"
#include "chrome/browser/chromeos/extensions/device_local_account_external_policy_loader.h"
-#include "chrome/browser/chromeos/extensions/external_pref_cache_loader.h"
-#include "chrome/browser/chromeos/login/user.h"
-#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/chromeos/policy/app_pack_updater.h"
+#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/browser/chromeos/policy/device_local_account.h"
#include "chrome/browser/chromeos/policy/device_local_account_policy_service.h"
-#include "chrome/browser/policy/browser_policy_connector.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "components/user_manager/user.h"
+#include "components/user_manager/user_manager.h"
#else
#include "chrome/browser/extensions/default_apps.h"
#endif
namespace extensions {
// Constants for keeping track of extension preferences in a dictionary.
+const char ExternalProviderImpl::kInstallParam[] = "install_parameter";
const char ExternalProviderImpl::kExternalCrx[] = "external_crx";
const char ExternalProviderImpl::kExternalVersion[] = "external_version";
const char ExternalProviderImpl::kExternalUpdateUrl[] = "external_update_url";
-const char ExternalProviderImpl::kSupportedLocales[] = "supported_locales";
const char ExternalProviderImpl::kIsBookmarkApp[] = "is_bookmark_app";
const char ExternalProviderImpl::kIsFromWebstore[] = "is_from_webstore";
const char ExternalProviderImpl::kKeepIfPresent[] = "keep_if_present";
+const char ExternalProviderImpl::kWasInstalledByOem[] = "was_installed_by_oem";
+const char ExternalProviderImpl::kSupportedLocales[] = "supported_locales";
+const char ExternalProviderImpl::kMayBeUntrusted[] = "may_be_untrusted";
ExternalProviderImpl::ExternalProviderImpl(
VisitorInterface* service,
const std::string& extension_id = i.key();
const base::DictionaryValue* extension = NULL;
- if (!Extension::IdIsValid(extension_id)) {
+ if (!crx_file::id_util::IdIsValid(extension_id)) {
LOG(WARNING) << "Malformed extension dictionary: key "
<< extension_id.c_str() << " is not a valid id.";
continue;
}
base::FilePath::StringType external_crx;
- const Value* external_version_value = NULL;
+ const base::Value* external_version_value = NULL;
std::string external_version;
std::string external_update_url;
bool has_external_version = false;
if (extension->Get(kExternalVersion, &external_version_value)) {
- if (external_version_value->IsType(Value::TYPE_STRING)) {
+ if (external_version_value->IsType(base::Value::TYPE_STRING)) {
external_version_value->GetAsString(&external_version);
has_external_version = true;
} else {
is_bookmark_app) {
creation_flags |= Extension::FROM_BOOKMARK;
}
- bool is_from_webstore;
+ bool is_from_webstore = false;
if (extension->GetBoolean(kIsFromWebstore, &is_from_webstore) &&
is_from_webstore) {
creation_flags |= Extension::FROM_WEBSTORE;
}
- bool keep_if_present;
+ bool keep_if_present = false;
if (extension->GetBoolean(kKeepIfPresent, &keep_if_present) &&
keep_if_present && profile_) {
ExtensionServiceInterface* extension_service =
continue;
}
}
+ bool was_installed_by_oem = false;
+ if (extension->GetBoolean(kWasInstalledByOem, &was_installed_by_oem) &&
+ was_installed_by_oem) {
+ creation_flags |= Extension::WAS_INSTALLED_BY_OEM;
+ }
+ bool may_be_untrusted = false;
+ if (extension->GetBoolean(kMayBeUntrusted, &may_be_untrusted) &&
+ may_be_untrusted) {
+ creation_flags |= Extension::MAY_BE_UNTRUSTED;
+ }
+
+ std::string install_parameter;
+ extension->GetString(kInstallParam, &install_parameter);
if (has_external_crx) {
if (crx_location_ == Manifest::INVALID_LOCATION) {
<< "\", which is not a valid URL.";
continue;
}
- service_->OnExternalExtensionUpdateUrlFound(
- extension_id, update_url, download_location_, creation_flags,
- auto_acknowledge_);
+ service_->OnExternalExtensionUpdateUrlFound(extension_id,
+ install_parameter,
+ update_url,
+ download_location_,
+ creation_flags,
+ auto_acknowledge_);
}
}
Profile* profile,
ProviderCollection* provider_list) {
scoped_refptr<ExternalLoader> external_loader;
+ scoped_refptr<ExternalLoader> external_recommended_loader;
extensions::Manifest::Location crx_location = Manifest::INVALID_LOCATION;
#if defined(OS_CHROMEOS)
- const chromeos::User* user =
- chromeos::UserManager::Get()->GetUserByProfile(profile);
- if (user && policy::IsDeviceLocalAccountUser(user->email(), NULL)) {
+ policy::BrowserPolicyConnectorChromeOS* connector =
+ g_browser_process->platform_part()->browser_policy_connector_chromeos();
+ bool is_chrome_os_public_session = false;
+ const user_manager::User* user =
+ chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
+ policy::DeviceLocalAccount::Type account_type;
+ if (user && policy::IsDeviceLocalAccountUser(user->email(), &account_type)) {
+ if (account_type == policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION)
+ is_chrome_os_public_session = true;
policy::DeviceLocalAccountPolicyBroker* broker =
- g_browser_process->browser_policy_connector()->
- GetDeviceLocalAccountPolicyService()->
- GetBrokerForUser(user->email());
+ connector->GetDeviceLocalAccountPolicyService()->GetBrokerForUser(
+ user->email());
if (broker) {
external_loader = broker->extension_loader();
crx_location = Manifest::EXTERNAL_POLICY;
NOTREACHED();
}
} else {
- external_loader = new ExternalPolicyLoader(profile);
+ external_loader = new ExternalPolicyLoader(
+ ExtensionManagementFactory::GetForBrowserContext(profile),
+ ExternalPolicyLoader::FORCED);
+ external_recommended_loader = new ExternalPolicyLoader(
+ ExtensionManagementFactory::GetForBrowserContext(profile),
+ ExternalPolicyLoader::RECOMMENDED);
}
#else
- external_loader = new ExternalPolicyLoader(profile);
+ external_loader = new ExternalPolicyLoader(
+ ExtensionManagementFactory::GetForBrowserContext(profile),
+ ExternalPolicyLoader::FORCED);
+ external_recommended_loader = new ExternalPolicyLoader(
+ ExtensionManagementFactory::GetForBrowserContext(profile),
+ ExternalPolicyLoader::RECOMMENDED);
#endif
// Policies are mandatory so they can't be skipped with command line flag.
- if (external_loader) {
+ if (external_loader.get()) {
provider_list->push_back(
linked_ptr<ExternalProviderInterface>(
new ExternalProviderImpl(
Extension::NO_FLAGS)));
}
+ // Load the KioskAppExternalProvider when running in kiosk mode.
+ if (chrome::IsRunningInForcedAppMode()) {
+#if defined(OS_CHROMEOS)
+ chromeos::KioskAppManager* kiosk_app_manager =
+ chromeos::KioskAppManager::Get();
+ DCHECK(kiosk_app_manager);
+ if (kiosk_app_manager && !kiosk_app_manager->external_loader_created()) {
+ provider_list->push_back(linked_ptr<ExternalProviderInterface>(
+ new ExternalProviderImpl(service,
+ kiosk_app_manager->CreateExternalLoader(),
+ profile,
+ Manifest::EXTERNAL_PREF,
+ Manifest::INVALID_LOCATION,
+ Extension::NO_FLAGS)));
+ }
+#endif
+ return;
+ }
+
+ // Extensions provided by recommended policies.
+ if (external_recommended_loader.get()) {
+ provider_list->push_back(linked_ptr<ExternalProviderInterface>(
+ new ExternalProviderImpl(service,
+ external_recommended_loader,
+ profile,
+ crx_location,
+ Manifest::EXTERNAL_PREF_DOWNLOAD,
+ Extension::NO_FLAGS)));
+ }
+
// In tests don't install extensions from default external sources.
// It would only slowdown tests and make them flaky.
if (CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableDefaultApps))
return;
- // No external app install in app mode.
- if (chrome::IsRunningInForcedAppMode())
- return;
-
// On Mac OS, items in /Library/... should be written by the superuser.
// Check that all components of the path are writable by root only.
ExternalPrefLoader::Options check_admin_permissions_on_mac;
bool is_chromeos_demo_session = false;
int bundled_extension_creation_flags = Extension::NO_FLAGS;
#if defined(OS_CHROMEOS)
- chromeos::UserManager* user_manager = chromeos::UserManager::Get();
+ user_manager::UserManager* user_manager = user_manager::UserManager::Get();
is_chromeos_demo_session =
user_manager && user_manager->IsLoggedInAsDemoUser() &&
- g_browser_process->browser_policy_connector()->GetDeviceMode() ==
- policy::DEVICE_MODE_RETAIL_KIOSK;
+ connector->GetDeviceMode() == policy::DEVICE_MODE_RETAIL_KIOSK;
bundled_extension_creation_flags = Extension::FROM_WEBSTORE |
Extension::WAS_INSTALLED_BY_DEFAULT;
#endif
#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
- if (!profile->IsManaged()) {
+ if (!profile->IsSupervised()) {
provider_list->push_back(
linked_ptr<ExternalProviderInterface>(
new ExternalProviderImpl(
service,
new ExternalPrefLoader(
chrome::DIR_STANDALONE_EXTERNAL_EXTENSIONS,
- ExternalPrefLoader::NONE),
+ ExternalPrefLoader::NONE,
+ NULL),
profile,
Manifest::EXTERNAL_PREF,
Manifest::EXTERNAL_PREF_DOWNLOAD,
#endif
#if defined(OS_CHROMEOS)
- if (!is_chromeos_demo_session) {
- int external_apps_path_id = profile->IsManaged() ?
- chrome::DIR_MANAGED_USERS_DEFAULT_APPS :
+ if (!is_chromeos_demo_session && !is_chrome_os_public_session) {
+ int external_apps_path_id = profile->IsSupervised() ?
+ chrome::DIR_SUPERVISED_USERS_DEFAULT_APPS :
chrome::DIR_STANDALONE_EXTERNAL_EXTENSIONS;
+ ExternalPrefLoader::Options pref_load_flags = profile->IsNewProfile() ?
+ ExternalPrefLoader::DELAY_LOAD_UNTIL_PRIORITY_SYNC :
+ ExternalPrefLoader::NONE;
provider_list->push_back(
- linked_ptr<ExternalProviderInterface>(
- new ExternalProviderImpl(
- service,
- new chromeos::ExternalPrefCacheLoader(
- external_apps_path_id, profile),
- profile,
- Manifest::EXTERNAL_PREF,
- Manifest::EXTERNAL_PREF_DOWNLOAD,
- bundled_extension_creation_flags)));
+ linked_ptr<ExternalProviderInterface>(new ExternalProviderImpl(
+ service,
+ new ExternalPrefLoader(external_apps_path_id,
+ pref_load_flags,
+ profile),
+ profile,
+ Manifest::EXTERNAL_PREF,
+ Manifest::EXTERNAL_PREF_DOWNLOAD,
+ bundled_extension_creation_flags)));
+
+ // OEM default apps.
+ int oem_extension_creation_flags =
+ bundled_extension_creation_flags | Extension::WAS_INSTALLED_BY_OEM;
+ chromeos::ServicesCustomizationDocument* customization =
+ chromeos::ServicesCustomizationDocument::GetInstance();
+ provider_list->push_back(linked_ptr<ExternalProviderInterface>(
+ new ExternalProviderImpl(service,
+ customization->CreateExternalLoader(profile),
+ profile,
+ Manifest::EXTERNAL_PREF,
+ Manifest::EXTERNAL_PREF_DOWNLOAD,
+ oem_extension_creation_flags)));
}
- policy::AppPackUpdater* app_pack_updater =
- g_browser_process->browser_policy_connector()->GetAppPackUpdater();
+ policy::AppPackUpdater* app_pack_updater = connector->GetAppPackUpdater();
if (is_chromeos_demo_session && app_pack_updater &&
!app_pack_updater->created_external_loader()) {
provider_list->push_back(
}
#endif
- if (!profile->IsManaged() && !is_chromeos_demo_session) {
+ if (!profile->IsSupervised() && !is_chromeos_demo_session) {
+#if !defined(OS_WIN)
provider_list->push_back(
linked_ptr<ExternalProviderInterface>(
new ExternalProviderImpl(
service,
new ExternalPrefLoader(chrome::DIR_EXTERNAL_EXTENSIONS,
- check_admin_permissions_on_mac),
+ check_admin_permissions_on_mac,
+ NULL),
profile,
Manifest::EXTERNAL_PREF,
Manifest::EXTERNAL_PREF_DOWNLOAD,
bundled_extension_creation_flags)));
+#endif
-#if defined(OS_CHROMEOS) || defined (OS_MACOSX)
// Define a per-user source of external extensions.
- // On Chrome OS, this serves as a source for OEM customization.
+#if defined(OS_MACOSX)
provider_list->push_back(
linked_ptr<ExternalProviderInterface>(
new ExternalProviderImpl(
service,
new ExternalPrefLoader(chrome::DIR_USER_EXTERNAL_EXTENSIONS,
- ExternalPrefLoader::NONE),
+ ExternalPrefLoader::NONE,
+ NULL),
profile,
Manifest::EXTERNAL_PREF,
Manifest::EXTERNAL_PREF_DOWNLOAD,
new ExternalRegistryLoader,
profile,
Manifest::EXTERNAL_REGISTRY,
- Manifest::INVALID_LOCATION,
+ Manifest::EXTERNAL_PREF_DOWNLOAD,
Extension::NO_FLAGS)));
#endif
profile,
service,
new ExternalPrefLoader(chrome::DIR_DEFAULT_APPS,
- ExternalPrefLoader::NONE),
+ ExternalPrefLoader::NONE,
+ NULL),
+ Manifest::INTERNAL,
Manifest::INTERNAL,
- Manifest::INVALID_LOCATION,
Extension::FROM_WEBSTORE |
Extension::WAS_INSTALLED_BY_DEFAULT)));
#endif
linked_ptr<ExternalProviderInterface>(
new ExternalProviderImpl(
service,
- new ExternalComponentLoader(),
+ new ExternalComponentLoader(profile),
profile,
Manifest::INVALID_LOCATION,
Manifest::EXTERNAL_COMPONENT,