| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/extensions/extension_management.h" | 5 #include "chrome/browser/extensions/extension_management.h" |
| 6 | 6 |
| 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" |
| 7 #include "base/logging.h" | 9 #include "base/logging.h" |
| 8 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
| 9 #include "chrome/browser/extensions/external_provider_impl.h" | 11 #include "chrome/browser/extensions/external_provider_impl.h" |
| 12 #include "chrome/browser/extensions/standard_management_policy_provider.h" |
| 13 #include "chrome/browser/profiles/profile.h" |
| 10 #include "components/crx_file/id_util.h" | 14 #include "components/crx_file/id_util.h" |
| 15 #include "components/keyed_service/content/browser_context_dependency_manager.h" |
| 11 #include "extensions/browser/pref_names.h" | 16 #include "extensions/browser/pref_names.h" |
| 12 #include "extensions/common/url_pattern.h" | 17 #include "extensions/common/url_pattern.h" |
| 13 | 18 |
| 14 namespace extensions { | 19 namespace extensions { |
| 15 | 20 |
| 16 void ExtensionManagement::IndividualSettings::Reset() { | 21 void ExtensionManagement::IndividualSettings::Reset() { |
| 17 installation_mode = ExtensionManagement::INSTALLATION_ALLOWED; | 22 installation_mode = ExtensionManagement::INSTALLATION_ALLOWED; |
| 18 update_url.clear(); | 23 update_url.clear(); |
| 19 } | 24 } |
| 20 | 25 |
| 21 ExtensionManagement::GlobalSettings::GlobalSettings() { | 26 ExtensionManagement::GlobalSettings::GlobalSettings() { |
| 22 Reset(); | 27 Reset(); |
| 23 } | 28 } |
| 24 | 29 |
| 25 ExtensionManagement::GlobalSettings::~GlobalSettings() { | 30 ExtensionManagement::GlobalSettings::~GlobalSettings() { |
| 26 } | 31 } |
| 27 | 32 |
| 28 void ExtensionManagement::GlobalSettings::Reset() { | 33 void ExtensionManagement::GlobalSettings::Reset() { |
| 29 has_restricted_install_sources = false; | 34 has_restricted_install_sources = false; |
| 30 install_sources.ClearPatterns(); | 35 install_sources.ClearPatterns(); |
| 31 has_restricted_allowed_types = false; | 36 has_restricted_allowed_types = false; |
| 32 allowed_types.clear(); | 37 allowed_types.clear(); |
| 33 } | 38 } |
| 34 | 39 |
| 35 ExtensionManagement::ExtensionManagement(PrefService* pref_service) | 40 ExtensionManagement::ExtensionManagement(PrefService* pref_service) |
| 36 : pref_service_(pref_service) { | 41 : pref_service_(pref_service) { |
| 42 pref_change_registrar_.Init(pref_service_); |
| 43 base::Closure pref_change_callback = base::Bind( |
| 44 &ExtensionManagement::OnExtensionPrefChanged, base::Unretained(this)); |
| 45 pref_change_registrar_.Add(pref_names::kInstallAllowList, |
| 46 pref_change_callback); |
| 47 pref_change_registrar_.Add(pref_names::kInstallDenyList, |
| 48 pref_change_callback); |
| 49 pref_change_registrar_.Add(pref_names::kInstallForceList, |
| 50 pref_change_callback); |
| 51 pref_change_registrar_.Add(pref_names::kAllowedInstallSites, |
| 52 pref_change_callback); |
| 53 pref_change_registrar_.Add(pref_names::kAllowedTypes, pref_change_callback); |
| 54 Refresh(); |
| 55 provider_.reset(new StandardManagementPolicyProvider(this)); |
| 37 } | 56 } |
| 38 | 57 |
| 39 ExtensionManagement::~ExtensionManagement() { | 58 ExtensionManagement::~ExtensionManagement() { |
| 40 } | 59 } |
| 41 | 60 |
| 61 void ExtensionManagement::AddObserver(Observer* observer) { |
| 62 observer_list_.AddObserver(observer); |
| 63 } |
| 64 |
| 65 void ExtensionManagement::RemoveObserver(Observer* observer) { |
| 66 observer_list_.RemoveObserver(observer); |
| 67 } |
| 68 |
| 69 ManagementPolicy::Provider* ExtensionManagement::GetProvider() { |
| 70 return provider_.get(); |
| 71 } |
| 72 |
| 73 bool ExtensionManagement::BlacklistedByDefault() { |
| 74 return default_settings_.installation_mode == INSTALLATION_BLOCKED; |
| 75 } |
| 76 |
| 77 const ExtensionManagement::IndividualSettings& ExtensionManagement::ReadById( |
| 78 const ExtensionId& id) const { |
| 79 DCHECK(crx_file::id_util::IdIsValid(id)) << "Invalid ID: " << id; |
| 80 SettingsIdMap::const_iterator it = settings_by_id_.find(id); |
| 81 if (it != settings_by_id_.end()) |
| 82 return it->second; |
| 83 return default_settings_; |
| 84 } |
| 85 |
| 86 const ExtensionManagement::GlobalSettings& |
| 87 ExtensionManagement::ReadGlobalSettings() const { |
| 88 return global_settings_; |
| 89 } |
| 90 |
| 42 void ExtensionManagement::Refresh() { | 91 void ExtensionManagement::Refresh() { |
| 43 // Load all extension management settings preferences. | 92 // Load all extension management settings preferences. |
| 44 const base::ListValue* allowed_list_pref = | 93 const base::ListValue* allowed_list_pref = |
| 45 static_cast<const base::ListValue*>(LoadPreference( | 94 static_cast<const base::ListValue*>(LoadPreference( |
| 46 pref_names::kInstallAllowList, true, base::Value::TYPE_LIST)); | 95 pref_names::kInstallAllowList, true, base::Value::TYPE_LIST)); |
| 47 // Allow user to use preference to block certain extensions. Note that policy | 96 // Allow user to use preference to block certain extensions. Note that policy |
| 48 // managed forcelist or whitelist will always override this. | 97 // managed forcelist or whitelist will always override this. |
| 49 const base::ListValue* denied_list_pref = | 98 const base::ListValue* denied_list_pref = |
| 50 static_cast<const base::ListValue*>(LoadPreference( | 99 static_cast<const base::ListValue*>(LoadPreference( |
| 51 pref_names::kInstallDenyList, false, base::Value::TYPE_LIST)); | 100 pref_names::kInstallDenyList, false, base::Value::TYPE_LIST)); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 global_settings_.allowed_types.push_back( | 184 global_settings_.allowed_types.push_back( |
| 136 static_cast<Manifest::Type>(int_value)); | 185 static_cast<Manifest::Type>(int_value)); |
| 137 } | 186 } |
| 138 } | 187 } |
| 139 } | 188 } |
| 140 | 189 |
| 141 // TODO(binjin): Add parsing of new ExtensionManagement preference after the | 190 // TODO(binjin): Add parsing of new ExtensionManagement preference after the |
| 142 // new ExtensionManagement policy is added. | 191 // new ExtensionManagement policy is added. |
| 143 } | 192 } |
| 144 | 193 |
| 145 const ExtensionManagement::IndividualSettings& ExtensionManagement::ReadById( | |
| 146 const ExtensionId& id) const { | |
| 147 DCHECK(crx_file::id_util::IdIsValid(id)) << "Invalid ID: " << id; | |
| 148 SettingsIdMap::const_iterator it = settings_by_id_.find(id); | |
| 149 if (it != settings_by_id_.end()) | |
| 150 return it->second; | |
| 151 return default_settings_; | |
| 152 } | |
| 153 | |
| 154 const ExtensionManagement::GlobalSettings& | |
| 155 ExtensionManagement::ReadGlobalSettings() const { | |
| 156 return global_settings_; | |
| 157 } | |
| 158 | |
| 159 const base::Value* ExtensionManagement::LoadPreference( | 194 const base::Value* ExtensionManagement::LoadPreference( |
| 160 const char* pref_name, | 195 const char* pref_name, |
| 161 bool force_managed, | 196 bool force_managed, |
| 162 base::Value::Type expected_type) { | 197 base::Value::Type expected_type) { |
| 163 const PrefService::Preference* pref = | 198 const PrefService::Preference* pref = |
| 164 pref_service_->FindPreference(pref_name); | 199 pref_service_->FindPreference(pref_name); |
| 165 if (pref && !pref->IsDefaultValue() && | 200 if (pref && !pref->IsDefaultValue() && |
| 166 (!force_managed || pref->IsManaged())) { | 201 (!force_managed || pref->IsManaged())) { |
| 167 const base::Value* value = pref->GetValue(); | 202 const base::Value* value = pref->GetValue(); |
| 168 if (value && value->IsType(expected_type)) | 203 if (value && value->IsType(expected_type)) |
| 169 return value; | 204 return value; |
| 170 } | 205 } |
| 171 return NULL; | 206 return NULL; |
| 172 } | 207 } |
| 173 | 208 |
| 209 void ExtensionManagement::OnExtensionPrefChanged() { |
| 210 Refresh(); |
| 211 NotifyExtensionManagementPrefChanged(); |
| 212 } |
| 213 |
| 214 void ExtensionManagement::NotifyExtensionManagementPrefChanged() { |
| 215 FOR_EACH_OBSERVER( |
| 216 Observer, observer_list_, OnExtensionManagementSettingsChanged()); |
| 217 } |
| 218 |
| 174 ExtensionManagement::IndividualSettings* ExtensionManagement::AccessById( | 219 ExtensionManagement::IndividualSettings* ExtensionManagement::AccessById( |
| 175 const ExtensionId& id) { | 220 const ExtensionId& id) { |
| 176 DCHECK(crx_file::id_util::IdIsValid(id)) << "Invalid ID: " << id; | 221 DCHECK(crx_file::id_util::IdIsValid(id)) << "Invalid ID: " << id; |
| 177 SettingsIdMap::iterator it = settings_by_id_.find(id); | 222 SettingsIdMap::iterator it = settings_by_id_.find(id); |
| 178 if (it == settings_by_id_.end()) | 223 if (it == settings_by_id_.end()) |
| 179 it = settings_by_id_.insert(std::make_pair(id, default_settings_)).first; | 224 it = settings_by_id_.insert(std::make_pair(id, default_settings_)).first; |
| 180 return &it->second; | 225 return &it->second; |
| 181 } | 226 } |
| 182 | 227 |
| 228 ExtensionManagement* ExtensionManagementFactory::GetForBrowserContext( |
| 229 content::BrowserContext* context) { |
| 230 return static_cast<ExtensionManagement*>( |
| 231 GetInstance()->GetServiceForBrowserContext(context, true)); |
| 232 } |
| 233 |
| 234 ExtensionManagementFactory* ExtensionManagementFactory::GetInstance() { |
| 235 return Singleton<ExtensionManagementFactory>::get(); |
| 236 } |
| 237 |
| 238 ExtensionManagementFactory::ExtensionManagementFactory() |
| 239 : BrowserContextKeyedServiceFactory( |
| 240 "ExtensionManagement", |
| 241 BrowserContextDependencyManager::GetInstance()) { |
| 242 } |
| 243 |
| 244 ExtensionManagementFactory::~ExtensionManagementFactory() { |
| 245 } |
| 246 |
| 247 KeyedService* ExtensionManagementFactory::BuildServiceInstanceFor( |
| 248 content::BrowserContext* context) const { |
| 249 return new ExtensionManagement( |
| 250 Profile::FromBrowserContext(context)->GetPrefs()); |
| 251 } |
| 252 |
| 183 } // namespace extensions | 253 } // namespace extensions |
| OLD | NEW |