Index: webkit/activex_shim/activex_shared.cc |
=================================================================== |
--- webkit/activex_shim/activex_shared.cc (revision 25626) |
+++ webkit/activex_shim/activex_shared.cc (working copy) |
@@ -1,241 +0,0 @@ |
-// Copyright (c) 2006-2008 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 "webkit/activex_shim/activex_shared.h" |
- |
-#include <windows.h> |
-#include "base/command_line.h" |
-#include "base/file_version_info.h" |
-#include "base/string_util.h" |
-#include "base/registry.h" |
-#include "googleurl/src/gurl.h" |
- |
-namespace activex_shim { |
- |
-namespace { |
-struct ActiveXAttribute { |
- const char* clsid; |
- ActiveXTypes type; |
- // allowed_sites is a (list) of simple patterns of sites. Rules are: |
- // - if pattern is empty or NULL pointer, no sites are allowed. |
- // - sites are separated by ";" |
- // - "*" will match any sites. |
- // - "file" matches file url starts with "file://" |
- // - anything else matches the last part of the host. |
- // e.g. "95559.com;ecitic.com" allows controls running from 95559.com and |
- // ecitic.com. |
- // See MatchUrlForSinglePattern for details. |
- const char* allowed_sites; |
- const char* allowed_codebase_sites; |
-}; |
-} // unnamed namespace. |
- |
-static const ActiveXAttribute activex_attributes[] = { |
- {"d27cdb6e-ae6d-11cf-96b8-444553540000", ACTIVEX_FLASH}, |
- // WMP 7 and later |
- {"6bf52a52-394a-11d3-b153-00c04f79faa6", ACTIVEX_WMP, "*", "microsoft.com"}, |
- // WMP 6.4 |
- {"22d6f312-b0f6-11d0-94ab-0080c74c7e95", ACTIVEX_WMP, "*", "microsoft.com"}, |
- {"cfcdaa03-8be4-11cf-b84b-0020afbbccfa", ACTIVEX_REALPLAYER}, |
- {"02bf25d5-8c17-4b23-bc80-d3488abddc6b", ACTIVEX_QUICKTIME}, |
- {"166b1bca-3f9c-11cf-8075-444553540000", ACTIVEX_SHOCKWAVE}, |
- {"4e174456-5ee6-494d-b6f2-2b52898a620e", ACTIVEX_TESTCONTROL, "file"}, |
-}; |
- |
-// See chrome_switches.cc, switches::kAllowAllActiveX. We duplicate the value |
-// here to avoid dependency on Chrome. |
-static const wchar_t kAllowAllActiveX[] = L"allow-all-activex"; |
- |
-static const ActiveXAttribute* FindActiveX(const std::string& clsid) { |
- for (unsigned int i = 0; i < arraysize(activex_attributes); ++i) { |
- if (LowerCaseEqualsASCII(clsid, activex_attributes[i].clsid)) |
- return &activex_attributes[i]; |
- } |
- return NULL; |
-} |
- |
-ActiveXTypes MapClassIdToType(const std::string& clsid) { |
- const ActiveXAttribute* attr = FindActiveX(clsid); |
- if (attr != NULL) |
- return attr->type; |
- else |
- return ACTIVEX_GENERIC; |
-} |
- |
-bool MatchUrlForSinglePattern(const GURL& url, const std::string& pattern) { |
- if (pattern.empty()) |
- return false; |
- if (pattern == "*") |
- return true; |
- if (pattern == "file") |
- return url.SchemeIsFile(); |
- return url.DomainIs(pattern.c_str()); |
-} |
- |
-bool MatchUrlForPatterns(const GURL& url, const std::string& patterns) { |
- std::vector<std::string> v; |
- SplitString(patterns, ';', &v); |
- for (unsigned int i = 0; i < v.size(); ++i) { |
- if (MatchUrlForSinglePattern(url, v[i])) |
- return true; |
- } |
- return false; |
-} |
- |
-// Whether allow-all-activex is specified in the command line. |
-static bool IsAllowAllActiveX() { |
- static bool parsed_flag = false; |
- static bool allow_all_activex = false; |
- if (!parsed_flag) { |
- allow_all_activex = |
- CommandLine::ForCurrentProcess()->HasSwitch(kAllowAllActiveX); |
- parsed_flag = true; |
- } |
- return allow_all_activex; |
-} |
- |
-// If an ActiveX control is allowed to run from a specific URL. |
-bool IsActiveXAllowed(const std::string& clsid, const GURL& url) { |
- if (IsAllowAllActiveX()) |
- return true; |
- const ActiveXAttribute* attr = FindActiveX(clsid); |
- if (attr == NULL) |
- return false; |
- if (attr->allowed_sites == NULL) |
- return false; |
- return MatchUrlForPatterns(url, attr->allowed_sites); |
-} |
- |
-// If an ActiveX control's codebase comes from allowed websites. |
-bool IsCodebaseAllowed(const std::string& clsid, const std::string& codebase) { |
- if (IsAllowAllActiveX()) |
- return true; |
- GURL url(codebase); |
- const ActiveXAttribute* attr = FindActiveX(clsid); |
- if (attr == NULL) |
- return false; |
- if (attr->allowed_codebase_sites == NULL) |
- return false; |
- return MatchUrlForPatterns(url, attr->allowed_codebase_sites); |
-} |
- |
-bool GetClsidFromClassidAttribute(const std::string& classid, |
- std::string* clsid) { |
- const unsigned int kClsidPrefixSize = 6; |
- if (classid.size() > kClsidPrefixSize) { |
- std::string prefix = classid.substr(0, kClsidPrefixSize); |
- if (LowerCaseEqualsASCII(prefix, "clsid:")) { |
- TrimWhitespace(classid.substr(kClsidPrefixSize), TRIM_ALL, clsid); |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-std::string GetVersionFromCodebaseAttribute(const std::string& codebase) { |
- std::string version; |
- size_t pos = codebase.find('#'); |
- if (pos == std::string::npos) |
- return version; |
- std::string rest = codebase.substr(pos + 1); |
- std::string version_prefix = "version="; |
- if (!StartsWithASCII(rest, "version=", false)) |
- return version; |
- size_t i; |
- for (i = version_prefix.size(); i < rest.size(); i++) { |
- char c = rest[i]; |
- if (c != ',' && (c > '9' || c < '0')) |
- break; |
- } |
- return rest.substr(version_prefix.size(), i - version_prefix.size()); |
-} |
- |
-// The version string should always be in the form of "1,2,0,4". |
-static bool ParseVersionFromCodebase(const std::string& version, |
- DWORD* version_ms, |
- DWORD* version_ls) { |
- *version_ms = 0; |
- *version_ls = 0; |
- std::vector<int> v; |
- std::vector<std::string> sv; |
- SplitString(version, ',', &sv); |
- for (size_t i = 0; i < sv.size(); ++i) |
- v.push_back(atoi(sv[i].c_str())); |
- if (v.size() != 4) |
- return false; |
- *version_ms = MAKELONG(v[1], v[0]); |
- *version_ls = MAKELONG(v[3], v[2]); |
- return true; |
-} |
- |
-bool IsActiveXInstalled(const std::string& combined_clsid) { |
- std::string clsid, version; |
- size_t pos = combined_clsid.find('#'); |
- if (pos == std::string::npos) { |
- clsid = combined_clsid; |
- } else { |
- clsid = combined_clsid.substr(0, pos); |
- version = combined_clsid.substr(pos + 1); |
- } |
- RegKey key; |
- std::wstring key_path = std::wstring(L"CLSID\\{") + ASCIIToWide(clsid) + L"}"; |
- if (!key.Open(HKEY_CLASSES_ROOT, key_path.c_str(), KEY_READ)) |
- return false; |
- // If no specific version is required, any installed version would be fine. |
- if (version.empty()) |
- return true; |
- DWORD requested_version_ms = 0; |
- DWORD requested_version_ls = 0; |
- if (!ParseVersionFromCodebase(version, |
- &requested_version_ms, |
- &requested_version_ls)) |
- return true; |
- // Get the path to the dll. |
- std::wstring path; |
- RegKey(HKEY_CLASSES_ROOT, (key_path + L"\\InprocServer32").c_str()). |
- ReadValue(NULL, &path); |
- if (path.empty()) |
- return false; |
- |
- // Get the file version from the dll. |
- DWORD file_version_ms, file_version_ls; |
- FileVersionInfo* vi = FileVersionInfo::CreateFileVersionInfo(path); |
- if (vi == NULL) |
- return false; |
- if (vi->fixed_file_info() == NULL) { |
- delete vi; |
- return false; |
- } |
- file_version_ms = vi->fixed_file_info()->dwFileVersionMS; |
- file_version_ls = vi->fixed_file_info()->dwFileVersionLS; |
- delete vi; |
- |
- // Compare the request version and actual file version. |
- if (file_version_ms > requested_version_ms) |
- return true; |
- else if (file_version_ms < requested_version_ms) |
- return false; |
- else |
- return file_version_ls >= requested_version_ls; |
-} |
- |
-bool IsMimeTypeActiveX(const std::string& mimetype) { |
- return LowerCaseEqualsASCII(mimetype, "application/x-oleobject") || |
- LowerCaseEqualsASCII(mimetype, "application/oleobject"); |
-} |
- |
-bool GetMimeTypeForClsid(const std::string& clsid, std::string* mime_type) { |
- DCHECK(mime_type != NULL); |
- |
- if (!base::strcasecmp(clsid.c_str(), |
- "6BF52A52-394A-11D3-B153-00C04F79FAA6") || |
- !base::strcasecmp(clsid.c_str(), |
- "22D6F312-B0F6-11D0-94AB-0080C74C7E95")) { |
- *mime_type = "application/x-mplayer2"; |
- return true; |
- } |
- return false; |
-} |
- |
-} // namespace activex_shim |