| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/policy/device_policy_decoder_chromeos.h" | 5 #include "chrome/browser/chromeos/policy/device_policy_decoder_chromeos.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 using google::protobuf::RepeatedPtrField; | 31 using google::protobuf::RepeatedPtrField; |
| 32 | 32 |
| 33 namespace em = enterprise_management; | 33 namespace em = enterprise_management; |
| 34 | 34 |
| 35 namespace policy { | 35 namespace policy { |
| 36 | 36 |
| 37 namespace { | 37 namespace { |
| 38 | 38 |
| 39 // Decodes a protobuf integer to an IntegerValue. Returns NULL in case the input | 39 // Decodes a protobuf integer to an IntegerValue. Returns NULL in case the input |
| 40 // value is out of bounds. | 40 // value is out of bounds. |
| 41 scoped_ptr<base::Value> DecodeIntegerValue(google::protobuf::int64 value) { | 41 std::unique_ptr<base::Value> DecodeIntegerValue(google::protobuf::int64 value) { |
| 42 if (value < std::numeric_limits<int>::min() || | 42 if (value < std::numeric_limits<int>::min() || |
| 43 value > std::numeric_limits<int>::max()) { | 43 value > std::numeric_limits<int>::max()) { |
| 44 LOG(WARNING) << "Integer value " << value | 44 LOG(WARNING) << "Integer value " << value |
| 45 << " out of numeric limits, ignoring."; | 45 << " out of numeric limits, ignoring."; |
| 46 return scoped_ptr<base::Value>(); | 46 return std::unique_ptr<base::Value>(); |
| 47 } | 47 } |
| 48 | 48 |
| 49 return scoped_ptr<base::Value>( | 49 return std::unique_ptr<base::Value>( |
| 50 new base::FundamentalValue(static_cast<int>(value))); | 50 new base::FundamentalValue(static_cast<int>(value))); |
| 51 } | 51 } |
| 52 | 52 |
| 53 // Decodes a JSON string to a base::Value, and drops unknown properties | 53 // Decodes a JSON string to a base::Value, and drops unknown properties |
| 54 // according to a policy schema. |policy_name| is the name of a policy schema | 54 // according to a policy schema. |policy_name| is the name of a policy schema |
| 55 // defined in policy_templates.json. Returns NULL in case the input is not a | 55 // defined in policy_templates.json. Returns NULL in case the input is not a |
| 56 // valid JSON string. | 56 // valid JSON string. |
| 57 scoped_ptr<base::Value> DecodeJsonStringAndDropUnknownBySchema( | 57 std::unique_ptr<base::Value> DecodeJsonStringAndDropUnknownBySchema( |
| 58 const std::string& json_string, | 58 const std::string& json_string, |
| 59 const std::string& policy_name) { | 59 const std::string& policy_name) { |
| 60 std::string error; | 60 std::string error; |
| 61 scoped_ptr<base::Value> root = base::JSONReader::ReadAndReturnError( | 61 std::unique_ptr<base::Value> root = base::JSONReader::ReadAndReturnError( |
| 62 json_string, base::JSON_ALLOW_TRAILING_COMMAS, NULL, &error); | 62 json_string, base::JSON_ALLOW_TRAILING_COMMAS, NULL, &error); |
| 63 | 63 |
| 64 if (!root) { | 64 if (!root) { |
| 65 LOG(WARNING) << "Invalid JSON string: " << error << ", ignoring."; | 65 LOG(WARNING) << "Invalid JSON string: " << error << ", ignoring."; |
| 66 return scoped_ptr<base::Value>(); | 66 return std::unique_ptr<base::Value>(); |
| 67 } | 67 } |
| 68 | 68 |
| 69 const Schema& schema = g_browser_process | 69 const Schema& schema = g_browser_process |
| 70 ->browser_policy_connector() | 70 ->browser_policy_connector() |
| 71 ->GetChromeSchema() | 71 ->GetChromeSchema() |
| 72 .GetKnownProperty(policy_name); | 72 .GetKnownProperty(policy_name); |
| 73 | 73 |
| 74 if (schema.valid()) { | 74 if (schema.valid()) { |
| 75 std::string error_path; | 75 std::string error_path; |
| 76 bool changed = false; | 76 bool changed = false; |
| 77 | 77 |
| 78 if (!schema.Normalize(root.get(), SCHEMA_ALLOW_UNKNOWN, &error_path, &error, | 78 if (!schema.Normalize(root.get(), SCHEMA_ALLOW_UNKNOWN, &error_path, &error, |
| 79 &changed)) { | 79 &changed)) { |
| 80 LOG(WARNING) << "Invalid policy value for " << policy_name << ": " | 80 LOG(WARNING) << "Invalid policy value for " << policy_name << ": " |
| 81 << error << " at " << error_path << "."; | 81 << error << " at " << error_path << "."; |
| 82 return scoped_ptr<base::Value>(); | 82 return std::unique_ptr<base::Value>(); |
| 83 } | 83 } |
| 84 | 84 |
| 85 if (changed) { | 85 if (changed) { |
| 86 LOG(WARNING) << "Some properties in " << policy_name | 86 LOG(WARNING) << "Some properties in " << policy_name |
| 87 << " were dropped: " << error << " at " << error_path << "."; | 87 << " were dropped: " << error << " at " << error_path << "."; |
| 88 } | 88 } |
| 89 } else { | 89 } else { |
| 90 LOG(WARNING) << "Unknown or invalid policy schema for " << policy_name | 90 LOG(WARNING) << "Unknown or invalid policy schema for " << policy_name |
| 91 << "."; | 91 << "."; |
| 92 return scoped_ptr<base::Value>(); | 92 return std::unique_ptr<base::Value>(); |
| 93 } | 93 } |
| 94 | 94 |
| 95 return root; | 95 return root; |
| 96 } | 96 } |
| 97 | 97 |
| 98 base::Value* DecodeConnectionType(int value) { | 98 base::Value* DecodeConnectionType(int value) { |
| 99 static const char* const kConnectionTypes[] = { | 99 static const char* const kConnectionTypes[] = { |
| 100 shill::kTypeEthernet, | 100 shill::kTypeEthernet, |
| 101 shill::kTypeWifi, | 101 shill::kTypeWifi, |
| 102 shill::kTypeWimax, | 102 shill::kTypeWimax, |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 container.ephemeral_users_enabled()), | 191 container.ephemeral_users_enabled()), |
| 192 NULL); | 192 NULL); |
| 193 } | 193 } |
| 194 } | 194 } |
| 195 | 195 |
| 196 if (policy.has_device_local_accounts()) { | 196 if (policy.has_device_local_accounts()) { |
| 197 const em::DeviceLocalAccountsProto& container( | 197 const em::DeviceLocalAccountsProto& container( |
| 198 policy.device_local_accounts()); | 198 policy.device_local_accounts()); |
| 199 const RepeatedPtrField<em::DeviceLocalAccountInfoProto>& accounts = | 199 const RepeatedPtrField<em::DeviceLocalAccountInfoProto>& accounts = |
| 200 container.account(); | 200 container.account(); |
| 201 scoped_ptr<base::ListValue> account_list(new base::ListValue()); | 201 std::unique_ptr<base::ListValue> account_list(new base::ListValue()); |
| 202 RepeatedPtrField<em::DeviceLocalAccountInfoProto>::const_iterator entry; | 202 RepeatedPtrField<em::DeviceLocalAccountInfoProto>::const_iterator entry; |
| 203 for (entry = accounts.begin(); entry != accounts.end(); ++entry) { | 203 for (entry = accounts.begin(); entry != accounts.end(); ++entry) { |
| 204 scoped_ptr<base::DictionaryValue> entry_dict( | 204 std::unique_ptr<base::DictionaryValue> entry_dict( |
| 205 new base::DictionaryValue()); | 205 new base::DictionaryValue()); |
| 206 if (entry->has_type()) { | 206 if (entry->has_type()) { |
| 207 if (entry->has_account_id()) { | 207 if (entry->has_account_id()) { |
| 208 entry_dict->SetStringWithoutPathExpansion( | 208 entry_dict->SetStringWithoutPathExpansion( |
| 209 chromeos::kAccountsPrefDeviceLocalAccountsKeyId, | 209 chromeos::kAccountsPrefDeviceLocalAccountsKeyId, |
| 210 entry->account_id()); | 210 entry->account_id()); |
| 211 } | 211 } |
| 212 entry_dict->SetIntegerWithoutPathExpansion( | 212 entry_dict->SetIntegerWithoutPathExpansion( |
| 213 chromeos::kAccountsPrefDeviceLocalAccountsKeyType, entry->type()); | 213 chromeos::kAccountsPrefDeviceLocalAccountsKeyType, entry->type()); |
| 214 if (entry->kiosk_app().has_app_id()) { | 214 if (entry->kiosk_app().has_app_id()) { |
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 policies->Set(key::kSystemTimezone, | 701 policies->Set(key::kSystemTimezone, |
| 702 POLICY_LEVEL_MANDATORY, | 702 POLICY_LEVEL_MANDATORY, |
| 703 POLICY_SCOPE_MACHINE, | 703 POLICY_SCOPE_MACHINE, |
| 704 POLICY_SOURCE_CLOUD, | 704 POLICY_SOURCE_CLOUD, |
| 705 new base::StringValue( | 705 new base::StringValue( |
| 706 policy.system_timezone().timezone()), | 706 policy.system_timezone().timezone()), |
| 707 NULL); | 707 NULL); |
| 708 } | 708 } |
| 709 | 709 |
| 710 if (policy.system_timezone().has_timezone_detection_type()) { | 710 if (policy.system_timezone().has_timezone_detection_type()) { |
| 711 scoped_ptr<base::Value> value(DecodeIntegerValue( | 711 std::unique_ptr<base::Value> value(DecodeIntegerValue( |
| 712 policy.system_timezone().timezone_detection_type())); | 712 policy.system_timezone().timezone_detection_type())); |
| 713 if (value) { | 713 if (value) { |
| 714 policies->Set(key::kSystemTimezoneAutomaticDetection, | 714 policies->Set(key::kSystemTimezoneAutomaticDetection, |
| 715 POLICY_LEVEL_MANDATORY, | 715 POLICY_LEVEL_MANDATORY, |
| 716 POLICY_SCOPE_MACHINE, | 716 POLICY_SCOPE_MACHINE, |
| 717 POLICY_SOURCE_CLOUD, | 717 POLICY_SOURCE_CLOUD, |
| 718 value.release(), | 718 value.release(), |
| 719 nullptr); | 719 nullptr); |
| 720 } | 720 } |
| 721 } | 721 } |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 807 new base::FundamentalValue( | 807 new base::FundamentalValue( |
| 808 policy.attestation_settings().content_protection_enabled()), | 808 policy.attestation_settings().content_protection_enabled()), |
| 809 NULL); | 809 NULL); |
| 810 } | 810 } |
| 811 } | 811 } |
| 812 | 812 |
| 813 if (policy.has_login_screen_power_management()) { | 813 if (policy.has_login_screen_power_management()) { |
| 814 const em::LoginScreenPowerManagementProto& container( | 814 const em::LoginScreenPowerManagementProto& container( |
| 815 policy.login_screen_power_management()); | 815 policy.login_screen_power_management()); |
| 816 if (container.has_login_screen_power_management()) { | 816 if (container.has_login_screen_power_management()) { |
| 817 scoped_ptr<base::Value> decoded_json; | 817 std::unique_ptr<base::Value> decoded_json; |
| 818 decoded_json = DecodeJsonStringAndDropUnknownBySchema( | 818 decoded_json = DecodeJsonStringAndDropUnknownBySchema( |
| 819 container.login_screen_power_management(), | 819 container.login_screen_power_management(), |
| 820 key::kDeviceLoginScreenPowerManagement); | 820 key::kDeviceLoginScreenPowerManagement); |
| 821 if (decoded_json) { | 821 if (decoded_json) { |
| 822 policies->Set(key::kDeviceLoginScreenPowerManagement, | 822 policies->Set(key::kDeviceLoginScreenPowerManagement, |
| 823 POLICY_LEVEL_MANDATORY, | 823 POLICY_LEVEL_MANDATORY, |
| 824 POLICY_SCOPE_MACHINE, | 824 POLICY_SCOPE_MACHINE, |
| 825 POLICY_SOURCE_CLOUD, | 825 POLICY_SOURCE_CLOUD, |
| 826 decoded_json.release(), | 826 decoded_json.release(), |
| 827 NULL); | 827 NULL); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 922 // Decode the various groups of policies. | 922 // Decode the various groups of policies. |
| 923 DecodeLoginPolicies(policy, policies); | 923 DecodeLoginPolicies(policy, policies); |
| 924 DecodeNetworkPolicies(policy, policies); | 924 DecodeNetworkPolicies(policy, policies); |
| 925 DecodeReportingPolicies(policy, policies); | 925 DecodeReportingPolicies(policy, policies); |
| 926 DecodeAutoUpdatePolicies(policy, policies); | 926 DecodeAutoUpdatePolicies(policy, policies); |
| 927 DecodeAccessibilityPolicies(policy, policies); | 927 DecodeAccessibilityPolicies(policy, policies); |
| 928 DecodeGenericPolicies(policy, policies); | 928 DecodeGenericPolicies(policy, policies); |
| 929 } | 929 } |
| 930 | 930 |
| 931 } // namespace policy | 931 } // namespace policy |
| OLD | NEW |