Signed-off-by: Hans Leidekker hans@codeweavers.com --- dlls/webservices/tests/Makefile.in | 2 +- dlls/webservices/tests/channel.c | 142 +++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+), 1 deletion(-)
diff --git a/dlls/webservices/tests/Makefile.in b/dlls/webservices/tests/Makefile.in index a7c93a7f5f..63e24e66db 100644 --- a/dlls/webservices/tests/Makefile.in +++ b/dlls/webservices/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = webservices.dll -IMPORTS = webservices user32 rpcrt4 ws2_32 +IMPORTS = webservices oleaut32 ole32 user32 rpcrt4 ws2_32 advapi32
C_SRCS = \ channel.c \ diff --git a/dlls/webservices/tests/channel.c b/dlls/webservices/tests/channel.c index 206f76def1..32820fed1f 100644 --- a/dlls/webservices/tests/channel.c +++ b/dlls/webservices/tests/channel.c @@ -17,8 +17,11 @@ */
#include <stdio.h> +#define COBJMACROS #include "windows.h" #include "webservices.h" +#include "initguid.h" +#include "netfw.h" #include "wine/test.h"
static void test_WsCreateChannel(void) @@ -814,10 +817,147 @@ static HANDLE start_listener( struct listener_info *info ) return thread; }
+enum firewall_op +{ + APP_ADD, + APP_REMOVE +}; + +static BOOL is_process_elevated(void) +{ + HANDLE token; + if (OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &token )) + { + TOKEN_ELEVATION_TYPE type; + DWORD size; + BOOL ret; + + ret = GetTokenInformation( token, TokenElevationType, &type, sizeof(type), &size ); + CloseHandle( token ); + return (ret && type == TokenElevationTypeFull); + } + return FALSE; +} + +static BOOL is_firewall_enabled(void) +{ + HRESULT hr, init; + INetFwMgr *mgr = NULL; + INetFwPolicy *policy = NULL; + INetFwProfile *profile = NULL; + VARIANT_BOOL enabled = VARIANT_FALSE; + + init = CoInitializeEx( 0, COINIT_APARTMENTTHREADED ); + + hr = CoCreateInstance( &CLSID_NetFwMgr, NULL, CLSCTX_INPROC_SERVER, &IID_INetFwMgr, + (void **)&mgr ); + ok( hr == S_OK, "got %08x\n", hr ); + if (hr != S_OK) goto done; + + hr = INetFwMgr_get_LocalPolicy( mgr, &policy ); + ok( hr == S_OK, "got %08x\n", hr ); + if (hr != S_OK) goto done; + + hr = INetFwPolicy_get_CurrentProfile( policy, &profile ); + if (hr != S_OK) goto done; + + hr = INetFwProfile_get_FirewallEnabled( profile, &enabled ); + ok( hr == S_OK, "got %08x\n", hr ); + +done: + if (policy) INetFwPolicy_Release( policy ); + if (profile) INetFwProfile_Release( profile ); + if (mgr) INetFwMgr_Release( mgr ); + if (SUCCEEDED( init )) CoUninitialize(); + return (enabled == VARIANT_TRUE); +} + +static HRESULT set_firewall( enum firewall_op op ) +{ + static const WCHAR testW[] = {'w','e','b','s','e','r','v','i','c','e','s','_','t','e','s','t',0}; + HRESULT hr, init; + INetFwMgr *mgr = NULL; + INetFwPolicy *policy = NULL; + INetFwProfile *profile = NULL; + INetFwAuthorizedApplication *app = NULL; + INetFwAuthorizedApplications *apps = NULL; + BSTR name, image = SysAllocStringLen( NULL, MAX_PATH ); + + if (!GetModuleFileNameW( NULL, image, MAX_PATH )) + { + SysFreeString( image ); + return E_FAIL; + } + init = CoInitializeEx( 0, COINIT_APARTMENTTHREADED ); + + hr = CoCreateInstance( &CLSID_NetFwMgr, NULL, CLSCTX_INPROC_SERVER, &IID_INetFwMgr, + (void **)&mgr ); + ok( hr == S_OK, "got %08x\n", hr ); + if (hr != S_OK) goto done; + + hr = INetFwMgr_get_LocalPolicy( mgr, &policy ); + ok( hr == S_OK, "got %08x\n", hr ); + if (hr != S_OK) goto done; + + hr = INetFwPolicy_get_CurrentProfile( policy, &profile ); + if (hr != S_OK) goto done; + + hr = INetFwProfile_get_AuthorizedApplications( profile, &apps ); + ok( hr == S_OK, "got %08x\n", hr ); + if (hr != S_OK) goto done; + + hr = CoCreateInstance( &CLSID_NetFwAuthorizedApplication, NULL, CLSCTX_INPROC_SERVER, + &IID_INetFwAuthorizedApplication, (void **)&app ); + ok( hr == S_OK, "got %08x\n", hr ); + if (hr != S_OK) goto done; + + hr = INetFwAuthorizedApplication_put_ProcessImageFileName( app, image ); + if (hr != S_OK) goto done; + + name = SysAllocString( testW ); + hr = INetFwAuthorizedApplication_put_Name( app, name ); + SysFreeString( name ); + ok( hr == S_OK, "got %08x\n", hr ); + if (hr != S_OK) goto done; + + if (op == APP_ADD) + hr = INetFwAuthorizedApplications_Add( apps, app ); + else if (op == APP_REMOVE) + hr = INetFwAuthorizedApplications_Remove( apps, image ); + else + hr = E_INVALIDARG; + +done: + if (app) INetFwAuthorizedApplication_Release( app ); + if (apps) INetFwAuthorizedApplications_Release( apps ); + if (policy) INetFwPolicy_Release( policy ); + if (profile) INetFwProfile_Release( profile ); + if (mgr) INetFwMgr_Release( mgr ); + if (SUCCEEDED( init )) CoUninitialize(); + SysFreeString( image ); + return hr; +} + START_TEST(channel) { + BOOL firewall_enabled = is_firewall_enabled(); struct listener_info info; HANDLE thread; + HRESULT hr; + + if (firewall_enabled) + { + if (!is_process_elevated()) + { + skip( "no privileges, skipping tests to avoid firewall dialog\n" ); + return; + } + if ((hr = set_firewall( APP_ADD )) != S_OK) + { + skip( "can't authorize app in firewall %08x\n", hr ); + return; + } + }
test_WsCreateChannel(); test_WsOpenChannel(); @@ -859,4 +999,6 @@ START_TEST(channel) thread = start_listener( &info ); test_WsAcceptChannel( &info ); WaitForSingleObject( thread, 3000 ); + + if (firewall_enabled) set_firewall( APP_REMOVE ); }