From 47016df9b719a57477156794b97c2860ed63957d Mon Sep 17 00:00:00 2001 From: Reece Dunn Date: Sun, 28 Feb 2010 21:24:47 +0000 Subject: [PATCH] msxml3/tests: Improve the IObjectSecurity tests to cover msxml3 SP8+ behaviour. --- dlls/msxml3/domdoc.c | 5 +- dlls/msxml3/tests/domdoc.c | 123 ++++++++++++++++++++++++++++++------- 2 files changed, 105 insertions(+), 23 deletions(-) diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 41c1f417642..a29e9b2fb3e 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -2214,7 +2214,7 @@ static ULONG WINAPI xmldoc_Safety_Release(IObjectSafety *iface) return IXMLDocument_Release((IXMLDocument *)This); } -#define SAFETY_SUPPORTED_OPTIONS (INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA) +#define SAFETY_SUPPORTED_OPTIONS (INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_SECURITY_MANAGER) static HRESULT WINAPI xmldoc_Safety_GetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions) @@ -2238,6 +2238,9 @@ static HRESULT WINAPI xmldoc_Safety_SetInterfaceSafetyOptions(IObjectSafety *ifa domdoc *This = impl_from_IObjectSafety(iface); TRACE("(%p)->(%s %x %x)\n", This, debugstr_guid(riid), dwOptionSetMask, dwEnabledOptions); + if ((dwOptionSetMask & ~SAFETY_SUPPORTED_OPTIONS) != 0) + return E_FAIL; + This->safeopt = dwEnabledOptions & dwOptionSetMask & SAFETY_SUPPORTED_OPTIONS; return S_OK; } diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 929a35f7f17..5f06d93f381 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -5292,6 +5292,41 @@ static void test_put_nodeValue(void) IXMLDOMDocument_Release(doc); } +static void test_IObjectSafety_set(IObjectSafety *safety, HRESULT result, HRESULT result2, DWORD set, DWORD mask, DWORD expected, DWORD expected2) +{ + HRESULT hr; + DWORD enabled, supported; + + trace("testing IObjectSafety: enable=%08x, mask=%08x\n", set, mask); + + hr = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL, set, mask); + if (result == result2) + ok(hr == result, "SetInterfaceSafetyOptions: expected %08x, returned %08x\n", result, hr ); + else + ok(broken(hr == result) || hr == result2, + "SetInterfaceSafetyOptions: expected %08x, got %08x\n", result2, hr ); + + supported = enabled = 0xCAFECAFE; + hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled); + ok(hr == S_OK, "ret %08x\n", hr ); + if (expected == expected2) + ok(enabled == expected, "Expected %08x, got %08x\n", expected, enabled); + else + ok(broken(enabled == expected) || enabled == expected2, + "Expected %08x, got %08x\n", expected2, enabled); + + /* reset the safety options */ + + hr = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL, + INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_SECURITY_MANAGER, + 0); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(enabled == 0, "Expected 0, got %08x\n", enabled); +} + static void test_document_IObjectSafety(void) { IXMLDOMDocument *doc; @@ -5314,41 +5349,85 @@ static void test_document_IObjectSafety(void) hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled); ok(hr == S_OK, "ret %08x\n", hr ); - ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA), - "Expected (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA)," + ok(broken(supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA)) || + supported == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER) /* msxml3 SP8+ */, + "Expected (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER), " "got %08x\n", supported); ok(enabled == 0, "Expected 0, got %08x\n", enabled); - /* set */ - hr = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL, - INTERFACESAFE_FOR_UNTRUSTED_CALLER, - INTERFACESAFE_FOR_UNTRUSTED_CALLER); - ok(hr == S_OK, "ret %08x\n", hr ); - hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled); - ok(hr == S_OK, "ret %08x\n", hr ); - ok(enabled == INTERFACESAFE_FOR_UNTRUSTED_CALLER, - "Expected INTERFACESAFE_FOR_UNTRUSTED_CALLER, got %08x\n", enabled); - /* set unsupported */ - hr = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL, - INTERFACE_USES_SECURITY_MANAGER | - INTERFACESAFE_FOR_UNTRUSTED_CALLER, - INTERFACE_USES_SECURITY_MANAGER); - ok(hr == S_OK, "ret %08x\n", hr ); - hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled); - ok(hr == S_OK, "ret %08x\n", hr ); - ok(enabled == 0, "Expected 0, got %08x\n", enabled); + + /* set -- individual flags */ + + test_IObjectSafety_set(safety, S_OK, S_OK, + INTERFACESAFE_FOR_UNTRUSTED_CALLER, INTERFACESAFE_FOR_UNTRUSTED_CALLER, + INTERFACESAFE_FOR_UNTRUSTED_CALLER, INTERFACESAFE_FOR_UNTRUSTED_CALLER); + + test_IObjectSafety_set(safety, S_OK, S_OK, + INTERFACESAFE_FOR_UNTRUSTED_DATA, INTERFACESAFE_FOR_UNTRUSTED_DATA, + INTERFACESAFE_FOR_UNTRUSTED_DATA, INTERFACESAFE_FOR_UNTRUSTED_DATA); + + test_IObjectSafety_set(safety, S_OK, S_OK, + INTERFACE_USES_SECURITY_MANAGER, INTERFACE_USES_SECURITY_MANAGER, + 0, INTERFACE_USES_SECURITY_MANAGER /* msxml3 SP8+ */); + + /* set INTERFACE_USES_DISPEX */ + + test_IObjectSafety_set(safety, S_OK, E_FAIL /* msxml3 SP8+ */, + INTERFACE_USES_DISPEX, INTERFACE_USES_DISPEX, + 0, 0); + + test_IObjectSafety_set(safety, S_OK, E_FAIL /* msxml3 SP8+ */, + INTERFACE_USES_DISPEX, 0, + 0, 0); + + test_IObjectSafety_set(safety, S_OK, S_OK /* msxml3 SP8+ */, + 0, INTERFACE_USES_DISPEX, + 0, 0); + + /* set option masking */ + + test_IObjectSafety_set(safety, S_OK, S_OK, + INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA, + INTERFACESAFE_FOR_UNTRUSTED_CALLER, + INTERFACESAFE_FOR_UNTRUSTED_CALLER, + INTERFACESAFE_FOR_UNTRUSTED_CALLER); + + test_IObjectSafety_set(safety, S_OK, S_OK, + INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA, + INTERFACESAFE_FOR_UNTRUSTED_DATA, + INTERFACESAFE_FOR_UNTRUSTED_DATA, + INTERFACESAFE_FOR_UNTRUSTED_DATA); + + test_IObjectSafety_set(safety, S_OK, S_OK, + INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA, + INTERFACE_USES_SECURITY_MANAGER, + 0, + 0); + + /* set -- inheriting previous settings */ hr = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL, INTERFACESAFE_FOR_UNTRUSTED_CALLER, INTERFACESAFE_FOR_UNTRUSTED_CALLER); ok(hr == S_OK, "ret %08x\n", hr ); + hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled); + ok(hr == S_OK, "ret %08x\n", hr ); + todo_wine + ok(broken(enabled == INTERFACESAFE_FOR_UNTRUSTED_CALLER) || + enabled == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACE_USES_SECURITY_MANAGER) /* msxml3 SP8+ */, + "Expected (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACE_USES_SECURITY_MANAGER), " + "got %08x\n", enabled); + hr = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL, INTERFACESAFE_FOR_UNTRUSTED_DATA, INTERFACESAFE_FOR_UNTRUSTED_DATA); ok(hr == S_OK, "ret %08x\n", hr ); hr = IObjectSafety_GetInterfaceSafetyOptions(safety, NULL, &supported, &enabled); ok(hr == S_OK, "ret %08x\n", hr ); - ok(enabled == INTERFACESAFE_FOR_UNTRUSTED_DATA, - "Expected INTERFACESAFE_FOR_UNTRUSTED_DATA, got %08x\n", enabled); + todo_wine + ok(broken(enabled == INTERFACESAFE_FOR_UNTRUSTED_DATA) || + enabled == (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA) /* msxml3 SP8+ */, + "Expected (INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA), " + "got %08x\n", enabled); IObjectSafety_Release(safety);