Thomas Mullaly : urlmon: Made domain mapping support IUri based and added wildcard scheme domain mapping tests .
Alexandre Julliard
julliard at winehq.org
Mon Sep 5 13:26:21 CDT 2011
Module: wine
Branch: master
Commit: dac6d862eca9a4428a8eea77ea6b242e1f550cf0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=dac6d862eca9a4428a8eea77ea6b242e1f550cf0
Author: Thomas Mullaly <thomas.mullaly at gmail.com>
Date: Sun Sep 4 20:56:09 2011 -0400
urlmon: Made domain mapping support IUri based and added wildcard scheme domain mapping tests.
---
dlls/urlmon/sec_mgr.c | 62 ++++++++++++++----------------------------
dlls/urlmon/tests/sec_mgr.c | 8 ++++-
2 files changed, 27 insertions(+), 43 deletions(-)
diff --git a/dlls/urlmon/sec_mgr.c b/dlls/urlmon/sec_mgr.c
index 11f8c2a..314605e 100644
--- a/dlls/urlmon/sec_mgr.c
+++ b/dlls/urlmon/sec_mgr.c
@@ -444,50 +444,38 @@ static HRESULT search_for_domain_mapping(HKEY domains, LPCWSTR schema, LPCWSTR h
return hres;
}
-static HRESULT get_zone_from_domains(LPCWSTR url, LPCWSTR schema, DWORD *zone)
+static HRESULT get_zone_from_domains(IUri *uri, DWORD *zone)
{
HRESULT hres;
- WCHAR *host_name;
- DWORD host_len = lstrlenW(url)+1;
+ BSTR host, scheme;
DWORD res;
HKEY domains;
+ DWORD scheme_type;
- host_name = heap_alloc(host_len*sizeof(WCHAR));
- if(!host_name)
- return E_OUTOFMEMORY;
-
- hres = CoInternetParseUrl(url, PARSE_DOMAIN, 0, host_name, host_len, &host_len, 0);
- if(hres == S_FALSE) {
- WCHAR *tmp = heap_realloc(host_name, (host_len+1)*sizeof(WCHAR));
- if(!tmp) {
- heap_free(host_name);
- return E_OUTOFMEMORY;
- }
-
- host_name = tmp;
- hres = CoInternetParseUrl(url, PARSE_DOMAIN, 0, host_name, host_len+1, &host_len, 0);
- }
+ hres = IUri_GetScheme(uri, &scheme_type);
+ if(FAILED(hres))
+ return hres;
/* Windows doesn't play nice with unknown scheme types when it tries
* to check if a host name maps into any domains.
- *
- * The reason is with how CoInternetParseUrl handles unknown scheme types
- * when it's parsing the domain of a URL (IE it always returns E_FAIL).
- *
- * Windows doesn't compensate for this and simply doesn't check if
- * the URL maps into any domains.
*/
- if(hres != S_OK) {
- heap_free(host_name);
- if(hres == E_FAIL)
- return S_FALSE;
+ if(scheme_type == URL_SCHEME_UNKNOWN)
+ return S_FALSE;
+
+ hres = IUri_GetHost(uri, &host);
+ if(FAILED(hres))
+ return hres;
+
+ hres = IUri_GetSchemeName(uri, &scheme);
+ if(FAILED(hres)) {
+ SysFreeString(host);
return hres;
}
/* First try CURRENT_USER. */
res = RegOpenKeyW(HKEY_CURRENT_USER, wszZoneMapDomainsKey, &domains);
if(res == ERROR_SUCCESS) {
- hres = search_for_domain_mapping(domains, schema, host_name, host_len, zone);
+ hres = search_for_domain_mapping(domains, scheme, host, SysStringLen(host), zone);
RegCloseKey(domains);
} else
WARN("Failed to open HKCU's %s key\n", debugstr_w(wszZoneMapDomainsKey));
@@ -496,13 +484,14 @@ static HRESULT get_zone_from_domains(LPCWSTR url, LPCWSTR schema, DWORD *zone)
if(hres == S_FALSE) {
res = RegOpenKeyW(HKEY_LOCAL_MACHINE, wszZoneMapDomainsKey, &domains);
if(res == ERROR_SUCCESS) {
- hres = search_for_domain_mapping(domains, schema, host_name, host_len, zone);
+ hres = search_for_domain_mapping(domains, scheme, host, SysStringLen(host), zone);
RegCloseKey(domains);
} else
WARN("Failed to open HKLM's %s key\n", debugstr_w(wszZoneMapDomainsKey));
}
- heap_free(host_name);
+ SysFreeString(host);
+ SysFreeString(scheme);
return hres;
}
@@ -563,16 +552,7 @@ static HRESULT map_security_uri_to_zone(IUri *uri, DWORD *zone)
}
if(*zone == URLZONE_INVALID) {
- BSTR secur_url;
-
- hres = IUri_GetDisplayUri(uri, &secur_url);
- if(FAILED(hres)) {
- SysFreeString(scheme);
- return hres;
- }
-
- hres = get_zone_from_domains(secur_url, scheme, zone);
- SysFreeString(secur_url);
+ hres = get_zone_from_domains(uri, zone);
if(hres == S_FALSE)
hres = get_zone_from_reg(scheme, zone);
}
diff --git a/dlls/urlmon/tests/sec_mgr.c b/dlls/urlmon/tests/sec_mgr.c
index 3e8cef3..c8d5b8b 100644
--- a/dlls/urlmon/tests/sec_mgr.c
+++ b/dlls/urlmon/tests/sec_mgr.c
@@ -604,7 +604,8 @@ static const zone_domain_mapping zone_domain_mappings[] = {
{"www.testing.com",NULL,"http",URLZONE_CUSTOM},
{"www.testing.com","testing","http",URLZONE_CUSTOM2},
{"org",NULL,"http",URLZONE_CUSTOM},
- {"org","testing","http",URLZONE_CUSTOM2}
+ {"org","testing","http",URLZONE_CUSTOM2},
+ {"wine.testing",NULL,"*",URLZONE_CUSTOM2}
};
static void register_zone_domains(void)
@@ -751,7 +752,10 @@ static const zone_mapping_test zone_mapping_tests[] = {
/* Tests for "org" zone mappings. */
{"http://google.org/",URLZONE_INTERNET,FALSE,URLZONE_CUSTOM},
{"http://org/",URLZONE_CUSTOM},
- {"http://testing.org/",URLZONE_CUSTOM2}
+ {"http://testing.org/",URLZONE_CUSTOM2},
+ /* Tests for "wine.testing" mapping */
+ {"*:wine.testing/test",URLZONE_CUSTOM2},
+ {"http://wine.testing/testing",URLZONE_CUSTOM2}
};
static void test_zone_domain_mappings(void)
More information about the wine-cvs
mailing list