Index: chrome/browser/ui/webui/policy_ui.cc |
diff --git a/chrome/browser/ui/webui/policy_ui.cc b/chrome/browser/ui/webui/policy_ui.cc |
index 3f768e0f8bc8cbd8a015c0b5bad3589cbfce58d5..f4ca756e190d6319c81a927a0f999e08d1939f45 100644 |
--- a/chrome/browser/ui/webui/policy_ui.cc |
+++ b/chrome/browser/ui/webui/policy_ui.cc |
@@ -4,105 +4,19 @@ |
#include "chrome/browser/ui/webui/policy_ui.h" |
-#include <stddef.h> |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/callback.h" |
-#include "base/compiler_specific.h" |
-#include "base/json/json_writer.h" |
-#include "base/logging.h" |
-#include "base/macros.h" |
-#include "base/memory/weak_ptr.h" |
-#include "base/strings/string16.h" |
-#include "base/time/time.h" |
-#include "base/values.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/policy/profile_policy_connector.h" |
-#include "chrome/browser/policy/profile_policy_connector_factory.h" |
-#include "chrome/browser/policy/schema_registry_service.h" |
-#include "chrome/browser/policy/schema_registry_service_factory.h" |
#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/ui/webui/policy_ui_handler.h" |
#include "chrome/common/url_constants.h" |
-#include "components/policy/core/browser/browser_policy_connector.h" |
-#include "components/policy/core/browser/cloud/message_util.h" |
-#include "components/policy/core/browser/configuration_policy_handler_list.h" |
-#include "components/policy/core/browser/policy_error_map.h" |
-#include "components/policy/core/common/cloud/cloud_policy_client.h" |
-#include "components/policy/core/common/cloud/cloud_policy_constants.h" |
-#include "components/policy/core/common/cloud/cloud_policy_core.h" |
-#include "components/policy/core/common/cloud/cloud_policy_refresh_scheduler.h" |
-#include "components/policy/core/common/cloud/cloud_policy_store.h" |
-#include "components/policy/core/common/cloud/cloud_policy_validator.h" |
-#include "components/policy/core/common/policy_map.h" |
-#include "components/policy/core/common/policy_namespace.h" |
-#include "components/policy/core/common/policy_service.h" |
-#include "components/policy/core/common/policy_types.h" |
-#include "components/policy/core/common/remote_commands/remote_commands_service.h" |
-#include "components/policy/core/common/schema.h" |
-#include "components/policy/core/common/schema_map.h" |
-#include "components/policy/core/common/schema_registry.h" |
-#include "content/public/browser/web_contents.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 "google_apis/gaia/gaia_auth_util.h" |
#include "grit/browser_resources.h" |
#include "grit/components_strings.h" |
-#include "policy/policy_constants.h" |
-#include "policy/proto/device_management_backend.pb.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/l10n/time_format.h" |
- |
-#if defined(OS_CHROMEOS) |
-#include "chrome/browser/browser_process_platform_part.h" |
-#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" |
-#include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" |
-#include "chrome/browser/chromeos/policy/device_local_account_policy_service.h" |
-#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h" |
-#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.h" |
-#include "components/user_manager/user_manager.h" |
-#else |
-#include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h" |
-#include "components/policy/core/common/cloud/user_cloud_policy_manager.h" |
-#endif |
- |
-#if defined(ENABLE_EXTENSIONS) |
-#include "extensions/browser/extension_registry.h" |
-#include "extensions/browser/extension_registry_observer.h" |
-#include "extensions/common/extension.h" |
-#include "extensions/common/manifest.h" |
-#include "extensions/common/manifest_constants.h" |
-#endif |
- |
-namespace em = enterprise_management; |
namespace { |
-struct PolicySourceMap { |
- const char* key; |
- int string_id; |
-}; |
- |
-// Strings that map from PolicySource enum to i18n string keys and their IDs. |
-const PolicySourceMap kPolicySources[policy::POLICY_SOURCE_COUNT] = { |
- {"sourceEnterpriseDefault", IDS_POLICY_SOURCE_ENTERPRISE_DEFAULT}, |
- {"sourceCloud", IDS_POLICY_SOURCE_CLOUD}, |
- {"sourcePublicSessionOverride", IDS_POLICY_SOURCE_PUBLIC_SESSION_OVERRIDE}, |
- {"sourcePlatform", IDS_POLICY_SOURCE_PLATFORM} |
-}; |
- |
-void AddLocalizedPoilcySourceStrings(content::WebUIDataSource* source) { |
- DCHECK_EQ(static_cast<size_t>(policy::POLICY_SOURCE_COUNT), |
- arraysize(kPolicySources)); |
- for (size_t i = 0; i < arraysize(kPolicySources); ++i) { |
- source->AddLocalizedString(kPolicySources[i].key, |
- kPolicySources[i].string_id); |
- } |
-} |
- |
-void AddCommonLocalizedStringsToSource(content::WebUIDataSource* source) { |
- source->AddLocalizedString("title", IDS_POLICY_TITLE); |
+content::WebUIDataSource* CreatePolicyUIHtmlSource() { |
+ content::WebUIDataSource* source = |
+ content::WebUIDataSource::Create(chrome::kChromeUIPolicyHost); |
+ PolicyUIHandler::AddCommonLocalizedStringsToSource(source); |
source->AddLocalizedString("filterPlaceholder", |
IDS_POLICY_FILTER_PLACEHOLDER); |
source->AddLocalizedString("reloadPolicies", IDS_POLICY_RELOAD_POLICIES); |
@@ -123,757 +37,20 @@ void AddCommonLocalizedStringsToSource(content::WebUIDataSource* source) { |
source->AddLocalizedString("labelStatus", IDS_POLICY_LABEL_STATUS); |
source->AddLocalizedString("showUnset", IDS_POLICY_SHOW_UNSET); |
source->AddLocalizedString("noPoliciesSet", IDS_POLICY_NO_POLICIES_SET); |
- source->AddLocalizedString("headerScope", IDS_POLICY_HEADER_SCOPE); |
- source->AddLocalizedString("headerLevel", IDS_POLICY_HEADER_LEVEL); |
- source->AddLocalizedString("headerName", IDS_POLICY_HEADER_NAME); |
- source->AddLocalizedString("headerValue", IDS_POLICY_HEADER_VALUE); |
- source->AddLocalizedString("headerStatus", IDS_POLICY_HEADER_STATUS); |
- source->AddLocalizedString("headerSource", IDS_POLICY_HEADER_SOURCE); |
source->AddLocalizedString("showExpandedValue", |
IDS_POLICY_SHOW_EXPANDED_VALUE); |
source->AddLocalizedString("hideExpandedValue", |
IDS_POLICY_HIDE_EXPANDED_VALUE); |
- source->AddLocalizedString("scopeUser", IDS_POLICY_SCOPE_USER); |
- source->AddLocalizedString("scopeDevice", IDS_POLICY_SCOPE_DEVICE); |
- source->AddLocalizedString("levelRecommended", IDS_POLICY_LEVEL_RECOMMENDED); |
- source->AddLocalizedString("levelMandatory", IDS_POLICY_LEVEL_MANDATORY); |
- source->AddLocalizedString("ok", IDS_POLICY_OK); |
- source->AddLocalizedString("unset", IDS_POLICY_UNSET); |
- source->AddLocalizedString("unknown", IDS_POLICY_UNKNOWN); |
- source->AddLocalizedString("notSpecified", IDS_POLICY_NOT_SPECIFIED); |
- AddLocalizedPoilcySourceStrings(source); |
- |
- source->SetJsonPath("strings.js"); |
-} |
- |
-content::WebUIDataSource* CreatePolicyMaterialDesignUIHtmlSource() { |
- content::WebUIDataSource* source = |
- content::WebUIDataSource::Create(chrome::kChromeUIMdPolicyHost); |
- AddCommonLocalizedStringsToSource(source); |
- source->SetDefaultResource(IDR_MD_POLICY_HTML); |
- |
- return source; |
-} |
- |
- |
-content::WebUIDataSource* CreatePolicyUIHtmlSource() { |
- content::WebUIDataSource* source = |
- content::WebUIDataSource::Create(chrome::kChromeUIPolicyHost); |
- AddCommonLocalizedStringsToSource(source); |
// Add required resources. |
source->AddResourcePath("policy.css", IDR_POLICY_CSS); |
source->AddResourcePath("policy.js", IDR_POLICY_JS); |
source->AddResourcePath("uber_utils.js", IDR_UBER_UTILS_JS); |
source->SetDefaultResource(IDR_POLICY_HTML); |
- |
return source; |
} |
-// Formats the association state indicated by |data|. If |data| is NULL, the |
-// state is considered to be UNMANAGED. |
-base::string16 FormatAssociationState(const em::PolicyData* data) { |
- if (data) { |
- switch (data->state()) { |
- case em::PolicyData::ACTIVE: |
- return l10n_util::GetStringUTF16(IDS_POLICY_ASSOCIATION_STATE_ACTIVE); |
- case em::PolicyData::UNMANAGED: |
- return l10n_util::GetStringUTF16( |
- IDS_POLICY_ASSOCIATION_STATE_UNMANAGED); |
- case em::PolicyData::DEPROVISIONED: |
- return l10n_util::GetStringUTF16( |
- IDS_POLICY_ASSOCIATION_STATE_DEPROVISIONED); |
- } |
- NOTREACHED() << "Unknown state " << data->state(); |
- } |
- |
- // Default to UNMANAGED for the case of missing policy or bad state enum. |
- return l10n_util::GetStringUTF16(IDS_POLICY_ASSOCIATION_STATE_UNMANAGED); |
-} |
- |
-void GetStatusFromCore(const policy::CloudPolicyCore* core, |
- base::DictionaryValue* dict) { |
- const policy::CloudPolicyStore* store = core->store(); |
- const policy::CloudPolicyClient* client = core->client(); |
- const policy::CloudPolicyRefreshScheduler* refresh_scheduler = |
- core->refresh_scheduler(); |
- |
- // CloudPolicyStore errors take precedence to show in the status message. |
- // Other errors (such as transient policy fetching problems) get displayed |
- // only if CloudPolicyStore is in STATUS_OK. |
- base::string16 status = |
- policy::FormatStoreStatus(store->status(), store->validation_status()); |
- if (store->status() == policy::CloudPolicyStore::STATUS_OK) { |
- if (client && client->status() != policy::DM_STATUS_SUCCESS) |
- status = policy::FormatDeviceManagementStatus(client->status()); |
- else if (!store->is_managed()) |
- status = FormatAssociationState(store->policy()); |
- } |
- |
- const em::PolicyData* policy = store->policy(); |
- std::string client_id = policy ? policy->device_id() : std::string(); |
- std::string username = policy ? policy->username() : std::string(); |
- |
- if (policy && policy->has_annotated_asset_id()) |
- dict->SetString("assetId", policy->annotated_asset_id()); |
- if (policy && policy->has_annotated_location()) |
- dict->SetString("location", policy->annotated_location()); |
- if (policy && policy->has_directory_api_id()) |
- dict->SetString("directoryApiId", policy->directory_api_id()); |
- |
- base::TimeDelta refresh_interval = |
- base::TimeDelta::FromMilliseconds(refresh_scheduler ? |
- refresh_scheduler->refresh_delay() : |
- policy::CloudPolicyRefreshScheduler::kDefaultRefreshDelayMs); |
- base::Time last_refresh_time = refresh_scheduler ? |
- refresh_scheduler->last_refresh() : base::Time(); |
- |
- bool no_error = store->status() == policy::CloudPolicyStore::STATUS_OK && |
- client && client->status() == policy::DM_STATUS_SUCCESS; |
- dict->SetBoolean("error", !no_error); |
- dict->SetString("status", status); |
- dict->SetString("clientId", client_id); |
- dict->SetString("username", username); |
- dict->SetString("refreshInterval", |
- ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_DURATION, |
- ui::TimeFormat::LENGTH_SHORT, |
- refresh_interval)); |
- dict->SetString("timeSinceLastRefresh", last_refresh_time.is_null() ? |
- l10n_util::GetStringUTF16(IDS_POLICY_NEVER_FETCHED) : |
- ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_ELAPSED, |
- ui::TimeFormat::LENGTH_SHORT, |
- base::Time::NowFromSystemTime() - |
- last_refresh_time)); |
-} |
- |
-void ExtractDomainFromUsername(base::DictionaryValue* dict) { |
- std::string username; |
- dict->GetString("username", &username); |
- if (!username.empty()) |
- dict->SetString("domain", gaia::ExtractDomainName(username)); |
-} |
- |
-// Utility function that returns a JSON serialization of the given |dict|. |
-scoped_ptr<base::StringValue> DictionaryToJSONString( |
- const base::DictionaryValue& dict) { |
- std::string json_string; |
- base::JSONWriter::WriteWithOptions(dict, |
- base::JSONWriter::OPTIONS_PRETTY_PRINT, |
- &json_string); |
- return make_scoped_ptr(new base::StringValue(json_string)); |
-} |
- |
-// Returns a copy of |value| with some values converted to a representation that |
-// i18n_template.js will display in a nicer way. |
-scoped_ptr<base::Value> CopyAndConvert(const base::Value* value) { |
- const base::DictionaryValue* dict = NULL; |
- if (value->GetAsDictionary(&dict)) |
- return DictionaryToJSONString(*dict); |
- |
- scoped_ptr<base::Value> copy(value->DeepCopy()); |
- base::ListValue* list = NULL; |
- if (copy->GetAsList(&list)) { |
- for (size_t i = 0; i < list->GetSize(); ++i) { |
- if (list->GetDictionary(i, &dict)) |
- list->Set(i, DictionaryToJSONString(*dict).release()); |
- } |
- } |
- |
- return copy.Pass(); |
-} |
- |
} // namespace |
-// An interface for querying the status of cloud policy. |
-class CloudPolicyStatusProvider { |
- public: |
- CloudPolicyStatusProvider(); |
- virtual ~CloudPolicyStatusProvider(); |
- |
- // Sets a callback to invoke upon status changes. |
- void SetStatusChangeCallback(const base::Closure& callback); |
- |
- virtual void GetStatus(base::DictionaryValue* dict); |
- |
- protected: |
- void NotifyStatusChange(); |
- |
- private: |
- base::Closure callback_; |
- |
- DISALLOW_COPY_AND_ASSIGN(CloudPolicyStatusProvider); |
-}; |
- |
-// Status provider implementation that pulls cloud policy status from a |
-// CloudPolicyCore instance provided at construction time. Also listens for |
-// changes on that CloudPolicyCore and reports them through the status change |
-// callback. |
-class CloudPolicyCoreStatusProvider |
- : public CloudPolicyStatusProvider, |
- public policy::CloudPolicyStore::Observer { |
- public: |
- explicit CloudPolicyCoreStatusProvider(policy::CloudPolicyCore* core); |
- ~CloudPolicyCoreStatusProvider() override; |
- |
- // policy::CloudPolicyStore::Observer implementation. |
- void OnStoreLoaded(policy::CloudPolicyStore* store) override; |
- void OnStoreError(policy::CloudPolicyStore* store) override; |
- |
- protected: |
- // Policy status is read from the CloudPolicyClient, CloudPolicyStore and |
- // CloudPolicyRefreshScheduler hosted by this |core_|. |
- policy::CloudPolicyCore* core_; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(CloudPolicyCoreStatusProvider); |
-}; |
- |
-// A cloud policy status provider for user policy. |
-class UserPolicyStatusProvider : public CloudPolicyCoreStatusProvider { |
- public: |
- explicit UserPolicyStatusProvider(policy::CloudPolicyCore* core); |
- ~UserPolicyStatusProvider() override; |
- |
- // CloudPolicyCoreStatusProvider implementation. |
- void GetStatus(base::DictionaryValue* dict) override; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(UserPolicyStatusProvider); |
-}; |
- |
-#if defined(OS_CHROMEOS) |
-// A cloud policy status provider for device policy. |
-class DevicePolicyStatusProvider : public CloudPolicyCoreStatusProvider { |
- public: |
- explicit DevicePolicyStatusProvider( |
- policy::BrowserPolicyConnectorChromeOS* connector); |
- ~DevicePolicyStatusProvider() override; |
- |
- // CloudPolicyCoreStatusProvider implementation. |
- void GetStatus(base::DictionaryValue* dict) override; |
- |
- private: |
- std::string domain_; |
- |
- DISALLOW_COPY_AND_ASSIGN(DevicePolicyStatusProvider); |
-}; |
- |
-// A cloud policy status provider that reads policy status from the policy core |
-// associated with the device-local account specified by |user_id| at |
-// construction time. The indirection via user ID and |
-// DeviceLocalAccountPolicyService is necessary because the device-local account |
-// may go away any time behind the scenes, at which point the status message |
-// text will indicate CloudPolicyStore::STATUS_BAD_STATE. |
-class DeviceLocalAccountPolicyStatusProvider |
- : public CloudPolicyStatusProvider, |
- public policy::DeviceLocalAccountPolicyService::Observer { |
- public: |
- DeviceLocalAccountPolicyStatusProvider( |
- const std::string& user_id, |
- policy::DeviceLocalAccountPolicyService* service); |
- ~DeviceLocalAccountPolicyStatusProvider() override; |
- |
- // CloudPolicyStatusProvider implementation. |
- void GetStatus(base::DictionaryValue* dict) override; |
- |
- // policy::DeviceLocalAccountPolicyService::Observer implementation. |
- void OnPolicyUpdated(const std::string& user_id) override; |
- void OnDeviceLocalAccountsChanged() override; |
- |
- private: |
- const std::string user_id_; |
- policy::DeviceLocalAccountPolicyService* service_; |
- |
- DISALLOW_COPY_AND_ASSIGN(DeviceLocalAccountPolicyStatusProvider); |
-}; |
-#endif |
- |
-// The JavaScript message handler for the chrome://policy page. |
-class PolicyUIHandler : public content::WebUIMessageHandler, |
-#if defined(ENABLE_EXTENSIONS) |
- public extensions::ExtensionRegistryObserver, |
-#endif |
- public policy::PolicyService::Observer, |
- public policy::SchemaRegistry::Observer { |
- public: |
- PolicyUIHandler(); |
- ~PolicyUIHandler() override; |
- |
- // content::WebUIMessageHandler implementation. |
- void RegisterMessages() override; |
- |
-#if defined(ENABLE_EXTENSIONS) |
- // 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::UnloadedExtensionInfo::Reason reason) override; |
-#endif |
- |
- // policy::PolicyService::Observer implementation. |
- void OnPolicyUpdated(const policy::PolicyNamespace& ns, |
- const policy::PolicyMap& previous, |
- const policy::PolicyMap& current) override; |
- |
- // policy::SchemaRegistry::Observer implementation. |
- void OnSchemaRegistryUpdated(bool has_new_schemas) override; |
- |
- private: |
- // Send a dictionary containing the names of all known policies to the UI. |
- void SendPolicyNames() const; |
- |
- // Send information about the current policy values to the UI. For each policy |
- // whose value has been set, a dictionary containing the value and additional |
- // metadata is sent. |
- void SendPolicyValues() const; |
- |
- // Send the status of cloud policy to the UI. For each scope that has cloud |
- // policy enabled (device and/or user), a dictionary containing status |
- // information is sent. |
- void SendStatus() const; |
- |
- // Inserts a description of each policy in |policy_map| into |values|, using |
- // the optional errors in |errors| to determine the status of each policy. |
- void GetPolicyValues(const policy::PolicyMap& policy_map, |
- policy::PolicyErrorMap* errors, |
- base::DictionaryValue* values) const; |
- |
- void GetChromePolicyValues(base::DictionaryValue* values) const; |
- |
- void HandleInitialized(const base::ListValue* args); |
- void HandleReloadPolicies(const base::ListValue* args); |
- |
- void OnRefreshPoliciesDone() const; |
- |
- policy::PolicyService* GetPolicyService() const; |
- |
- std::string device_domain_; |
- |
- // Providers that supply status dictionaries for user and device policy, |
- // respectively. These are created on initialization time as appropriate for |
- // the platform (Chrome OS / desktop) and type of policy that is in effect. |
- scoped_ptr<CloudPolicyStatusProvider> user_status_provider_; |
- scoped_ptr<CloudPolicyStatusProvider> device_status_provider_; |
- |
- base::WeakPtrFactory<PolicyUIHandler> weak_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(PolicyUIHandler); |
-}; |
- |
-CloudPolicyStatusProvider::CloudPolicyStatusProvider() { |
-} |
- |
-CloudPolicyStatusProvider::~CloudPolicyStatusProvider() { |
-} |
- |
-void CloudPolicyStatusProvider::SetStatusChangeCallback( |
- const base::Closure& callback) { |
- callback_ = callback; |
-} |
- |
-void CloudPolicyStatusProvider::GetStatus(base::DictionaryValue* dict) { |
-} |
- |
-void CloudPolicyStatusProvider::NotifyStatusChange() { |
- if (!callback_.is_null()) |
- callback_.Run(); |
-} |
- |
-CloudPolicyCoreStatusProvider::CloudPolicyCoreStatusProvider( |
- policy::CloudPolicyCore* core) : core_(core) { |
- core_->store()->AddObserver(this); |
- // TODO(bartfab): Add an observer that watches for client errors. Observing |
- // core_->client() directly is not safe as the client may be destroyed and |
- // (re-)created anytime if the user signs in or out on desktop platforms. |
-} |
- |
-CloudPolicyCoreStatusProvider::~CloudPolicyCoreStatusProvider() { |
- core_->store()->RemoveObserver(this); |
-} |
- |
-void CloudPolicyCoreStatusProvider::OnStoreLoaded( |
- policy::CloudPolicyStore* store) { |
- NotifyStatusChange(); |
-} |
- |
-void CloudPolicyCoreStatusProvider::OnStoreError( |
- policy::CloudPolicyStore* store) { |
- NotifyStatusChange(); |
-} |
- |
-UserPolicyStatusProvider::UserPolicyStatusProvider( |
- policy::CloudPolicyCore* core) : CloudPolicyCoreStatusProvider(core) { |
-} |
- |
-UserPolicyStatusProvider::~UserPolicyStatusProvider() { |
-} |
- |
-void UserPolicyStatusProvider::GetStatus(base::DictionaryValue* dict) { |
- if (!core_->store()->is_managed()) |
- return; |
- GetStatusFromCore(core_, dict); |
- ExtractDomainFromUsername(dict); |
-} |
- |
-#if defined(OS_CHROMEOS) |
-DevicePolicyStatusProvider::DevicePolicyStatusProvider( |
- policy::BrowserPolicyConnectorChromeOS* connector) |
- : CloudPolicyCoreStatusProvider( |
- connector->GetDeviceCloudPolicyManager()->core()) { |
- domain_ = connector->GetEnterpriseDomain(); |
-} |
- |
-DevicePolicyStatusProvider::~DevicePolicyStatusProvider() { |
-} |
- |
-void DevicePolicyStatusProvider::GetStatus(base::DictionaryValue* dict) { |
- GetStatusFromCore(core_, dict); |
- dict->SetString("domain", domain_); |
-} |
- |
-DeviceLocalAccountPolicyStatusProvider::DeviceLocalAccountPolicyStatusProvider( |
- const std::string& user_id, |
- policy::DeviceLocalAccountPolicyService* service) |
- : user_id_(user_id), |
- service_(service) { |
- service_->AddObserver(this); |
-} |
- |
-DeviceLocalAccountPolicyStatusProvider:: |
- ~DeviceLocalAccountPolicyStatusProvider() { |
- service_->RemoveObserver(this); |
-} |
- |
-void DeviceLocalAccountPolicyStatusProvider::GetStatus( |
- base::DictionaryValue* dict) { |
- const policy::DeviceLocalAccountPolicyBroker* broker = |
- service_->GetBrokerForUser(user_id_); |
- if (broker) { |
- GetStatusFromCore(broker->core(), dict); |
- } else { |
- dict->SetBoolean("error", true); |
- dict->SetString("status", |
- policy::FormatStoreStatus( |
- policy::CloudPolicyStore::STATUS_BAD_STATE, |
- policy::CloudPolicyValidatorBase::VALIDATION_OK)); |
- dict->SetString("username", std::string()); |
- } |
- ExtractDomainFromUsername(dict); |
- dict->SetBoolean("publicAccount", true); |
-} |
- |
-void DeviceLocalAccountPolicyStatusProvider::OnPolicyUpdated( |
- const std::string& user_id) { |
- if (user_id == user_id_) |
- NotifyStatusChange(); |
-} |
- |
-void DeviceLocalAccountPolicyStatusProvider::OnDeviceLocalAccountsChanged() { |
- NotifyStatusChange(); |
-} |
-#endif |
- |
-PolicyUIHandler::PolicyUIHandler() |
- : weak_factory_(this) { |
-} |
- |
-PolicyUIHandler::~PolicyUIHandler() { |
- GetPolicyService()->RemoveObserver(policy::POLICY_DOMAIN_CHROME, this); |
- GetPolicyService()->RemoveObserver(policy::POLICY_DOMAIN_EXTENSIONS, this); |
- policy::SchemaRegistry* registry = |
- policy::SchemaRegistryServiceFactory::GetForContext( |
- Profile::FromWebUI(web_ui())->GetOriginalProfile())->registry(); |
- registry->RemoveObserver(this); |
- |
-#if defined(ENABLE_EXTENSIONS) |
- extensions::ExtensionRegistry::Get(Profile::FromWebUI(web_ui())) |
- ->RemoveObserver(this); |
-#endif |
-} |
- |
-void PolicyUIHandler::RegisterMessages() { |
-#if defined(OS_CHROMEOS) |
- policy::BrowserPolicyConnectorChromeOS* connector = |
- g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
- if (connector->IsEnterpriseManaged()) |
- device_status_provider_.reset(new DevicePolicyStatusProvider(connector)); |
- |
- const user_manager::UserManager* user_manager = |
- user_manager::UserManager::Get(); |
- if (user_manager->IsLoggedInAsPublicAccount()) { |
- policy::DeviceLocalAccountPolicyService* local_account_service = |
- connector->GetDeviceLocalAccountPolicyService(); |
- if (local_account_service) { |
- user_status_provider_.reset( |
- new DeviceLocalAccountPolicyStatusProvider( |
- user_manager->GetLoggedInUser()->email(), local_account_service)); |
- } |
- } else { |
- policy::UserCloudPolicyManagerChromeOS* user_cloud_policy_manager = |
- policy::UserCloudPolicyManagerFactoryChromeOS::GetForProfile( |
- Profile::FromWebUI(web_ui())); |
- if (user_cloud_policy_manager) { |
- user_status_provider_.reset( |
- new UserPolicyStatusProvider(user_cloud_policy_manager->core())); |
- } |
- } |
-#else |
- policy::UserCloudPolicyManager* user_cloud_policy_manager = |
- policy::UserCloudPolicyManagerFactory::GetForBrowserContext( |
- web_ui()->GetWebContents()->GetBrowserContext()); |
- if (user_cloud_policy_manager) { |
- user_status_provider_.reset( |
- new UserPolicyStatusProvider(user_cloud_policy_manager->core())); |
- } |
-#endif |
- |
- if (!user_status_provider_.get()) |
- user_status_provider_.reset(new CloudPolicyStatusProvider()); |
- if (!device_status_provider_.get()) |
- device_status_provider_.reset(new CloudPolicyStatusProvider()); |
- |
- base::Closure update_callback(base::Bind(&PolicyUIHandler::SendStatus, |
- base::Unretained(this))); |
- user_status_provider_->SetStatusChangeCallback(update_callback); |
- device_status_provider_->SetStatusChangeCallback(update_callback); |
- GetPolicyService()->AddObserver(policy::POLICY_DOMAIN_CHROME, this); |
- GetPolicyService()->AddObserver(policy::POLICY_DOMAIN_EXTENSIONS, this); |
- |
-#if defined(ENABLE_EXTENSIONS) |
- extensions::ExtensionRegistry::Get(Profile::FromWebUI(web_ui())) |
- ->AddObserver(this); |
-#endif |
- policy::SchemaRegistry* registry = |
- policy::SchemaRegistryServiceFactory::GetForContext( |
- Profile::FromWebUI(web_ui())->GetOriginalProfile())->registry(); |
- registry->AddObserver(this); |
- |
- web_ui()->RegisterMessageCallback( |
- "initialized", |
- base::Bind(&PolicyUIHandler::HandleInitialized, base::Unretained(this))); |
- web_ui()->RegisterMessageCallback( |
- "reloadPolicies", |
- base::Bind(&PolicyUIHandler::HandleReloadPolicies, |
- base::Unretained(this))); |
-} |
- |
-#if defined(ENABLE_EXTENSIONS) |
-void PolicyUIHandler::OnExtensionLoaded( |
- content::BrowserContext* browser_context, |
- const extensions::Extension* extension) { |
- SendPolicyNames(); |
- SendPolicyValues(); |
-} |
- |
-void PolicyUIHandler::OnExtensionUnloaded( |
- content::BrowserContext* browser_context, |
- const extensions::Extension* extension, |
- extensions::UnloadedExtensionInfo::Reason reason) { |
- SendPolicyNames(); |
- SendPolicyValues(); |
-} |
-#endif |
- |
-void PolicyUIHandler::OnSchemaRegistryUpdated(bool has_new_schemas) { |
- // Update UI when new schema is added. |
- if (has_new_schemas) { |
- SendPolicyNames(); |
- SendPolicyValues(); |
- } |
-} |
- |
-void PolicyUIHandler::OnPolicyUpdated(const policy::PolicyNamespace& ns, |
- const policy::PolicyMap& previous, |
- const policy::PolicyMap& current) { |
- SendPolicyValues(); |
-} |
- |
-void PolicyUIHandler::SendPolicyNames() const { |
- base::DictionaryValue names; |
- |
- Profile* profile = Profile::FromWebUI(web_ui()); |
- policy::SchemaRegistry* registry = |
- policy::SchemaRegistryServiceFactory::GetForContext( |
- profile->GetOriginalProfile())->registry(); |
- scoped_refptr<policy::SchemaMap> schema_map = registry->schema_map(); |
- |
- // Add Chrome policy names. |
- base::DictionaryValue* chrome_policy_names = new base::DictionaryValue; |
- policy::PolicyNamespace chrome_ns(policy::POLICY_DOMAIN_CHROME, ""); |
- const policy::Schema* chrome_schema = schema_map->GetSchema(chrome_ns); |
- for (policy::Schema::Iterator it = chrome_schema->GetPropertiesIterator(); |
- !it.IsAtEnd(); it.Advance()) { |
- chrome_policy_names->SetBoolean(it.key(), true); |
- } |
- names.Set("chromePolicyNames", chrome_policy_names); |
- |
-#if defined(ENABLE_EXTENSIONS) |
- // Add extension policy names. |
- base::DictionaryValue* extension_policy_names = new base::DictionaryValue; |
- |
- for (const scoped_refptr<const extensions::Extension>& extension : |
- extensions::ExtensionRegistry::Get(profile)->enabled_extensions()) { |
- // Skip this extension if it's not an enterprise extension. |
- if (!extension->manifest()->HasPath( |
- extensions::manifest_keys::kStorageManagedSchema)) |
- continue; |
- base::DictionaryValue* extension_value = new base::DictionaryValue; |
- extension_value->SetString("name", extension->name()); |
- const policy::Schema* schema = |
- schema_map->GetSchema(policy::PolicyNamespace( |
- policy::POLICY_DOMAIN_EXTENSIONS, extension->id())); |
- base::DictionaryValue* policy_names = new base::DictionaryValue; |
- if (schema && schema->valid()) { |
- // Get policy names from the extension's policy schema. |
- // Store in a map, not an array, for faster lookup on JS side. |
- for (policy::Schema::Iterator prop = schema->GetPropertiesIterator(); |
- !prop.IsAtEnd(); prop.Advance()) { |
- policy_names->SetBoolean(prop.key(), true); |
- } |
- } |
- extension_value->Set("policyNames", policy_names); |
- extension_policy_names->Set(extension->id(), extension_value); |
- } |
- names.Set("extensionPolicyNames", extension_policy_names); |
-#endif // defined(ENABLE_EXTENSIONS) |
- |
- web_ui()->CallJavascriptFunction("policy.Page.setPolicyNames", names); |
-} |
- |
-void PolicyUIHandler::SendPolicyValues() const { |
- base::DictionaryValue all_policies; |
- |
- // Add Chrome policy values. |
- base::DictionaryValue* chrome_policies = new base::DictionaryValue; |
- GetChromePolicyValues(chrome_policies); |
- all_policies.Set("chromePolicies", chrome_policies); |
- |
-#if defined(ENABLE_EXTENSIONS) |
- // Add extension policy values. |
- extensions::ExtensionRegistry* registry = |
- extensions::ExtensionRegistry::Get(Profile::FromWebUI(web_ui())); |
- base::DictionaryValue* extension_values = new base::DictionaryValue; |
- |
- for (const scoped_refptr<const extensions::Extension>& extension : |
- registry->enabled_extensions()) { |
- // Skip this extension if it's not an enterprise extension. |
- if (!extension->manifest()->HasPath( |
- extensions::manifest_keys::kStorageManagedSchema)) |
- continue; |
- base::DictionaryValue* extension_policies = new base::DictionaryValue; |
- policy::PolicyNamespace policy_namespace = policy::PolicyNamespace( |
- policy::POLICY_DOMAIN_EXTENSIONS, extension->id()); |
- policy::PolicyErrorMap empty_error_map; |
- GetPolicyValues(GetPolicyService()->GetPolicies(policy_namespace), |
- &empty_error_map, extension_policies); |
- extension_values->Set(extension->id(), extension_policies); |
- } |
- all_policies.Set("extensionPolicies", extension_values); |
-#endif |
- web_ui()->CallJavascriptFunction("policy.Page.setPolicyValues", all_policies); |
-} |
- |
-void PolicyUIHandler::GetPolicyValues(const policy::PolicyMap& map, |
- policy::PolicyErrorMap* errors, |
- base::DictionaryValue* values) const { |
- for (policy::PolicyMap::const_iterator entry = map.begin(); |
- entry != map.end(); ++entry) { |
- base::DictionaryValue* value = new base::DictionaryValue; |
- value->Set("value", CopyAndConvert(entry->second.value).release()); |
- if (entry->second.scope == policy::POLICY_SCOPE_USER) |
- value->SetString("scope", "user"); |
- else |
- value->SetString("scope", "machine"); |
- if (entry->second.level == policy::POLICY_LEVEL_RECOMMENDED) |
- value->SetString("level", "recommended"); |
- else |
- value->SetString("level", "mandatory"); |
- value->SetString("source", kPolicySources[entry->second.source].key); |
- base::string16 error = errors->GetErrors(entry->first); |
- if (!error.empty()) |
- value->SetString("error", error); |
- values->Set(entry->first, value); |
- } |
-} |
- |
-void PolicyUIHandler::GetChromePolicyValues( |
- base::DictionaryValue* values) const { |
- policy::PolicyService* policy_service = GetPolicyService(); |
- policy::PolicyMap map; |
- |
- // Make a copy that can be modified, since some policy values are modified |
- // before being displayed. |
- map.CopyFrom(policy_service->GetPolicies( |
- policy::PolicyNamespace(policy::POLICY_DOMAIN_CHROME, std::string()))); |
- |
- // Get a list of all the errors in the policy values. |
- const policy::ConfigurationPolicyHandlerList* handler_list = |
- g_browser_process->browser_policy_connector()->GetHandlerList(); |
- policy::PolicyErrorMap errors; |
- handler_list->ApplyPolicySettings(map, NULL, &errors); |
- |
- // Convert dictionary values to strings for display. |
- handler_list->PrepareForDisplaying(&map); |
- |
- GetPolicyValues(map, &errors, values); |
-} |
- |
-void PolicyUIHandler::SendStatus() const { |
- scoped_ptr<base::DictionaryValue> device_status(new base::DictionaryValue); |
- device_status_provider_->GetStatus(device_status.get()); |
- if (!device_domain_.empty()) |
- device_status->SetString("domain", device_domain_); |
- scoped_ptr<base::DictionaryValue> user_status(new base::DictionaryValue); |
- user_status_provider_->GetStatus(user_status.get()); |
- std::string username; |
- user_status->GetString("username", &username); |
- if (!username.empty()) |
- user_status->SetString("domain", gaia::ExtractDomainName(username)); |
- |
- base::DictionaryValue status; |
- if (!device_status->empty()) |
- status.Set("device", device_status.release()); |
- if (!user_status->empty()) |
- status.Set("user", user_status.release()); |
- |
- web_ui()->CallJavascriptFunction("policy.Page.setStatus", status); |
-} |
- |
-void PolicyUIHandler::HandleInitialized(const base::ListValue* args) { |
- SendPolicyNames(); |
- SendPolicyValues(); |
- SendStatus(); |
-} |
- |
-void PolicyUIHandler::HandleReloadPolicies(const base::ListValue* args) { |
-#if defined(OS_CHROMEOS) |
- // Allow user to manually fetch remote commands, in case invalidation |
- // service is not working properly. |
- // TODO(binjin): evaluate and possibly remove this after invalidation |
- // service is landed and tested. http://crbug.com/480982 |
- policy::BrowserPolicyConnectorChromeOS* connector = |
- g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
- policy::RemoteCommandsService* remote_commands_service = |
- connector->GetDeviceCloudPolicyManager() |
- ->core() |
- ->remote_commands_service(); |
- if (remote_commands_service) |
- remote_commands_service->FetchRemoteCommands(); |
-#endif |
- GetPolicyService()->RefreshPolicies(base::Bind( |
- &PolicyUIHandler::OnRefreshPoliciesDone, weak_factory_.GetWeakPtr())); |
-} |
- |
-void PolicyUIHandler::OnRefreshPoliciesDone() const { |
- web_ui()->CallJavascriptFunction("policy.Page.reloadPoliciesDone"); |
-} |
- |
-policy::PolicyService* PolicyUIHandler::GetPolicyService() const { |
- return policy::ProfilePolicyConnectorFactory::GetForBrowserContext( |
- web_ui()->GetWebContents()->GetBrowserContext())->policy_service(); |
-} |
- |
PolicyUI::PolicyUI(content::WebUI* web_ui) : WebUIController(web_ui) { |
web_ui->AddMessageHandler(new PolicyUIHandler); |
content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), |
@@ -882,13 +59,3 @@ PolicyUI::PolicyUI(content::WebUI* web_ui) : WebUIController(web_ui) { |
PolicyUI::~PolicyUI() { |
} |
- |
-PolicyMaterialDesignUI::PolicyMaterialDesignUI(content::WebUI* web_ui) : |
- WebUIController(web_ui) { |
- web_ui->AddMessageHandler(new PolicyUIHandler); |
- content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), |
- CreatePolicyMaterialDesignUIHtmlSource()); |
-} |
- |
-PolicyMaterialDesignUI::~PolicyMaterialDesignUI() { |
-} |