/* * Internet Security and Zone Manager * * Copyright (c) 2004 Huw D M Davies * Copyright 2004 Jacek Caban * * 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 #define COBJMACROS #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); /*********************************************************************** * InternetSecurityManager implementation * */ typedef struct SecManagerImpl{ const IInternetSecurityManagerVtbl* lpvtbl1; /* VTable relative to the IInternetSecurityManager interface.*/ ULONG ref; /* reference counter for this object */ } SecManagerImpl; 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 */ IInternetSecurityManager_AddRef(iface); return S_OK; } static ULONG WINAPI SecManagerImpl_AddRef(IInternetSecurityManager* iface) { SecManagerImpl *This = (SecManagerImpl *)iface; ULONG refCount = InterlockedIncrement(&This->ref); TRACE("(%p)->(ref before=%lu)\n",This, refCount - 1); return refCount; } static ULONG WINAPI SecManagerImpl_Release(IInternetSecurityManager* iface) { SecManagerImpl *This = (SecManagerImpl *)iface; ULONG refCount = InterlockedDecrement(&This->ref); TRACE("(%p)->(ref before=%lu)\n",This, refCount + 1); /* destroy the object if there's no more reference on it */ if (!refCount){ HeapFree(GetProcessHeap(),0,This); URLMON_UnlockModule(); } return refCount; } 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; } static const 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 }; 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; URLMON_LockModule(); return S_OK; } /*********************************************************************** * InternetZoneManager implementation * */ typedef struct { const IInternetZoneManagerVtbl* lpVtbl; ULONG ref; } ZoneMgrImpl; /******************************************************************** * IInternetZoneManager_QueryInterface */ static HRESULT WINAPI ZoneMgrImpl_QueryInterface(IInternetZoneManager* iface, REFIID riid, void** ppvObject) { ZoneMgrImpl* This = (ZoneMgrImpl*)iface; TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppvObject); if(!This || !ppvObject) return E_INVALIDARG; if(!IsEqualIID(&IID_IUnknown, riid) && !IsEqualIID(&IID_IInternetZoneManager, riid)) { FIXME("Unknown interface: %s\n", debugstr_guid(riid)); *ppvObject = NULL; return E_NOINTERFACE; } *ppvObject = iface; IInternetZoneManager_AddRef(iface); return S_OK; } /******************************************************************** * IInternetZoneManager_AddRef */ static ULONG WINAPI ZoneMgrImpl_AddRef(IInternetZoneManager* iface) { ZoneMgrImpl* This = (ZoneMgrImpl*)iface; ULONG refCount = InterlockedIncrement(&This->ref); TRACE("(%p)->(ref before=%lu)\n",This, refCount - 1); return refCount; } /******************************************************************** * IInternetZoneManager_Release */ static ULONG WINAPI ZoneMgrImpl_Release(IInternetZoneManager* iface) { ZoneMgrImpl* This = (ZoneMgrImpl*)iface; ULONG refCount = InterlockedDecrement(&This->ref); TRACE("(%p)->(ref before=%lu)\n",This, refCount + 1); if(!refCount) { HeapFree(GetProcessHeap(), 0, This); URLMON_UnlockModule(); } return refCount; } /******************************************************************** * IInternetZoneManager_GetZoneAttributes */ static HRESULT WINAPI ZoneMgrImpl_GetZoneAttributes(IInternetZoneManager* iface, DWORD dwZone, ZONEATTRIBUTES* pZoneAttributes) { FIXME("(%p)->(%ld %p) stub\n", iface, dwZone, pZoneAttributes); return E_NOTIMPL; } /******************************************************************** * IInternetZoneManager_SetZoneAttributes */ static HRESULT WINAPI ZoneMgrImpl_SetZoneAttributes(IInternetZoneManager* iface, DWORD dwZone, ZONEATTRIBUTES* pZoneAttributes) { FIXME("(%p)->(%08lx %p) stub\n", iface, dwZone, pZoneAttributes); return E_NOTIMPL; } /******************************************************************** * IInternetZoneManager_GetZoneCustomPolicy */ static HRESULT WINAPI ZoneMgrImpl_GetZoneCustomPolicy(IInternetZoneManager* iface, DWORD dwZone, REFGUID guidKey, BYTE** ppPolicy, DWORD* pcbPolicy, URLZONEREG ulrZoneReg) { FIXME("(%p)->(%08lx %s %p %p %08x) stub\n", iface, dwZone, debugstr_guid(guidKey), ppPolicy, pcbPolicy, ulrZoneReg); return E_NOTIMPL; } /******************************************************************** * IInternetZoneManager_SetZoneCustomPolicy */ static HRESULT WINAPI ZoneMgrImpl_SetZoneCustomPolicy(IInternetZoneManager* iface, DWORD dwZone, REFGUID guidKey, BYTE* ppPolicy, DWORD cbPolicy, URLZONEREG ulrZoneReg) { FIXME("(%p)->(%08lx %s %p %08lx %08x) stub\n", iface, dwZone, debugstr_guid(guidKey), ppPolicy, cbPolicy, ulrZoneReg); return E_NOTIMPL; } /******************************************************************** * IInternetZoneManager_GetZoneActionPolicy */ static HRESULT WINAPI ZoneMgrImpl_GetZoneActionPolicy(IInternetZoneManager* iface, DWORD dwZone, DWORD dwAction, BYTE* pPolicy, DWORD cbPolicy, URLZONEREG urlZoneReg) { FIXME("(%p)->(%08lx %08lx %p %08lx %08x) stub\n", iface, dwZone, dwAction, pPolicy, cbPolicy, urlZoneReg); return E_NOTIMPL; } /******************************************************************** * IInternetZoneManager_SetZoneActionPolicy */ static HRESULT WINAPI ZoneMgrImpl_SetZoneActionPolicy(IInternetZoneManager* iface, DWORD dwZone, DWORD dwAction, BYTE* pPolicy, DWORD cbPolicy, URLZONEREG urlZoneReg) { FIXME("(%p)->(%08lx %08lx %p %08lx %08x) stub\n", iface, dwZone, dwAction, pPolicy, cbPolicy, urlZoneReg); return E_NOTIMPL; } /******************************************************************** * IInternetZoneManager_PromptAction */ static HRESULT WINAPI ZoneMgrImpl_PromptAction(IInternetZoneManager* iface, DWORD dwAction, HWND hwndParent, LPCWSTR pwszUrl, LPCWSTR pwszText, DWORD dwPromptFlags) { FIXME("%p %08lx %p %s %s %08lx\n", iface, dwAction, hwndParent, debugstr_w(pwszUrl), debugstr_w(pwszText), dwPromptFlags ); return E_NOTIMPL; } /******************************************************************** * IInternetZoneManager_LogAction */ static HRESULT WINAPI ZoneMgrImpl_LogAction(IInternetZoneManager* iface, DWORD dwAction, LPCWSTR pwszUrl, LPCWSTR pwszText, DWORD dwLogFlags) { FIXME("(%p)->(%08lx %s %s %08lx) stub\n", iface, dwAction, debugstr_w(pwszUrl), debugstr_w(pwszText), dwLogFlags); return E_NOTIMPL; } /******************************************************************** * IInternetZoneManager_CreateZoneEnumerator */ static HRESULT WINAPI ZoneMgrImpl_CreateZoneEnumerator(IInternetZoneManager* iface, DWORD* pdwEnum, DWORD* pdwCount, DWORD dwFlags) { FIXME("(%p)->(%p %p %08lx) stub\n", iface, pdwEnum, pdwCount, dwFlags); return E_NOTIMPL; } /******************************************************************** * IInternetZoneManager_GetZoneAt */ static HRESULT WINAPI ZoneMgrImpl_GetZoneAt(IInternetZoneManager* iface, DWORD dwEnum, DWORD dwIndex, DWORD* pdwZone) { FIXME("(%p)->(%08lx %08lx %p) stub\n", iface, dwEnum, dwIndex, pdwZone); return E_NOTIMPL; } /******************************************************************** * IInternetZoneManager_DestroyZoneEnumerator */ static HRESULT WINAPI ZoneMgrImpl_DestroyZoneEnumerator(IInternetZoneManager* iface, DWORD dwEnum) { FIXME("(%p)->(%08lx) stub\n", iface, dwEnum); return E_NOTIMPL; } /******************************************************************** * IInternetZoneManager_CopyTemplatePoliciesToZone */ static HRESULT WINAPI ZoneMgrImpl_CopyTemplatePoliciesToZone(IInternetZoneManager* iface, DWORD dwTemplate, DWORD dwZone, DWORD dwReserved) { FIXME("(%p)->(%08lx %08lx %08lx) stub\n", iface, dwTemplate, dwZone, dwReserved); return E_NOTIMPL; } /******************************************************************** * IInternetZoneManager_Construct */ static const IInternetZoneManagerVtbl ZoneMgrImplVtbl = { ZoneMgrImpl_QueryInterface, ZoneMgrImpl_AddRef, ZoneMgrImpl_Release, ZoneMgrImpl_GetZoneAttributes, ZoneMgrImpl_SetZoneAttributes, ZoneMgrImpl_GetZoneCustomPolicy, ZoneMgrImpl_SetZoneCustomPolicy, ZoneMgrImpl_GetZoneActionPolicy, ZoneMgrImpl_SetZoneActionPolicy, ZoneMgrImpl_PromptAction, ZoneMgrImpl_LogAction, ZoneMgrImpl_CreateZoneEnumerator, ZoneMgrImpl_GetZoneAt, ZoneMgrImpl_DestroyZoneEnumerator, ZoneMgrImpl_CopyTemplatePoliciesToZone, }; HRESULT ZoneMgrImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) { ZoneMgrImpl* ret = HeapAlloc(GetProcessHeap(), 0, sizeof(ZoneMgrImpl)); TRACE("(%p %p)\n", pUnkOuter, ppobj); ret->lpVtbl = &ZoneMgrImplVtbl; ret->ref = 1; *ppobj = (IInternetZoneManager*)ret; URLMON_LockModule(); return S_OK; } /*********************************************************************** * 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); } /******************************************************************** * CoInternetCreateZoneManager (URLMON.@) */ HRESULT WINAPI CoInternetCreateZoneManager(IServiceProvider* pSP, IInternetZoneManager** ppZM, DWORD dwReserved) { TRACE("(%p %p %lx)\n", pSP, ppZM, dwReserved); return ZoneMgrImpl_Construct(NULL, (void**)ppZM); }