Thomas Mullaly : urlmon: Improved MapUrlToZone{Ex2} and GetSecurityId support.
Alexandre Julliard
julliard at winehq.org
Mon Oct 10 10:25:35 CDT 2011
Module: wine
Branch: master
Commit: 253fccc82eef1f4d10460e7a792e73a1647d7898
URL: http://source.winehq.org/git/wine.git/?a=commit;h=253fccc82eef1f4d10460e7a792e73a1647d7898
Author: Thomas Mullaly <thomas.mullaly at gmail.com>
Date: Thu Sep 15 21:36:18 2011 -0400
urlmon: Improved MapUrlToZone{Ex2} and GetSecurityId support.
---
dlls/urlmon/sec_mgr.c | 26 ++++++++++++++++++++++++--
dlls/urlmon/tests/sec_mgr.c | 30 +++++++++++++++++++++++++++++-
2 files changed, 53 insertions(+), 3 deletions(-)
diff --git a/dlls/urlmon/sec_mgr.c b/dlls/urlmon/sec_mgr.c
index 0c7170c..c74fbce 100644
--- a/dlls/urlmon/sec_mgr.c
+++ b/dlls/urlmon/sec_mgr.c
@@ -62,6 +62,15 @@ static inline BOOL is_drive_path(const WCHAR *path)
return isalphaW(*path) && *(path+1) == ':';
}
+/* List of schemes types Windows seems to expect to be hierarchical. */
+static inline BOOL is_hierarchical_scheme(URL_SCHEME type) {
+ return(type == URL_SCHEME_HTTP || type == URL_SCHEME_FTP ||
+ type == URL_SCHEME_GOPHER || type == URL_SCHEME_NNTP ||
+ type == URL_SCHEME_TELNET || type == URL_SCHEME_WAIS ||
+ type == URL_SCHEME_FILE || type == URL_SCHEME_HTTPS ||
+ type == URL_SCHEME_RES);
+}
+
/********************************************************************
* get_string_from_reg [internal]
*
@@ -466,6 +475,19 @@ static HRESULT get_zone_from_domains(IUri *uri, DWORD *zone)
if(FAILED(hres))
return hres;
+ /* Known hierarchical scheme types must have a host. If they don't Windows
+ * assigns URLZONE_INVALID to the zone.
+ */
+ if((scheme_type != URL_SCHEME_UNKNOWN && scheme_type != URL_SCHEME_FILE)
+ && is_hierarchical_scheme(scheme_type) && !*host) {
+ *zone = URLZONE_INVALID;
+
+ SysFreeString(host);
+
+ /* The MapUrlToZone functions return S_OK when this condition occurs. */
+ return S_OK;
+ }
+
hres = IUri_GetSchemeName(uri, &scheme);
if(FAILED(hres)) {
SysFreeString(host);
@@ -695,8 +717,8 @@ static HRESULT get_security_id(LPCWSTR url, BYTE *secid, DWORD *secid_len)
static const WCHAR wszFile[] = {'f','i','l','e',':'};
hres = map_url_to_zone(url, &zone, &secur_url);
- if(FAILED(hres))
- return hres == 0x80041001 ? E_INVALIDARG : hres;
+ if(zone == URLZONE_INVALID)
+ return (hres == 0x80041001 || hres == S_OK) ? E_INVALIDARG : hres;
/* file protocol is a special case */
if(strlenW(secur_url) >= sizeof(wszFile)/sizeof(WCHAR)
diff --git a/dlls/urlmon/tests/sec_mgr.c b/dlls/urlmon/tests/sec_mgr.c
index fca17e8..869cc35 100644
--- a/dlls/urlmon/tests/sec_mgr.c
+++ b/dlls/urlmon/tests/sec_mgr.c
@@ -100,6 +100,8 @@ static const WCHAR url10[] = {'f','i','l','e',':','/','/','s','o','m','e','%','2
'.','j','p','g',0};
static const WCHAR url11[] = {'f','i','l','e',':','/','/','c',':','/','I','n','d','e','x','.','h','t','m',0};
static const WCHAR url12[] = {'f','i','l','e',':','/','/','/','c',':','/','I','n','d','e','x','.','h','t','m',0};
+static const WCHAR url13[] = {'h','t','t','p',':','g','o','o','g','l','e','.','c','o','m',0};
+static const WCHAR url14[] = {'z','i','p',':','t','e','s','t','i','n','g','.','c','o','m','/','t','e','s','t','i','n','g',0};
static const WCHAR url4e[] = {'f','i','l','e',':','s','o','m','e',' ','f','i','l','e',
'.','j','p','g',0};
@@ -121,6 +123,8 @@ static const BYTE secid7[] = {'f','t','p',':','z','o','n','e','3',
'.','w','i','n','e','t','e','s','t',3,0,0,0};
static const BYTE secid10[] =
{'f','i','l','e',':','s','o','m','e','%','2','0','f','i','l','e','.','j','p','g',3,0,0,0};
+static const BYTE secid14[] =
+ {'z','i','p',':','t','e','s','t','i','n','g','.','c','o','m','/','t','e','s','t','i','n','g',3,0,0,0};
static const BYTE secid10_2[] =
{'f','i','l','e',':','s','o','m','e',' ','f','i','l','e','.','j','p','g',3,0,0,0};
@@ -416,6 +420,28 @@ static void test_SecurityManager(void)
"wrong secid\n");
zone = 100;
+ hres = IInternetSecurityManager_MapUrlToZone(secmgr, url13, &zone, 0);
+ ok(hres == S_OK, "MapUrlToZone failed: %08x\n", hres);
+ ok(zone == URLZONE_INVALID || broken(zone == URLZONE_INTERNET), "zone=%d\n", zone);
+
+ size = sizeof(buf);
+ memset(buf, 0xf0, sizeof(buf));
+ hres = IInternetSecurityManager_GetSecurityId(secmgr, url13, buf, &size, 0);
+ ok(hres == E_INVALIDARG || broken(hres == S_OK), "GetSecurityId failed: %08x\n", hres);
+
+ zone = 100;
+ hres = IInternetSecurityManager_MapUrlToZone(secmgr, url14, &zone, 0);
+ ok(hres == S_OK, "MapUrlToZone failed: %08x, expected S_OK\n", hres);
+ ok(zone == URLZONE_INTERNET, "zone=%d\n", zone);
+
+ size = sizeof(buf);
+ memset(buf, 0xf0, sizeof(buf));
+ hres = IInternetSecurityManager_GetSecurityId(secmgr, url14, buf, &size, 0);
+ ok(hres == S_OK, "GetSecurityId failed: %08x, expected S_OK\n", hres);
+ todo_wine ok(size == sizeof(secid14), "size=%d\n", size);
+ todo_wine ok(!memcmp(buf, secid14, size), "wrong secid\n");
+
+ zone = 100;
hres = IInternetSecurityManager_MapUrlToZone(secmgr, NULL, &zone, 0);
ok(hres == E_INVALIDARG, "MapUrlToZone failed: %08x, expected E_INVALIDARG\n", hres);
ok(zone == 100 || zone == -1, "zone=%d\n", zone);
@@ -1734,7 +1760,9 @@ static const struct {
{"ftp://zone3.winetest/file.test",0,0,URLZONE_INTERNET},
{"/file/testing/test.test",Uri_CREATE_ALLOW_RELATIVE,0,URLZONE_INTERNET},
{"zip://testing.com/",0,0,URLZONE_INTERNET},
- {"zip:testing.com",0,0,URLZONE_INTERNET}
+ {"zip:testing.com",0,0,URLZONE_INTERNET},
+ {"http:google.com",0,S_OK,URLZONE_INVALID},
+ {"http:/google.com",0,S_OK,URLZONE_INVALID}
};
static void test_SecurityManagerEx2(void)
More information about the wine-cvs
mailing list