Index: chrome/browser/extensions/external_registry_extension_loader_win.cc |
diff --git a/chrome/browser/extensions/external_registry_extension_loader_win.cc b/chrome/browser/extensions/external_registry_extension_loader_win.cc |
index 55ab9ad3ea53db3f3257f4e4fffb4db64307c231..86cf311614e436e58c60f5affc6636f05cfaec3f 100644 |
--- a/chrome/browser/extensions/external_registry_extension_loader_win.cc |
+++ b/chrome/browser/extensions/external_registry_extension_loader_win.cc |
@@ -1,10 +1,12 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
#include "chrome/browser/extensions/external_registry_extension_loader_win.h" |
#include "base/file_path.h" |
+#include "base/file_util.h" |
+#include "base/memory/scoped_handle.h" |
#include "base/string_util.h" |
#include "base/utf_string_conversions.h" |
#include "base/values.h" |
@@ -27,6 +29,11 @@ const wchar_t kRegistryExtensionPath[] = L"path"; |
// Registry value of that key that defines the current version of the .crx file. |
const wchar_t kRegistryExtensionVersion[] = L"version"; |
+bool CanOpenFileForReading(const FilePath& path) { |
+ ScopedStdioHandle file_handle(file_util::OpenFile(path, "rb")); |
+ return file_handle.get() != NULL; |
+} |
+ |
} // namespace |
void ExternalRegistryExtensionLoader::StartLoading() { |
@@ -44,64 +51,80 @@ void ExternalRegistryExtensionLoader::LoadOnFileThread() { |
base::win::RegistryKeyIterator iterator( |
kRegRoot, ASCIIToWide(kRegistryExtensions).c_str()); |
- while (iterator.Valid()) { |
+ for (; iterator.Valid(); ++iterator) { |
base::win::RegKey key; |
std::wstring key_path = ASCIIToWide(kRegistryExtensions); |
key_path.append(L"\\"); |
key_path.append(iterator.Name()); |
- if (key.Open(kRegRoot, key_path.c_str(), KEY_READ) == ERROR_SUCCESS) { |
- std::wstring extension_path_str; |
- if (key.ReadValue(kRegistryExtensionPath, &extension_path_str) |
- == ERROR_SUCCESS) { |
- FilePath extension_path(extension_path_str); |
- if (!extension_path.IsAbsolute()) { |
- LOG(ERROR) << "Path " << extension_path_str |
- << " needs to be absolute in key " |
- << key_path; |
- ++iterator; |
- continue; |
- } |
- std::wstring extension_version; |
- if (key.ReadValue(kRegistryExtensionVersion, &extension_version) |
- == ERROR_SUCCESS) { |
- std::string id = WideToASCII(iterator.Name()); |
- StringToLowerASCII(&id); |
- |
- if (!Extension::IdIsValid(id)) { |
- LOG(ERROR) << "Invalid id value " << id |
- << " for key " << key_path << " ."; |
- ++iterator; |
- continue; |
- } |
- |
- scoped_ptr<Version> version; |
- version.reset(Version::GetVersionFromString( |
- WideToASCII(extension_version))); |
- if (!version.get()) { |
- LOG(ERROR) << "Invalid version value " << extension_version |
- << " for key " << key_path << " ."; |
- ++iterator; |
- continue; |
- } |
- |
- prefs->SetString( |
- id + "." + ExternalExtensionProviderImpl::kExternalVersion, |
- WideToASCII(extension_version)); |
- prefs->SetString( |
- id + "." + ExternalExtensionProviderImpl::kExternalCrx, |
- extension_path_str); |
- } else { |
- // TODO(erikkay): find a way to get this into about:extensions |
- LOG(ERROR) << "Missing value " << kRegistryExtensionVersion |
- << " for key " << key_path << " ."; |
- } |
- } else { |
- // TODO(erikkay): find a way to get this into about:extensions |
- LOG(ERROR) << "Missing value " << kRegistryExtensionPath |
- << " for key " << key_path << " ."; |
- } |
+ if (key.Open(kRegRoot, key_path.c_str(), KEY_READ) != ERROR_SUCCESS) { |
+ LOG(ERROR) << "Unable to read registry key at path: " << key_path << "."; |
+ continue; |
} |
- ++iterator; |
+ |
+ std::wstring extension_path_str; |
+ if (key.ReadValue(kRegistryExtensionPath, &extension_path_str) |
+ != ERROR_SUCCESS) { |
+ // TODO(erikkay): find a way to get this into about:extensions |
+ LOG(ERROR) << "Missing value " << kRegistryExtensionPath |
+ << " for key " << key_path << "."; |
+ continue; |
+ } |
+ |
+ FilePath extension_path(extension_path_str); |
+ if (!extension_path.IsAbsolute()) { |
+ LOG(ERROR) << "File path " << extension_path_str |
+ << " needs to be absolute in key " |
+ << key_path; |
+ continue; |
+ } |
+ |
+ if (!file_util::PathExists(extension_path)) { |
+ LOG(ERROR) << "File " << extension_path_str |
+ << " for key " << key_path |
+ << " does not exist or is not readable."; |
+ continue; |
+ } |
+ |
+ if (!CanOpenFileForReading(extension_path)) { |
+ LOG(ERROR) << "File " << extension_path_str |
+ << " for key " << key_path << " can not be read. " |
+ << "Check that users who should have the extension " |
+ << "installed have permission to read it."; |
+ continue; |
+ } |
+ |
+ std::wstring extension_version; |
+ if (key.ReadValue(kRegistryExtensionVersion, &extension_version) |
+ != ERROR_SUCCESS) { |
+ // TODO(erikkay): find a way to get this into about:extensions |
+ LOG(ERROR) << "Missing value " << kRegistryExtensionVersion |
+ << " for key " << key_path << "."; |
+ continue; |
+ } |
+ |
+ std::string id = WideToASCII(iterator.Name()); |
+ StringToLowerASCII(&id); |
+ if (!Extension::IdIsValid(id)) { |
+ LOG(ERROR) << "Invalid id value " << id |
+ << " for key " << key_path << "."; |
+ continue; |
+ } |
+ |
+ scoped_ptr<Version> version; |
+ version.reset(Version::GetVersionFromString( |
+ WideToASCII(extension_version))); |
+ if (!version.get()) { |
+ LOG(ERROR) << "Invalid version value " << extension_version |
+ << " for key " << key_path << "."; |
+ continue; |
+ } |
+ |
+ prefs->SetString( |
+ id + "." + ExternalExtensionProviderImpl::kExternalVersion, |
+ WideToASCII(extension_version)); |
+ prefs->SetString( |
+ id + "." + ExternalExtensionProviderImpl::kExternalCrx, |
+ extension_path_str); |
} |
prefs_.reset(prefs.release()); |