From 076b5b706f23779d38fd18dbfeb322523cb835d2 Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Tue, 28 Sep 2004 19:18:52 +0000 Subject: [PATCH] Stub implementation of IInternetSecurityManager. Add a classfactory. Fix calling convention of CoInternetCreateSecurityManager. --- dlls/urlmon/Makefile.in | 1 + dlls/urlmon/sec_mgr.c | 250 ++++++++++++++++++++++++++++++++++++++++++++++ dlls/urlmon/umon.c | 12 --- dlls/urlmon/urlmon_main.c | 150 ++++++++++++++++++++++++++-- dlls/urlmon/urlmon_main.h | 2 + include/urlmon.idl | 96 ++++++++++++++++++ 6 files changed, 492 insertions(+), 19 deletions(-) create mode 100644 dlls/urlmon/sec_mgr.c diff --git a/dlls/urlmon/Makefile.in b/dlls/urlmon/Makefile.in index 45ee964031f..f74e05680aa 100644 --- a/dlls/urlmon/Makefile.in +++ b/dlls/urlmon/Makefile.in @@ -8,6 +8,7 @@ EXTRALIBS = -luuid C_SRCS = \ regsvr.c \ + sec_mgr.c \ umon.c \ urlmon_main.c diff --git a/dlls/urlmon/sec_mgr.c b/dlls/urlmon/sec_mgr.c new file mode 100644 index 00000000000..b95f6bea089 --- /dev/null +++ b/dlls/urlmon/sec_mgr.c @@ -0,0 +1,250 @@ +/* + * Internet Security Manager + * + * Copyright (c) 2004 Huw D M Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "wine/debug.h" +#include "ole2.h" +#include "wine/unicode.h" +#include "urlmon.h" +#include "urlmon_main.h" + +WINE_DEFAULT_DEBUG_CHANNEL(urlmon); + +typedef struct SecManagerImpl{ + + IInternetSecurityManagerVtbl* lpvtbl1; /* VTable relative to the IInternetSecurityManager interface.*/ + + ULONG ref; /* reference counter for this object */ + +} SecManagerImpl; + +/* IUnknown prototype functions */ +static HRESULT WINAPI SecManagerImpl_QueryInterface(IInternetSecurityManager* iface,REFIID riid,void** ppvObject); +static ULONG WINAPI SecManagerImpl_AddRef(IInternetSecurityManager* iface); +static ULONG WINAPI SecManagerImpl_Release(IInternetSecurityManager* iface); + +static HRESULT WINAPI SecManagerImpl_SetSecuritySite(IInternetSecurityManager *iface, + IInternetSecurityMgrSite *pSite); +static HRESULT WINAPI SecManagerImpl_GetSecuritySite(IInternetSecurityManager *iface, + IInternetSecurityMgrSite **ppSite); +static HRESULT WINAPI SecManagerImpl_MapUrlToZone(IInternetSecurityManager *iface, + LPCWSTR pwszUrl, DWORD *pdwZone, + DWORD dwFlags); +static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManager *iface, + LPCWSTR pwszUrl, + BYTE *pbSecurityId, DWORD *pcbSecurityId, + DWORD dwReserved); +static HRESULT WINAPI SecManagerImpl_ProcessUrlAction(IInternetSecurityManager *iface, + LPCWSTR pwszUrl, DWORD dwAction, + BYTE *pPolicy, DWORD cbPolicy, + BYTE *pContext, DWORD cbContext, + DWORD dwFlags, DWORD dwReserved); +static HRESULT WINAPI SecManagerImpl_QueryCustomPolicy(IInternetSecurityManager *iface, + LPCWSTR pwszUrl, REFGUID guidKey, + BYTE **ppPolicy, DWORD *pcbPolicy, + BYTE *pContext, DWORD cbContext, + DWORD dwReserved); +static HRESULT WINAPI SecManagerImpl_SetZoneMapping(IInternetSecurityManager *iface, + DWORD dwZone, LPCWSTR pwszPattern, DWORD dwFlags); +static HRESULT WINAPI SecManagerImpl_GetZoneMappings(IInternetSecurityManager *iface, + DWORD dwZone, IEnumString **ppenumString, DWORD dwFlags); + +static HRESULT SecManagerImpl_Destroy(SecManagerImpl* This); +HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); + +static IInternetSecurityManagerVtbl VT_SecManagerImpl = +{ + SecManagerImpl_QueryInterface, + SecManagerImpl_AddRef, + SecManagerImpl_Release, + SecManagerImpl_SetSecuritySite, + SecManagerImpl_GetSecuritySite, + SecManagerImpl_MapUrlToZone, + SecManagerImpl_GetSecurityId, + SecManagerImpl_ProcessUrlAction, + SecManagerImpl_QueryCustomPolicy, + SecManagerImpl_SetZoneMapping, + SecManagerImpl_GetZoneMappings +}; + +static HRESULT WINAPI SecManagerImpl_QueryInterface(IInternetSecurityManager* iface,REFIID riid,void** ppvObject) +{ + SecManagerImpl *This = (SecManagerImpl *)iface; + + TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppvObject); + + /* Perform a sanity check on the parameters.*/ + if ( (This==0) || (ppvObject==0) ) + return E_INVALIDARG; + + /* Initialize the return parameter */ + *ppvObject = 0; + + /* Compare the riid with the interface IDs implemented by this object.*/ + if (IsEqualIID(&IID_IUnknown, riid) || + IsEqualIID(&IID_IInternetSecurityManager, riid)) + *ppvObject = iface; + + /* Check that we obtained an interface.*/ + if ((*ppvObject)==0) + return E_NOINTERFACE; + + /* Query Interface always increases the reference count by one when it is successful */ + SecManagerImpl_AddRef(iface); + + return S_OK; +} + +static ULONG WINAPI SecManagerImpl_AddRef(IInternetSecurityManager* iface) +{ + SecManagerImpl *This = (SecManagerImpl *)iface; + + TRACE("(%p)\n",This); + + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI SecManagerImpl_Release(IInternetSecurityManager* iface) +{ + SecManagerImpl *This = (SecManagerImpl *)iface; + ULONG ref; + TRACE("(%p)\n",This); + + ref = InterlockedDecrement(&This->ref); + + /* destroy the object if there's no more reference on it */ + if (ref==0){ + + SecManagerImpl_Destroy(This); + + return 0; + } + return ref; +} + +static HRESULT SecManagerImpl_Destroy(SecManagerImpl* This) +{ + TRACE("(%p)\n",This); + + HeapFree(GetProcessHeap(),0,This); + + return S_OK; +} + +HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) +{ + SecManagerImpl *This; + + TRACE("(%p,%p)\n",pUnkOuter,ppobj); + This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This)); + + /* Initialize the virtual function table. */ + This->lpvtbl1 = &VT_SecManagerImpl; + This->ref = 1; + + *ppobj = This; + return S_OK; +} + +static HRESULT WINAPI SecManagerImpl_SetSecuritySite(IInternetSecurityManager *iface, + IInternetSecurityMgrSite *pSite) +{ + FIXME("(%p)->(%p)\n", iface, pSite); + return E_NOTIMPL; +} + +static HRESULT WINAPI SecManagerImpl_GetSecuritySite(IInternetSecurityManager *iface, + IInternetSecurityMgrSite **ppSite) +{ + FIXME("(%p)->( %p)\n", iface, ppSite); + return E_NOTIMPL; +} + +static HRESULT WINAPI SecManagerImpl_MapUrlToZone(IInternetSecurityManager *iface, + LPCWSTR pwszUrl, DWORD *pdwZone, + DWORD dwFlags) +{ + FIXME("(%p)->(%s %p %08lx)\n", iface, debugstr_w(pwszUrl), pdwZone, dwFlags); + return E_NOTIMPL; +} + +static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManager *iface, + LPCWSTR pwszUrl, + BYTE *pbSecurityId, DWORD *pcbSecurityId, + DWORD dwReserved) +{ + FIXME("(%p)->(%s %p %p %08lx)\n", iface, debugstr_w(pwszUrl), pbSecurityId, pcbSecurityId, + dwReserved); + return E_NOTIMPL; +} + + +static HRESULT WINAPI SecManagerImpl_ProcessUrlAction(IInternetSecurityManager *iface, + LPCWSTR pwszUrl, DWORD dwAction, + BYTE *pPolicy, DWORD cbPolicy, + BYTE *pContext, DWORD cbContext, + DWORD dwFlags, DWORD dwReserved) +{ + FIXME("(%p)->(%s %08lx %p %08lx %p %08lx %08lx %08lx)\n", iface, debugstr_w(pwszUrl), dwAction, + pPolicy, cbPolicy, pContext, cbContext, dwFlags, dwReserved); + return E_NOTIMPL; +} + + +static HRESULT WINAPI SecManagerImpl_QueryCustomPolicy(IInternetSecurityManager *iface, + LPCWSTR pwszUrl, REFGUID guidKey, + BYTE **ppPolicy, DWORD *pcbPolicy, + BYTE *pContext, DWORD cbContext, + DWORD dwReserved) +{ + FIXME("(%p)->(%s %s %p %p %p %08lx %08lx )\n", iface, debugstr_w(pwszUrl), debugstr_guid(guidKey), + ppPolicy, pcbPolicy, pContext, cbContext, dwReserved); + return E_NOTIMPL; +} + +static HRESULT WINAPI SecManagerImpl_SetZoneMapping(IInternetSecurityManager *iface, + DWORD dwZone, LPCWSTR pwszPattern, DWORD dwFlags) +{ + FIXME("(%p)->(%08lx %s %08lx)\n", iface, dwZone, debugstr_w(pwszPattern),dwFlags); + return E_NOTIMPL; +} + +static HRESULT WINAPI SecManagerImpl_GetZoneMappings(IInternetSecurityManager *iface, + DWORD dwZone, IEnumString **ppenumString, DWORD dwFlags) +{ + FIXME("(%p)->(%08lx %p %08lx)\n", iface, dwZone, ppenumString,dwFlags); + return E_NOTIMPL; +} + +/*********************************************************************** + * CoInternetCreateSecurityManager (URLMON.@) + * + */ +HRESULT WINAPI CoInternetCreateSecurityManager( IServiceProvider *pSP, + IInternetSecurityManager **ppSM, DWORD dwReserved ) +{ + TRACE("%p %p %ld\n", pSP, ppSM, dwReserved ); + return SecManagerImpl_Construct(NULL, (void**) ppSM); +} diff --git a/dlls/urlmon/umon.c b/dlls/urlmon/umon.c index f1db1e10064..6a2bf20dbd2 100644 --- a/dlls/urlmon/umon.c +++ b/dlls/urlmon/umon.c @@ -1061,18 +1061,6 @@ HRESULT WINAPI CoInternetQueryInfo(LPCWSTR pwzUrl, QUERYOPTION QueryOption, return S_OK; } -/*********************************************************************** - * CoInternetCreateSecurityManager (URLMON.@) - * - */ -typedef void *IInternetSecurityManager; -HRESULT CoInternetCreateSecurityManager( IServiceProvider *pSP, - IInternetSecurityManager **ppSM, DWORD dwReserved ) -{ - FIXME("%p %ld\n", pSP, dwReserved ); - return E_NOTIMPL; -} - static BOOL URLMON_IsBinary(LPVOID pBuffer, DWORD cbSize) { unsigned int i, binarycount = 0; diff --git a/dlls/urlmon/urlmon_main.c b/dlls/urlmon/urlmon_main.c index 146f239409c..cc87f240b68 100644 --- a/dlls/urlmon/urlmon_main.c +++ b/dlls/urlmon/urlmon_main.c @@ -29,6 +29,8 @@ #include "wine/debug.h" +#include "winuser.h" +#include "urlmon.h" #include "urlmon_main.h" WINE_DEFAULT_DEBUG_CHANNEL(urlmon); @@ -77,18 +79,152 @@ HRESULT WINAPI URLMON_DllCanUnloadNow(void) return S_FALSE; } -/*********************************************************************** - * DllGetClassObject (URLMON.@) + + +/****************************************************************************** + * Urlmon ClassFactory + */ +typedef struct { + IClassFactory ITF_IClassFactory; + + DWORD ref; + HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj); +} IClassFactoryImpl; + +struct object_creation_info +{ + const CLSID *clsid; + HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj); +}; + +static const struct object_creation_info object_creation[] = +{ + { &CLSID_InternetSecurityManager, &SecManagerImpl_Construct } +}; + +static HRESULT WINAPI +CF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) +{ + IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + + if (IsEqualGUID(riid, &IID_IUnknown) + || IsEqualGUID(riid, &IID_IClassFactory)) + { + IClassFactory_AddRef(iface); + *ppobj = This; + return S_OK; + } + + WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj); + return E_NOINTERFACE; +} + +static ULONG WINAPI CF_AddRef(LPCLASSFACTORY iface) +{ + IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI CF_Release(LPCLASSFACTORY iface) +{ + IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + + ULONG ref = InterlockedDecrement(&This->ref); + + if (ref == 0) + HeapFree(GetProcessHeap(), 0, This); + + return ref; +} + + +static HRESULT WINAPI CF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, + REFIID riid, LPVOID *ppobj) +{ + IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + HRESULT hres; + LPUNKNOWN punk; + + TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj); + + *ppobj = NULL; + if(SUCCEEDED(hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk))) { + hres = IUnknown_QueryInterface(punk, riid, ppobj); + IUnknown_Release(punk); + } + return hres; +} + +static HRESULT WINAPI CF_LockServer(LPCLASSFACTORY iface,BOOL dolock) +{ + IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + FIXME("(%p)->(%d),stub!\n",This,dolock); + return S_OK; +} + +static IClassFactoryVtbl CF_Vtbl = +{ + CF_QueryInterface, + CF_AddRef, + CF_Release, + CF_CreateInstance, + CF_LockServer +}; + +/******************************************************************************* + * DllGetClassObject [URLMON.@] + * Retrieves class object from a DLL object + * + * NOTES + * Docs say returns STDAPI + * + * PARAMS + * rclsid [I] CLSID for the class object + * riid [I] Reference to identifier of interface for class object + * ppv [O] Address of variable to receive interface pointer for riid + * + * RETURNS + * Success: S_OK + * Failure: CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, E_INVALIDARG, + * E_UNEXPECTED */ -HRESULT WINAPI URLMON_DllGetClassObject(REFCLSID rclsid, REFIID riid, - LPVOID *ppv) + +DWORD WINAPI URLMON_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) { - FIXME("(%p, %p, %p): stub\n", debugstr_guid(rclsid), - debugstr_guid(riid), ppv); + int i; + IClassFactoryImpl *factory; + + TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); + + if ( !IsEqualGUID( &IID_IClassFactory, riid ) + && ! IsEqualGUID( &IID_IUnknown, riid) ) + return E_NOINTERFACE; + + for (i=0; i < sizeof(object_creation)/sizeof(object_creation[0]); i++) + { + if (IsEqualGUID(object_creation[i].clsid, rclsid)) + break; + } - return CLASS_E_CLASSNOTAVAILABLE; + if (i == sizeof(object_creation)/sizeof(object_creation[0])) + { + FIXME("%s: no class found.\n", debugstr_guid(rclsid)); + return CLASS_E_CLASSNOTAVAILABLE; + } + + factory = HeapAlloc(GetProcessHeap(), 0, sizeof(*factory)); + if (factory == NULL) return E_OUTOFMEMORY; + + factory->ITF_IClassFactory.lpVtbl = &CF_Vtbl; + factory->ref = 1; + + factory->pfnCreateInstance = object_creation[i].pfnCreateInstance; + + *ppv = &(factory->ITF_IClassFactory); + return S_OK; } + /*********************************************************************** * DllRegisterServerEx (URLMON.@) */ diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index 141e8ac2fde..9b00cd8dc77 100644 --- a/dlls/urlmon/urlmon_main.h +++ b/dlls/urlmon/urlmon_main.h @@ -25,6 +25,8 @@ #include "winbase.h" extern HINSTANCE URLMON_hInstance; +extern HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); + #define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field)) diff --git a/include/urlmon.idl b/include/urlmon.idl index 80dc89f83d5..25e0e1435fe 100644 --- a/include/urlmon.idl +++ b/include/urlmon.idl @@ -563,6 +563,102 @@ interface IInternetSession : IUnknown [in] DWORD dwReserved); } +/***************************************************************************** + * IInternetSecurityMgrSite interface + */ +[ + local, + object, + uuid(79eac9ed-baf9-11ce-8c82-00aa004ba90b), + pointer_default(unique) +] +interface IInternetSecurityMgrSite : IUnknown +{ + HRESULT GetWindow( + [out] HWND *phwnd); + + HRESULT EnableModeless( + [in] BOOL fEnable); +}; + + +/***************************************************************************** + * IInternetSecurityManager interface + */ +cpp_quote("#define SID_SInternetSecurityManager IID_IInternetSecurityManager") + +[ + object, + uuid(79eac9ee-baf9-11ce-8c82-00aa004ba90b), + pointer_default(unique) +] +interface IInternetSecurityManager : IUnknown +{ + HRESULT SetSecuritySite( + [in, unique] IInternetSecurityMgrSite *pSite); + + HRESULT GetSecuritySite( + [out] IInternetSecurityMgrSite **ppSite); + + HRESULT MapUrlToZone( + [in] LPCWSTR pwszUrl, + [out] DWORD *pdwZone, + [in] DWORD dwFlags); + +cpp_quote("#define MAX_SIZE_SECURITY_ID 512") + + HRESULT GetSecurityId( + [in] LPCWSTR pwszUrl, + [out, size_is(*pcbSecurityId)] BYTE *pbSecurityId, + [in, out] DWORD *pcbSecurityId, + [in] DWORD dwReserved); + + + typedef enum { + PUAF_DEFAULT = 0x00, + PUAF_NOUI = 0x01, + PUAF_ISFILE = 0x02, + PUAF_WARN_IF_DENIED = 0x04, + PUAF_FORCEUI_FOREGROUND = 0x08, + PUAF_CHECK_TIPS = 0x10 + } PUAF; + + HRESULT ProcessUrlAction( + [in] LPCWSTR pwszUrl, + [in] DWORD dwAction, + [out, size_is(cbPolicy)] BYTE *pPolicy, + [in] DWORD cbPolicy, + [in] BYTE *pContext, + [in] DWORD cbContext, + [in] DWORD dwFlags, + [in] DWORD dwReserved); + + HRESULT QueryCustomPolicy( + [in] LPCWSTR pwszUrl, + [in] REFGUID guidKey, + [out, size_is(*pcbPolicy)] BYTE **ppPolicy, + [out] DWORD *pcbPolicy, + [in] BYTE *pContext, + [in] DWORD cbContext, + [in] DWORD dwReserved); + + typedef enum { + SZM_CREATE = 0x0, + SZM_DELETE = 0x1 + } SZM_FLAGS; + + HRESULT SetZoneMapping( + [in] DWORD dwZone, + [in] LPCWSTR lpszPattern, + [in] DWORD dwFlags); + + HRESULT GetZoneMappings( + [in] DWORD dwZone, + [out] IEnumString **ppenumString, + [in] DWORD dwFlags); +}; +cpp_quote("DEFINE_GUID(CLSID_InternetSecurityManager, 0x7b8a2d94, 0x0ac9, 0x11d1, 0x89, 0x6c, 0x00, 0xc0, 0x4f, 0xB6, 0xbf, 0xc4);") + cpp_quote("DEFINE_GUID(IID_IAsyncMoniker, 0x79EAC9D3, 0xBAF9, 0x11CE, 0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B);") cpp_quote("DEFINE_GUID(CLSID_StdURLMoniker, 0x79EAC9E0, 0xBAF9, 0x11CE, 0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B);") -- 2.11.4.GIT