19ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
29ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
39ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// found in the LICENSE file.
49ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
59ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/chromeos/policy/login_screen_power_management_policy.h"
69ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/json/json_reader.h"
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/strings/string_number_conversions.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/values.h"
109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/policy/configuration_policy_handler.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/policy/policy_error_map.h"
129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chromeos/dbus/power_policy_controller.h"
139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "grit/generated_resources.h"
149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "policy/policy_constants.h"
159ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
169ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochnamespace policy {
179ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
189ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochnamespace {
199ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  const char kScreenDimDelayAC[] = "AC.Delays.ScreenDim";
209ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  const char kScreenOffDelayAC[] = "AC.Delays.ScreenOff";
219ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  const char kIdleDelayAC[] = "AC.Delays.Idle";
229ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  const char kScreenDimDelayBattery[] = "Battery.Delays.ScreenDim";
239ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  const char kScreenOffDelayBattery[] = "Battery.Delays.ScreenOff";
249ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  const char kIdleDelayBattery[] = "Battery.Delays.Idle";
259ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  const char kIdleActionAC[] = "AC.IdleAction";
269ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  const char kIdleActionBattery[] = "Battery.IdleAction";
279ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  const char kLidCloseAction[] = "LidCloseAction";
289ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  const char kUserActivityScreenDimDelayScale[] =
299ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      "UserActivityScreenDimDelayScale";
309ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
319ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  const char kActionSuspend[]   = "Suspend";
329ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  const char kActionShutdown[]  = "Shutdown";
339ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  const char kActionDoNothing[] = "DoNothing";
349ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
359ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochscoped_ptr<base::Value> GetValue(const base::DictionaryValue* dict,
369ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                 const std::string& key,
379ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                 base::Value::Type type,
389ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                 PolicyErrorMap* errors) {
399ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  const base::Value* value;
409ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (!dict->Get(key, &value))
419ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    return scoped_ptr<base::Value>();
429ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
439ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (!value->IsType(type)) {
449ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    if (errors) {
459ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      errors->AddError(key::kDeviceLoginScreenPowerManagement,
469ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                       key,
479ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                       IDS_POLICY_TYPE_ERROR,
489ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                       ConfigurationPolicyHandler::ValueTypeToString(type));
499ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    }
509ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    return scoped_ptr<base::Value>();
519ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  }
529ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
539ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return scoped_ptr<base::Value>(value->DeepCopy());
549ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
559ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
569ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochscoped_ptr<base::Value> GetInteger(const base::DictionaryValue* dict,
579ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                   const std::string& key,
589ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                   int minimum,
599ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                   PolicyErrorMap* errors) {
609ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  scoped_ptr<base::Value> value =
619ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      GetValue(dict, key, base::Value::TYPE_INTEGER, errors);
629ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  int integer;
639ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (!value || !value->GetAsInteger(&integer) || integer >= minimum)
649ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    return value.Pass();
659ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
669ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (errors) {
679ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    errors->AddError(key::kDeviceLoginScreenPowerManagement,
689ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                     key,
699ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                     IDS_POLICY_OUT_OF_RANGE_ERROR,
709ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                     base::IntToString(integer));
719ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  }
729ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return scoped_ptr<base::Value>();
739ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
749ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
759ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochscoped_ptr<base::Value> GetAction(const base::DictionaryValue* dict,
769ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                  const std::string& key,
779ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                  PolicyErrorMap* errors) {
789ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  scoped_ptr<base::Value> value =
799ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      GetValue(dict, key, base::Value::TYPE_STRING, errors);
809ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  std::string action;
819ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (!value || !value->GetAsString(&action))
829ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    return value.Pass();
839ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
849ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (action == kActionSuspend) {
859ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    return scoped_ptr<base::Value>(new base::FundamentalValue(
869ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        chromeos::PowerPolicyController::ACTION_SUSPEND));
879ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  }
889ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (action == kActionShutdown) {
899ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    return scoped_ptr<base::Value>(new base::FundamentalValue(
909ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        chromeos::PowerPolicyController::ACTION_SHUT_DOWN));
919ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  }
929ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (action == kActionDoNothing) {
939ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    return scoped_ptr<base::Value>(new base::FundamentalValue(
949ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        chromeos::PowerPolicyController::ACTION_DO_NOTHING));
959ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  }
969ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
979ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (errors) {
989ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    errors->AddError(key::kDeviceLoginScreenPowerManagement,
999ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                     key,
1009ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                     IDS_POLICY_OUT_OF_RANGE_ERROR,
1019ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                     action);
1029ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  }
1039ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return scoped_ptr<base::Value>();
1049ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
1059ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1069ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}  // namespace
1079ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1089ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben MurdochLoginScreenPowerManagementPolicy::LoginScreenPowerManagementPolicy() {
1099ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
1109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben MurdochLoginScreenPowerManagementPolicy::~LoginScreenPowerManagementPolicy() {
1129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
1139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochbool LoginScreenPowerManagementPolicy::Init(const std::string& json,
1159ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                            PolicyErrorMap* errors) {
1169ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  std::string error;
1179ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  scoped_ptr<base::Value> root(base::JSONReader::ReadAndReturnError(
1189ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      json, base::JSON_ALLOW_TRAILING_COMMAS, NULL, &error));
1199ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  base::DictionaryValue* dict = NULL;
1209ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (!root || !root->GetAsDictionary(&dict)) {
1219ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    if (errors) {
1229ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      errors->AddError(key::kDeviceLoginScreenPowerManagement,
1239ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                       IDS_POLICY_JSON_PARSE_ERROR,
1249ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                       error);
1259ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    }
1269ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    // Errors in JSON decoding are fatal.
1279ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    return false;
1289ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  }
1299ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1309ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  screen_dim_delay_ac_ = GetInteger(dict, kScreenDimDelayAC, 0, errors);
1319ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  screen_off_delay_ac_ = GetInteger(dict, kScreenOffDelayAC, 0, errors);
1329ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  idle_delay_ac_ = GetInteger(dict, kIdleDelayAC, 0, errors);
1339ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  screen_dim_delay_battery_ =
1349ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      GetInteger(dict, kScreenDimDelayBattery, 0, errors);
1359ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  screen_off_delay_battery_ =
1369ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      GetInteger(dict, kScreenOffDelayBattery, 0, errors);
1379ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  idle_delay_battery_ = GetInteger(dict, kIdleDelayBattery, 0, errors);
1389ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  idle_action_ac_ = GetAction(dict, kIdleActionAC, errors);
1399ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  idle_action_battery_ = GetAction(dict, kIdleActionBattery, errors);
1409ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  lid_close_action_ = GetAction(dict, kLidCloseAction, errors);
1419ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  user_activity_screen_dim_delay_scale_ =
1429ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      GetInteger(dict, kUserActivityScreenDimDelayScale, 100, errors);
1439ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1449ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  // Validation errors for individual power policies are non-fatal as other
1459ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  // power policies that pass validation will still be applied.
1469ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return true;
1479ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
1489ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1499ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochconst base::Value*
1509ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    LoginScreenPowerManagementPolicy::GetScreenDimDelayAC() const {
1519ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return screen_dim_delay_ac_.get();
1529ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
1539ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1549ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochconst base::Value*
1559ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    LoginScreenPowerManagementPolicy::GetScreenOffDelayAC() const {
1569ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return screen_off_delay_ac_.get();
1579ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
1589ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1599ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochconst base::Value* LoginScreenPowerManagementPolicy::GetIdleDelayAC() const {
1609ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return idle_delay_ac_.get();
1619ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
1629ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1639ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochconst base::Value*
1649ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    LoginScreenPowerManagementPolicy::GetScreenDimDelayBattery() const {
1659ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return screen_dim_delay_battery_.get();
1669ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
1679ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1689ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochconst base::Value*
1699ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    LoginScreenPowerManagementPolicy::GetScreenOffDelayBattery() const {
1709ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return screen_off_delay_battery_.get();
1719ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
1729ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1739ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochconst base::Value*
1749ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    LoginScreenPowerManagementPolicy::GetIdleDelayBattery() const {
1759ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return idle_delay_battery_.get();
1769ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
1779ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1789ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochconst base::Value* LoginScreenPowerManagementPolicy::GetIdleActionAC() const {
1799ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return idle_action_ac_.get();
1809ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
1819ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1829ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochconst base::Value*
1839ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    LoginScreenPowerManagementPolicy::GetIdleActionBattery() const {
1849ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return idle_action_battery_.get();
1859ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
1869ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1879ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochconst base::Value* LoginScreenPowerManagementPolicy::GetLidCloseAction() const {
1889ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return lid_close_action_.get();
1899ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
1909ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1919ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochconst base::Value* LoginScreenPowerManagementPolicy::
1929ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    GetUserActivityScreenDimDelayScale() const {
1939ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return user_activity_screen_dim_delay_scale_.get();
1949ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
1959ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1969ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch} // namespace policy
197