content_settings_policy_provider.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
1bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// Use of this source code is governed by a BSD-style license that can be 3bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// found in the LICENSE file. 4bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson 5bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "chrome/browser/content_settings/content_settings_policy_provider.h" 6bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson 7bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include <string> 8bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include <vector> 9bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson 10bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "base/json/json_reader.h" 11bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "base/prefs/pref_service.h" 12bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "base/values.h" 13bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "chrome/browser/content_settings/content_settings_rule.h" 14bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "chrome/browser/content_settings/content_settings_utils.h" 15bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "chrome/common/chrome_notification_types.h" 16bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "chrome/common/content_settings_pattern.h" 17bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "chrome/common/pref_names.h" 18bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "components/user_prefs/pref_registry_syncable.h" 19bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "content/public/browser/browser_thread.h" 20bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "content/public/browser/notification_details.h" 21bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "content/public/browser/notification_source.h" 22bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson 23bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonusing content::BrowserThread; 24bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson 25bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonnamespace { 26bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson 27bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// The preferences used to manage ContentSettingsTypes. 28bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonconst char* kPrefToManageType[] = { 29bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedDefaultCookiesSetting, 30bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedDefaultImagesSetting, 31bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedDefaultJavaScriptSetting, 32bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedDefaultPluginsSetting, 33bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedDefaultPopupsSetting, 34bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedDefaultGeolocationSetting, 35bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedDefaultNotificationsSetting, 36bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson NULL, // No policy for default value of content type auto-select-certificate 37bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson NULL, // No policy for default value of fullscreen requests 38bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson NULL, // No policy for default value of mouse lock requests 39bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson NULL, // No policy for default value of mixed script blocking 40bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedDefaultMediaStreamSetting, 41bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson NULL, // No policy for default value of media stream mic 42bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson NULL, // No policy for default value of media stream camera 43bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson NULL, // No policy for default value of protocol handlers 44bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson NULL, // No policy for default value of PPAPI broker 45bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#if defined(OS_WIN) 46bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson NULL, // No policy for default value of "switch to desktop" 47bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#endif 48bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson}; 49bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee WilsonCOMPILE_ASSERT(arraysize(kPrefToManageType) == CONTENT_SETTINGS_NUM_TYPES, 50bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson managed_content_settings_pref_names_array_size_incorrect); 51bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson 52bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonstruct PrefsForManagedContentSettingsMapEntry { 53bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson const char* pref_name; 54bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson ContentSettingsType content_type; 55bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson ContentSetting setting; 56bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson}; 57bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson 58bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonconst PrefsForManagedContentSettingsMapEntry 59bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson kPrefsForManagedContentSettingsMap[] = { 60bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson { 61bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedCookiesAllowedForUrls, 62bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTINGS_TYPE_COOKIES, 63bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTING_ALLOW 64bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson }, { 65bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedCookiesSessionOnlyForUrls, 66bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTINGS_TYPE_COOKIES, 67bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTING_SESSION_ONLY 68bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson }, { 69bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedCookiesBlockedForUrls, 70bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTINGS_TYPE_COOKIES, 71bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTING_BLOCK 72bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson }, { 73bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedImagesAllowedForUrls, 74bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTINGS_TYPE_IMAGES, 75bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTING_ALLOW 76bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson }, { 77bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedImagesBlockedForUrls, 78bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTINGS_TYPE_IMAGES, 79bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTING_BLOCK 80bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson }, { 81bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedJavaScriptAllowedForUrls, 82bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTINGS_TYPE_JAVASCRIPT, 83bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTING_ALLOW 84bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson }, { 85bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedJavaScriptBlockedForUrls, 86bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTINGS_TYPE_JAVASCRIPT, 87bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTING_BLOCK 88bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson }, { 89bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedPluginsAllowedForUrls, 90bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTINGS_TYPE_PLUGINS, 91bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTING_ALLOW 92bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson }, { 93bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedPluginsBlockedForUrls, 94bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTINGS_TYPE_PLUGINS, 95bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTING_BLOCK 96bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson }, { 97bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedPopupsAllowedForUrls, 98bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTINGS_TYPE_POPUPS, 99bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTING_ALLOW 100bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson }, { 101bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedPopupsBlockedForUrls, 102bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTINGS_TYPE_POPUPS, 103bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTING_BLOCK 104bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson }, { 105bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedNotificationsAllowedForUrls, 106bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTINGS_TYPE_NOTIFICATIONS, 107bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTING_ALLOW 108bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson }, { 109bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson prefs::kManagedNotificationsBlockedForUrls, 110bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTINGS_TYPE_NOTIFICATIONS, 111bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson CONTENT_SETTING_BLOCK 112bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson } 113bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson}; 114bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson 115bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson} // namespace 116bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson 117bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonnamespace content_settings { 118bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson 119bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson// static 120bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonvoid PolicyProvider::RegisterUserPrefs( 121bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson user_prefs::PrefRegistrySyncable* registry) { 122bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson registry->RegisterListPref(prefs::kManagedAutoSelectCertificateForUrls, 123bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 124bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson registry->RegisterListPref(prefs::kManagedCookiesAllowedForUrls, 125bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 126bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson registry->RegisterListPref(prefs::kManagedCookiesBlockedForUrls, 127bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 128bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson registry->RegisterListPref(prefs::kManagedCookiesSessionOnlyForUrls, 129bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 130bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson registry->RegisterListPref(prefs::kManagedImagesAllowedForUrls, 131bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 132bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson registry->RegisterListPref(prefs::kManagedImagesBlockedForUrls, 133bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 134bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson registry->RegisterListPref(prefs::kManagedJavaScriptAllowedForUrls, 135bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 136bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson registry->RegisterListPref(prefs::kManagedJavaScriptBlockedForUrls, 137 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 138 registry->RegisterListPref(prefs::kManagedPluginsAllowedForUrls, 139 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 140 registry->RegisterListPref(prefs::kManagedPluginsBlockedForUrls, 141 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 142 registry->RegisterListPref(prefs::kManagedPopupsAllowedForUrls, 143 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 144 registry->RegisterListPref(prefs::kManagedPopupsBlockedForUrls, 145 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 146 registry->RegisterListPref(prefs::kManagedNotificationsAllowedForUrls, 147 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 148 registry->RegisterListPref(prefs::kManagedNotificationsBlockedForUrls, 149 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 150 // Preferences for default content setting policies. If a policy is not set of 151 // the corresponding preferences below is set to CONTENT_SETTING_DEFAULT. 152 registry->RegisterIntegerPref( 153 prefs::kManagedDefaultCookiesSetting, 154 CONTENT_SETTING_DEFAULT, 155 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 156 registry->RegisterIntegerPref( 157 prefs::kManagedDefaultImagesSetting, 158 CONTENT_SETTING_DEFAULT, 159 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 160 registry->RegisterIntegerPref( 161 prefs::kManagedDefaultJavaScriptSetting, 162 CONTENT_SETTING_DEFAULT, 163 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 164 registry->RegisterIntegerPref( 165 prefs::kManagedDefaultPluginsSetting, 166 CONTENT_SETTING_DEFAULT, 167 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 168 registry->RegisterIntegerPref( 169 prefs::kManagedDefaultPopupsSetting, 170 CONTENT_SETTING_DEFAULT, 171 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 172 registry->RegisterIntegerPref( 173 prefs::kManagedDefaultGeolocationSetting, 174 CONTENT_SETTING_DEFAULT, 175 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 176 registry->RegisterIntegerPref( 177 prefs::kManagedDefaultNotificationsSetting, 178 CONTENT_SETTING_DEFAULT, 179 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 180 registry->RegisterIntegerPref( 181 prefs::kManagedDefaultMediaStreamSetting, 182 CONTENT_SETTING_DEFAULT, 183 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 184} 185 186PolicyProvider::PolicyProvider(PrefService* prefs) : prefs_(prefs) { 187 ReadManagedDefaultSettings(); 188 ReadManagedContentSettings(false); 189 190 pref_change_registrar_.Init(prefs_); 191 PrefChangeRegistrar::NamedChangeCallback callback = 192 base::Bind(&PolicyProvider::OnPreferenceChanged, base::Unretained(this)); 193 pref_change_registrar_.Add( 194 prefs::kManagedAutoSelectCertificateForUrls, callback); 195 pref_change_registrar_.Add(prefs::kManagedCookiesBlockedForUrls, callback); 196 pref_change_registrar_.Add(prefs::kManagedCookiesAllowedForUrls, callback); 197 pref_change_registrar_.Add( 198 prefs::kManagedCookiesSessionOnlyForUrls, callback); 199 pref_change_registrar_.Add(prefs::kManagedImagesBlockedForUrls, callback); 200 pref_change_registrar_.Add(prefs::kManagedImagesAllowedForUrls, callback); 201 pref_change_registrar_.Add(prefs::kManagedJavaScriptBlockedForUrls, callback); 202 pref_change_registrar_.Add(prefs::kManagedJavaScriptAllowedForUrls, callback); 203 pref_change_registrar_.Add(prefs::kManagedPluginsBlockedForUrls, callback); 204 pref_change_registrar_.Add(prefs::kManagedPluginsAllowedForUrls, callback); 205 pref_change_registrar_.Add(prefs::kManagedPopupsBlockedForUrls, callback); 206 pref_change_registrar_.Add(prefs::kManagedPopupsAllowedForUrls, callback); 207 pref_change_registrar_.Add( 208 prefs::kManagedNotificationsAllowedForUrls, callback); 209 pref_change_registrar_.Add( 210 prefs::kManagedNotificationsBlockedForUrls, callback); 211 // The following preferences are only used to indicate if a 212 // default content setting is managed and to hold the managed default setting 213 // value. If the value for any of the following perferences is set then the 214 // corresponding default content setting is managed. These preferences exist 215 // in parallel to the preference default content settings. If a 216 // default content settings type is managed any user defined excpetions 217 // (patterns) for this type are ignored. 218 pref_change_registrar_.Add(prefs::kManagedDefaultCookiesSetting, callback); 219 pref_change_registrar_.Add(prefs::kManagedDefaultImagesSetting, callback); 220 pref_change_registrar_.Add(prefs::kManagedDefaultJavaScriptSetting, callback); 221 pref_change_registrar_.Add(prefs::kManagedDefaultPluginsSetting, callback); 222 pref_change_registrar_.Add(prefs::kManagedDefaultPopupsSetting, callback); 223 pref_change_registrar_.Add( 224 prefs::kManagedDefaultGeolocationSetting, callback); 225 pref_change_registrar_.Add( 226 prefs::kManagedDefaultNotificationsSetting, callback); 227 pref_change_registrar_.Add( 228 prefs::kManagedDefaultMediaStreamSetting, callback); 229} 230 231PolicyProvider::~PolicyProvider() { 232 DCHECK(!prefs_); 233} 234 235RuleIterator* PolicyProvider::GetRuleIterator( 236 ContentSettingsType content_type, 237 const ResourceIdentifier& resource_identifier, 238 bool incognito) const { 239 return value_map_.GetRuleIterator(content_type, resource_identifier, &lock_); 240} 241 242void PolicyProvider::GetContentSettingsFromPreferences( 243 OriginIdentifierValueMap* value_map) { 244 for (size_t i = 0; i < arraysize(kPrefsForManagedContentSettingsMap); ++i) { 245 const char* pref_name = kPrefsForManagedContentSettingsMap[i].pref_name; 246 // Skip unset policies. 247 if (!prefs_->HasPrefPath(pref_name)) { 248 VLOG(2) << "Skipping unset preference: " << pref_name; 249 continue; 250 } 251 252 const PrefService::Preference* pref = prefs_->FindPreference(pref_name); 253 DCHECK(pref); 254 DCHECK(pref->IsManaged()); 255 256 const base::ListValue* pattern_str_list = NULL; 257 if (!pref->GetValue()->GetAsList(&pattern_str_list)) { 258 NOTREACHED(); 259 return; 260 } 261 262 for (size_t j = 0; j < pattern_str_list->GetSize(); ++j) { 263 std::string original_pattern_str; 264 if (!pattern_str_list->GetString(j, &original_pattern_str)) { 265 NOTREACHED(); 266 continue; 267 } 268 269 PatternPair pattern_pair = ParsePatternString(original_pattern_str); 270 // Ignore invalid patterns. 271 if (!pattern_pair.first.IsValid()) { 272 VLOG(1) << "Ignoring invalid content settings pattern: " << 273 original_pattern_str; 274 continue; 275 } 276 277 ContentSettingsType content_type = 278 kPrefsForManagedContentSettingsMap[i].content_type; 279 DCHECK_NE(content_type, CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE); 280 // If only one pattern was defined auto expand it to a pattern pair. 281 ContentSettingsPattern secondary_pattern = 282 !pattern_pair.second.IsValid() ? ContentSettingsPattern::Wildcard() 283 : pattern_pair.second; 284 value_map->SetValue( 285 pattern_pair.first, 286 secondary_pattern, 287 content_type, 288 NO_RESOURCE_IDENTIFIER, 289 base::Value::CreateIntegerValue( 290 kPrefsForManagedContentSettingsMap[i].setting)); 291 } 292 } 293} 294 295void PolicyProvider::GetAutoSelectCertificateSettingsFromPreferences( 296 OriginIdentifierValueMap* value_map) { 297 const char* pref_name = prefs::kManagedAutoSelectCertificateForUrls; 298 299 if (!prefs_->HasPrefPath(pref_name)) { 300 VLOG(2) << "Skipping unset preference: " << pref_name; 301 return; 302 } 303 304 const PrefService::Preference* pref = prefs_->FindPreference(pref_name); 305 DCHECK(pref); 306 DCHECK(pref->IsManaged()); 307 308 const base::ListValue* pattern_filter_str_list = NULL; 309 if (!pref->GetValue()->GetAsList(&pattern_filter_str_list)) { 310 NOTREACHED(); 311 return; 312 } 313 314 // Parse the list of pattern filter strings. A pattern filter string has 315 // the following JSON format: 316 // 317 // { 318 // "pattern": <content settings pattern string>, 319 // "filter" : <certificate filter in JSON format> 320 // } 321 // 322 // e.g. 323 // { 324 // "pattern": "[*.]example.com", 325 // "filter": { 326 // "ISSUER": { 327 // "CN": "some name" 328 // } 329 // } 330 // } 331 for (size_t j = 0; j < pattern_filter_str_list->GetSize(); ++j) { 332 std::string pattern_filter_json; 333 if (!pattern_filter_str_list->GetString(j, &pattern_filter_json)) { 334 NOTREACHED(); 335 continue; 336 } 337 338 scoped_ptr<base::Value> value(base::JSONReader::Read(pattern_filter_json, 339 base::JSON_ALLOW_TRAILING_COMMAS)); 340 if (!value || !value->IsType(base::Value::TYPE_DICTIONARY)) { 341 VLOG(1) << "Ignoring invalid certificate auto select setting. Reason:" 342 " Invalid JSON object: " << pattern_filter_json; 343 continue; 344 } 345 346 scoped_ptr<base::DictionaryValue> pattern_filter_pair( 347 static_cast<base::DictionaryValue*>(value.release())); 348 std::string pattern_str; 349 bool pattern_read = pattern_filter_pair->GetString("pattern", &pattern_str); 350 base::Value* cert_filter_ptr = NULL; 351 bool filter_read = pattern_filter_pair->Remove("filter", &cert_filter_ptr); 352 scoped_ptr<base::Value> cert_filter(cert_filter_ptr); 353 if (!pattern_read || !filter_read || 354 !cert_filter->IsType(base::Value::TYPE_DICTIONARY)) { 355 VLOG(1) << "Ignoring invalid certificate auto select setting. Reason:" 356 " Missing pattern or filter."; 357 continue; 358 } 359 360 ContentSettingsPattern pattern = 361 ContentSettingsPattern::FromString(pattern_str); 362 // Ignore invalid patterns. 363 if (!pattern.IsValid()) { 364 VLOG(1) << "Ignoring invalid certificate auto select setting:" 365 " Invalid content settings pattern: " << pattern; 366 continue; 367 } 368 369 value_map->SetValue(pattern, 370 ContentSettingsPattern::Wildcard(), 371 CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE, 372 std::string(), 373 cert_filter.release()); 374 } 375} 376 377void PolicyProvider::ReadManagedDefaultSettings() { 378 for (size_t type = 0; type < arraysize(kPrefToManageType); ++type) { 379 if (kPrefToManageType[type] == NULL) { 380 continue; 381 } 382 UpdateManagedDefaultSetting(ContentSettingsType(type)); 383 } 384} 385 386void PolicyProvider::UpdateManagedDefaultSetting( 387 ContentSettingsType content_type) { 388 // If a pref to manage a default-content-setting was not set (NOTICE: 389 // "HasPrefPath" returns false if no value was set for a registered pref) then 390 // the default value of the preference is used. The default value of a 391 // preference to manage a default-content-settings is CONTENT_SETTING_DEFAULT. 392 // This indicates that no managed value is set. If a pref was set, than it 393 // MUST be managed. 394 DCHECK(!prefs_->HasPrefPath(kPrefToManageType[content_type]) || 395 prefs_->IsManagedPreference(kPrefToManageType[content_type])); 396 base::AutoLock auto_lock(lock_); 397 398 int setting = prefs_->GetInteger(kPrefToManageType[content_type]); 399 if (setting == CONTENT_SETTING_DEFAULT) { 400 value_map_.DeleteValue( 401 ContentSettingsPattern::Wildcard(), 402 ContentSettingsPattern::Wildcard(), 403 content_type, 404 std::string()); 405 } else { 406 value_map_.SetValue( 407 ContentSettingsPattern::Wildcard(), 408 ContentSettingsPattern::Wildcard(), 409 content_type, 410 std::string(), 411 Value::CreateIntegerValue(setting)); 412 } 413} 414 415 416void PolicyProvider::ReadManagedContentSettings(bool overwrite) { 417 base::AutoLock auto_lock(lock_); 418 if (overwrite) 419 value_map_.clear(); 420 GetContentSettingsFromPreferences(&value_map_); 421 GetAutoSelectCertificateSettingsFromPreferences(&value_map_); 422} 423 424// Since the PolicyProvider is a read only content settings provider, all 425// methodes of the ProviderInterface that set or delete any settings do nothing. 426bool PolicyProvider::SetWebsiteSetting( 427 const ContentSettingsPattern& primary_pattern, 428 const ContentSettingsPattern& secondary_pattern, 429 ContentSettingsType content_type, 430 const ResourceIdentifier& resource_identifier, 431 Value* value) { 432 return false; 433} 434 435void PolicyProvider::ClearAllContentSettingsRules( 436 ContentSettingsType content_type) { 437} 438 439void PolicyProvider::ShutdownOnUIThread() { 440 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 441 RemoveAllObservers(); 442 if (!prefs_) 443 return; 444 pref_change_registrar_.RemoveAll(); 445 prefs_ = NULL; 446} 447 448void PolicyProvider::OnPreferenceChanged(const std::string& name) { 449 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 450 451 if (name == prefs::kManagedDefaultCookiesSetting) { 452 UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES); 453 } else if (name == prefs::kManagedDefaultImagesSetting) { 454 UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_IMAGES); 455 } else if (name == prefs::kManagedDefaultJavaScriptSetting) { 456 UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_JAVASCRIPT); 457 } else if (name == prefs::kManagedDefaultPluginsSetting) { 458 UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_PLUGINS); 459 } else if (name == prefs::kManagedDefaultPopupsSetting) { 460 UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_POPUPS); 461 } else if (name == prefs::kManagedDefaultGeolocationSetting) { 462 UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_GEOLOCATION); 463 } else if (name == prefs::kManagedDefaultNotificationsSetting) { 464 UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_NOTIFICATIONS); 465 } else if (name == prefs::kManagedDefaultMediaStreamSetting) { 466 UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM); 467 } else if (name == prefs::kManagedAutoSelectCertificateForUrls || 468 name == prefs::kManagedCookiesAllowedForUrls || 469 name == prefs::kManagedCookiesBlockedForUrls || 470 name == prefs::kManagedCookiesSessionOnlyForUrls || 471 name == prefs::kManagedImagesAllowedForUrls || 472 name == prefs::kManagedImagesBlockedForUrls || 473 name == prefs::kManagedJavaScriptAllowedForUrls || 474 name == prefs::kManagedJavaScriptBlockedForUrls || 475 name == prefs::kManagedPluginsAllowedForUrls || 476 name == prefs::kManagedPluginsBlockedForUrls || 477 name == prefs::kManagedPopupsAllowedForUrls || 478 name == prefs::kManagedPopupsBlockedForUrls || 479 name == prefs::kManagedNotificationsAllowedForUrls || 480 name == prefs::kManagedNotificationsBlockedForUrls) { 481 ReadManagedContentSettings(true); 482 ReadManagedDefaultSettings(); 483 } 484 485 NotifyObservers(ContentSettingsPattern(), 486 ContentSettingsPattern(), 487 CONTENT_SETTINGS_TYPE_DEFAULT, 488 std::string()); 489} 490 491} // namespace content_settings 492