Jacek Caban : mshtml: Check for CATID_SafeForScripting in GUID_CUSTOM_CONFIRMOBJECTSAFETY implementation if IObjectSafety is not available .

Alexandre Julliard julliard at winehq.org
Fri Nov 20 10:48:01 CST 2009


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Nov 20 00:00:41 2009 +0100

mshtml: Check for CATID_SafeForScripting in GUID_CUSTOM_CONFIRMOBJECTSAFETY implementation if IObjectSafety is not available.

---

 dlls/mshtml/htmldoc.c        |    2 +
 dlls/mshtml/mshtml_private.h |    2 +
 dlls/mshtml/secmgr.c         |   38 +++++++++++----
 dlls/mshtml/tests/script.c   |  104 +++++++++++++++++++++++++++++++++---------
 4 files changed, 114 insertions(+), 32 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 836f1ae..5dfc4db 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -1765,6 +1765,8 @@ static void HTMLDocumentNode_destructor(HTMLDOMNode *iface)
 
     if(This->nsevent_listener)
         release_nsevents(This);
+    if(This->catmgr)
+        ICatInformation_Release(This->catmgr);
     if(This->secmgr)
         IInternetSecurityManager_Release(This->secmgr);
 
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index cc04106..ce13b48 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -18,6 +18,7 @@
 
 #include "wingdi.h"
 #include "docobj.h"
+#include "comcat.h"
 #include "mshtml.h"
 #include "mshtmhst.h"
 #include "hlink.h"
@@ -503,6 +504,7 @@ struct HTMLDocumentNode {
     BOOL content_ready;
 
     IInternetSecurityManager *secmgr;
+    ICatInformation *catmgr;
     nsDocumentEventListener *nsevent_listener;
     BOOL *event_vector;
 
diff --git a/dlls/mshtml/secmgr.c b/dlls/mshtml/secmgr.c
index 8938943..e35a83b 100644
--- a/dlls/mshtml/secmgr.c
+++ b/dlls/mshtml/secmgr.c
@@ -84,7 +84,7 @@ static HRESULT WINAPI InternetHostSecurityManager_ProcessUrlAction(IInternetHost
             pContext, cbContext, dwFlags, dwReserved);
 }
 
-static DWORD confirm_safety(HTMLDocumentNode *This, const WCHAR *url, IUnknown *obj)
+static HRESULT confirm_safety(HTMLDocumentNode *This, const WCHAR *url, struct CONFIRMSAFETY *cs, DWORD *ret)
 {
     DWORD policy, enabled_opts, supported_opts;
     IObjectSafety *obj_safety;
@@ -94,12 +94,29 @@ static DWORD confirm_safety(HTMLDocumentNode *This, const WCHAR *url, IUnknown *
 
     hres = IInternetSecurityManager_ProcessUrlAction(This->secmgr, url, URLACTION_SCRIPT_SAFE_ACTIVEX,
             (BYTE*)&policy, sizeof(policy), NULL, 0, 0, 0);
-    if(FAILED(hres) || policy != URLPOLICY_ALLOW)
-        return URLPOLICY_DISALLOW;
+    if(FAILED(hres) || policy != URLPOLICY_ALLOW) {
+        *ret = URLPOLICY_DISALLOW;
+        return S_OK;
+    }
+
+    hres = IUnknown_QueryInterface(cs->pUnk, &IID_IObjectSafety, (void**)&obj_safety);
+    if(FAILED(hres)) {
+        CATID scripting_catid = CATID_SafeForScripting;
+
+        if(!This->catmgr) {
+            hres = CoCreateInstance(&CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER,
+                    &IID_ICatInformation, (void**)&This->catmgr);
+            if(FAILED(hres))
+                return hres;
+        }
+
+        hres = ICatInformation_IsClassOfCategories(This->catmgr, &cs->clsid, 1, &scripting_catid, 0, NULL);
+        if(FAILED(hres))
+            return hres;
 
-    hres = IUnknown_QueryInterface(obj, &IID_IObjectSafety, (void**)&obj_safety);
-    if(FAILED(hres))
-        return URLPOLICY_DISALLOW;
+        *ret = hres == S_OK ? URLPOLICY_ALLOW : URLPOLICY_DISALLOW;
+        return S_OK;
+    }
 
     hres = IObjectSafety_GetInterfaceSafetyOptions(obj_safety, &IID_IDispatchEx, &supported_opts, &enabled_opts);
     if(SUCCEEDED(hres)) {
@@ -109,10 +126,9 @@ static DWORD confirm_safety(HTMLDocumentNode *This, const WCHAR *url, IUnknown *
         hres = IObjectSafety_SetInterfaceSafetyOptions(obj_safety, &IID_IDispatchEx, enabled_opts, enabled_opts);
     }
     IObjectSafety_Release(obj_safety);
-    if(FAILED(hres))
-        return URLPOLICY_DISALLOW;
 
-    return URLPOLICY_ALLOW;
+    *ret = SUCCEEDED(hres) ? URLPOLICY_ALLOW : URLPOLICY_DISALLOW;
+    return S_OK;
 }
 
 static HRESULT WINAPI InternetHostSecurityManager_QueryCustomPolicy(IInternetHostSecurityManager *iface, REFGUID guidKey,
@@ -149,7 +165,9 @@ static HRESULT WINAPI InternetHostSecurityManager_QueryCustomPolicy(IInternetHos
             return E_FAIL;
         }
 
-        policy = confirm_safety(This, url, cs->pUnk);
+        hres = confirm_safety(This, url, cs, &policy);
+        if(FAILED(hres))
+            return hres;
 
         *ppPolicy = CoTaskMemAlloc(sizeof(policy));
         if(!*ppPolicy)
diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c
index 8daa9bc..c5cc72f 100644
--- a/dlls/mshtml/tests/script.c
+++ b/dlls/mshtml/tests/script.c
@@ -121,6 +121,7 @@ DEFINE_EXPECT(AXGetInterfaceSafetyOptions);
 DEFINE_EXPECT(AXSetInterfaceSafetyOptions);
 
 #define TESTSCRIPT_CLSID "{178fc163-f585-4e24-9c13-4bb7faf80746}"
+#define TESTACTIVEX_CLSID "{178fc163-f585-4e24-9c13-4bb7faf80646}"
 
 #define DISPID_SCRIPT_TESTPROP   0x100000
 
@@ -133,6 +134,7 @@ static IHTMLDocument2 *notif_doc;
 static IDispatchEx *window_dispex;
 static BOOL doc_complete;
 static IDispatch *script_disp;
+static BOOL ax_objsafe;
 
 static const char *debugstr_guid(REFIID riid)
 {
@@ -165,6 +167,28 @@ static BSTR a2bstr(const char *str)
     return ret;
 }
 
+static BOOL init_key(const char *key_name, const char *def_value, BOOL init)
+{
+    HKEY hkey;
+    DWORD res;
+
+    if(!init) {
+        RegDeleteKey(HKEY_CLASSES_ROOT, key_name);
+        return TRUE;
+    }
+
+    res = RegCreateKeyA(HKEY_CLASSES_ROOT, key_name, &hkey);
+    if(res != ERROR_SUCCESS)
+        return FALSE;
+
+    if(def_value)
+        res = RegSetValueA(hkey, NULL, REG_SZ, def_value, strlen(def_value));
+
+    RegCloseKey(hkey);
+
+    return res == ERROR_SUCCESS;
+}
+
 static HRESULT WINAPI PropertyNotifySink_QueryInterface(IPropertyNotifySink *iface,
         REFIID riid, void**ppv)
 {
@@ -599,6 +623,8 @@ static HRESULT WINAPI AXObjectSafety_QueryInterface(IObjectSafety *iface, REFIID
 
     if(IsEqualGUID(&IID_IObjectSafety, riid)) {
         CHECK_EXPECT(AXQueryInterface_IObjectSafety);
+        if(!ax_objsafe)
+            return E_NOINTERFACE;
         *ppv = iface;
         return S_OK;
     }
@@ -647,6 +673,12 @@ static const IObjectSafetyVtbl AXObjectSafetyVtbl = {
 
 static IObjectSafety AXObjectSafety = { &AXObjectSafetyVtbl };
 
+static BOOL set_safe_reg(BOOL init)
+{
+    return init_key("CLSID\\"TESTACTIVEX_CLSID"\\Implemented Categories\\{7dd95801-9882-11cf-9fa9-00aa006c42c4}",
+                    NULL, init);
+}
+
 static void test_security(void)
 {
     IInternetHostSecurityManager *sec_mgr;
@@ -673,6 +705,7 @@ static void test_security(void)
     cs.pUnk = (IUnknown*)&AXObjectSafety;
     cs.dwFlags = 0;
 
+    ax_objsafe = TRUE;
     SET_EXPECT(AXQueryInterface_IActiveScript);
     SET_EXPECT(AXQueryInterface_IObjectSafety);
     SET_EXPECT(AXGetInterfaceSafetyOptions);
@@ -689,6 +722,55 @@ static void test_security(void)
     ok(*(DWORD*)ppolicy == URLPOLICY_ALLOW, "policy = %x\n", *(DWORD*)ppolicy);
     CoTaskMemFree(ppolicy);
 
+    ax_objsafe = FALSE;
+    SET_EXPECT(AXQueryInterface_IActiveScript);
+    SET_EXPECT(AXQueryInterface_IObjectSafety);
+    hres = IInternetHostSecurityManager_QueryCustomPolicy(sec_mgr, &GUID_CUSTOM_CONFIRMOBJECTSAFETY,
+            &ppolicy, &policy_size, (BYTE*)&cs, sizeof(cs), 0);
+    CHECK_CALLED(AXQueryInterface_IActiveScript);
+    CHECK_CALLED(AXQueryInterface_IObjectSafety);
+
+    ok(hres == S_OK, "QueryCusromPolicy failed: %08x\n", hres);
+    ok(policy_size == sizeof(DWORD), "policy_size = %d\n", policy_size);
+    ok(*(DWORD*)ppolicy == URLPOLICY_DISALLOW, "policy = %x\n", *(DWORD*)ppolicy);
+    CoTaskMemFree(ppolicy);
+
+    if(set_safe_reg(TRUE)) {
+        ax_objsafe = FALSE;
+        SET_EXPECT(AXQueryInterface_IActiveScript);
+        SET_EXPECT(AXQueryInterface_IObjectSafety);
+        hres = IInternetHostSecurityManager_QueryCustomPolicy(sec_mgr, &GUID_CUSTOM_CONFIRMOBJECTSAFETY,
+                 &ppolicy, &policy_size, (BYTE*)&cs, sizeof(cs), 0);
+        CHECK_CALLED(AXQueryInterface_IActiveScript);
+        CHECK_CALLED(AXQueryInterface_IObjectSafety);
+
+        ok(hres == S_OK, "QueryCusromPolicy failed: %08x\n", hres);
+        ok(policy_size == sizeof(DWORD), "policy_size = %d\n", policy_size);
+        ok(*(DWORD*)ppolicy == URLPOLICY_ALLOW, "policy = %x\n", *(DWORD*)ppolicy);
+        CoTaskMemFree(ppolicy);
+
+        ax_objsafe = TRUE;
+        SET_EXPECT(AXQueryInterface_IActiveScript);
+        SET_EXPECT(AXQueryInterface_IObjectSafety);
+        SET_EXPECT(AXGetInterfaceSafetyOptions);
+        SET_EXPECT(AXSetInterfaceSafetyOptions);
+        hres = IInternetHostSecurityManager_QueryCustomPolicy(sec_mgr, &GUID_CUSTOM_CONFIRMOBJECTSAFETY,
+                &ppolicy, &policy_size, (BYTE*)&cs, sizeof(cs), 0);
+        CHECK_CALLED(AXQueryInterface_IActiveScript);
+        CHECK_CALLED(AXQueryInterface_IObjectSafety);
+        CHECK_CALLED(AXGetInterfaceSafetyOptions);
+        CHECK_CALLED(AXSetInterfaceSafetyOptions);
+
+        ok(hres == S_OK, "QueryCusromPolicy failed: %08x\n", hres);
+        ok(policy_size == sizeof(DWORD), "policy_size = %d\n", policy_size);
+        ok(*(DWORD*)ppolicy == URLPOLICY_ALLOW, "policy = %x\n", *(DWORD*)ppolicy);
+        CoTaskMemFree(ppolicy);
+
+        set_safe_reg(FALSE);
+    }else {
+        skip("Could not set safety registry\n");
+    }
+
     IInternetHostSecurityManager_Release(sec_mgr);
 }
 
@@ -1510,28 +1592,6 @@ static void test_simple_script(void)
     CHECK_CALLED(Close);
 }
 
-static BOOL init_key(const char *key_name, const char *def_value, BOOL init)
-{
-    HKEY hkey;
-    DWORD res;
-
-    if(!init) {
-        RegDeleteKey(HKEY_CLASSES_ROOT, key_name);
-        return TRUE;
-    }
-
-    res = RegCreateKeyA(HKEY_CLASSES_ROOT, key_name, &hkey);
-    if(res != ERROR_SUCCESS)
-        return FALSE;
-
-    if(def_value)
-        res = RegSetValueA(hkey, NULL, REG_SZ, def_value, strlen(def_value));
-
-    RegCloseKey(hkey);
-
-    return res == ERROR_SUCCESS;
-}
-
 static BOOL init_registry(BOOL init)
 {
     return init_key("TestScript\\CLSID", TESTSCRIPT_CLSID, init)




More information about the wine-cvs mailing list