urlmon: Added basic MapUrlToZoneEx2 implementation.
This commit is contained in:
parent
e0dfbd6a94
commit
98d5dfb83d
@ -57,6 +57,11 @@ static const WCHAR wszZoneMapDomainsKey[] = {'S','o','f','t','w','a','r','e','\\
|
|||||||
'Z','o','n','e','M','a','p','\\',
|
'Z','o','n','e','M','a','p','\\',
|
||||||
'D','o','m','a','i','n','s',0};
|
'D','o','m','a','i','n','s',0};
|
||||||
|
|
||||||
|
static inline BOOL is_drive_path(const WCHAR *path)
|
||||||
|
{
|
||||||
|
return isalphaW(*path) && *(path+1) == ':';
|
||||||
|
}
|
||||||
|
|
||||||
/********************************************************************
|
/********************************************************************
|
||||||
* get_string_from_reg [internal]
|
* get_string_from_reg [internal]
|
||||||
*
|
*
|
||||||
@ -501,45 +506,37 @@ static HRESULT get_zone_from_domains(LPCWSTR url, LPCWSTR schema, DWORD *zone)
|
|||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT map_url_to_zone(LPCWSTR url, DWORD *zone, LPWSTR *ret_url)
|
static HRESULT map_security_uri_to_zone(IUri *uri, DWORD *zone)
|
||||||
{
|
{
|
||||||
LPWSTR secur_url;
|
|
||||||
WCHAR schema[64];
|
|
||||||
DWORD size=0;
|
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
BSTR scheme;
|
||||||
|
|
||||||
*zone = URLZONE_INVALID;
|
*zone = URLZONE_INVALID;
|
||||||
|
|
||||||
hres = CoInternetGetSecurityUrl(url, &secur_url, PSU_SECURITY_URL_ONLY, 0);
|
hres = IUri_GetSchemeName(uri, &scheme);
|
||||||
if(hres != S_OK) {
|
if(FAILED(hres))
|
||||||
size = strlenW(url)*sizeof(WCHAR);
|
return hres;
|
||||||
|
|
||||||
secur_url = CoTaskMemAlloc(size);
|
if(!strcmpiW(scheme, fileW)) {
|
||||||
if(!secur_url)
|
BSTR path;
|
||||||
return E_OUTOFMEMORY;
|
WCHAR *ptr, *path_start, root[20];
|
||||||
|
|
||||||
memcpy(secur_url, url, size);
|
hres = IUri_GetPath(uri, &path);
|
||||||
|
if(FAILED(hres)) {
|
||||||
|
SysFreeString(scheme);
|
||||||
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
hres = CoInternetParseUrl(secur_url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(WCHAR), &size, 0);
|
if(*path == '/' && is_drive_path(path+1))
|
||||||
if(FAILED(hres) || !*schema) {
|
path_start = path+1;
|
||||||
CoTaskMemFree(secur_url);
|
else
|
||||||
return E_INVALIDARG;
|
path_start = path;
|
||||||
}
|
|
||||||
|
|
||||||
/* file protocol is a special case */
|
if(((ptr = strchrW(path_start, '\\')) || (ptr = strchrW(path_start, '/'))) && ptr-path_start < sizeof(root)/sizeof(WCHAR)) {
|
||||||
if(!strcmpW(schema, fileW)) {
|
|
||||||
WCHAR path[MAX_PATH], root[20];
|
|
||||||
WCHAR *ptr;
|
|
||||||
|
|
||||||
hres = CoInternetParseUrl(secur_url, PARSE_PATH_FROM_URL, 0, path,
|
|
||||||
sizeof(path)/sizeof(WCHAR), &size, 0);
|
|
||||||
|
|
||||||
if(SUCCEEDED(hres) && (ptr = strchrW(path, '\\')) && ptr-path < sizeof(root)/sizeof(WCHAR)) {
|
|
||||||
UINT type;
|
UINT type;
|
||||||
|
|
||||||
memcpy(root, path, (ptr-path)*sizeof(WCHAR));
|
memcpy(root, path_start, (ptr-path_start)*sizeof(WCHAR));
|
||||||
root[ptr-path] = 0;
|
root[ptr-path_start] = 0;
|
||||||
|
|
||||||
type = GetDriveTypeW(root);
|
type = GetDriveTypeW(root);
|
||||||
|
|
||||||
@ -562,14 +559,56 @@ static HRESULT map_url_to_zone(LPCWSTR url, DWORD *zone, LPWSTR *ret_url)
|
|||||||
FIXME("unsupported drive type %d\n", type);
|
FIXME("unsupported drive type %d\n", type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
SysFreeString(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(*zone == URLZONE_INVALID) {
|
if(*zone == URLZONE_INVALID) {
|
||||||
hres = get_zone_from_domains(secur_url, schema, zone);
|
BSTR secur_url;
|
||||||
if(hres == S_FALSE)
|
|
||||||
hres = get_zone_from_reg(schema, zone);
|
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);
|
||||||
|
if(hres == S_FALSE)
|
||||||
|
hres = get_zone_from_reg(scheme, zone);
|
||||||
|
}
|
||||||
|
|
||||||
|
SysFreeString(scheme);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT map_url_to_zone(LPCWSTR url, DWORD *zone, LPWSTR *ret_url)
|
||||||
|
{
|
||||||
|
IUri *secur_uri;
|
||||||
|
LPWSTR secur_url;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
*zone = URLZONE_INVALID;
|
||||||
|
|
||||||
|
hres = CoInternetGetSecurityUrl(url, &secur_url, PSU_SECURITY_URL_ONLY, 0);
|
||||||
|
if(hres != S_OK) {
|
||||||
|
DWORD size = strlenW(url)*sizeof(WCHAR);
|
||||||
|
|
||||||
|
secur_url = CoTaskMemAlloc(size);
|
||||||
|
if(!secur_url)
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
memcpy(secur_url, url, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
hres = CreateUri(secur_url, 0, 0, &secur_uri);
|
||||||
|
if(FAILED(hres)) {
|
||||||
|
CoTaskMemFree(secur_url);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
|
||||||
|
hres = map_security_uri_to_zone(secur_uri, zone);
|
||||||
|
IUri_Release(secur_uri);
|
||||||
|
|
||||||
if(FAILED(hres) || !ret_url)
|
if(FAILED(hres) || !ret_url)
|
||||||
CoTaskMemFree(secur_url);
|
CoTaskMemFree(secur_url);
|
||||||
else
|
else
|
||||||
@ -578,6 +617,21 @@ static HRESULT map_url_to_zone(LPCWSTR url, DWORD *zone, LPWSTR *ret_url)
|
|||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT map_uri_to_zone(IUri *uri, DWORD *zone)
|
||||||
|
{
|
||||||
|
HRESULT hres;
|
||||||
|
IUri *secur_uri;
|
||||||
|
|
||||||
|
hres = CoInternetGetSecurityUrlEx(uri, &secur_uri, PSU_SECURITY_URL_ONLY, 0);
|
||||||
|
if(FAILED(hres))
|
||||||
|
return hres;
|
||||||
|
|
||||||
|
hres = map_security_uri_to_zone(secur_uri, zone);
|
||||||
|
IUri_Release(secur_uri);
|
||||||
|
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT open_zone_key(HKEY parent_key, DWORD zone, HKEY *hkey)
|
static HRESULT open_zone_key(HKEY parent_key, DWORD zone, HKEY *hkey)
|
||||||
{
|
{
|
||||||
static const WCHAR wszFormat[] = {'%','s','%','u',0};
|
static const WCHAR wszFormat[] = {'%','s','%','u',0};
|
||||||
@ -1033,8 +1087,21 @@ static HRESULT WINAPI SecManagerImpl_MapUrlToZoneEx2(IInternetSecurityManagerEx2
|
|||||||
IUri *pUri, DWORD *pdwZone, DWORD dwFlags, LPWSTR *ppwszMappedUrl, DWORD *pdwOutFlags)
|
IUri *pUri, DWORD *pdwZone, DWORD dwFlags, LPWSTR *ppwszMappedUrl, DWORD *pdwOutFlags)
|
||||||
{
|
{
|
||||||
SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface);
|
SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface);
|
||||||
FIXME("(%p)->(%p %p %08x %p %p) stub\n", This, pUri, pdwZone, dwFlags, ppwszMappedUrl, pdwOutFlags);
|
|
||||||
return E_NOTIMPL;
|
TRACE("(%p)->(%p %p %08x %p %p)\n", This, pUri, pdwZone, dwFlags, ppwszMappedUrl, pdwOutFlags);
|
||||||
|
|
||||||
|
if(!pdwZone)
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
if(!pUri) {
|
||||||
|
*pdwZone = URLZONE_INVALID;
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dwFlags)
|
||||||
|
FIXME("Unsupported flags: %08x\n", dwFlags);
|
||||||
|
|
||||||
|
return map_uri_to_zone(pUri, pdwZone);
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI SecManagerImpl_ProcessUrlActionEx2(IInternetSecurityManagerEx2 *iface,
|
static HRESULT WINAPI SecManagerImpl_ProcessUrlActionEx2(IInternetSecurityManagerEx2 *iface,
|
||||||
|
@ -1620,12 +1620,16 @@ static const struct {
|
|||||||
DWORD zone;
|
DWORD zone;
|
||||||
BOOL map_todo;
|
BOOL map_todo;
|
||||||
} sec_mgr_ex2_tests[] = {
|
} sec_mgr_ex2_tests[] = {
|
||||||
{"res://mshtml.dll/blank.htm",0,S_OK,URLZONE_LOCAL_MACHINE,TRUE},
|
{"res://mshtml.dll/blank.htm",0,S_OK,URLZONE_LOCAL_MACHINE},
|
||||||
{"index.htm",Uri_CREATE_ALLOW_RELATIVE,0,URLZONE_INTERNET,TRUE},
|
{"index.htm",Uri_CREATE_ALLOW_RELATIVE,0,URLZONE_INTERNET},
|
||||||
{"file://c:\\Index.html",0,0,URLZONE_LOCAL_MACHINE,TRUE},
|
{"file://c:\\Index.html",0,0,URLZONE_LOCAL_MACHINE},
|
||||||
{"http://www.zone3.winetest/",0,0,URLZONE_INTERNET,TRUE},
|
{"http://www.zone3.winetest/",0,0,URLZONE_INTERNET},
|
||||||
{"about:blank",0,0,URLZONE_INTERNET,TRUE},
|
{"about:blank",0,0,URLZONE_INTERNET},
|
||||||
{"ftp://zone3.winetest/file.test",0,0,URLZONE_INTERNET,TRUE}
|
{"ftp://zone3.winetest/file.test",0,0,URLZONE_INTERNET},
|
||||||
|
{"/file/testing/test.test",Uri_CREATE_ALLOW_RELATIVE,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}
|
||||||
};
|
};
|
||||||
|
|
||||||
static void test_SecurityManagerEx2(void)
|
static void test_SecurityManagerEx2(void)
|
||||||
@ -1652,14 +1656,14 @@ static void test_SecurityManagerEx2(void)
|
|||||||
zone = 0xdeadbeef;
|
zone = 0xdeadbeef;
|
||||||
|
|
||||||
hres = IInternetSecurityManagerEx2_MapUrlToZoneEx2(sec_mgr2, NULL, &zone, 0, NULL, NULL);
|
hres = IInternetSecurityManagerEx2_MapUrlToZoneEx2(sec_mgr2, NULL, &zone, 0, NULL, NULL);
|
||||||
todo_wine ok(hres == E_INVALIDARG, "MapUrlToZoneEx2 returned %08x, expected E_INVALIDARG\n", hres);
|
ok(hres == E_INVALIDARG, "MapUrlToZoneEx2 returned %08x, expected E_INVALIDARG\n", hres);
|
||||||
todo_wine ok(zone == URLZONE_INVALID, "zone was %d\n", zone);
|
ok(zone == URLZONE_INVALID, "zone was %d\n", zone);
|
||||||
|
|
||||||
hres = pCreateUri(url5, 0, 0, &uri);
|
hres = pCreateUri(url5, 0, 0, &uri);
|
||||||
ok(hres == S_OK, "CreateUri failed: %08x\n", hres);
|
ok(hres == S_OK, "CreateUri failed: %08x\n", hres);
|
||||||
|
|
||||||
hres = IInternetSecurityManagerEx2_MapUrlToZoneEx2(sec_mgr2, uri, NULL, 0, NULL, NULL);
|
hres = IInternetSecurityManagerEx2_MapUrlToZoneEx2(sec_mgr2, uri, NULL, 0, NULL, NULL);
|
||||||
todo_wine ok(hres == E_INVALIDARG, "MapToUrlZoneEx2 returned %08x, expected E_INVALIDARG\n", hres);
|
ok(hres == E_INVALIDARG, "MapToUrlZoneEx2 returned %08x, expected E_INVALIDARG\n", hres);
|
||||||
|
|
||||||
IUri_Release(uri);
|
IUri_Release(uri);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user