You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
487 lines
13 KiB
487 lines
13 KiB
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
//
|
|
// aaaaConfig.cpp
|
|
//
|
|
// Abstract:
|
|
//
|
|
// Handlers for aaaa config commands
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
#include "stdafx.h"
|
|
|
|
#include "strdefs.h"
|
|
#include "rmstring.h"
|
|
#include "aaaamon.h"
|
|
#include "aaaaversion.h"
|
|
#include "aaaaconfig.h"
|
|
#include "utils.h"
|
|
#include "iasdefs.h"
|
|
#include "ias.h"
|
|
|
|
namespace
|
|
{
|
|
const wchar_t* const tokenArray[] =
|
|
{
|
|
{TOKEN_VERSION},
|
|
{TOKEN_CONFIG},
|
|
{TOKEN_SERVER_SETTINGS},
|
|
{TOKEN_CLIENTS},
|
|
{TOKEN_CONNECTION_REQUEST_POLICIES},
|
|
{TOKEN_LOGGING},
|
|
{TOKEN_REMOTE_ACCESS_POLICIES},
|
|
};
|
|
};
|
|
|
|
//
|
|
// NOTE since WIN32 errors are assumed to fall in the range -32k to 32k
|
|
// (see comment in winerror.h near HRESULT_FROM_WIN32 definition), we can
|
|
// re-create original Win32 error from low-order 16 bits of HRESULT.
|
|
//
|
|
#define WIN32_FROM_HRESULT(x) \
|
|
( (HRESULT_FACILITY(x) == FACILITY_WIN32) ? ((DWORD)((x) & 0x0000FFFF)) : (x) )
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Parses the Aaaa set config from the command line
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
AaaaConfigParseSetCommandLine(
|
|
IN PWCHAR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwCmdFlags
|
|
)
|
|
|
|
{
|
|
const WCHAR IAS_MDB[] = L"%SystemRoot%\\System32\\ias\\ias.mdb";
|
|
DWORD dwErr = NO_ERROR;
|
|
|
|
static TOKEN_VALUE rgEnumType[] =
|
|
{
|
|
{TOKEN_SERVER_SETTINGS, SERVER_SETTINGS},
|
|
{TOKEN_CLIENTS, CLIENTS},
|
|
{TOKEN_CONNECTION_REQUEST_POLICIES, CONNECTION_REQUEST_POLICIES},
|
|
{TOKEN_LOGGING, LOGGING},
|
|
{TOKEN_REMOTE_ACCESS_POLICIES, REMOTE_ACCESS_POLICIES},
|
|
};
|
|
|
|
static AAAAMON_CMD_ARG pArgs[] =
|
|
{
|
|
{
|
|
AAAAMONTR_CMD_TYPE_ENUM,
|
|
{TOKEN_TYPE, FALSE, FALSE},
|
|
rgEnumType,
|
|
sizeof(rgEnumType) / sizeof(*rgEnumType),
|
|
NULL
|
|
},
|
|
{
|
|
AAAAMONTR_CMD_TYPE_STRING,
|
|
// tag string, required or not, present or not
|
|
{TOKEN_BLOB, NS_REQ_PRESENT, FALSE}, //tag_type
|
|
NULL,
|
|
0,
|
|
NULL ,
|
|
},
|
|
};
|
|
|
|
wchar_t* blobString = 0;
|
|
do
|
|
{
|
|
// Parse
|
|
//
|
|
dwErr = RutlParse(
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
NULL,
|
|
pArgs,
|
|
sizeof(pArgs) / sizeof(*pArgs));
|
|
if ( dwErr != NO_ERROR )
|
|
{
|
|
break;
|
|
}
|
|
|
|
_ASSERT(pBlobString != 0);
|
|
|
|
blobString = AAAAMON_CMD_ARG_GetPsz(&pArgs[1]);
|
|
if (!blobString)
|
|
{
|
|
dwErr = ERROR_INVALID_SYNTAX;
|
|
break;
|
|
}
|
|
|
|
IAS_SHOW_TOKEN_LIST restoreType;
|
|
DWORD dwordType = (AAAAMON_CMD_ARG_GetDword(&pArgs[0]));
|
|
if (dwordType == -1)
|
|
{
|
|
// optional parameter not set
|
|
restoreType = CONFIG;
|
|
}
|
|
else
|
|
{
|
|
restoreType = (IAS_SHOW_TOKEN_LIST)dwordType;
|
|
}
|
|
|
|
// Config
|
|
//
|
|
if ( !pArgs[1].rgTag.bPresent )
|
|
{
|
|
// tag blob not found
|
|
DisplayMessage(g_hModule, MSG_AAAACONFIG_SET_FAIL);
|
|
dwErr = ERROR_INVALID_SYNTAX;
|
|
break;
|
|
}
|
|
|
|
// tag blob found
|
|
// Now try to restore the database from the script
|
|
|
|
HRESULT hres = IASRestoreConfig(blobString, restoreType);
|
|
if ( FAILED(hres) )
|
|
{
|
|
if (hres != IAS_E_LICENSE_VIOLATION)
|
|
{
|
|
DisplayMessage(g_hModule, MSG_AAAACONFIG_SET_FAIL);
|
|
dwErr = WIN32_FROM_HRESULT(hres);
|
|
}
|
|
else
|
|
{
|
|
DisplayMessage(g_hModule, MSG_AAAACONFIG_LICENSE_VIOLATION);
|
|
dwErr = NO_ERROR;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
// set config successfull: refresh the service
|
|
hres = RefreshIASService();
|
|
if ( FAILED(hres) )
|
|
{
|
|
///////////////////////////
|
|
// Refresh should not fail.
|
|
///////////////////////////
|
|
DisplayMessage(g_hModule, MSG_AAAACONFIG_SET_REFRESH_FAIL);
|
|
dwErr = NO_ERROR;
|
|
}
|
|
else
|
|
{
|
|
DisplayMessage(g_hModule, MSG_AAAACONFIG_SET_SUCCESS);
|
|
dwErr = NO_ERROR;
|
|
}
|
|
|
|
} while ( FALSE );
|
|
|
|
RutlFree(blobString);
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// Function Name:AaaConfigDumpConfig
|
|
//
|
|
// Parameters: none
|
|
//
|
|
// Description: writes the current config (header, content...) to the output
|
|
//
|
|
// Returns: NO_ERROR or ERROR_SUPPRESS_OUTPUT
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
DWORD AaaaConfigDumpConfig(IAS_SHOW_TOKEN_LIST showType)
|
|
{
|
|
const int MAX_SIZE_DISPLAY_LINE = 80;
|
|
const int SIZE_MAX_STRING = 512;
|
|
|
|
DisplayMessage(g_hModule, MSG_AAAACONFIG_SHOW_HEADER);
|
|
|
|
bool bCoInitialized = false;
|
|
do
|
|
{
|
|
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
|
if ( FAILED(hr) )
|
|
{
|
|
if ( hr != RPC_E_CHANGED_MODE )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bCoInitialized = true;
|
|
}
|
|
|
|
LONG lVersion;
|
|
hr = AaaaVersionGetVersion(&lVersion);
|
|
if ( FAILED(hr) )
|
|
{
|
|
DisplayMessage(g_hModule, MSG_AAAACONFIG_SHOW_FAIL);
|
|
break;
|
|
}
|
|
|
|
// Sanity check to make sure that the actual database is a Whistler DB
|
|
if ( lVersion != IAS_CURRENT_VERSION )
|
|
{
|
|
DisplayMessage(g_hModule, MSG_AAAACONFIG_SHOW_FAIL);
|
|
break;
|
|
}
|
|
|
|
wchar_t sDisplayString[SIZE_MAX_STRING] = L"";
|
|
// This will not create a buffer overrun
|
|
swprintf(
|
|
sDisplayString,
|
|
L"# IAS.MDB Version = %d\n",
|
|
lVersion
|
|
);
|
|
|
|
DisplayMessageT(sDisplayString);
|
|
|
|
ULONG ulSize;
|
|
wchar_t* pDumpString;
|
|
hr = IASDumpConfig(&pDumpString, &ulSize);
|
|
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
ULONG RelativePos = 0;
|
|
ULONG CurrentPos = 0;
|
|
wchar_t DisplayLine [MAX_SIZE_DISPLAY_LINE];
|
|
|
|
DisplayMessageT(MSG_AAAACONFIG_BLOBBEGIN_A);
|
|
switch (showType)
|
|
{
|
|
case SERVER_SETTINGS:
|
|
{
|
|
DisplayMessageT(MSG_AAAACONFIG_BLOBBEGIN_B);
|
|
DisplayMessageT(TOKEN_SERVER_SETTINGS);
|
|
break;
|
|
}
|
|
case CLIENTS:
|
|
{
|
|
DisplayMessageT(MSG_AAAACONFIG_BLOBBEGIN_B);
|
|
DisplayMessageT(TOKEN_CLIENTS);
|
|
break;
|
|
}
|
|
case CONNECTION_REQUEST_POLICIES:
|
|
{
|
|
DisplayMessageT(MSG_AAAACONFIG_BLOBBEGIN_B);
|
|
DisplayMessageT(TOKEN_CONNECTION_REQUEST_POLICIES);
|
|
break;
|
|
}
|
|
case LOGGING:
|
|
{
|
|
DisplayMessageT(MSG_AAAACONFIG_BLOBBEGIN_B);
|
|
DisplayMessageT(TOKEN_LOGGING);
|
|
break;
|
|
}
|
|
case REMOTE_ACCESS_POLICIES:
|
|
{
|
|
DisplayMessageT(MSG_AAAACONFIG_BLOBBEGIN_B);
|
|
DisplayMessageT(TOKEN_REMOTE_ACCESS_POLICIES);
|
|
break;
|
|
}
|
|
case CONFIG:
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
DisplayMessageT(MSG_AAAACONFIG_BLOBBEGIN_C);
|
|
while ( CurrentPos <= ulSize )
|
|
{
|
|
wchar_t TempChar = pDumpString[CurrentPos++];
|
|
DisplayLine[RelativePos++] = TempChar;
|
|
if ( TempChar == L'\r' )
|
|
{
|
|
DisplayLine[RelativePos] = L'\0';
|
|
DisplayMessageT(DisplayLine);
|
|
RelativePos = 0;
|
|
}
|
|
}
|
|
DisplayMessageT(L"*");
|
|
|
|
free(pDumpString); // was allocated by malloc
|
|
DisplayMessageT(MSG_AAAACONFIG_BLOBEND);
|
|
|
|
DisplayMessage(
|
|
g_hModule,
|
|
MSG_AAAACONFIG_SHOW_FOOTER
|
|
);
|
|
}
|
|
else
|
|
{
|
|
DisplayMessage(g_hModule, MSG_AAAACONFIG_SHOW_INVALID_SYNTAX);
|
|
DisplayMessage(g_hModule, HLP_AAAACONFIG_SHOW);
|
|
}
|
|
}
|
|
while (false);
|
|
|
|
if (bCoInitialized)
|
|
{
|
|
CoUninitialize();
|
|
}
|
|
|
|
return NO_ERROR;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Handles the aaaa config set command
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
HandleAaaaConfigSet(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
{
|
|
return AaaaConfigParseSetCommandLine(
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
dwFlags
|
|
);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Parses the Aaaa set config from the command line
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
AaaaConfigParseShowCommandLine(
|
|
IN PWCHAR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwCmdFlags
|
|
)
|
|
|
|
{
|
|
const size_t arraySize = sizeof(tokenArray)/sizeof(*tokenArray);
|
|
|
|
BOOL bFound = FALSE;
|
|
for (DWORD index = 0; index < arraySize; ++index)
|
|
{
|
|
if (MatchToken(ppwcArguments[dwCurrentIndex-1], tokenArray[index]))
|
|
{
|
|
bFound = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
const size_t SIZE_MAX_STRING = 512;
|
|
DWORD dwErr = NO_ERROR;
|
|
if (bFound == TRUE)
|
|
{
|
|
switch (index)
|
|
{
|
|
case VERSION:
|
|
{
|
|
LONG lVersion;
|
|
HRESULT hr = AaaaVersionGetVersion(&lVersion);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
wchar_t sDisplayString[SIZE_MAX_STRING];
|
|
// This will not create a buffer overrun
|
|
swprintf(
|
|
sDisplayString,
|
|
L"Version = %d\n",
|
|
lVersion
|
|
);
|
|
DisplayMessageT(sDisplayString);
|
|
}
|
|
else
|
|
{
|
|
DisplayMessage(g_hModule, MSG_AAAAVERSION_GET_FAIL);
|
|
dwErr = ERROR;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case CONFIG:
|
|
{
|
|
AaaaConfigDumpConfig(CONFIG);
|
|
break;
|
|
}
|
|
|
|
case SERVER_SETTINGS:
|
|
{
|
|
AaaaConfigDumpConfig(SERVER_SETTINGS);
|
|
break;
|
|
}
|
|
|
|
case CLIENTS:
|
|
{
|
|
AaaaConfigDumpConfig(CLIENTS);
|
|
break;
|
|
}
|
|
|
|
case CONNECTION_REQUEST_POLICIES:
|
|
{
|
|
AaaaConfigDumpConfig(CONNECTION_REQUEST_POLICIES);
|
|
break;
|
|
}
|
|
|
|
case LOGGING:
|
|
{
|
|
AaaaConfigDumpConfig(LOGGING);
|
|
break;
|
|
}
|
|
|
|
case REMOTE_ACCESS_POLICIES:
|
|
{
|
|
AaaaConfigDumpConfig(REMOTE_ACCESS_POLICIES);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
DisplayMessage(g_hModule, MSG_AAAACONFIG_SHOW_INVALID_SYNTAX);
|
|
}
|
|
}
|
|
}
|
|
return dwErr;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Handles the aaaa config show command
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
HandleAaaaConfigShow(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
{
|
|
if (dwCurrentIndex < dwArgCount)
|
|
{
|
|
DisplayMessage(g_hModule, MSG_AAAACONFIG_SHOW_FAIL);
|
|
DisplayMessage(g_hModule, HLP_AAAACONFIG_SHOW);
|
|
}
|
|
else
|
|
{
|
|
return AaaaConfigParseShowCommandLine(
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
dwFlags
|
|
);
|
|
}
|
|
|
|
return NO_ERROR;
|
|
}
|