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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/chromeos/extensions/info_private_api.h" 6 7 #include "base/basictypes.h" 8 #include "base/prefs/pref_service.h" 9 #include "base/sys_info.h" 10 #include "base/values.h" 11 #include "chrome/browser/app_mode/app_mode_utils.h" 12 #include "chrome/browser/browser_process.h" 13 #include "chrome/browser/chromeos/login/startup_utils.h" 14 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" 15 #include "chrome/browser/chromeos/settings/cros_settings.h" 16 #include "chrome/browser/chromeos/system/timezone_util.h" 17 #include "chrome/browser/profiles/profile.h" 18 #include "chrome/common/pref_names.h" 19 #include "chromeos/network/device_state.h" 20 #include "chromeos/network/network_handler.h" 21 #include "chromeos/network/network_state_handler.h" 22 #include "chromeos/settings/cros_settings_names.h" 23 #include "chromeos/system/statistics_provider.h" 24 #include "components/metrics/metrics_service.h" 25 #include "components/user_manager/user_manager.h" 26 #include "extensions/common/error_utils.h" 27 #include "third_party/cros_system_api/dbus/service_constants.h" 28 29 using chromeos::NetworkHandler; 30 31 namespace extensions { 32 33 namespace { 34 35 // Key which corresponds to the HWID setting. 36 const char kPropertyHWID[] = "hwid"; 37 38 // Key which corresponds to the customization ID setting. 39 const char kPropertyCustomizationID[] = "customizationId"; 40 41 // Key which corresponds to the home provider property. 42 const char kPropertyHomeProvider[] = "homeProvider"; 43 44 // Key which corresponds to the initial_locale property. 45 const char kPropertyInitialLocale[] = "initialLocale"; 46 47 // Key which corresponds to the board property in JS. 48 const char kPropertyBoard[] = "board"; 49 50 // Key which corresponds to the isOwner property in JS. 51 const char kPropertyOwner[] = "isOwner"; 52 53 // Key which corresponds to the clientId property in JS. 54 const char kPropertyClientId[] = "clientId"; 55 56 // Key which corresponds to the timezone property in JS. 57 const char kPropertyTimezone[] = "timezone"; 58 59 // Key which corresponds to the timezone property in JS. 60 const char kPropertySupportedTimezones[] = "supportedTimezones"; 61 62 // Key which corresponds to the large cursor A11Y property in JS. 63 const char kPropertyLargeCursorEnabled[] = "a11yLargeCursorEnabled"; 64 65 // Key which corresponds to the sticky keys A11Y property in JS. 66 const char kPropertyStickyKeysEnabled[] = "a11yStickyKeysEnabled"; 67 68 // Key which corresponds to the spoken feedback A11Y property in JS. 69 const char kPropertySpokenFeedbackEnabled[] = "a11ySpokenFeedbackEnabled"; 70 71 // Key which corresponds to the high contrast mode A11Y property in JS. 72 const char kPropertyHighContrastEnabled[] = "a11yHighContrastEnabled"; 73 74 // Key which corresponds to the screen magnifier A11Y property in JS. 75 const char kPropertyScreenMagnifierEnabled[] = "a11yScreenMagnifierEnabled"; 76 77 // Key which corresponds to the auto click A11Y property in JS. 78 const char kPropertyAutoclickEnabled[] = "a11yAutoClickEnabled"; 79 80 // Key which corresponds to the auto click A11Y property in JS. 81 const char kPropertyVirtualKeyboardEnabled[] = "a11yVirtualKeyboardEnabled"; 82 83 // Key which corresponds to the send-function-keys property in JS. 84 const char kPropertySendFunctionsKeys[] = "sendFunctionKeys"; 85 86 // Property not found error message. 87 const char kPropertyNotFound[] = "Property '*' does not exist."; 88 89 const struct { 90 const char* api_name; 91 const char* preference_name; 92 } kPreferencesMap[] = { 93 {kPropertyLargeCursorEnabled, prefs::kAccessibilityLargeCursorEnabled}, 94 {kPropertyStickyKeysEnabled, prefs::kAccessibilityStickyKeysEnabled}, 95 {kPropertySpokenFeedbackEnabled, 96 prefs::kAccessibilitySpokenFeedbackEnabled}, 97 {kPropertyHighContrastEnabled, prefs::kAccessibilityHighContrastEnabled}, 98 {kPropertyScreenMagnifierEnabled, 99 prefs::kAccessibilityScreenMagnifierEnabled}, 100 {kPropertyAutoclickEnabled, prefs::kAccessibilityAutoclickEnabled}, 101 {kPropertyVirtualKeyboardEnabled, 102 prefs::kAccessibilityVirtualKeyboardEnabled}, 103 {kPropertySendFunctionsKeys, prefs::kLanguageSendFunctionKeys}}; 104 105 const char* GetBoolPrefNameForApiProperty(const char* api_name) { 106 for (size_t i = 0; 107 i < (sizeof(kPreferencesMap)/sizeof(*kPreferencesMap)); 108 i++) { 109 if (strcmp(kPreferencesMap[i].api_name, api_name) == 0) 110 return kPreferencesMap[i].preference_name; 111 } 112 113 return NULL; 114 } 115 116 bool IsEnterpriseKiosk() { 117 if (!chrome::IsRunningInForcedAppMode()) 118 return false; 119 120 policy::BrowserPolicyConnectorChromeOS* connector = 121 g_browser_process->platform_part()->browser_policy_connector_chromeos(); 122 return connector->IsEnterpriseManaged(); 123 } 124 125 std::string GetClientId() { 126 return IsEnterpriseKiosk() 127 ? g_browser_process->metrics_service()->GetClientId() 128 : std::string(); 129 } 130 131 } // namespace 132 133 ChromeosInfoPrivateGetFunction::ChromeosInfoPrivateGetFunction() { 134 } 135 136 ChromeosInfoPrivateGetFunction::~ChromeosInfoPrivateGetFunction() { 137 } 138 139 bool ChromeosInfoPrivateGetFunction::RunAsync() { 140 base::ListValue* list = NULL; 141 EXTENSION_FUNCTION_VALIDATE(args_->GetList(0, &list)); 142 scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue()); 143 for (size_t i = 0; i < list->GetSize(); ++i) { 144 std::string property_name; 145 EXTENSION_FUNCTION_VALIDATE(list->GetString(i, &property_name)); 146 base::Value* value = GetValue(property_name); 147 if (value) 148 result->Set(property_name, value); 149 } 150 SetResult(result.release()); 151 SendResponse(true); 152 return true; 153 } 154 155 base::Value* ChromeosInfoPrivateGetFunction::GetValue( 156 const std::string& property_name) { 157 if (property_name == kPropertyHWID) { 158 std::string hwid; 159 chromeos::system::StatisticsProvider* provider = 160 chromeos::system::StatisticsProvider::GetInstance(); 161 provider->GetMachineStatistic(chromeos::system::kHardwareClassKey, &hwid); 162 return new base::StringValue(hwid); 163 } else if (property_name == kPropertyCustomizationID) { 164 std::string customization_id; 165 chromeos::system::StatisticsProvider* provider = 166 chromeos::system::StatisticsProvider::GetInstance(); 167 provider->GetMachineStatistic(chromeos::system::kCustomizationIdKey, 168 &customization_id); 169 return new base::StringValue(customization_id); 170 } else if (property_name == kPropertyHomeProvider) { 171 const chromeos::DeviceState* cellular_device = 172 NetworkHandler::Get()->network_state_handler()->GetDeviceStateByType( 173 chromeos::NetworkTypePattern::Cellular()); 174 std::string home_provider_id; 175 if (cellular_device) 176 home_provider_id = cellular_device->home_provider_id(); 177 return new base::StringValue(home_provider_id); 178 } else if (property_name == kPropertyInitialLocale) { 179 return new base::StringValue( 180 chromeos::StartupUtils::GetInitialLocale()); 181 } else if (property_name == kPropertyBoard) { 182 return new base::StringValue(base::SysInfo::GetLsbReleaseBoard()); 183 } else if (property_name == kPropertyOwner) { 184 return new base::FundamentalValue( 185 user_manager::UserManager::Get()->IsCurrentUserOwner()); 186 } else if (property_name == kPropertyClientId) { 187 return new base::StringValue(GetClientId()); 188 } else if (property_name == kPropertyTimezone) { 189 return chromeos::CrosSettings::Get()->GetPref( 190 chromeos::kSystemTimezone)->DeepCopy(); 191 } else if (property_name == kPropertySupportedTimezones) { 192 scoped_ptr<base::ListValue> values = chromeos::system::GetTimezoneList(); 193 return values.release(); 194 } else { 195 const char* pref_name = 196 GetBoolPrefNameForApiProperty(property_name.c_str()); 197 if (pref_name) { 198 return new base::FundamentalValue( 199 Profile::FromBrowserContext(context_)->GetPrefs()->GetBoolean( 200 pref_name)); 201 } 202 } 203 204 DLOG(ERROR) << "Unknown property request: " << property_name; 205 return NULL; 206 } 207 208 ChromeosInfoPrivateSetFunction::ChromeosInfoPrivateSetFunction() { 209 } 210 211 ChromeosInfoPrivateSetFunction::~ChromeosInfoPrivateSetFunction() { 212 } 213 214 bool ChromeosInfoPrivateSetFunction::RunSync() { 215 std::string param_name; 216 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, ¶m_name)); 217 if (param_name == kPropertyTimezone) { 218 std::string param_value; 219 EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, ¶m_value)); 220 chromeos::CrosSettings::Get()->Set(chromeos::kSystemTimezone, 221 base::StringValue(param_value)); 222 } else { 223 const char* pref_name = GetBoolPrefNameForApiProperty(param_name.c_str()); 224 if (pref_name) { 225 bool param_value; 226 EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(1, ¶m_value)); 227 Profile::FromBrowserContext(context_)->GetPrefs()->SetBoolean( 228 pref_name, 229 param_value); 230 } else { 231 error_ = ErrorUtils::FormatErrorMessage(kPropertyNotFound, param_name); 232 return false; 233 } 234 } 235 236 return true; 237 } 238 239 } // namespace extensions 240