static IUnknown *create_activex_object(script_ctx_t *ctx, const WCHAR *progid)
{
- IInternetHostSecurityManager *secmgr;
+ IInternetHostSecurityManager *secmgr = NULL;
IObjectWithSite *obj_site;
struct CONFIRMSAFETY cs;
IClassFactoryEx *cfex;
TRACE("GUID %s\n", debugstr_guid(&guid));
- secmgr = get_sec_mgr(ctx);
- if(!secmgr)
- return NULL;
+ if(ctx->safeopt & INTERFACE_USES_SECURITY_MANAGER) {
+ secmgr = get_sec_mgr(ctx);
+ if(!secmgr)
+ return NULL;
- policy = 0;
- hres = IInternetHostSecurityManager_ProcessUrlAction(secmgr, URLACTION_ACTIVEX_RUN, (BYTE*)&policy, sizeof(policy),
- (BYTE*)&guid, sizeof(GUID), 0, 0);
- if(FAILED(hres) || policy != URLPOLICY_ALLOW)
- return NULL;
+ policy = 0;
+ hres = IInternetHostSecurityManager_ProcessUrlAction(secmgr, URLACTION_ACTIVEX_RUN,
+ (BYTE*)&policy, sizeof(policy), (BYTE*)&guid, sizeof(GUID), 0, 0);
+ if(FAILED(hres) || policy != URLPOLICY_ALLOW)
+ return NULL;
+ }
hres = CoGetClassObject(&guid, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, NULL, &IID_IClassFactory, (void**)&cf);
if(FAILED(hres))
if(FAILED(hres))
return NULL;
- cs.clsid = guid;
- cs.pUnk = obj;
- cs.dwFlags = 0;
- hres = IInternetHostSecurityManager_QueryCustomPolicy(secmgr, &GUID_CUSTOM_CONFIRMOBJECTSAFETY, &bpolicy, &policy_size,
- (BYTE*)&cs, sizeof(cs), 0);
- if(SUCCEEDED(hres)) {
- policy = policy_size >= sizeof(DWORD) ? *(DWORD*)bpolicy : URLPOLICY_DISALLOW;
- CoTaskMemFree(bpolicy);
- }
+ if(secmgr) {
+ cs.clsid = guid;
+ cs.pUnk = obj;
+ cs.dwFlags = 0;
+ hres = IInternetHostSecurityManager_QueryCustomPolicy(secmgr, &GUID_CUSTOM_CONFIRMOBJECTSAFETY,
+ &bpolicy, &policy_size, (BYTE*)&cs, sizeof(cs), 0);
+ if(SUCCEEDED(hres)) {
+ policy = policy_size >= sizeof(DWORD) ? *(DWORD*)bpolicy : URLPOLICY_DISALLOW;
+ CoTaskMemFree(bpolicy);
+ }
- if(FAILED(hres) || policy != URLPOLICY_ALLOW) {
- IUnknown_Release(obj);
- return NULL;
+ if(FAILED(hres) || policy != URLPOLICY_ALLOW) {
+ IUnknown_Release(obj);
+ return NULL;
+ }
}
hres = IUnknown_QueryInterface(obj, &IID_IObjectWithSite, (void**)&obj_site);
return E_NOTIMPL;
}
- if(ctx->safeopt != (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER)) {
+ if(ctx->safeopt != (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER)
+ && ctx->safeopt != INTERFACE_USES_DISPEX) {
FIXME("Unsupported safeopt %x\n", ctx->safeopt);
return E_NOTIMPL;
}
}else if(IsEqualGUID(&IID_IObjectWithSite, riid)) {
CHECK_EXPECT(QI_IObjectWithSite);
*ppv = object_with_site;
- }else {
- return E_NOINTERFACE;
+ }else if(IsEqualGUID(&IID_IObjectSafety, riid)) {
+ ok(0, "Unexpected IID_IObjectSafety query\n");
}
return *ppv ? S_OK : E_NOINTERFACE;
static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
-static void set_safety_options(IUnknown *unk)
+static void set_safety_options(IUnknown *unk, BOOL use_sec_mgr)
{
IObjectSafety *safety;
- DWORD supported, enabled;
+ DWORD supported, enabled, options_all, options_set;
HRESULT hres;
hres = IUnknown_QueryInterface(unk, &IID_IObjectSafety, (void**)&safety);
if(FAILED(hres))
return;
- hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
- INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER,
- INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER);
+ options_all = INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER;
+ if(use_sec_mgr)
+ options_set = options_all;
+ else
+ options_set = INTERFACE_USES_DISPEX;
+
+ hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, options_all, options_set);
ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
supported = enabled = 0xdeadbeef;
hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
- ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
- "supported=%x\n", supported);
- ok(enabled == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
- "enabled=%x\n", enabled);
+ ok(supported == options_all, "supported=%x, expected %x\n", supported, options_all);
+ ok(enabled == options_set, "enabled=%x, expected %x\n", enabled, options_set);
IObjectSafety_Release(safety);
}
ok_(__FILE__,line)(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
}
-static IActiveScriptParse *create_script(BOOL skip_tests)
+static IActiveScriptParse *create_script(BOOL skip_tests, BOOL use_sec_mgr)
{
IActiveScriptParse *parser;
IActiveScript *script;
return NULL;
if(!skip_tests)
- set_safety_options((IUnknown*)script);
+ set_safety_options((IUnknown*)script, use_sec_mgr);
hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parser);
ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
IActiveScriptParse *parser;
IDispatchEx *proc;
- parser = create_script(FALSE);
+ parser = create_script(FALSE, TRUE);
SET_EXPECT(Host_QS_SecMgr);
SET_EXPECT(ProcessUrlAction);
IDispatchEx_Release(proc);
IUnknown_Release(parser);
- parser = create_script(FALSE);
+ parser = create_script(FALSE, TRUE);
proc = parse_procedure_a(parser, "(new ActiveXObject('Wine.Test')).reportSuccess();");
SET_EXPECT(Host_QS_SecMgr);
IDispatchEx_Release(proc);
IUnknown_Release(parser);
- parser = create_script(FALSE);
+ parser = create_script(FALSE, TRUE);
QS_SecMgr_hres = E_NOINTERFACE;
SET_EXPECT(Host_QS_SecMgr);
IUnknown_Release(parser);
- parser = create_script(FALSE);
+ parser = create_script(FALSE, TRUE);
ProcessUrlAction_hres = E_FAIL;
SET_EXPECT(Host_QS_SecMgr);
IUnknown_Release(parser);
- parser = create_script(FALSE);
+ parser = create_script(FALSE, TRUE);
ProcessUrlAction_policy = URLPOLICY_DISALLOW;
SET_EXPECT(Host_QS_SecMgr);
IUnknown_Release(parser);
- parser = create_script(FALSE);
+ parser = create_script(FALSE, TRUE);
CreateInstance_hres = E_FAIL;
SET_EXPECT(Host_QS_SecMgr);
IUnknown_Release(parser);
- parser = create_script(FALSE);
+ parser = create_script(FALSE, TRUE);
QueryCustomPolicy_hres = E_FAIL;
SET_EXPECT(Host_QS_SecMgr);
IUnknown_Release(parser);
- parser = create_script(FALSE);
+ parser = create_script(FALSE, TRUE);
QueryCustomPolicy_psize = 6;
SET_EXPECT(Host_QS_SecMgr);
IUnknown_Release(parser);
- parser = create_script(FALSE);
+ parser = create_script(FALSE, TRUE);
QueryCustomPolicy_policy = URLPOLICY_DISALLOW;
SET_EXPECT(Host_QS_SecMgr);
IUnknown_Release(parser);
- parser = create_script(FALSE);
+ parser = create_script(FALSE, FALSE);
+
+ SET_EXPECT(CreateInstance);
+ SET_EXPECT(QI_IObjectWithSite);
+ SET_EXPECT(reportSuccess);
+ parse_script_a(parser, "(new ActiveXObject('Wine.Test')).reportSuccess();");
+ CHECK_CALLED(CreateInstance);
+ CHECK_CALLED(QI_IObjectWithSite);
+ CHECK_CALLED(reportSuccess);
+
+ IUnknown_Release(parser);
+
+ parser = create_script(FALSE, TRUE);
object_with_site = &ObjectWithSite;
SET_EXPECT(Host_QS_SecMgr);
BSTR str;
HRESULT hres;
- parser = create_script(TRUE);
+ parser = create_script(TRUE, TRUE);
if(!parser)
return FALSE;