|
|
/*
File: rasaaaa.h The 'remoteaccess aaaa' sub context
3/2/99 */
#include "precomp.h"
#include "rasaaaa.h"
#include <winsock2.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
// The guid for this context
//
GUID g_RasAaaaGuid = RASAAAA_GUID; static PWCHAR g_pszServer = NULL; static DWORD g_dwBuild = 0;
// Stolen from snapin code
//
#define CCHRADIUSSERVER 13
#define PSZRADIUSSERVER L"RADIUSServer."
// The commands supported in this context
//
CMD_ENTRY g_RasAaaaAddCmdTable[] = { CREATE_CMD_ENTRY(RASAAAA_ADD_AUTHSERV, RasAaaaHandleAddAuthServ), CREATE_CMD_ENTRY(RASAAAA_ADD_ACCTSERV, RasAaaaHandleAddAcctServ), };
CMD_ENTRY g_RasAaaaDelCmdTable[] = { CREATE_CMD_ENTRY(RASAAAA_DEL_AUTHSERV, RasAaaaHandleDelAuthServ), CREATE_CMD_ENTRY(RASAAAA_DEL_ACCTSERV, RasAaaaHandleDelAcctServ), };
CMD_ENTRY g_RasAaaaSetCmdTable[] = { CREATE_CMD_ENTRY(RASAAAA_SET_AUTH, RasAaaaHandleSetAuth), CREATE_CMD_ENTRY(RASAAAA_SET_ACCT, RasAaaaHandleSetAcct), CREATE_CMD_ENTRY(RASAAAA_SET_AUTHSERV, RasAaaaHandleSetAuthServ), CREATE_CMD_ENTRY(RASAAAA_SET_ACCTSERV, RasAaaaHandleSetAcctServ), };
CMD_ENTRY g_RasAaaaShowCmdTable[] = { CREATE_CMD_ENTRY(RASAAAA_SHOW_AUTH, RasAaaaHandleShowAuth), CREATE_CMD_ENTRY(RASAAAA_SHOW_ACCT, RasAaaaHandleShowAcct), CREATE_CMD_ENTRY(RASAAAA_SHOW_AUTHSERV, RasAaaaHandleShowAuthServ), CREATE_CMD_ENTRY(RASAAAA_SHOW_ACCTSERV, RasAaaaHandleShowAcctServ), };
CMD_GROUP_ENTRY g_RasAaaaCmdGroups[] = { CREATE_CMD_GROUP_ENTRY(GROUP_SET, g_RasAaaaSetCmdTable), CREATE_CMD_GROUP_ENTRY(GROUP_SHOW, g_RasAaaaShowCmdTable), CREATE_CMD_GROUP_ENTRY(GROUP_ADD, g_RasAaaaAddCmdTable), CREATE_CMD_GROUP_ENTRY(GROUP_DEL, g_RasAaaaDelCmdTable), };
ULONG g_ulRasAaaaNumGroups = sizeof(g_RasAaaaCmdGroups)/sizeof(CMD_GROUP_ENTRY);
//
// Registry strings
//
WCHAR pszRegKeyAuth[] = L"SYSTEM\\CurrentControlSet\\Services\\RemoteAccess\\Authentication\\Providers"; WCHAR pszRegKeyAcct[] = L"SYSTEM\\CurrentControlSet\\Services\\RemoteAccess\\Accounting\\Providers";
WCHAR pszGuidWinAuth[] = L"{1AA7F841-C7F5-11D0-A376-00C04FC9DA04}"; WCHAR pszGuidRadAuth[] = L"{1AA7F83F-C7F5-11D0-A376-00C04FC9DA04}";
WCHAR pszGuidWinAcct[] = L"{1AA7F846-C7F5-11D0-A376-00C04FC9DA04}"; WCHAR pszGuidRadAcct[] = L"{1AA7F840-C7F5-11D0-A376-00C04FC9DA04}";
WCHAR pszRegValActiveProvider[] = L"ActiveProvider"; WCHAR pszRegKeyServers[] = L"Servers";
WCHAR pszRegValAuthPort[] = L"AuthPort"; WCHAR pszRegValAcctPort[] = L"AcctPort"; WCHAR pszRegValMessage[] = L"EnableAccountingOnOff"; WCHAR pszRegValScore[] = L"Score"; WCHAR pszRegValTimeout[] = L"Timeout"; WCHAR pszRegValSignature[] = L"SendSignature";
//
// Local definitions
//
#define RASAAAA_Auth 0x1
#define RASAAAA_Acct 0x2
#define RASAAAA_Windows 0x10
#define RASAAAA_Radius 0x20
#define RASAAAA_None 0x40
#define RASAAAA_F_Provider 0x1
#define RASAAAA_F_Create 0x2
//
// Structures representing auth/acct servers
//
typedef struct _AAAA_AUTH_SERVER { PWCHAR pszName; PWCHAR pszSecret; DWORD dwScore; DWORD dwPort; DWORD dwTimeout; DWORD dwSignature; } RASAAAA_AUTH_SERVER;
typedef struct _AAAA_ACCT_SERVER { PWCHAR pszName; PWCHAR pszSecret; DWORD dwScore; DWORD dwPort; DWORD dwTimeout; DWORD dwMessages; } RASAAAA_ACCT_SERVER;
typedef DWORD (* RASAAAA_SERVER_ENUM_CB)( IN PVOID pvServer, IN HANDLE hData);
typedef struct _AAAA_ENUM_DATA { DWORD dwType; HANDLE hData; RASAAAA_SERVER_ENUM_CB pEnum; } RASAAAA_ENUM_DATA;
TOKEN_VALUE g_rgEnumEnableDisable[] = { {TOKEN_ENABLED, 1}, {TOKEN_DISABLED, 0} }; RASMON_CMD_ARG g_pArgsAuth[] = { { RASMONTR_CMD_TYPE_STRING, {TOKEN_NAME, TRUE, FALSE}, NULL, 0, NULL },
{ RASMONTR_CMD_TYPE_STRING, {TOKEN_SECRET, FALSE, FALSE}, NULL, 0, NULL },
{ RASMONTR_CMD_TYPE_DWORD, {TOKEN_INITSCORE, FALSE, FALSE}, NULL, 0, NULL },
{ RASMONTR_CMD_TYPE_DWORD, {TOKEN_PORT, FALSE, FALSE}, NULL, 0, NULL },
{ RASMONTR_CMD_TYPE_DWORD, {TOKEN_TIMEOUT, FALSE, FALSE}, NULL, 0, NULL },
{ RASMONTR_CMD_TYPE_ENUM, {TOKEN_SIGNATURE, FALSE, FALSE}, g_rgEnumEnableDisable, sizeof(g_rgEnumEnableDisable)/sizeof(*g_rgEnumEnableDisable), NULL } };
RASMON_CMD_ARG g_pArgsAcct[] = { { RASMONTR_CMD_TYPE_STRING, {TOKEN_NAME, TRUE, FALSE}, NULL, 0, NULL },
{ RASMONTR_CMD_TYPE_STRING, {TOKEN_SECRET, FALSE, FALSE}, NULL, 0, NULL },
{ RASMONTR_CMD_TYPE_DWORD, {TOKEN_INITSCORE, FALSE, FALSE}, NULL, 0, NULL },
{ RASMONTR_CMD_TYPE_DWORD, {TOKEN_PORT, FALSE, FALSE}, NULL, 0, NULL },
{ RASMONTR_CMD_TYPE_DWORD, {TOKEN_TIMEOUT, FALSE, FALSE}, NULL, 0, NULL },
{ RASMONTR_CMD_TYPE_ENUM, {TOKEN_MESSAGES, FALSE, FALSE}, g_rgEnumEnableDisable, sizeof(g_rgEnumEnableDisable)/sizeof(*g_rgEnumEnableDisable), NULL } };
#define g_dwArgsAuthCount (sizeof(g_pArgsAuth) / sizeof(*g_pArgsAuth))
#define g_dwArgsAcctCount (sizeof(g_pArgsAcct) / sizeof(*g_pArgsAcct))
//
// Local prototypes
//
DWORD RasAaaaServerInit( IN DWORD dwType, OUT LPVOID lpvServer);
DWORD RasAaaaServerCleanup( IN DWORD dwType, IN PVOID pvServer); DWORD RasAaaaServerAdd( IN DWORD dwType, IN PVOID pvServer);
DWORD RasAaaaServerDelete( IN DWORD dwType, IN PVOID pvServer); DWORD RasAaaaServerRead( IN DWORD dwType, IN PVOID pvServer, IN HKEY hkServer OPTIONAL);
DWORD RasAaaaServerWrite( IN DWORD dwType, IN PVOID pvServer, IN HKEY hkServer OPTIONAL, IN BOOL bInitSecret);
DWORD RasAaaaServerEnum( IN DWORD dwType, IN RASAAAA_SERVER_ENUM_CB pEnum, IN HANDLE hData);
DWORD RasAaaaServerKeyOpen( IN DWORD dwType, IN DWORD dwFlags, OUT PHKEY phKey);
DWORD RasAaaaServerSecretWrite( IN LPCWSTR pszServer, IN LPCWSTR pszSecret);
//
// Discovers the current provider
//
DWORD RasAaaaProviderRead( IN DWORD dwType, OUT LPDWORD lpdwProvider) { DWORD dwErr = NO_ERROR; HKEY hkProviders = NULL; PWCHAR pszGuid = NULL;
do { // Show the authentication provider
//
dwErr = RasAaaaServerKeyOpen( dwType, RASAAAA_F_Provider, &hkProviders); BREAK_ON_DWERR(dwErr);
dwErr = RutlRegReadString( hkProviders, pszRegValActiveProvider, &pszGuid); BREAK_ON_DWERR(dwErr); if (pszGuid == NULL) { dwErr = ERROR_CAN_NOT_COMPLETE; break; }
if (dwType == RASAAAA_Auth) { if (lstrcmpi(pszGuid, pszGuidRadAuth) == 0) { *lpdwProvider = RASAAAA_Radius; } else { *lpdwProvider = RASAAAA_Windows; } } else { if (lstrcmpi(pszGuid, pszGuidRadAcct) == 0) { *lpdwProvider = RASAAAA_Radius; } else if (lstrcmpi(pszGuid, pszGuidWinAcct) == 0) { *lpdwProvider = RASAAAA_Windows; } else { *lpdwProvider = RASAAAA_None; } } } while (FALSE);
// Cleanup
//
{ if (hkProviders) { RegCloseKey(hkProviders); }
RutlFree(pszGuid); }
return dwErr; }
//
// Looks up the address of a server
//
DWORD RasAaaaServerLookupAddress( IN LPCWSTR pszServer, OUT LPWSTR* ppszAddress) { DWORD dwErr = NO_ERROR, dwCount = 0, dwAddr; struct hostent* pHost; CHAR pszNameA[512]; WCHAR pszName[512]; do { // Convert the host name to ansi
//
dwCount = WideCharToMultiByte( GetConsoleOutputCP(), 0, pszServer, -1, pszNameA, sizeof(pszNameA), NULL, NULL); if (dwCount == 0) { dwErr = GetLastError(); break; }
// Lookup the host
//
pHost = gethostbyname(pszNameA); if (pHost == NULL) { *ppszAddress = RutlStrDup(pszServer); if (*ppszAddress == NULL) { dwErr = ERROR_NOT_ENOUGH_MEMORY; } break; }
// Convert the discovered address to unicode
//
dwAddr = *(PDWORD)(pHost->h_addr_list[0]); dwCount = MultiByteToWideChar( GetConsoleOutputCP(), 0, inet_ntoa(*(PIN_ADDR)&dwAddr), -1, pszName, sizeof(pszName) / sizeof(WCHAR)); if (dwCount == 0) { dwErr = GetLastError(); break; }
*ppszAddress = RutlStrDup(pszName); if (*ppszAddress == NULL) { dwErr = ERROR_NOT_ENOUGH_MEMORY; } } while (FALSE);
// Cleanup
{ }
return dwErr; } //
// Populates a server cb with defaults
//
DWORD RasAaaaServerInit( IN DWORD dwType, OUT PVOID pvServer) { if (dwType == RASAAAA_Auth) { RASAAAA_AUTH_SERVER* pInfo = (RASAAAA_AUTH_SERVER*)pvServer; pInfo->pszName = NULL; pInfo->pszSecret = NULL; pInfo->dwScore = 30; pInfo->dwPort = 1812; pInfo->dwTimeout = 5; pInfo->dwSignature = 0; } else { RASAAAA_ACCT_SERVER* pInfo = (RASAAAA_ACCT_SERVER*)pvServer;
pInfo->pszName = NULL; pInfo->pszSecret = NULL; pInfo->dwScore = 30; pInfo->dwPort = 1813; pInfo->dwTimeout = 5; pInfo->dwMessages = 0; }
return NO_ERROR; }
//
// Cleans up a server cb
//
DWORD RasAaaaServerCleanup( IN DWORD dwType, IN PVOID pvServer) { if (dwType == RASAAAA_Auth) { RASAAAA_AUTH_SERVER* pInfo = (RASAAAA_AUTH_SERVER*)pvServer; RutlFree(pInfo->pszName); RutlFree(pInfo->pszSecret); } else { RASAAAA_ACCT_SERVER* pInfo = (RASAAAA_ACCT_SERVER*)pvServer;
RutlFree(pInfo->pszName); RutlFree(pInfo->pszSecret); }
return NO_ERROR; }
//
// Adds a server
//
DWORD RasAaaaServerAdd( IN DWORD dwType, IN PVOID pvServer) { DWORD dwErr = NO_ERROR, dwDisposition; HKEY hkServers = NULL, hkKey = NULL;
do { dwErr = RasAaaaServerKeyOpen( dwType, RASAAAA_F_Create, &hkServers); BREAK_ON_DWERR(dwErr);
// Create the new key
//
dwErr = RegCreateKeyExW( hkServers, *((PWCHAR*)pvServer), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkKey, &dwDisposition); BREAK_ON_DWERR(dwErr);
if (dwDisposition == REG_OPENED_EXISTING_KEY) { dwErr = ERROR_ALREADY_EXISTS; break; }
dwErr = RasAaaaServerWrite(dwType, pvServer, hkKey, TRUE); BREAK_ON_DWERR(dwErr); } while (FALSE);
// Cleanup
//
{ if (hkServers) { RegCloseKey(hkServers); } if (hkKey) { RegCloseKey(hkKey); } } return dwErr; }
DWORD RasAaaaServerDelete( IN DWORD dwType, IN PVOID pvServer) { DWORD dwErr = NO_ERROR; HKEY hkServers = NULL;
do { dwErr = RasAaaaServerKeyOpen( dwType, 0, &hkServers); BREAK_ON_DWERR(dwErr);
dwErr = RegDeleteKey(hkServers, *(PWCHAR*)pvServer); BREAK_ON_DWERR(dwErr);
// Cleanup the shared secret
//
RasAaaaServerSecretWrite(*(PWCHAR*)pvServer, NULL); } while (FALSE);
// Cleanup
{ if (hkServers) { RegCloseKey(hkServers); } }
return dwErr; }
//
// Callback to an enumeration function that deletes the given
// authentication server
//
DWORD RasAaaaServerDeleteAuthCb( IN PVOID pvServer, IN HANDLE hData) { return RasAaaaServerDelete(RASAAAA_Auth, pvServer); }
//
// Callback to an enumeration function that deletes the given
// accounting server
//
DWORD RasAaaaServerDeleteAcctCb( IN PVOID pvServer, IN HANDLE hData) { return RasAaaaServerDelete(RASAAAA_Acct, pvServer); }
//
// Read server info
//
DWORD RasAaaaServerRead( IN DWORD dwType, IN PVOID pvServer, IN HKEY hkServer OPTIONAL) { DWORD dwErr = NO_ERROR; HKEY hkServers = NULL, hkKey = NULL;
do { if (hkServer == NULL) { dwErr = RasAaaaServerKeyOpen( dwType, 0, &hkServers); BREAK_ON_DWERR(dwErr);
dwErr = RegOpenKeyEx( hkServers, *(PWCHAR*)pvServer, 0, KEY_ALL_ACCESS, &hkKey); BREAK_ON_DWERR(dwErr); } else { hkKey = hkServer; }
if (dwType == RASAAAA_Auth) { RASAAAA_AUTH_SERVER* pInfo = (RASAAAA_AUTH_SERVER*)pvServer;
dwErr = RutlRegReadDword( hkKey, pszRegValScore, &pInfo->dwScore); BREAK_ON_DWERR(dwErr); dwErr = RutlRegReadDword( hkKey, pszRegValAuthPort, &pInfo->dwPort); BREAK_ON_DWERR(dwErr); dwErr = RutlRegReadDword( hkKey, pszRegValTimeout, &pInfo->dwTimeout); BREAK_ON_DWERR(dwErr); dwErr = RutlRegReadDword( hkKey, pszRegValSignature, &pInfo->dwSignature); BREAK_ON_DWERR(dwErr); } else { RASAAAA_ACCT_SERVER* pInfo = (RASAAAA_ACCT_SERVER*)pvServer;
dwErr = RutlRegReadDword( hkKey, pszRegValScore, &pInfo->dwScore); BREAK_ON_DWERR(dwErr); dwErr = RutlRegReadDword( hkKey, pszRegValAcctPort, &pInfo->dwPort); BREAK_ON_DWERR(dwErr); dwErr = RutlRegReadDword( hkKey, pszRegValTimeout, &pInfo->dwTimeout); BREAK_ON_DWERR(dwErr); dwErr = RutlRegReadDword( hkKey, pszRegValMessage, &pInfo->dwMessages); BREAK_ON_DWERR(dwErr); } } while (FALSE);
// Cleanup
//
{ if (hkServers) { RegCloseKey(hkServers); } if (hkKey && hkServer == NULL) { RegCloseKey(hkKey); } } return dwErr; }
//
// Write server info
//
DWORD RasAaaaServerWrite( IN DWORD dwType, IN PVOID pvServer, IN HKEY hkServer, OPTIONAL IN BOOL bInitSecret) { DWORD dwErr = NO_ERROR; HKEY hkServers = NULL, hkKey = NULL;
do { if (hkServer == NULL) { dwErr = RasAaaaServerKeyOpen( dwType, 0, &hkServers); BREAK_ON_DWERR(dwErr);
dwErr = RegOpenKeyEx( hkServers, *(PWCHAR*)pvServer, 0, KEY_ALL_ACCESS, &hkKey); BREAK_ON_DWERR(dwErr); } else { hkKey = hkServer; }
if (dwType == RASAAAA_Auth) { RASAAAA_AUTH_SERVER* pInfo = (RASAAAA_AUTH_SERVER*)pvServer;
dwErr = RutlRegWriteDword( hkKey, pszRegValScore, pInfo->dwScore); BREAK_ON_DWERR(dwErr); dwErr = RutlRegWriteDword( hkKey, pszRegValAuthPort, pInfo->dwPort); BREAK_ON_DWERR(dwErr); dwErr = RutlRegWriteDword( hkKey, pszRegValTimeout, pInfo->dwTimeout); BREAK_ON_DWERR(dwErr); dwErr = RutlRegWriteDword( hkKey, pszRegValSignature, pInfo->dwSignature); BREAK_ON_DWERR(dwErr);
if (pInfo->pszSecret) { dwErr = RasAaaaServerSecretWrite( pInfo->pszName, pInfo->pszSecret); BREAK_ON_DWERR(dwErr); } else if (bInitSecret) { dwErr = RasAaaaServerSecretWrite( pInfo->pszName, L""); BREAK_ON_DWERR(dwErr); } } else { RASAAAA_ACCT_SERVER* pInfo = (RASAAAA_ACCT_SERVER*)pvServer;
dwErr = RutlRegWriteDword( hkKey, pszRegValScore, pInfo->dwScore); BREAK_ON_DWERR(dwErr); dwErr = RutlRegWriteDword( hkKey, pszRegValAcctPort, pInfo->dwPort); BREAK_ON_DWERR(dwErr); dwErr = RutlRegWriteDword( hkKey, pszRegValTimeout, pInfo->dwTimeout); BREAK_ON_DWERR(dwErr); dwErr = RutlRegWriteDword( hkKey, pszRegValMessage, pInfo->dwMessages); BREAK_ON_DWERR(dwErr); if (pInfo->pszSecret) { dwErr = RasAaaaServerSecretWrite( pInfo->pszName, pInfo->pszSecret); BREAK_ON_DWERR(dwErr); } else if (bInitSecret) { dwErr = RasAaaaServerSecretWrite( pInfo->pszName, L""); BREAK_ON_DWERR(dwErr); } } } while (FALSE);
// Cleanup
{ if (hkServers) { RegCloseKey(hkServers); } if (hkKey && hkServer == NULL) { RegCloseKey(hkKey); } }
return dwErr; }
//
// Callback function for registry enumerator
//
DWORD RasAaaaServerEnumCb( IN LPCWSTR pszName, IN HKEY hKey, IN HANDLE hData) { RASAAAA_ENUM_DATA* pData = (RASAAAA_ENUM_DATA*)hData; RASAAAA_AUTH_SERVER AuthServer; RASAAAA_ACCT_SERVER AcctServer; DWORD dwErr = NO_ERROR;
ZeroMemory(&AuthServer, sizeof(AuthServer)); ZeroMemory(&AcctServer, sizeof(AcctServer)); do { if (pData->dwType == RASAAAA_Auth) { AuthServer.pszName = RutlStrDup(pszName);
dwErr = RasAaaaServerRead( pData->dwType, (PVOID)&AuthServer, hKey); BREAK_ON_DWERR(dwErr);
dwErr = pData->pEnum((PVOID)&AuthServer, pData->hData); BREAK_ON_DWERR(dwErr); } else { AcctServer.pszName = RutlStrDup(pszName);
dwErr = RasAaaaServerRead( pData->dwType, (PVOID)&AcctServer, hKey); BREAK_ON_DWERR(dwErr);
dwErr = pData->pEnum((PVOID)&AcctServer, pData->hData); BREAK_ON_DWERR(dwErr); } } while (FALSE);
// Cleanup
//
{ RasAaaaServerCleanup( pData->dwType, (pData->dwType == RASAAAA_Auth) ? (PVOID)&AuthServer : (PVOID)&AcctServer); }
return dwErr; }
//
// Enumerates the servers
//
DWORD RasAaaaServerEnum( IN DWORD dwType, IN RASAAAA_SERVER_ENUM_CB pEnum, IN HANDLE hData) { DWORD dwErr = NO_ERROR; HKEY hkServers = NULL; RASAAAA_ENUM_DATA EnumData;
do { ZeroMemory(&EnumData, sizeof(EnumData)); dwErr = RasAaaaServerKeyOpen( dwType, 0, &hkServers); if (dwErr == ERROR_FILE_NOT_FOUND) { dwErr = NO_ERROR; break; } BREAK_ON_DWERR(dwErr);
EnumData.dwType = dwType; EnumData.pEnum = pEnum; EnumData.hData = hData; dwErr = RutlRegEnumKeys( hkServers, RasAaaaServerEnumCb, (HANDLE)&EnumData); BREAK_ON_DWERR(dwErr);
} while (FALSE);
// Cleanup
//
{ if (hkServers) { RegCloseKey(hkServers); } }
return dwErr; }
//
// Opens the appropriate registry key
//
DWORD RasAaaaServerKeyOpen( IN DWORD dwType, IN DWORD dwFlags, OUT PHKEY phKey) { HKEY hkRoot = NULL, hkProvider = NULL; DWORD dwErr = NO_ERROR;
do { dwErr = RegOpenKeyEx( g_pServerInfo->hkMachine, (dwType == RASAAAA_Auth) ? pszRegKeyAuth : pszRegKeyAcct, 0, KEY_ALL_ACCESS, &hkRoot); BREAK_ON_DWERR(dwErr);
if (dwFlags & RASAAAA_F_Provider) { *phKey = hkRoot; break; }
dwErr = RegOpenKeyEx( hkRoot, (dwType == RASAAAA_Auth) ? pszGuidRadAuth : pszGuidRadAcct, 0, KEY_ALL_ACCESS, &hkProvider); BREAK_ON_DWERR(dwErr);
if (dwFlags & RASAAAA_F_Create) { DWORD dwDisposition; dwErr = RegCreateKeyExW( hkProvider, pszRegKeyServers, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, phKey, &dwDisposition); BREAK_ON_DWERR(dwErr); } else { dwErr = RegOpenKeyExW( hkProvider, pszRegKeyServers, 0, KEY_ALL_ACCESS, phKey); BREAK_ON_DWERR(dwErr); }
} while (FALSE);
// Cleanup
{ if (hkRoot && !(dwFlags & RASAAAA_F_Provider)) { RegCloseKey(hkRoot); } if (hkProvider) { RegCloseKey(hkProvider); } if (dwErr != NO_ERROR) { if (*phKey) { RegCloseKey(*phKey); } *phKey = NULL; } }
return dwErr; }
//
// Saves a shared secret
//
DWORD RasAaaaServerSecretWrite( IN LPCWSTR pszRadiusServerName, IN LPCWSTR pszSecret) { LSA_HANDLE hLSA = NULL; NTSTATUS ntStatus; LSA_OBJECT_ATTRIBUTES objectAttributes; LSA_UNICODE_STRING LSAPrivData, LSAPrivDataDesc; TCHAR tszPrivData[MAX_PATH+1], tszPrivDataDesc[MAX_PATH+CCHRADIUSSERVER+1]; TCHAR * ptszTemp; PUNICODE_STRING pSystem; UNICODE_STRING uszSystemName;
pSystem = NULL; InitializeObjectAttributes(&objectAttributes, NULL, 0, NULL, NULL);
ntStatus = LsaOpenPolicy( pSystem, &objectAttributes, POLICY_ALL_ACCESS, &hLSA);
if ( !NT_SUCCESS( ntStatus) ) { return( RtlNtStatusToDosError( ntStatus ) ); }
ZeroMemory(tszPrivDataDesc, sizeof(tszPrivDataDesc)); lstrcpy(tszPrivDataDesc, PSZRADIUSSERVER); lstrcpyn(tszPrivDataDesc + CCHRADIUSSERVER, pszRadiusServerName, MAX_PATH); LSAPrivDataDesc.Length = (USHORT)((lstrlen(tszPrivDataDesc) + 1) * sizeof(TCHAR)); LSAPrivDataDesc.MaximumLength = sizeof(tszPrivDataDesc); LSAPrivDataDesc.Buffer = tszPrivDataDesc;
ZeroMemory(tszPrivData, sizeof(tszPrivData)); if (pszSecret) { lstrcpyn(tszPrivData, pszSecret, MAX_PATH); LSAPrivData.Length = (USHORT)(lstrlen(tszPrivData) * sizeof(TCHAR)); LSAPrivData.MaximumLength = sizeof(tszPrivData); LSAPrivData.Buffer = tszPrivData; } else { LSAPrivData.Length = 0; LSAPrivData.MaximumLength = 0; LSAPrivData.Buffer = NULL; } ntStatus = LsaStorePrivateData(hLSA, &LSAPrivDataDesc, &LSAPrivData);
ZeroMemory( tszPrivData, sizeof( tszPrivData ) );
LsaClose(hLSA);
return( RtlNtStatusToDosError( ntStatus ) ); }
//
// Displays the given server
//
DWORD RasAaaaServerAuthShow( IN PVOID pvServer, IN HANDLE hData) { DWORD dwErr = NO_ERROR; RASAAAA_AUTH_SERVER* pServer = (RASAAAA_AUTH_SERVER*)pvServer; PWCHAR pszAddress = NULL; BOOL* pDumpFmt = (BOOL*)hData; PWCHAR pszPort = NULL, pszScore = NULL, pszTimeout = NULL, pszName = NULL, pszSig = NULL;
do { if (!pDumpFmt || *pDumpFmt == FALSE) { // Lookup the address
//
dwErr = RasAaaaServerLookupAddress(pServer->pszName, &pszAddress); BREAK_ON_DWERR(dwErr); DisplayMessage( g_hModule, MSG_RASAAAA_SHOW_AUTHSERV, pServer->pszName, pszAddress, pServer->dwPort, pServer->dwScore, pServer->dwTimeout, (pServer->dwSignature) ? TOKEN_ENABLED : TOKEN_DISABLED); } else { // Make assignment strings
//
pszPort = RutlAssignmentFromTokenAndDword( g_hModule, TOKEN_PORT, pServer->dwPort, 10); pszScore = RutlAssignmentFromTokenAndDword( g_hModule, TOKEN_INITSCORE, pServer->dwScore, 10); pszTimeout = RutlAssignmentFromTokenAndDword( g_hModule, TOKEN_TIMEOUT, pServer->dwTimeout, 10); pszName = RutlAssignmentFromTokens( g_hModule, TOKEN_NAME, pServer->pszName); pszSig = RutlAssignmentFromTokens( g_hModule, TOKEN_SIGNATURE, (pServer->dwSignature) ? TOKEN_ENABLED : TOKEN_DISABLED); if (!pszPort || !pszScore || !pszTimeout || !pszName || !pszSig) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; } // Display the command
//
DisplayMessage( g_hModule, MSG_RASAAAA_CMD5, DMP_RASAAAA_ADD_AUTHSERV, pszName, pszPort, pszScore, pszTimeout, pszSig); } } while (FALSE);
// Cleanup
{ RutlFree(pszAddress); RutlFree(pszName); RutlFree(pszPort); RutlFree(pszScore); RutlFree(pszTimeout); RutlFree(pszSig); }
return dwErr; }
//
// Displays the given server
//
DWORD RasAaaaServerAcctShow( IN PVOID pvServer, IN HANDLE hData) { DWORD dwErr = NO_ERROR; RASAAAA_ACCT_SERVER* pServer = (RASAAAA_ACCT_SERVER*)pvServer; PWCHAR pszAddress = NULL; PWCHAR pszPort = NULL, pszScore = NULL, pszTimeout = NULL, pszName = NULL, pszMsg = NULL; BOOL* pDumpFmt = (BOOL*)hData; do { if (!pDumpFmt || *pDumpFmt == FALSE) { // Lookup the address
//
dwErr = RasAaaaServerLookupAddress(pServer->pszName, &pszAddress); BREAK_ON_DWERR(dwErr); DisplayMessage( g_hModule, MSG_RASAAAA_SHOW_AUTHSERV, pServer->pszName, pszAddress, pServer->dwPort, pServer->dwScore, pServer->dwTimeout, (pServer->dwMessages) ? TOKEN_ENABLED : TOKEN_DISABLED); } else { // Make assignment strings
//
pszPort = RutlAssignmentFromTokenAndDword( g_hModule, TOKEN_PORT, pServer->dwPort, 10); pszScore = RutlAssignmentFromTokenAndDword( g_hModule, TOKEN_INITSCORE, pServer->dwScore, 10); pszTimeout = RutlAssignmentFromTokenAndDword( g_hModule, TOKEN_TIMEOUT, pServer->dwTimeout, 10); pszName = RutlAssignmentFromTokens( g_hModule, TOKEN_NAME, pServer->pszName); pszMsg = RutlAssignmentFromTokens( g_hModule, TOKEN_MESSAGES, (pServer->dwMessages) ? TOKEN_ENABLED : TOKEN_DISABLED); if (!pszPort || !pszScore || !pszTimeout || !pszName || !pszMsg) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; } // Display the command
//
DisplayMessage( g_hModule, MSG_RASAAAA_CMD5, DMP_RASAAAA_ADD_ACCTSERV, pszName, pszPort, pszScore, pszTimeout, pszMsg); } } while (FALSE);
// Cleanup
{ RutlFree(pszAddress); RutlFree(pszName); RutlFree(pszPort); RutlFree(pszScore); RutlFree(pszTimeout); RutlFree(pszMsg); }
return dwErr; }
//
// Entry called by rasmontr to register this context
//
DWORD WINAPI RasAaaaStartHelper( IN CONST GUID *pguidParent, IN DWORD dwVersion) { DWORD dwErr = NO_ERROR; NS_CONTEXT_ATTRIBUTES attMyAttributes;
// Initialize
//
ZeroMemory(&attMyAttributes, sizeof(attMyAttributes));
attMyAttributes.pwszContext = L"aaaa"; attMyAttributes.guidHelper = g_RasAaaaGuid; attMyAttributes.dwVersion = RASAAAA_VERSION; attMyAttributes.dwFlags = 0; attMyAttributes.ulNumTopCmds= 0; attMyAttributes.pTopCmds = NULL; attMyAttributes.ulNumGroups = g_ulRasAaaaNumGroups; attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_RasAaaaCmdGroups; attMyAttributes.pfnDumpFn = RasAaaaDump;
dwErr = RegisterContext( &attMyAttributes ); return dwErr; }
DWORD WINAPI RasAaaaDump( IN LPCWSTR pwszRouter, IN OUT LPWSTR *ppwcArguments, IN DWORD dwArgCount, IN LPCVOID pvData ) { DWORD dwErr = NO_ERROR, dwProvider; PWCHAR pszCmd = NULL, pszToken = NULL; BOOL bDumpFmt;
// Dump the header
//
DisplayMessage(g_hModule, MSG_RASAAAA_SCRIPTHEADER); DisplayMessageT(DMP_RASAAAA_PUSHD); do { // Dump the commands to set the correct authentication and
// accounting providers
//
dwErr = RasAaaaProviderRead(RASAAAA_Auth, &dwProvider); BREAK_ON_DWERR(dwErr);
pszCmd = RutlAssignmentFromTokens( g_hModule, TOKEN_PROVIDER, (dwProvider == RASAAAA_Windows) ? TOKEN_WINDOWS : TOKEN_RADIUS); if (pszCmd == NULL) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; }
DisplayMessage( g_hModule, MSG_RASAAAA_CMD1, DMP_RASAAAA_SET_AUTH, pszCmd);
RutlFree(pszCmd); dwErr = RasAaaaProviderRead(RASAAAA_Acct, &dwProvider); BREAK_ON_DWERR(dwErr);
if (dwProvider == RASAAAA_Windows) { pszToken = (PWCHAR)TOKEN_WINDOWS; } else if (dwProvider == RASAAAA_Radius) { pszToken = (PWCHAR)TOKEN_RADIUS; } else { pszToken = (PWCHAR)TOKEN_NONE; } pszCmd = RutlAssignmentFromTokens( g_hModule, TOKEN_PROVIDER, pszToken); if (pszCmd == NULL) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; }
DisplayMessage( g_hModule, MSG_RASAAAA_CMD1, DMP_RASAAAA_SET_ACCT, pszCmd);
RutlFree(pszCmd);
DisplayMessageT(MSG_NEWLINE);
// Dump the commands to delete all of the current servers
//
pszCmd = RutlAssignmentFromTokens( g_hModule, TOKEN_NAME, TOKEN_RASAAAA_ALLSERVERS); if (pszCmd == NULL) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; }
DisplayMessage( g_hModule, MSG_RASAAAA_CMD1, DMP_RASAAAA_DEL_AUTHSERV, pszCmd);
DisplayMessage( g_hModule, MSG_RASAAAA_CMD1, DMP_RASAAAA_DEL_ACCTSERV, pszCmd);
RutlFree(pszCmd);
DisplayMessageT(MSG_NEWLINE);
// Dump commands to add all of the current auth servers
//
bDumpFmt = TRUE; dwErr = RasAaaaServerEnum( RASAAAA_Auth, RasAaaaServerAuthShow, (HANDLE)&bDumpFmt); BREAK_ON_DWERR(dwErr);
DisplayMessageT(MSG_NEWLINE);
// Dump commands to add all of the accouting servers
//
dwErr = RasAaaaServerEnum( RASAAAA_Acct, RasAaaaServerAcctShow, (HANDLE)&bDumpFmt); BREAK_ON_DWERR(dwErr);
} while (FALSE);
// Dump the footer
DisplayMessageT(DMP_RASAAAA_POPD); DisplayMessage(g_hModule, MSG_RASAAAA_SCRIPTFOOTER);
// Cleanup
{ }
return dwErr; }
DWORD RasAaaaHandleAddAuthServ( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR; RASAAAA_AUTH_SERVER Server; RASMON_CMD_ARG pArgs[g_dwArgsAuthCount]; // Initialize
CopyMemory(pArgs, g_pArgsAuth, sizeof(g_pArgsAuth));
do { dwErr = RasAaaaServerInit(RASAAAA_Auth, (PVOID)&Server); BREAK_ON_DWERR(dwErr); // Parse the command line
//
dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, pbDone, pArgs, sizeof(pArgs)/sizeof(*pArgs)); BREAK_ON_DWERR( dwErr );
Server.pszName = RASMON_CMD_ARG_GetPsz(pArgs + 0); Server.pszSecret = RASMON_CMD_ARG_GetPsz(pArgs + 1);
if (RASMON_CMD_ARG_Present(pArgs + 2)) { Server.dwScore = RASMON_CMD_ARG_GetDword(pArgs + 2); } if (RASMON_CMD_ARG_Present(pArgs + 3)) { Server.dwPort = RASMON_CMD_ARG_GetDword(pArgs + 3); } if (RASMON_CMD_ARG_Present(pArgs + 4)) { Server.dwTimeout = RASMON_CMD_ARG_GetDword(pArgs + 4); } if (RASMON_CMD_ARG_Present(pArgs + 5)) { Server.dwSignature = RASMON_CMD_ARG_GetDword(pArgs + 5); }
dwErr = RasAaaaServerAdd(RASAAAA_Auth, (PVOID)&Server); BREAK_ON_DWERR(dwErr);
DisplayMessage(g_hModule, MSG_RASAAAA_MUST_RESTART_SERVICES);
} while (FALSE);
// Cleanup
//
{ RasAaaaServerCleanup(RASAAAA_Auth, (PVOID)&Server); } return dwErr; }
DWORD RasAaaaHandleAddAcctServ( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR; RASAAAA_ACCT_SERVER Server; RASMON_CMD_ARG pArgs[g_dwArgsAcctCount]; // Initialize
CopyMemory(pArgs, g_pArgsAcct, sizeof(g_pArgsAcct));
do { dwErr = RasAaaaServerInit(RASAAAA_Acct, (PVOID)&Server); BREAK_ON_DWERR(dwErr); // Parse the command line
//
dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, pbDone, pArgs, sizeof(pArgs)/sizeof(*pArgs)); BREAK_ON_DWERR( dwErr );
Server.pszName = RASMON_CMD_ARG_GetPsz(pArgs + 0); Server.pszSecret = RASMON_CMD_ARG_GetPsz(pArgs + 1);
if (RASMON_CMD_ARG_Present(pArgs + 2)) { Server.dwScore = RASMON_CMD_ARG_GetDword(pArgs + 2); } if (RASMON_CMD_ARG_Present(pArgs + 3)) { Server.dwPort = RASMON_CMD_ARG_GetDword(pArgs + 3); } if (RASMON_CMD_ARG_Present(pArgs + 4)) { Server.dwTimeout = RASMON_CMD_ARG_GetDword(pArgs + 4); } if (RASMON_CMD_ARG_Present(pArgs + 5)) { Server.dwMessages = RASMON_CMD_ARG_GetDword(pArgs + 5); }
dwErr = RasAaaaServerAdd(RASAAAA_Acct, (PVOID)&Server); BREAK_ON_DWERR(dwErr);
DisplayMessage(g_hModule, MSG_RASAAAA_MUST_RESTART_SERVICES);
} while (FALSE);
// Cleanup
//
{ RasAaaaServerCleanup(RASAAAA_Acct, (PVOID)&Server); } return dwErr; }
DWORD RasAaaaHandleDelAuthServ( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR, dwType = RASAAAA_Auth; RASAAAA_AUTH_SERVER Server; PVOID pvServer = (PVOID)&Server; RASMON_CMD_ARG pArgs[] = { { RASMONTR_CMD_TYPE_STRING, {TOKEN_NAME, TRUE, FALSE}, NULL, 0, NULL } };
ZeroMemory(&Server, sizeof(Server));
do { // Parse the command line
//
dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, pbDone, pArgs, sizeof(pArgs)/sizeof(*pArgs)); BREAK_ON_DWERR( dwErr );
Server.pszName = RASMON_CMD_ARG_GetPsz(&pArgs[0]);
if (wcscmp(Server.pszName, TOKEN_RASAAAA_ALLSERVERS) == 0) { dwErr = RasAaaaServerEnum( RASAAAA_Auth, RasAaaaServerDeleteAuthCb, NULL); } else { dwErr = RasAaaaServerDelete(dwType, pvServer); } BREAK_ON_DWERR( dwErr ); DisplayMessage(g_hModule, MSG_RASAAAA_MUST_RESTART_SERVICES);
} while (FALSE);
// Cleanup
//
{ RasAaaaServerCleanup(dwType, pvServer); }
return dwErr; }
DWORD RasAaaaHandleDelAcctServ( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR, dwType = RASAAAA_Acct; RASAAAA_ACCT_SERVER Server; PVOID pvServer = (PVOID)&Server; RASMON_CMD_ARG pArgs[] = { { RASMONTR_CMD_TYPE_STRING, {TOKEN_NAME, TRUE, FALSE}, NULL, 0, NULL } };
ZeroMemory(&Server, sizeof(Server));
do { // Parse the command line
//
dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, pbDone, pArgs, sizeof(pArgs)/sizeof(*pArgs)); BREAK_ON_DWERR( dwErr );
Server.pszName = RASMON_CMD_ARG_GetPsz(&pArgs[0]);
if (wcscmp(Server.pszName, TOKEN_RASAAAA_ALLSERVERS) == 0) { dwErr = RasAaaaServerEnum( RASAAAA_Acct, RasAaaaServerDeleteAcctCb, NULL); } else { dwErr = RasAaaaServerDelete(dwType, pvServer); } BREAK_ON_DWERR( dwErr ); DisplayMessage(g_hModule, MSG_RASAAAA_MUST_RESTART_SERVICES);
} while (FALSE);
// Cleanup
//
{ RasAaaaServerCleanup(dwType, pvServer); }
return dwErr; }
DWORD RasAaaaHandleSetAuth( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR, dwValue; HKEY hkProviders = NULL; TOKEN_VALUE rgEnum[] = { {TOKEN_WINDOWS, 1}, {TOKEN_RADIUS, 0} }; RASMON_CMD_ARG pArgs[] = { { RASMONTR_CMD_TYPE_ENUM, {TOKEN_PROVIDER, TRUE, FALSE}, rgEnum, sizeof(rgEnum) / sizeof(*rgEnum), NULL } };
do { // Parse the command line
//
dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, pbDone, pArgs, sizeof(pArgs)/sizeof(*pArgs)); BREAK_ON_DWERR( dwErr );
dwValue = RASMON_CMD_ARG_GetDword(&pArgs[0]);
dwErr = RasAaaaServerKeyOpen( RASAAAA_Auth, RASAAAA_F_Provider, &hkProviders); BREAK_ON_DWERR(dwErr);
dwErr = RutlRegWriteString( hkProviders, pszRegValActiveProvider, (dwValue) ? pszGuidWinAuth : pszGuidRadAuth); BREAK_ON_DWERR(dwErr);
} while (FALSE);
// Cleanup
//
{ if (hkProviders) { RegCloseKey(hkProviders); } }
return dwErr; }
DWORD RasAaaaHandleSetAcct( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR, dwValue; HKEY hkProviders = NULL; PWCHAR pszProvider = NULL; TOKEN_VALUE rgEnum[] = { {TOKEN_WINDOWS, 1}, {TOKEN_RADIUS, 0}, {TOKEN_NONE, 2} }; RASMON_CMD_ARG pArgs[] = { { RASMONTR_CMD_TYPE_ENUM, {TOKEN_PROVIDER, TRUE, FALSE}, rgEnum, sizeof(rgEnum) / sizeof(*rgEnum), NULL } };
do { // Parse the command line
//
dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, pbDone, pArgs, sizeof(pArgs)/sizeof(*pArgs)); BREAK_ON_DWERR( dwErr );
dwValue = RASMON_CMD_ARG_GetDword(&pArgs[0]);
dwErr = RasAaaaServerKeyOpen( RASAAAA_Acct, RASAAAA_F_Provider, &hkProviders); BREAK_ON_DWERR(dwErr);
if (dwValue == 0) { pszProvider = pszGuidRadAcct; } else if (dwValue == 1) { pszProvider = pszGuidWinAcct; } else { pszProvider = L""; } dwErr = RutlRegWriteString( hkProviders, pszRegValActiveProvider, pszProvider); BREAK_ON_DWERR(dwErr);
} while (FALSE);
// Cleanup
//
{ if (hkProviders) { RegCloseKey(hkProviders); } }
return dwErr; }
DWORD RasAaaaHandleSetAuthServ( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR; RASAAAA_AUTH_SERVER Server; RASMON_CMD_ARG pArgs[g_dwArgsAuthCount]; // Initialize
CopyMemory(pArgs, g_pArgsAuth, sizeof(g_pArgsAuth));
do { dwErr = RasAaaaServerInit(RASAAAA_Auth, (PVOID)&Server); BREAK_ON_DWERR(dwErr); // Parse the command line
//
dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, pbDone, pArgs, sizeof(pArgs)/sizeof(*pArgs)); BREAK_ON_DWERR( dwErr );
Server.pszName = RASMON_CMD_ARG_GetPsz(pArgs + 0); Server.pszSecret = RASMON_CMD_ARG_GetPsz(pArgs + 1);
dwErr = RasAaaaServerRead(RASAAAA_Auth, (PVOID)&Server, NULL); BREAK_ON_DWERR(dwErr);
if (RASMON_CMD_ARG_Present(pArgs + 2)) { Server.dwScore = RASMON_CMD_ARG_GetDword(pArgs + 2); } if (RASMON_CMD_ARG_Present(pArgs + 3)) { Server.dwPort = RASMON_CMD_ARG_GetDword(pArgs + 3); } if (RASMON_CMD_ARG_Present(pArgs + 4)) { Server.dwTimeout = RASMON_CMD_ARG_GetDword(pArgs + 4); } if (RASMON_CMD_ARG_Present(pArgs + 5)) { Server.dwSignature = RASMON_CMD_ARG_GetDword(pArgs + 5); }
dwErr = RasAaaaServerWrite(RASAAAA_Auth, (PVOID)&Server, NULL, FALSE); BREAK_ON_DWERR(dwErr);
} while (FALSE);
// Cleanup
//
{ RasAaaaServerCleanup(RASAAAA_Auth, (PVOID)&Server); } return dwErr; }
DWORD RasAaaaHandleSetAcctServ( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR; RASAAAA_ACCT_SERVER Server; RASMON_CMD_ARG pArgs[g_dwArgsAcctCount]; // Initialize
CopyMemory(pArgs, g_pArgsAcct, sizeof(g_pArgsAcct));
do { dwErr = RasAaaaServerInit(RASAAAA_Acct, (PVOID)&Server); BREAK_ON_DWERR(dwErr); // Parse the command line
//
dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, pbDone, pArgs, sizeof(pArgs)/sizeof(*pArgs)); BREAK_ON_DWERR( dwErr );
Server.pszName = RASMON_CMD_ARG_GetPsz(pArgs + 0); Server.pszSecret = RASMON_CMD_ARG_GetPsz(pArgs + 1);
dwErr = RasAaaaServerRead(RASAAAA_Acct, (PVOID)&Server, NULL); BREAK_ON_DWERR(dwErr);
if (RASMON_CMD_ARG_Present(pArgs + 2)) { Server.dwScore = RASMON_CMD_ARG_GetDword(pArgs + 2); } if (RASMON_CMD_ARG_Present(pArgs + 3)) { Server.dwPort = RASMON_CMD_ARG_GetDword(pArgs + 3); } if (RASMON_CMD_ARG_Present(pArgs + 4)) { Server.dwTimeout = RASMON_CMD_ARG_GetDword(pArgs + 4); } if (RASMON_CMD_ARG_Present(pArgs + 5)) { Server.dwMessages = RASMON_CMD_ARG_GetDword(pArgs + 5); }
dwErr = RasAaaaServerWrite(RASAAAA_Acct, (PVOID)&Server, NULL, FALSE); BREAK_ON_DWERR(dwErr);
} while (FALSE);
// Cleanup
//
{ RasAaaaServerCleanup(RASAAAA_Acct, (PVOID)&Server); } return dwErr; }
DWORD RasAaaaHandleShowAuth( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR, dwProvider; DWORD dwNumArgs = dwArgCount - dwCurrentIndex; PWCHAR pszProvider = (PWCHAR)TOKEN_WINDOWS;
do { // Make sure no arguments were passed
//
if (dwNumArgs > 0) { dwErr = ERROR_INVALID_SYNTAX; break; }
dwErr = RasAaaaProviderRead(RASAAAA_Auth, &dwProvider); BREAK_ON_DWERR(dwErr);
if (dwProvider == RASAAAA_Radius) { pszProvider = (PWCHAR)TOKEN_RADIUS; }
DisplayMessage( g_hModule, MSG_RASAAAA_SHOW_AUTH, pszProvider); } while (FALSE);
// Cleanup
{ }
return dwErr; }
DWORD RasAaaaHandleShowAcct( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR, dwProvider; DWORD dwNumArgs = dwArgCount - dwCurrentIndex; PWCHAR pszProvider = NULL;
do { // Make sure no arguments were passed
//
if (dwNumArgs > 0) { dwErr = ERROR_INVALID_SYNTAX; break; }
// Show the authentication provider
//
dwErr = RasAaaaProviderRead(RASAAAA_Acct, &dwProvider); BREAK_ON_DWERR(dwErr);
if (dwProvider == RASAAAA_Radius) { pszProvider = (PWCHAR)TOKEN_RADIUS; } else if (dwProvider == RASAAAA_Windows) { pszProvider = (PWCHAR)TOKEN_WINDOWS; } else { pszProvider = (PWCHAR)TOKEN_NONE; }
DisplayMessage( g_hModule, MSG_RASAAAA_SHOW_ACCT, pszProvider); } while (FALSE);
// Cleanup
{ }
return dwErr; }
DWORD RasAaaaHandleShowAuthServ( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR; RASAAAA_AUTH_SERVER Server; RASMON_CMD_ARG pArgs[] = { { RASMONTR_CMD_TYPE_STRING, {TOKEN_NAME, FALSE, FALSE}, NULL, 0, NULL } };
do { ZeroMemory(&Server, sizeof(Server)); dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, pbDone, pArgs, sizeof(pArgs)/sizeof(*pArgs)); BREAK_ON_DWERR( dwErr );
Server.pszName = RASMON_CMD_ARG_GetPsz(pArgs + 0);
// Display the header
//
DisplayMessage( g_hModule, MSG_RASAAAA_SHOW_AUTHSERV_HDR);
if (Server.pszName) { dwErr = RasAaaaServerRead( RASAAAA_Auth, (PVOID)&Server, NULL); BREAK_ON_DWERR(dwErr);
dwErr = RasAaaaServerAuthShow( (PVOID)&Server, NULL); BREAK_ON_DWERR(dwErr); } else { // Show all the servers
//
dwErr = RasAaaaServerEnum( RASAAAA_Auth, RasAaaaServerAuthShow, NULL); BREAK_ON_DWERR(dwErr); } } while (FALSE);
// Cleanup
{ RasAaaaServerCleanup(RASAAAA_Auth, (PVOID)&Server); }
return dwErr; }
DWORD RasAaaaHandleShowAcctServ( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) { DWORD dwErr = NO_ERROR; RASAAAA_ACCT_SERVER Server; RASMON_CMD_ARG pArgs[] = { { RASMONTR_CMD_TYPE_STRING, {TOKEN_NAME, FALSE, FALSE}, NULL, 0, NULL } };
do { ZeroMemory(&Server, sizeof(Server)); dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, pbDone, pArgs, sizeof(pArgs)/sizeof(*pArgs)); BREAK_ON_DWERR( dwErr );
Server.pszName = RASMON_CMD_ARG_GetPsz(pArgs + 0);
// Display the header
//
DisplayMessage( g_hModule, MSG_RASAAAA_SHOW_ACCTSERV_HDR);
if (Server.pszName) { dwErr = RasAaaaServerRead( RASAAAA_Acct, (PVOID)&Server, NULL); BREAK_ON_DWERR(dwErr);
dwErr = RasAaaaServerAcctShow( (PVOID)&Server, NULL); BREAK_ON_DWERR(dwErr); } else { // Show all the servers
//
dwErr = RasAaaaServerEnum( RASAAAA_Acct, RasAaaaServerAcctShow, NULL); BREAK_ON_DWERR(dwErr); } } while (FALSE);
// Cleanup
{ RasAaaaServerCleanup(RASAAAA_Auth, (PVOID)&Server); }
return dwErr; }
|