blob: dd1cf52143b746278b11fbaf538005c89b7d8b8e [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/enterprise/reporting/extension_info.h"
#include <string>
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/common/extension_set.h"
#include "extensions/common/manifest_url_handlers.h"
#include "extensions/common/permissions/permissions_data.h"
using extensions::mojom::ManifestLocation;
namespace em = ::enterprise_management;
namespace enterprise_reporting {
namespace {
em::Extension_InstallType GetExtensionInstallType(
ManifestLocation extension_location) {
switch (extension_location) {
case ManifestLocation::kInternal:
return em::Extension_InstallType_TYPE_NORMAL;
case ManifestLocation::kUnpacked:
case ManifestLocation::kCommandLine:
return em::Extension_InstallType_TYPE_DEVELOPMENT;
case ManifestLocation::kExternalPref:
case ManifestLocation::kExternalRegistry:
case ManifestLocation::kExternalPrefDownload:
return em::Extension_InstallType_TYPE_SIDELOAD;
case ManifestLocation::kExternalPolicy:
case ManifestLocation::kExternalPolicyDownload:
return em::Extension_InstallType_TYPE_ADMIN;
default:
NOTREACHED();
[[fallthrough]];
case ManifestLocation::kInvalidLocation:
case ManifestLocation::kComponent:
case ManifestLocation::kExternalComponent:
return em::Extension_InstallType_TYPE_OTHER;
}
}
void AddPermission(const extensions::Extension* extension,
em::Extension* extension_info) {
for (const std::string& permission :
extension->permissions_data()->active_permissions().GetAPIsAsStrings()) {
extension_info->add_permissions(permission);
}
}
void AddHostPermission(const extensions::Extension* extension,
em::Extension* extension_info) {
for (const auto& url :
extension->permissions_data()->active_permissions().explicit_hosts()) {
extension_info->add_host_permissions(url.GetAsString());
}
}
void AddExtensions(const extensions::ExtensionSet& extensions,
em::ChromeUserProfileInfo* profile_info,
bool enabled) {
for (const auto& extension : extensions) {
// Skip the component extension.
if (!extension->ShouldExposeViaManagementAPI())
continue;
auto* extension_info = profile_info->add_extensions();
extension_info->set_id(extension->id());
extension_info->set_version(extension->VersionString());
extension_info->set_name(extension->name());
extension_info->set_description(extension->description());
extension_info->set_app_type(
ConvertExtensionTypeToProto(extension->GetType()));
extension_info->set_homepage_url(
extensions::ManifestURL::GetHomepageURL(extension.get()).spec());
extension_info->set_install_type(
GetExtensionInstallType(extension->location()));
extension_info->set_enabled(enabled);
AddPermission(extension.get(), extension_info);
AddHostPermission(extension.get(), extension_info);
extension_info->set_from_webstore(extension->from_webstore());
extension_info->set_manifest_version(extension->manifest_version());
}
}
} // namespace
em::Extension_ExtensionType ConvertExtensionTypeToProto(
extensions::Manifest::Type extension_type) {
switch (extension_type) {
case extensions::Manifest::TYPE_UNKNOWN:
case extensions::Manifest::TYPE_SHARED_MODULE:
return em::Extension_ExtensionType_TYPE_UNKNOWN;
case extensions::Manifest::TYPE_EXTENSION:
return em::Extension_ExtensionType_TYPE_EXTENSION;
case extensions::Manifest::TYPE_THEME:
return em::Extension_ExtensionType_TYPE_THEME;
case extensions::Manifest::TYPE_USER_SCRIPT:
return em::Extension_ExtensionType_TYPE_USER_SCRIPT;
case extensions::Manifest::TYPE_HOSTED_APP:
return em::Extension_ExtensionType_TYPE_HOSTED_APP;
case extensions::Manifest::TYPE_LEGACY_PACKAGED_APP:
return em::Extension_ExtensionType_TYPE_LEGACY_PACKAGED_APP;
case extensions::Manifest::TYPE_PLATFORM_APP:
return em::Extension_ExtensionType_TYPE_PLATFORM_APP;
case extensions::Manifest::TYPE_LOGIN_SCREEN_EXTENSION:
return em::Extension_ExtensionType_TYPE_LOGIN_SCREEN_EXTENSION;
case extensions::Manifest::TYPE_CHROMEOS_SYSTEM_EXTENSION:
return em::Extension_ExtensionType_TYPE_CHROMEOS_SYSTEM_EXTENSION;
case extensions::Manifest::NUM_LOAD_TYPES:
NOTREACHED();
return em::Extension_ExtensionType_TYPE_UNKNOWN;
}
}
void AppendExtensionInfoIntoProfileReport(
Profile* profile,
em::ChromeUserProfileInfo* profile_info) {
auto* registry = extensions::ExtensionRegistry::Get(profile);
AddExtensions(registry->enabled_extensions(), profile_info, true);
AddExtensions(registry->disabled_extensions(), profile_info, false);
AddExtensions(registry->terminated_extensions(), profile_info, false);
}
} // namespace enterprise_reporting