Jacek Caban : urlmon: Fixed URLZONEREG_DEFAULT handling in GetZoneActionPolicy.

Alexandre Julliard julliard at winehq.org
Fri Mar 14 08:29:33 CDT 2008


Module: wine
Branch: master
Commit: dfb1089a45f17c596fdcf86ebcda8acfced6259b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=dfb1089a45f17c596fdcf86ebcda8acfced6259b

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Mar 14 12:41:50 2008 +0100

urlmon: Fixed URLZONEREG_DEFAULT handling in GetZoneActionPolicy.

---

 dlls/urlmon/sec_mgr.c |  144 ++++++++++++++++++++++++++-----------------------
 1 files changed, 76 insertions(+), 68 deletions(-)

diff --git a/dlls/urlmon/sec_mgr.c b/dlls/urlmon/sec_mgr.c
index 027bec8..efba140 100644
--- a/dlls/urlmon/sec_mgr.c
+++ b/dlls/urlmon/sec_mgr.c
@@ -143,6 +143,80 @@ static HRESULT map_url_to_zone(LPCWSTR url, DWORD *zone, LPWSTR *ret_url)
     return hres;
 }
 
+static HRESULT open_zone_key(HKEY parent_key, DWORD zone, HKEY *hkey)
+{
+    static const WCHAR wszZonesKey[] =
+        {'S','o','f','t','w','a','r','e','\\',
+         'M','i','c','r','o','s','o','f','t','\\',
+         'W','i','n','d','o','w','s','\\',
+         'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+         'I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s','\\',
+         'Z','o','n','e','s','\\',0};
+    static const WCHAR wszFormat[] = {'%','s','%','l','d',0};
+
+    WCHAR key_name[sizeof(wszZonesKey)/sizeof(WCHAR)+8];
+    DWORD res;
+
+    wsprintfW(key_name, wszFormat, wszZonesKey, zone);
+
+    res = RegOpenKeyW(parent_key, key_name, hkey);
+
+    if(res != ERROR_SUCCESS) {
+        WARN("RegOpenKey failed\n");
+        return E_INVALIDARG;
+    }
+
+    return S_OK;
+}
+
+static HRESULT get_action_policy(DWORD zone, DWORD action, BYTE *policy, DWORD size, URLZONEREG zone_reg)
+{
+    HKEY parent_key;
+    HKEY hkey;
+    LONG res;
+    HRESULT hres;
+
+    switch(zone_reg) {
+    case URLZONEREG_DEFAULT:
+    case URLZONEREG_HKCU:
+        parent_key = HKEY_CURRENT_USER;
+        break;
+    case URLZONEREG_HKLM:
+        parent_key = HKEY_LOCAL_MACHINE;
+        break;
+    default:
+        WARN("Unknown URLZONEREG: %d\n", zone_reg);
+        return E_FAIL;
+    };
+
+    hres = open_zone_key(parent_key, zone, &hkey);
+    if(SUCCEEDED(hres)) {
+        WCHAR action_str[16];
+        DWORD len = size;
+
+        static const WCHAR formatW[] = {'%','X',0};
+
+        wsprintfW(action_str, formatW, action);
+
+        res = RegQueryValueExW(hkey, action_str, NULL, NULL, policy, &len);
+        if(res == ERROR_MORE_DATA) {
+            hres = E_INVALIDARG;
+        }else if(res == ERROR_FILE_NOT_FOUND) {
+            hres = E_FAIL;
+        }else if(res != ERROR_SUCCESS) {
+            ERR("RegQueryValue failed: %d\n", res);
+            hres = E_UNEXPECTED;
+        }
+
+        RegCloseKey(hkey);
+    }
+
+    if(FAILED(hres) && zone_reg == URLZONEREG_DEFAULT)
+        return get_action_policy(zone, action, policy, size, URLZONEREG_HKLM);
+
+    return hres;
+}
+
 /***********************************************************************
  *           InternetSecurityManager implementation
  *
@@ -330,7 +404,7 @@ static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManager *ifa
         return hres == 0x80041001 ? E_INVALIDARG : hres;
 
     /* file protocol is a special case */
-    if(strlenW(pwszUrl) >= sizeof(wszFile)/sizeof(WCHAR)
+    if(strlenW(url) >= sizeof(wszFile)/sizeof(WCHAR)
             && !memcmp(url, wszFile, sizeof(wszFile)) && strchrW(url, '\\')) {
 
         static const BYTE secidFile[] = {'f','i','l','e',':'};
@@ -506,46 +580,6 @@ typedef struct {
     LONG ref;
 } ZoneMgrImpl;
 
-static HRESULT open_zone_key(DWORD zone, HKEY *hkey, URLZONEREG zone_reg)
-{
-    static const WCHAR wszZonesKey[] =
-        {'S','o','f','t','w','a','r','e','\\',
-            'M','i','c','r','o','s','o','f','t','\\',
-            'W','i','n','d','o','w','s','\\',
-            'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
-            'I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s','\\',
-            'Z','o','n','e','s','\\',0};
-    static const WCHAR wszFormat[] = {'%','s','%','l','d',0};
-
-    WCHAR key_name[sizeof(wszZonesKey)/sizeof(WCHAR)+8];
-    HKEY parent_key;
-    DWORD res;
-
-    switch(zone_reg) {
-    case URLZONEREG_DEFAULT: /* FIXME: TEST */
-    case URLZONEREG_HKCU:
-        parent_key = HKEY_CURRENT_USER;
-        break;
-    case URLZONEREG_HKLM:
-        parent_key = HKEY_LOCAL_MACHINE;
-        break;
-    default:
-        WARN("Unknown URLZONEREG: %d\n", zone_reg);
-        return E_FAIL;
-    };
-
-    wsprintfW(key_name, wszFormat, wszZonesKey, zone);
-
-    res = RegOpenKeyW(parent_key, key_name, hkey);
-
-    if(res != ERROR_SUCCESS) {
-        WARN("RegOpenKey failed\n");
-        return E_INVALIDARG;
-    }
-
-    return S_OK;
-}
-
 /********************************************************************
  *      IInternetZoneManager_QueryInterface
  */
@@ -659,39 +693,13 @@ static HRESULT WINAPI ZoneMgrImpl_SetZoneCustomPolicy(IInternetZoneManager* ifac
 static HRESULT WINAPI ZoneMgrImpl_GetZoneActionPolicy(IInternetZoneManager* iface,
         DWORD dwZone, DWORD dwAction, BYTE* pPolicy, DWORD cbPolicy, URLZONEREG urlZoneReg)
 {
-    WCHAR action[16];
-    HKEY hkey;
-    LONG res;
-    DWORD size = cbPolicy;
-    HRESULT hres;
-
-    static const WCHAR wszFormat[] = {'%','l','X',0};
-
     TRACE("(%p)->(%d %08x %p %d %d)\n", iface, dwZone, dwAction, pPolicy,
             cbPolicy, urlZoneReg);
 
     if(!pPolicy)
         return E_INVALIDARG;
 
-    hres = open_zone_key(dwZone, &hkey, urlZoneReg);
-    if(FAILED(hres))
-        return hres;
-
-    wsprintfW(action, wszFormat, dwAction);
-
-    res = RegQueryValueExW(hkey, action, NULL, NULL, pPolicy, &size);
-    if(res == ERROR_MORE_DATA) {
-        hres = E_INVALIDARG;
-    }else if(res == ERROR_FILE_NOT_FOUND) {
-        hres = E_FAIL;
-    }else if(res != ERROR_SUCCESS) {
-        ERR("RegQueryValue failed: %d\n", res);
-        hres = E_UNEXPECTED;
-    }
-
-    RegCloseKey(hkey);
-
-    return hres;
+    return get_action_policy(dwZone, dwAction, pPolicy, cbPolicy, urlZoneReg);
 }
 
 /********************************************************************




More information about the wine-cvs mailing list