689
static HRESULT get_security_id(LPCWSTR url, BYTE *secid, DWORD *secid_len)
691
LPWSTR secur_url, ptr, ptr2;
695
static const WCHAR wszFile[] = {'f','i','l','e',':'};
714
static HRESULT generate_security_id(IUri *uri, BYTE *secid, DWORD *secid_len, DWORD zone)
720
if(zone == URLZONE_INVALID)
723
hres = IUri_GetScheme(uri, &scheme_type);
727
/* Windows handles opaque URLs differently then hierarchical ones. */
728
if(!is_hierarchical_scheme(scheme_type) && scheme_type != URL_SCHEME_WILDCARD) {
731
hres = IUri_GetDisplayUri(uri, &display_uri);
735
len = WideCharToMultiByte(CP_ACP, 0, display_uri, -1, NULL, 0, NULL, NULL)-1;
737
if(len+sizeof(DWORD) > *secid_len) {
738
SysFreeString(display_uri);
739
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
742
WideCharToMultiByte(CP_ACP, 0, display_uri, -1, (LPSTR)secid, len, NULL, NULL);
743
SysFreeString(display_uri);
745
*(DWORD*)(secid+len) = zone;
748
DWORD host_len, scheme_len;
751
hres = IUri_GetHost(uri, &host);
755
/* The host can't be empty for Wildcard URIs. */
756
if(scheme_type == URL_SCHEME_WILDCARD && !*host) {
761
hres = IUri_GetSchemeName(uri, &scheme);
767
host_len = WideCharToMultiByte(CP_ACP, 0, host, -1, NULL, 0, NULL, NULL)-1;
768
scheme_len = WideCharToMultiByte(CP_ACP, 0, scheme, -1, NULL, 0, NULL, NULL)-1;
770
len = host_len+scheme_len+sizeof(BYTE);
772
if(len+sizeof(DWORD) > *secid_len) {
774
SysFreeString(scheme);
775
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
778
WideCharToMultiByte(CP_ACP, 0, scheme, -1, (LPSTR)secid, len, NULL, NULL);
779
SysFreeString(scheme);
781
ptr = secid+scheme_len;
784
WideCharToMultiByte(CP_ACP, 0, host, -1, (LPSTR)ptr, host_len, NULL, NULL);
792
*secid_len = len+sizeof(DWORD);
797
static HRESULT get_security_id_for_url(LPCWSTR url, BYTE *secid, DWORD *secid_len)
800
DWORD zone = URLZONE_INVALID;
801
LPWSTR secur_url = NULL;
697
804
hres = map_url_to_zone(url, &zone, &secur_url);
699
806
return hres == 0x80041001 ? E_INVALIDARG : hres;
701
/* file protocol is a special case */
702
if(strlenW(secur_url) >= sizeof(wszFile)/sizeof(WCHAR)
703
&& !memcmp(secur_url, wszFile, sizeof(wszFile))) {
704
WCHAR path[MAX_PATH];
705
len = sizeof(path)/sizeof(WCHAR);
707
hres = CoInternetParseUrl(secur_url, PARSE_PATH_FROM_URL, 0, path, len, &len, 0);
708
if(hres == S_OK && !PathIsNetworkPathW(path)) {
709
static const BYTE secidFile[] = {'f','i','l','e',':'};
711
CoTaskMemFree(secur_url);
713
if(*secid_len < sizeof(secidFile)+sizeof(zone))
714
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
716
memcpy(secid, secidFile, sizeof(secidFile));
717
*(DWORD*)(secid+sizeof(secidFile)) = zone;
719
*secid_len = sizeof(secidFile)+sizeof(zone);
724
ptr = strchrW(secur_url, ':');
729
memmove(ptr, ptr2, (strlenW(ptr2)+1)*sizeof(WCHAR));
731
ptr = strchrW(ptr, '/');
735
len = WideCharToMultiByte(CP_ACP, 0, secur_url, -1, NULL, 0, NULL, NULL)-1;
737
if(len+sizeof(DWORD) > *secid_len) {
738
CoTaskMemFree(secur_url);
739
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
742
WideCharToMultiByte(CP_ACP, 0, secur_url, -1, (LPSTR)secid, len, NULL, NULL);
808
hres = CreateUri(secur_url, 0, 0, &uri);
743
809
CoTaskMemFree(secur_url);
745
*(DWORD*)(secid+len) = zone;
747
*secid_len = len+sizeof(DWORD);
813
hres = generate_security_id(uri, secid, secid_len, zone);
819
static HRESULT get_security_id_for_uri(IUri *uri, BYTE *secid, DWORD *secid_len)
823
DWORD zone = URLZONE_INVALID;
825
hres = map_uri_to_zone(uri, &zone, &secur_uri);
829
hres = generate_security_id(secur_uri, secid, secid_len, zone);
830
IUri_Release(secur_uri);
752
835
/***********************************************************************