urlmon: Improved GetSecurityId's support for file url's.

This commit is contained in:
Thomas Mullaly 2011-08-31 18:31:35 -04:00 committed by Alexandre Julliard
parent 9848872207
commit e0dfbd6a94
2 changed files with 71 additions and 54 deletions

View File

@ -652,6 +652,69 @@ static HRESULT get_action_policy(DWORD zone, DWORD action, BYTE *policy, DWORD s
return hres;
}
static HRESULT get_security_id(LPCWSTR url, BYTE *secid, DWORD *secid_len)
{
LPWSTR secur_url, ptr, ptr2;
DWORD zone, len;
HRESULT hres;
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;
/* file protocol is a special case */
if(strlenW(secur_url) >= sizeof(wszFile)/sizeof(WCHAR)
&& !memcmp(secur_url, wszFile, sizeof(wszFile))) {
WCHAR path[MAX_PATH];
len = sizeof(path)/sizeof(WCHAR);
hres = CoInternetParseUrl(secur_url, PARSE_PATH_FROM_URL, 0, path, len, &len, 0);
if(hres == S_OK && !PathIsNetworkPathW(path)) {
static const BYTE secidFile[] = {'f','i','l','e',':'};
CoTaskMemFree(secur_url);
if(*secid_len < sizeof(secidFile)+sizeof(zone))
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
memcpy(secid, secidFile, sizeof(secidFile));
*(DWORD*)(secid+sizeof(secidFile)) = zone;
*secid_len = sizeof(secidFile)+sizeof(zone);
return S_OK;
}
}
ptr = strchrW(secur_url, ':');
ptr2 = ++ptr;
while(*ptr2 == '/')
ptr2++;
if(ptr2 != ptr)
memmove(ptr, ptr2, (strlenW(ptr2)+1)*sizeof(WCHAR));
ptr = strchrW(ptr, '/');
if(ptr)
*ptr = 0;
len = WideCharToMultiByte(CP_ACP, 0, secur_url, -1, NULL, 0, NULL, NULL)-1;
if(len+sizeof(DWORD) > *secid_len) {
CoTaskMemFree(secur_url);
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
}
WideCharToMultiByte(CP_ACP, 0, secur_url, -1, (LPSTR)secid, len, NULL, NULL);
CoTaskMemFree(secur_url);
*(DWORD*)(secid+len) = zone;
*secid_len = len+sizeof(DWORD);
return S_OK;
}
/***********************************************************************
* InternetSecurityManager implementation
*
@ -817,16 +880,13 @@ static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManagerEx2 *
LPCWSTR pwszUrl, BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved)
{
SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface);
LPWSTR url, ptr, ptr2;
DWORD zone, len;
HRESULT hres;
static const WCHAR wszFile[] = {'f','i','l','e',':'};
TRACE("(%p)->(%s %p %p %08lx)\n", iface, debugstr_w(pwszUrl), pbSecurityId,
pcbSecurityId, dwReserved);
if(This->custom_manager) {
HRESULT hres;
hres = IInternetSecurityManager_GetSecurityId(This->custom_manager,
pwszUrl, pbSecurityId, pcbSecurityId, dwReserved);
if(hres != INET_E_DEFAULT_ACTION)
@ -839,54 +899,7 @@ static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManagerEx2 *
if(dwReserved)
FIXME("dwReserved is not supported\n");
hres = map_url_to_zone(pwszUrl, &zone, &url);
if(FAILED(hres))
return hres == 0x80041001 ? E_INVALIDARG : hres;
/* file protocol is a special case */
if(strlenW(url) >= sizeof(wszFile)/sizeof(WCHAR)
&& !memcmp(url, wszFile, sizeof(wszFile)) && strchrW(url, '\\')) {
static const BYTE secidFile[] = {'f','i','l','e',':'};
CoTaskMemFree(url);
if(*pcbSecurityId < sizeof(secidFile)+sizeof(zone))
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
memcpy(pbSecurityId, secidFile, sizeof(secidFile));
*(DWORD*)(pbSecurityId+sizeof(secidFile)) = zone;
*pcbSecurityId = sizeof(secidFile)+sizeof(zone);
return S_OK;
}
ptr = strchrW(url, ':');
ptr2 = ++ptr;
while(*ptr2 == '/')
ptr2++;
if(ptr2 != ptr)
memmove(ptr, ptr2, (strlenW(ptr2)+1)*sizeof(WCHAR));
ptr = strchrW(ptr, '/');
if(ptr)
*ptr = 0;
len = WideCharToMultiByte(CP_ACP, 0, url, -1, NULL, 0, NULL, NULL)-1;
if(len+sizeof(DWORD) > *pcbSecurityId) {
CoTaskMemFree(url);
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
}
WideCharToMultiByte(CP_ACP, 0, url, -1, (LPSTR)pbSecurityId, len, NULL, NULL);
CoTaskMemFree(url);
*(DWORD*)(pbSecurityId+len) = zone;
*pcbSecurityId = len+sizeof(DWORD);
return S_OK;
return get_security_id(pwszUrl, pbSecurityId, pcbSecurityId);
}

View File

@ -94,6 +94,8 @@ static const WCHAR url9[] = {'h','t','t','p',':','/','/','w','w','w','.','z','o'
'.','w','i','n','e','t','e','s','t', '/','s','i','t','e','/','a','b','o','u','t',0};
static const WCHAR url10[] = {'f','i','l','e',':','/','/','s','o','m','e','%','2','0','f','i','l','e',
'.','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 url4e[] = {'f','i','l','e',':','s','o','m','e',' ','f','i','l','e',
'.','j','p','g',0};
@ -140,7 +142,9 @@ static struct secmgr_test {
{url3, 0, S_OK, sizeof(secid1), secid1, S_OK},
{url5, 3, S_OK, sizeof(secid5), secid5, S_OK},
{url6, 3, S_OK, sizeof(secid6), secid6, S_OK},
{url7, 3, S_OK, sizeof(secid7), secid7, S_OK}
{url7, 3, S_OK, sizeof(secid7), secid7, S_OK},
{url11,0, S_OK, sizeof(secid1), secid1, S_OK},
{url12,0, S_OK, sizeof(secid1), secid1, S_OK}
};
static int strcmp_w(const WCHAR *str1, const WCHAR *str2)