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/component_updater/supervised_user_whitelist_installer.h
" | 5 #include "chrome/browser/component_updater/supervised_user_whitelist_installer.h
" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/files/file_enumerator.h" | 9 #include "base/files/file_enumerator.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
(...skipping 22 matching lines...) Expand all Loading... |
33 #include "components/crx_file/id_util.h" | 33 #include "components/crx_file/id_util.h" |
34 #include "components/safe_json/json_sanitizer.h" | 34 #include "components/safe_json/json_sanitizer.h" |
35 #include "content/public/browser/browser_thread.h" | 35 #include "content/public/browser/browser_thread.h" |
36 | 36 |
37 namespace component_updater { | 37 namespace component_updater { |
38 | 38 |
39 namespace { | 39 namespace { |
40 | 40 |
41 const char kSanitizedWhitelistExtension[] = ".json"; | 41 const char kSanitizedWhitelistExtension[] = ".json"; |
42 | 42 |
43 const char kWhitelist[] = "whitelist"; | 43 const char kWhitelistedContent[] = "whitelisted_content"; |
44 const char kFile[] = "file"; | 44 const char kSites[] = "sites"; |
45 | 45 |
46 const char kClients[] = "clients"; | 46 const char kClients[] = "clients"; |
47 const char kName[] = "name"; | 47 const char kName[] = "name"; |
48 | 48 |
| 49 // These are copies of extensions::manifest_keys::kName and kShortName. They |
| 50 // are duplicated here because we mustn't depend on code from extensions/ |
| 51 // (since it's not built on Android). |
| 52 const char kExtensionName[] = "name"; |
| 53 const char kExtensionShortName[] = "short_name"; |
| 54 |
| 55 base::string16 GetWhitelistTitle(const base::DictionaryValue& manifest) { |
| 56 base::string16 title; |
| 57 if (!manifest.GetString(kExtensionShortName, &title)) |
| 58 manifest.GetString(kExtensionName, &title); |
| 59 return title; |
| 60 } |
| 61 |
49 base::FilePath GetRawWhitelistPath(const base::DictionaryValue& manifest, | 62 base::FilePath GetRawWhitelistPath(const base::DictionaryValue& manifest, |
50 const base::FilePath& install_dir) { | 63 const base::FilePath& install_dir) { |
51 const base::DictionaryValue* whitelist_dict = nullptr; | 64 const base::DictionaryValue* whitelist_dict = nullptr; |
52 if (!manifest.GetDictionary(kWhitelist, &whitelist_dict)) | 65 if (!manifest.GetDictionary(kWhitelistedContent, &whitelist_dict)) |
53 return base::FilePath(); | 66 return base::FilePath(); |
54 | 67 |
55 base::FilePath::StringType whitelist_file; | 68 base::FilePath::StringType whitelist_file; |
56 if (!whitelist_dict->GetString(kFile, &whitelist_file)) | 69 if (!whitelist_dict->GetString(kSites, &whitelist_file)) |
57 return base::FilePath(); | 70 return base::FilePath(); |
58 | 71 |
59 return install_dir.Append(whitelist_file); | 72 return install_dir.Append(whitelist_file); |
60 } | 73 } |
61 | 74 |
62 base::FilePath GetSanitizedWhitelistPath(const std::string& crx_id) { | 75 base::FilePath GetSanitizedWhitelistPath(const std::string& crx_id) { |
63 base::FilePath base_dir; | 76 base::FilePath base_dir; |
64 PathService::Get(chrome::DIR_SUPERVISED_USER_INSTALLED_WHITELISTS, &base_dir); | 77 PathService::Get(chrome::DIR_SUPERVISED_USER_INSTALLED_WHITELISTS, &base_dir); |
65 return base_dir.empty() | 78 return base_dir.empty() |
66 ? base::FilePath() | 79 ? base::FilePath() |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 | 193 |
181 if (!base::DeleteFile(path, true)) | 194 if (!base::DeleteFile(path, true)) |
182 DPLOG(ERROR) << "Couldn't delete " << path.value(); | 195 DPLOG(ERROR) << "Couldn't delete " << path.value(); |
183 } | 196 } |
184 } | 197 } |
185 } | 198 } |
186 | 199 |
187 class SupervisedUserWhitelistComponentInstallerTraits | 200 class SupervisedUserWhitelistComponentInstallerTraits |
188 : public ComponentInstallerTraits { | 201 : public ComponentInstallerTraits { |
189 public: | 202 public: |
| 203 using RawWhitelistReadyCallback = |
| 204 base::Callback<void(const base::string16&, const base::FilePath&)>; |
| 205 |
190 SupervisedUserWhitelistComponentInstallerTraits( | 206 SupervisedUserWhitelistComponentInstallerTraits( |
191 const std::string& crx_id, | 207 const std::string& crx_id, |
192 const std::string& name, | 208 const std::string& name, |
193 const base::Callback<void(const base::FilePath&)>& callback) | 209 const RawWhitelistReadyCallback& callback) |
194 : crx_id_(crx_id), name_(name), callback_(callback) {} | 210 : crx_id_(crx_id), name_(name), callback_(callback) {} |
195 ~SupervisedUserWhitelistComponentInstallerTraits() override {} | 211 ~SupervisedUserWhitelistComponentInstallerTraits() override {} |
196 | 212 |
197 private: | 213 private: |
198 // ComponentInstallerTraits overrides: | 214 // ComponentInstallerTraits overrides: |
199 bool VerifyInstallation(const base::DictionaryValue& manifest, | 215 bool VerifyInstallation(const base::DictionaryValue& manifest, |
200 const base::FilePath& install_dir) const override; | 216 const base::FilePath& install_dir) const override; |
201 bool CanAutoUpdate() const override; | 217 bool CanAutoUpdate() const override; |
202 bool OnCustomInstall(const base::DictionaryValue& manifest, | 218 bool OnCustomInstall(const base::DictionaryValue& manifest, |
203 const base::FilePath& install_dir) override; | 219 const base::FilePath& install_dir) override; |
204 void ComponentReady(const base::Version& version, | 220 void ComponentReady(const base::Version& version, |
205 const base::FilePath& install_dir, | 221 const base::FilePath& install_dir, |
206 scoped_ptr<base::DictionaryValue> manifest) override; | 222 scoped_ptr<base::DictionaryValue> manifest) override; |
207 base::FilePath GetBaseDirectory() const override; | 223 base::FilePath GetBaseDirectory() const override; |
208 void GetHash(std::vector<uint8_t>* hash) const override; | 224 void GetHash(std::vector<uint8_t>* hash) const override; |
209 std::string GetName() const override; | 225 std::string GetName() const override; |
210 | 226 |
211 std::string crx_id_; | 227 std::string crx_id_; |
212 std::string name_; | 228 std::string name_; |
213 base::Callback<void(const base::FilePath&)> callback_; | 229 RawWhitelistReadyCallback callback_; |
214 | 230 |
215 DISALLOW_COPY_AND_ASSIGN(SupervisedUserWhitelistComponentInstallerTraits); | 231 DISALLOW_COPY_AND_ASSIGN(SupervisedUserWhitelistComponentInstallerTraits); |
216 }; | 232 }; |
217 | 233 |
218 bool SupervisedUserWhitelistComponentInstallerTraits::VerifyInstallation( | 234 bool SupervisedUserWhitelistComponentInstallerTraits::VerifyInstallation( |
219 const base::DictionaryValue& manifest, | 235 const base::DictionaryValue& manifest, |
220 const base::FilePath& install_dir) const { | 236 const base::FilePath& install_dir) const { |
221 // Check whether the whitelist exists at the path specified by the manifest. | 237 // Check whether the whitelist exists at the path specified by the manifest. |
222 // This does not check whether the whitelist is wellformed. | 238 // This does not check whether the whitelist is wellformed. |
223 return base::PathExists(GetRawWhitelistPath(manifest, install_dir)); | 239 return base::PathExists(GetRawWhitelistPath(manifest, install_dir)); |
224 } | 240 } |
225 | 241 |
226 bool SupervisedUserWhitelistComponentInstallerTraits::CanAutoUpdate() const { | 242 bool SupervisedUserWhitelistComponentInstallerTraits::CanAutoUpdate() const { |
227 return true; | 243 return true; |
228 } | 244 } |
229 | 245 |
230 bool SupervisedUserWhitelistComponentInstallerTraits::OnCustomInstall( | 246 bool SupervisedUserWhitelistComponentInstallerTraits::OnCustomInstall( |
231 const base::DictionaryValue& manifest, | 247 const base::DictionaryValue& manifest, |
232 const base::FilePath& install_dir) { | 248 const base::FilePath& install_dir) { |
233 // Delete the existing sanitized whitelist. | 249 // Delete the existing sanitized whitelist. |
234 return base::DeleteFile(GetSanitizedWhitelistPath(crx_id_), false); | 250 return base::DeleteFile(GetSanitizedWhitelistPath(crx_id_), false); |
235 } | 251 } |
236 | 252 |
237 void SupervisedUserWhitelistComponentInstallerTraits::ComponentReady( | 253 void SupervisedUserWhitelistComponentInstallerTraits::ComponentReady( |
238 const base::Version& version, | 254 const base::Version& version, |
239 const base::FilePath& install_dir, | 255 const base::FilePath& install_dir, |
240 scoped_ptr<base::DictionaryValue> manifest) { | 256 scoped_ptr<base::DictionaryValue> manifest) { |
241 callback_.Run(GetRawWhitelistPath(*manifest, install_dir)); | 257 // TODO(treib): Before getting the title, we should localize the manifest |
| 258 // using extension_l10n_util::LocalizeExtension, but that doesn't exist on |
| 259 // Android. crbug.com/558387 |
| 260 callback_.Run(GetWhitelistTitle(*manifest), |
| 261 GetRawWhitelistPath(*manifest, install_dir)); |
242 } | 262 } |
243 | 263 |
244 base::FilePath | 264 base::FilePath |
245 SupervisedUserWhitelistComponentInstallerTraits::GetBaseDirectory() const { | 265 SupervisedUserWhitelistComponentInstallerTraits::GetBaseDirectory() const { |
246 base::FilePath whitelist_directory; | 266 base::FilePath whitelist_directory; |
247 PathService::Get(DIR_SUPERVISED_USER_WHITELISTS, &whitelist_directory); | 267 PathService::Get(DIR_SUPERVISED_USER_WHITELISTS, &whitelist_directory); |
248 return whitelist_directory.AppendASCII(crx_id_); | 268 return whitelist_directory.AppendASCII(crx_id_); |
249 } | 269 } |
250 | 270 |
251 void SupervisedUserWhitelistComponentInstallerTraits::GetHash( | 271 void SupervisedUserWhitelistComponentInstallerTraits::GetHash( |
(...skipping 17 matching lines...) Expand all Loading... |
269 private: | 289 private: |
270 void RegisterComponent(const std::string& crx_id, | 290 void RegisterComponent(const std::string& crx_id, |
271 const std::string& name, | 291 const std::string& name, |
272 const base::Closure& callback); | 292 const base::Closure& callback); |
273 void RegisterNewComponent(const std::string& crx_id, const std::string& name); | 293 void RegisterNewComponent(const std::string& crx_id, const std::string& name); |
274 bool UnregisterWhitelistInternal(base::DictionaryValue* pref_dict, | 294 bool UnregisterWhitelistInternal(base::DictionaryValue* pref_dict, |
275 const std::string& client_id, | 295 const std::string& client_id, |
276 const std::string& crx_id); | 296 const std::string& crx_id); |
277 | 297 |
278 void OnRawWhitelistReady(const std::string& crx_id, | 298 void OnRawWhitelistReady(const std::string& crx_id, |
| 299 const base::string16& title, |
279 const base::FilePath& whitelist_path); | 300 const base::FilePath& whitelist_path); |
280 void OnSanitizedWhitelistReady(const std::string& crx_id); | 301 void OnSanitizedWhitelistReady(const std::string& crx_id, |
| 302 const base::string16& title); |
281 | 303 |
282 // SupervisedUserWhitelistInstaller overrides: | 304 // SupervisedUserWhitelistInstaller overrides: |
283 void RegisterComponents() override; | 305 void RegisterComponents() override; |
284 void Subscribe(const WhitelistReadyCallback& callback) override; | 306 void Subscribe(const WhitelistReadyCallback& callback) override; |
285 void RegisterWhitelist(const std::string& client_id, | 307 void RegisterWhitelist(const std::string& client_id, |
286 const std::string& crx_id, | 308 const std::string& crx_id, |
287 const std::string& name) override; | 309 const std::string& name) override; |
288 void UnregisterWhitelist(const std::string& client_id, | 310 void UnregisterWhitelist(const std::string& client_id, |
289 const std::string& crx_id) override; | 311 const std::string& crx_id) override; |
290 | 312 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 DCHECK(result); | 384 DCHECK(result); |
363 | 385 |
364 result = base::DeleteFile(GetSanitizedWhitelistPath(crx_id), false); | 386 result = base::DeleteFile(GetSanitizedWhitelistPath(crx_id), false); |
365 DCHECK(result); | 387 DCHECK(result); |
366 | 388 |
367 return removed; | 389 return removed; |
368 } | 390 } |
369 | 391 |
370 void SupervisedUserWhitelistInstallerImpl::OnRawWhitelistReady( | 392 void SupervisedUserWhitelistInstallerImpl::OnRawWhitelistReady( |
371 const std::string& crx_id, | 393 const std::string& crx_id, |
| 394 const base::string16& title, |
372 const base::FilePath& whitelist_path) { | 395 const base::FilePath& whitelist_path) { |
373 cus_->GetSequencedTaskRunner()->PostTask( | 396 cus_->GetSequencedTaskRunner()->PostTask( |
374 FROM_HERE, | 397 FROM_HERE, |
375 base::Bind( | 398 base::Bind( |
376 &CheckForSanitizedWhitelistOnTaskRunner, crx_id, whitelist_path, | 399 &CheckForSanitizedWhitelistOnTaskRunner, crx_id, whitelist_path, |
377 base::ThreadTaskRunnerHandle::Get(), | 400 base::ThreadTaskRunnerHandle::Get(), |
378 base::Bind( | 401 base::Bind( |
379 &SupervisedUserWhitelistInstallerImpl::OnSanitizedWhitelistReady, | 402 &SupervisedUserWhitelistInstallerImpl::OnSanitizedWhitelistReady, |
380 weak_ptr_factory_.GetWeakPtr(), crx_id))); | 403 weak_ptr_factory_.GetWeakPtr(), crx_id, title))); |
381 } | 404 } |
382 | 405 |
383 void SupervisedUserWhitelistInstallerImpl::OnSanitizedWhitelistReady( | 406 void SupervisedUserWhitelistInstallerImpl::OnSanitizedWhitelistReady( |
384 const std::string& crx_id) { | 407 const std::string& crx_id, |
| 408 const base::string16& title) { |
385 for (const WhitelistReadyCallback& callback : callbacks_) | 409 for (const WhitelistReadyCallback& callback : callbacks_) |
386 callback.Run(crx_id, GetSanitizedWhitelistPath(crx_id)); | 410 callback.Run(crx_id, title, GetSanitizedWhitelistPath(crx_id)); |
387 } | 411 } |
388 | 412 |
389 void SupervisedUserWhitelistInstallerImpl::RegisterComponents() { | 413 void SupervisedUserWhitelistInstallerImpl::RegisterComponents() { |
390 const std::map<std::string, std::string> command_line_whitelists = | 414 const std::map<std::string, std::string> command_line_whitelists = |
391 SupervisedUserWhitelistService::GetWhitelistsFromCommandLine(); | 415 SupervisedUserWhitelistService::GetWhitelistsFromCommandLine(); |
392 | 416 |
393 std::set<std::string> registered_whitelists; | 417 std::set<std::string> registered_whitelists; |
394 std::set<std::string> stale_whitelists; | 418 std::set<std::string> stale_whitelists; |
395 DictionaryPrefUpdate update(local_state_, | 419 DictionaryPrefUpdate update(local_state_, |
396 prefs::kRegisteredSupervisedUserWhitelists); | 420 prefs::kRegisteredSupervisedUserWhitelists); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 | 569 |
546 // static | 570 // static |
547 void SupervisedUserWhitelistInstaller::TriggerComponentUpdate( | 571 void SupervisedUserWhitelistInstaller::TriggerComponentUpdate( |
548 OnDemandUpdater* updater, | 572 OnDemandUpdater* updater, |
549 const std::string& crx_id) { | 573 const std::string& crx_id) { |
550 const bool result = updater->OnDemandUpdate(crx_id); | 574 const bool result = updater->OnDemandUpdate(crx_id); |
551 DCHECK(result); | 575 DCHECK(result); |
552 } | 576 } |
553 | 577 |
554 } // namespace component_updater | 578 } // namespace component_updater |
OLD | NEW |