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