blob: ea700bbe668265c31d85c894e40e75917988a3ea [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_WEBUI_MANAGEMENT_UI_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_MANAGEMENT_UI_HANDLER_H_
#include <memory>
#include <set>
#include <string>
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/strings/string16.h"
#include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h"
#include "chrome/common/url_constants.h"
#include "components/policy/core/common/policy_service.h"
#include "components/prefs/pref_change_registrar.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
#include "content/public/browser/web_ui_message_handler.h"
#include "extensions/browser/extension_registry_observer.h"
#include "extensions/buildflags/buildflags.h"
#include "extensions/common/extension_id.h"
#include "url/gurl.h"
#if defined(OS_CHROMEOS)
// Constants defining the IDs for the localized strings sent to the page as
// load time data.
extern const char kManagementLogUploadEnabled[];
extern const char kManagementReportActivityTimes[];
extern const char kManagementReportHardwareStatus[];
extern const char kManagementReportNetworkInterfaces[];
extern const char kManagementReportUsers[];
extern const char kManagementReportCrashReports[];
extern const char kManagementReportAppInfoAndActivity[];
extern const char kManagementPrinting[];
extern const char kManagementCrostini[];
extern const char kManagementCrostiniContainerConfiguration[];
extern const char kManagementReportExtensions[];
extern const char kManagementReportAndroidApplications[];
#endif // defined(OS_CHROMEOS)
extern const char kCloudReportingExtensionId[];
extern const char kOnPremReportingExtensionStableId[];
extern const char kOnPremReportingExtensionBetaId[];
extern const char kManagementExtensionReportMachineName[];
extern const char kManagementExtensionReportMachineNameAddress[];
extern const char kManagementExtensionReportUsername[];
extern const char kManagementExtensionReportVersion[];
extern const char kManagementExtensionReportExtensionsPlugin[];
extern const char kManagementExtensionReportSafeBrowsingWarnings[];
extern const char kManagementExtensionReportPerfCrash[];
extern const char kManagementExtensionReportUserBrowsingData[];
extern const char kThreatProtectionTitle[];
extern const char kManagementDataLossPreventionName[];
extern const char kManagementDataLossPreventionPermissions[];
extern const char kManagementMalwareScanningName[];
extern const char kManagementMalwareScanningPermissions[];
extern const char kManagementEnterpriseReportingEvent[];
extern const char kManagementEnterpriseReportingVisibleData[];
extern const char kManagementOnFileAttachedEvent[];
extern const char kManagementOnFileAttachedVisibleData[];
extern const char kManagementOnFileDownloadedEvent[];
extern const char kManagementOnFileDownloadedVisibleData[];
extern const char kManagementOnBulkDataEntryEvent[];
extern const char kManagementOnBulkDataEntryVisibleData[];
extern const char kManagementOnPageVisitedEvent[];
extern const char kManagementOnPageVisitedVisibleData[];
extern const char kPolicyKeyReportMachineIdData[];
extern const char kPolicyKeyReportUserIdData[];
extern const char kPolicyKeyReportVersionData[];
extern const char kPolicyKeyReportPolicyData[];
extern const char kPolicyKeyReportExtensionsData[];
extern const char kPolicyKeyReportSafeBrowsingData[];
extern const char kPolicyKeyReportSystemTelemetryData[];
extern const char kPolicyKeyReportUserBrowsingData[];
extern const char kReportingTypeDevice[];
extern const char kReportingTypeExtensions[];
extern const char kReportingTypeSecurity[];
extern const char kReportingTypeUser[];
extern const char kReportingTypeUserActivity[];
namespace base {
class ListValue;
} // namespace base
namespace extensions {
class Extension;
} // namespace extensions
namespace policy {
class DeviceCloudPolicyManagerChromeOS;
class PolicyService;
class StatusCollector;
class SystemLogUploader;
} // namespace policy
class Profile;
// The JavaScript message handler for the chrome://management page.
class ManagementUIHandler : public content::WebUIMessageHandler,
public extensions::ExtensionRegistryObserver,
public policy::PolicyService::Observer,
public BitmapFetcherDelegate {
public:
ManagementUIHandler();
~ManagementUIHandler() override;
static void Initialize(content::WebUI* web_ui,
content::WebUIDataSource* source);
// content::WebUIMessageHandler implementation.
void RegisterMessages() override;
void SetAccountManagedForTesting(bool managed) { account_managed_ = managed; }
void SetDeviceManagedForTesting(bool managed) { device_managed_ = managed; }
static std::string GetAccountDomain(Profile* profile);
void OnJavascriptAllowed() override;
void OnJavascriptDisallowed() override;
protected:
// Protected for testing.
static void InitializeInternal(content::WebUI* web_ui,
content::WebUIDataSource* source,
Profile* profile);
void AddReportingInfo(base::Value* report_sources);
base::Value GetContextualManagedData(Profile* profile);
base::Value GetThreatProtectionInfo(Profile* profile) const;
virtual policy::PolicyService* GetPolicyService() const;
virtual const extensions::Extension* GetEnabledExtension(
const std::string& extensionId) const;
#if defined(OS_CHROMEOS)
// Protected for testing.
virtual const std::string GetDeviceDomain() const;
virtual const policy::DeviceCloudPolicyManagerChromeOS*
GetDeviceCloudPolicyManager() const;
void AddDeviceReportingInfo(base::Value* report_sources,
const policy::StatusCollector* collector,
const policy::SystemLogUploader* uploader,
Profile* profile) const;
// Virtual for testing
virtual bool IsUpdateRequiredEol() const;
// Adds device return instructions for a managed user as an update is required
// as per device policy but the device cannot be updated due to End of Life
// (Auto Update Expiration).
void AddUpdateRequiredEolInfo(base::Value* response) const;
// Adds a boolean which indicates if there's a proxy on the device enforced by
// the admin. If true, a warning will be added to the transparency panel to
// inform the user that the admin may be able to see their network traffic.
void AddProxyServerPrivacyDisclosure(base::Value* response) const;
#endif // defined(OS_CHROMEOS)
private:
void GetManagementStatus(Profile* profile, base::Value* status) const;
#if defined(OS_CHROMEOS)
void HandleGetDeviceReportingInfo(const base::ListValue* args);
void HandleGetPluginVmDataCollectionStatus(const base::ListValue* args);
void HandleGetLocalTrustRootsInfo(const base::ListValue* args);
#endif // defined(OS_CHROMEOS)
void HandleGetExtensions(const base::ListValue* args);
void HandleGetContextualManagedData(const base::ListValue* args);
void HandleGetThreatProtectionInfo(const base::ListValue* args);
void HandleInitBrowserReportingInfo(const base::ListValue* args);
void AsyncUpdateLogo();
// BitmapFetcherDelegate
void OnFetchComplete(const GURL& url, const SkBitmap* bitmap) override;
void NotifyBrowserReportingInfoUpdated();
#if defined(OS_CHROMEOS)
void NotifyPluginVmDataCollectionUpdated();
#endif // defined(OS_CHROMEOS)
void NotifyThreatProtectionInfoUpdated();
// extensions::ExtensionRegistryObserver implementation.
void OnExtensionLoaded(content::BrowserContext* browser_context,
const extensions::Extension* extension) override;
void OnExtensionUnloaded(content::BrowserContext* browser_context,
const extensions::Extension* extension,
extensions::UnloadedExtensionReason reason) override;
void UpdateManagedState();
// policy::PolicyService::Observer
void OnPolicyUpdated(const policy::PolicyNamespace& ns,
const policy::PolicyMap& previous,
const policy::PolicyMap& current) override;
void AddObservers();
void RemoveObservers();
bool managed_() const { return account_managed_ || device_managed_; }
bool account_managed_ = false;
bool device_managed_ = false;
// To avoid double-removing the observers, which would cause a DCHECK()
// failure.
bool has_observers_ = false;
std::string web_ui_data_source_name_;
PrefChangeRegistrar pref_registrar_;
std::set<extensions::ExtensionId> reporting_extension_ids_;
GURL logo_url_;
std::string fetched_image_;
std::unique_ptr<BitmapFetcher> icon_fetcher_;
DISALLOW_COPY_AND_ASSIGN(ManagementUIHandler);
};
#endif // CHROME_BROWSER_UI_WEBUI_MANAGEMENT_UI_HANDLER_H_