From 253fccc82eef1f4d10460e7a792e73a1647d7898 Mon Sep 17 00:00:00 2001 From: Thomas Mullaly Date: Thu, 15 Sep 2011 21:36:18 -0400 Subject: [PATCH] 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 0c7170c7b68..c74fbce0294 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 fca17e80e37..869cc35c584 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) -- 2.11.4.GIT