15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/policy/configuration_policy_handler_chromeos.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/magnifier/magnifier_constants.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/callback.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_writer.h"
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/logging.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/prefs/pref_value_map.h"
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
185e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/ash/chrome_launcher_prefs.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chromeos/dbus/power_policy_controller.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_signature.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_utils.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_validator.h"
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "components/onc/onc_constants.h"
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/browser/policy_error_map.h"
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/external_data_fetcher.h"
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_map.h"
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/policy/core/common/schema.h"
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "crypto/sha2.h"
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "grit/components_strings.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "policy/policy_constants.h"
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "url/gurl.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace {
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kSubkeyURL[] = "url";
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kSubkeyHash[] = "hash";
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool GetSubkeyString(const base::DictionaryValue& dict,
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     policy::PolicyErrorMap* errors,
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     const std::string& policy,
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     const std::string& subkey,
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     std::string* value) {
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::Value* raw_value = NULL;
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!dict.GetWithoutPathExpansion(subkey, &raw_value)) {
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    errors->AddError(policy, subkey, IDS_POLICY_NOT_SPECIFIED_ERROR);
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return false;
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string string_value;
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!raw_value->GetAsString(&string_value)) {
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    errors->AddError(policy, subkey, IDS_POLICY_TYPE_ERROR, "string");
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return false;
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (string_value.empty()) {
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    errors->AddError(policy, subkey, IDS_POLICY_NOT_SPECIFIED_ERROR);
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return false;
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  *value = string_value;
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return true;
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kScreenDimDelayAC[] = "AC.Delays.ScreenDim";
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kScreenOffDelayAC[] = "AC.Delays.ScreenOff";
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kIdleWarningDelayAC[] = "AC.Delays.IdleWarning";
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kIdleDelayAC[] = "AC.Delays.Idle";
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kIdleActionAC[] = "AC.IdleAction";
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kScreenDimDelayBattery[] = "Battery.Delays.ScreenDim";
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kScreenOffDelayBattery[] = "Battery.Delays.ScreenOff";
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kIdleWarningDelayBattery[] = "Battery.Delays.IdleWarning";
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kIdleDelayBattery[] = "Battery.Delays.Idle";
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kIdleActionBattery[] = "Battery.IdleAction";
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kScreenLockDelayAC[] = "AC";
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kScreenLockDelayBattery[] = "Battery";
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kActionSuspend[] = "Suspend";
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kActionLogout[] = "Logout";
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kActionShutdown[]  = "Shutdown";
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kActionDoNothing[] = "DoNothing";
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)scoped_ptr<base::Value> GetValue(const base::DictionaryValue* dict,
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 const char* key) {
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::Value* value = NULL;
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!dict->Get(key, &value))
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return scoped_ptr<base::Value>();
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return scoped_ptr<base::Value>(value->DeepCopy());
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)scoped_ptr<base::Value> GetAction(const base::DictionaryValue* dict,
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  const char* key) {
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<base::Value> value = GetValue(dict, key);
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string action;
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!value || !value->GetAsString(&action))
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return scoped_ptr<base::Value>();
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (action == kActionSuspend) {
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return scoped_ptr<base::Value>(new base::FundamentalValue(
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        chromeos::PowerPolicyController::ACTION_SUSPEND));
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (action == kActionLogout) {
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return scoped_ptr<base::Value>(new base::FundamentalValue(
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        chromeos::PowerPolicyController::ACTION_STOP_SESSION));
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (action == kActionShutdown) {
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return scoped_ptr<base::Value>(new base::FundamentalValue(
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        chromeos::PowerPolicyController::ACTION_SHUT_DOWN));
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (action == kActionDoNothing) {
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return scoped_ptr<base::Value>(new base::FundamentalValue(
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        chromeos::PowerPolicyController::ACTION_DO_NOTHING));
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return scoped_ptr<base::Value>();
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}  // namespace
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)ExternalDataPolicyHandler::ExternalDataPolicyHandler(const char* policy_name)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : TypeCheckingPolicyHandler(policy_name, base::Value::TYPE_DICTIONARY) {
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)ExternalDataPolicyHandler::~ExternalDataPolicyHandler() {
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool ExternalDataPolicyHandler::CheckPolicySettings(const PolicyMap& policies,
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                    PolicyErrorMap* errors) {
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!TypeCheckingPolicyHandler::CheckPolicySettings(policies, errors))
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return false;
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const std::string policy = policy_name();
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::Value* value = policies.GetValue(policy);
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!value)
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return true;
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::DictionaryValue* dict = NULL;
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  value->GetAsDictionary(&dict);
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!dict) {
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    NOTREACHED();
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return false;
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string url_string;
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string hash_string;
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!GetSubkeyString(*dict, errors, policy, kSubkeyURL, &url_string) ||
147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      !GetSubkeyString(*dict, errors, policy, kSubkeyHash, &hash_string)) {
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return false;
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const GURL url(url_string);
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!url.is_valid()) {
153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    errors->AddError(policy, kSubkeyURL, IDS_POLICY_VALUE_FORMAT_ERROR);
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return false;
155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<uint8> hash;
158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!base::HexStringToBytes(hash_string, &hash) ||
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      hash.size() != crypto::kSHA256Length) {
160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    errors->AddError(policy, kSubkeyHash, IDS_POLICY_VALUE_FORMAT_ERROR);
161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return false;
162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return true;
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ExternalDataPolicyHandler::ApplyPolicySettings(const PolicyMap& policies,
168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                    PrefValueMap* prefs) {
169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NetworkConfigurationPolicyHandler*
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NetworkConfigurationPolicyHandler::CreateForUserPolicy() {
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return new NetworkConfigurationPolicyHandler(
175ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      key::kOpenNetworkConfiguration,
176ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      onc::ONC_SOURCE_USER_POLICY,
177ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      prefs::kOpenNetworkConfiguration);
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NetworkConfigurationPolicyHandler*
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NetworkConfigurationPolicyHandler::CreateForDevicePolicy() {
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return new NetworkConfigurationPolicyHandler(
184ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      key::kDeviceOpenNetworkConfiguration,
185ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      onc::ONC_SOURCE_DEVICE_POLICY,
186ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      prefs::kDeviceOpenNetworkConfiguration);
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkConfigurationPolicyHandler::~NetworkConfigurationPolicyHandler() {}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NetworkConfigurationPolicyHandler::CheckPolicySettings(
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PolicyMap& policies,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PolicyErrorMap* errors) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::Value* value;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CheckAndGetValue(policies, errors, &value))
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (value) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string onc_blob;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value->GetAsString(&onc_blob);
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<base::DictionaryValue> root_dict =
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        chromeos::onc::ReadDictionaryFromJson(onc_blob);
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (root_dict.get() == NULL) {
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      errors->AddError(policy_name(), IDS_POLICY_NETWORK_CONFIG_PARSE_FAILED);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Validate the ONC dictionary. We are liberal and ignore unknown field
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // names and ignore invalid field names in kRecommended arrays.
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    chromeos::onc::Validator validator(
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        false,  // Ignore unknown fields.
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        false,  // Ignore invalid recommended field names.
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        true,   // Fail on missing fields.
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        true);  // Validate for managed ONC
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    validator.SetOncSource(onc_source_);
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // ONC policies are always unencrypted.
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    chromeos::onc::Validator::Result validation_result;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_dict = validator.ValidateAndRepairObject(
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        &chromeos::onc::kToplevelConfigurationSignature, *root_dict,
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        &validation_result);
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (validation_result == chromeos::onc::Validator::VALID_WITH_WARNINGS)
223ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      errors->AddError(policy_name(), IDS_POLICY_NETWORK_CONFIG_IMPORT_PARTIAL);
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    else if (validation_result == chromeos::onc::Validator::INVALID)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      errors->AddError(policy_name(), IDS_POLICY_NETWORK_CONFIG_IMPORT_FAILED);
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // In any case, don't reject the policy as some networks or certificates
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // could still be applied.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigurationPolicyHandler::ApplyPolicySettings(
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PolicyMap& policies,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefValueMap* prefs) {
237ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const base::Value* value = policies.GetValue(policy_name());
238ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!value)
239ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
240ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
241ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::string onc_blob;
242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  value->GetAsString(&onc_blob);
243ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
244ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<base::ListValue> network_configs(new base::ListValue);
245ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::ListValue certificates;
2468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::DictionaryValue global_network_config;
2478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  chromeos::onc::ParseAndValidateOncForImport(onc_blob,
2488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                              onc_source_,
2498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                              "",
2508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                              network_configs.get(),
2518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                              &global_network_config,
2528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                              &certificates);
2538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Currently, only the per-network configuration is stored in a pref. Ignore
2558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // |global_network_config| and |certificates|.
256ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  prefs->SetValue(pref_path_, network_configs.release());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigurationPolicyHandler::PrepareForDisplaying(
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PolicyMap* policies) const {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PolicyMap::Entry* entry = policies->Get(policy_name());
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Value* sanitized_config = SanitizeNetworkConfig(entry->value);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!sanitized_config)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sanitized_config = base::Value::CreateNullValue();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  policies->Set(policy_name(), entry->level, entry->scope,
2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                sanitized_config, NULL);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NetworkConfigurationPolicyHandler::NetworkConfigurationPolicyHandler(
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const char* policy_name,
2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    onc::ONCSource onc_source,
275ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const char* pref_path)
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : TypeCheckingPolicyHandler(policy_name, base::Value::TYPE_STRING),
277ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      onc_source_(onc_source),
278ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      pref_path_(pref_path) {
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Value* NetworkConfigurationPolicyHandler::SanitizeNetworkConfig(
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Value* config) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string json_string;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!config->GetAsString(&json_string))
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> toplevel_dict =
2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      chromeos::onc::ReadDictionaryFromJson(json_string);
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!toplevel_dict)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Placeholder to insert in place of the filtered setting.
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char kPlaceholder[] = "********";
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  toplevel_dict = chromeos::onc::MaskCredentialsInOncObject(
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      chromeos::onc::kToplevelConfigurationSignature,
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      *toplevel_dict,
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kPlaceholder);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::JSONWriter::WriteWithOptions(toplevel_dict.get(),
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     base::JSONWriter::OPTIONS_PRETTY_PRINT,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &json_string);
304effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return new base::StringValue(json_string);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PinnedLauncherAppsPolicyHandler::PinnedLauncherAppsPolicyHandler()
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ExtensionListPolicyHandler(key::kPinnedLauncherApps,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 prefs::kPinnedLauncherApps,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false) {}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PinnedLauncherAppsPolicyHandler::~PinnedLauncherAppsPolicyHandler() {}
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PinnedLauncherAppsPolicyHandler::ApplyPolicySettings(
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PolicyMap& policies,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefValueMap* prefs) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyErrorMap errors;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::Value* policy_value = policies.GetValue(policy_name());
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::ListValue* policy_list = NULL;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy_value && policy_value->GetAsList(&policy_list) && policy_list) {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ListValue* pinned_apps_list = new base::ListValue();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (base::ListValue::const_iterator entry(policy_list->begin());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         entry != policy_list->end(); ++entry) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string id;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((*entry)->GetAsString(&id)) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::DictionaryValue* app_dict = new base::DictionaryValue();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        app_dict->SetString(ash::kPinnedAppsPrefAppIDPath, id);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pinned_apps_list->Append(app_dict);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs->SetValue(pref_path(), pinned_apps_list);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ScreenMagnifierPolicyHandler::ScreenMagnifierPolicyHandler()
336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : IntRangePolicyHandlerBase(key::kScreenMagnifierType,
337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                0, ash::MAGNIFIER_FULL, false) {
338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ScreenMagnifierPolicyHandler::~ScreenMagnifierPolicyHandler() {
341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ScreenMagnifierPolicyHandler::ApplyPolicySettings(
344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const PolicyMap& policies,
345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    PrefValueMap* prefs) {
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const base::Value* value = policies.GetValue(policy_name());
347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int value_in_range;
348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (value && EnsureInRange(value, &value_in_range, NULL)) {
349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    prefs->SetValue(prefs::kAccessibilityScreenMagnifierEnabled,
350effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    new base::FundamentalValue(value_in_range != 0));
351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    prefs->SetValue(prefs::kAccessibilityScreenMagnifierType,
352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    new base::FundamentalValue(value_in_range));
353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3569ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben MurdochLoginScreenPowerManagementPolicyHandler::
357effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    LoginScreenPowerManagementPolicyHandler(const Schema& chrome_schema)
358effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    : SchemaValidatingPolicyHandler(key::kDeviceLoginScreenPowerManagement,
359effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    chrome_schema.GetKnownProperty(
360effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                        key::kDeviceLoginScreenPowerManagement),
361effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    SCHEMA_ALLOW_UNKNOWN) {
3629ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
3639ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
3649ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben MurdochLoginScreenPowerManagementPolicyHandler::
3659ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    ~LoginScreenPowerManagementPolicyHandler() {
3669ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
3679ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
3689ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochvoid LoginScreenPowerManagementPolicyHandler::ApplyPolicySettings(
3699ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    const PolicyMap& policies,
3709ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    PrefValueMap* prefs) {
3719ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
3729ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
373558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochDeprecatedIdleActionHandler::DeprecatedIdleActionHandler()
374558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    : IntRangePolicyHandlerBase(
375558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          key::kIdleAction,
376558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          chromeos::PowerPolicyController::ACTION_SUSPEND,
377558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          chromeos::PowerPolicyController::ACTION_DO_NOTHING,
378558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          false) {}
379558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
380558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochDeprecatedIdleActionHandler::~DeprecatedIdleActionHandler() {}
381558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
382558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid DeprecatedIdleActionHandler::ApplyPolicySettings(const PolicyMap& policies,
383558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                                      PrefValueMap* prefs) {
384558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  const base::Value* value = policies.GetValue(policy_name());
385558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (value && EnsureInRange(value, NULL, NULL)) {
386558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    if (!prefs->GetValue(prefs::kPowerAcIdleAction, NULL))
387558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      prefs->SetValue(prefs::kPowerAcIdleAction, value->DeepCopy());
388558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    if (!prefs->GetValue(prefs::kPowerBatteryIdleAction, NULL))
389558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      prefs->SetValue(prefs::kPowerBatteryIdleAction, value->DeepCopy());
390558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
391558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
392558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)PowerManagementIdleSettingsPolicyHandler::
394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PowerManagementIdleSettingsPolicyHandler(const Schema& chrome_schema)
395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : SchemaValidatingPolicyHandler(
396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          key::kPowerManagementIdleSettings,
397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          chrome_schema.GetKnownProperty(key::kPowerManagementIdleSettings),
398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          SCHEMA_ALLOW_UNKNOWN) {
399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)PowerManagementIdleSettingsPolicyHandler::
402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ~PowerManagementIdleSettingsPolicyHandler() {
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void PowerManagementIdleSettingsPolicyHandler::ApplyPolicySettings(
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const PolicyMap& policies,
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PrefValueMap* prefs) {
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<base::Value> policy_value;
409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!CheckAndGetValue(policies, NULL, &policy_value))
410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::DictionaryValue* dict = NULL;
412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!policy_value->GetAsDictionary(&dict)) {
413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    NOTREACHED();
414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<base::Value> value;
417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  value = GetValue(dict, kScreenDimDelayAC);
419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (value)
420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    prefs->SetValue(prefs::kPowerAcScreenDimDelayMs, value.release());
421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  value = GetValue(dict, kScreenOffDelayAC);
422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (value)
423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    prefs->SetValue(prefs::kPowerAcScreenOffDelayMs, value.release());
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  value = GetValue(dict, kIdleWarningDelayAC);
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (value)
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    prefs->SetValue(prefs::kPowerAcIdleWarningDelayMs, value.release());
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  value = GetValue(dict, kIdleDelayAC);
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (value)
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    prefs->SetValue(prefs::kPowerAcIdleDelayMs, value.release());
430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  value = GetAction(dict, kIdleActionAC);
431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (value)
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    prefs->SetValue(prefs::kPowerAcIdleAction, value.release());
433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  value = GetValue(dict, kScreenDimDelayBattery);
435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (value)
436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    prefs->SetValue(prefs::kPowerBatteryScreenDimDelayMs, value.release());
437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  value = GetValue(dict, kScreenOffDelayBattery);
438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (value)
439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    prefs->SetValue(prefs::kPowerBatteryScreenOffDelayMs, value.release());
440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  value = GetValue(dict, kIdleWarningDelayBattery);
441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (value)
442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    prefs->SetValue(prefs::kPowerBatteryIdleWarningDelayMs, value.release());
443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  value = GetValue(dict, kIdleDelayBattery);
444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (value)
445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    prefs->SetValue(prefs::kPowerBatteryIdleDelayMs, value.release());
446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  value = GetAction(dict, kIdleActionBattery);
447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (value)
448a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    prefs->SetValue(prefs::kPowerBatteryIdleAction, value.release());
449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ScreenLockDelayPolicyHandler::ScreenLockDelayPolicyHandler(
452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const Schema& chrome_schema)
453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : SchemaValidatingPolicyHandler(
454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          key::kScreenLockDelays,
455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          chrome_schema.GetKnownProperty(key::kScreenLockDelays),
456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          SCHEMA_ALLOW_UNKNOWN) {
457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ScreenLockDelayPolicyHandler::~ScreenLockDelayPolicyHandler() {
460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ScreenLockDelayPolicyHandler::ApplyPolicySettings(
463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const PolicyMap& policies,
464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PrefValueMap* prefs) {
465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<base::Value> policy_value;
466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!CheckAndGetValue(policies, NULL, &policy_value))
467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::DictionaryValue* dict = NULL;
469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!policy_value->GetAsDictionary(&dict)) {
470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    NOTREACHED();
471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<base::Value> value;
474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  value = GetValue(dict, kScreenLockDelayAC);
476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (value)
477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    prefs->SetValue(prefs::kPowerAcScreenLockDelayMs, value.release());
478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  value = GetValue(dict, kScreenLockDelayBattery);
479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (value)
480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    prefs->SetValue(prefs::kPowerBatteryScreenLockDelayMs, value.release());
481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace policy
484