/*++ Copyright (c) 1998 Microsoft Corporation Module Name: routing\netsh\ras\userhndl.c Abstract: Handlers for user commands Revision History: pmay --*/ #include "precomp.h" #pragma hdrstop DWORD HandleUserSet( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description: Handler for setting the ras information for a user Arguments: ppwcArguments - Argument array dwCurrentIndex - ppwcArguments[dwCurrentIndex] is the first arg dwArgCount - ppwcArguments[dwArgCount - 1] is the last arg Return Value: NO_ERROR --*/ { USERMON_PARAMS* pParams = NULL; RAS_USER_0 RasUser0; DWORD dwErr; RASUSER_DATA UserData, *pUserData = &UserData; do { // Initialize ZeroMemory(&RasUser0, sizeof(RasUser0)); ZeroMemory(pUserData, sizeof(RASUSER_DATA)); // Parse the options dwErr = UserParseSetOptions( ppwcArguments, dwCurrentIndex, dwArgCount, &pParams); if (dwErr isnot NO_ERROR) { break; } // Read in the current user settings dwErr = UserGetRasProperties( g_pServerInfo, pParams->pwszUser, &RasUser0); if (dwErr isnot NO_ERROR) { break; } // Merge in the dialin bit if (pParams->lpdwDialin isnot NULL) { RasUser0.bfPrivilege &= ~RASPRIV_DialinPrivilege; RasUser0.bfPrivilege &= ~RASPRIV_DialinPolicy; RasUser0.bfPrivilege |= *(pParams->lpdwDialin); } // Merge in the callback policy if (pParams->lpdwCallback isnot NULL) { RasUser0.bfPrivilege &= ~RASPRIV_NoCallback; RasUser0.bfPrivilege &= ~RASPRIV_AdminSetCallback; RasUser0.bfPrivilege &= ~RASPRIV_CallerSetCallback; RasUser0.bfPrivilege |= *(pParams->lpdwCallback); } // Merge in the callback number if (pParams->pwszCbNumber isnot NULL) { wcscpy(RasUser0.wszPhoneNumber, pParams->pwszCbNumber); if (wcslen(RasUser0.wszPhoneNumber) > 48) { dwErr = ERROR_BAD_FORMAT; break; } } // Make sure that if admin set callback is specified, that we // force the user to specify a callback number. // if ((RasUser0.bfPrivilege & RASPRIV_AdminSetCallback) && (wcscmp(RasUser0.wszPhoneNumber, L"") == 0)) { DisplayMessage( g_hModule, EMSG_RASUSER_MUST_PROVIDE_CB_NUMBER); dwErr = ERROR_CAN_NOT_COMPLETE; break; } // Write out the new user settings // dwErr = UserSetRasProperties( g_pServerInfo, pParams->pwszUser, &RasUser0); if (dwErr isnot NO_ERROR) { break; } // Read back the settings to see what's // new // dwErr = UserGetRasProperties( g_pServerInfo, pParams->pwszUser, &RasUser0); if (dwErr isnot NO_ERROR) { break; } // Display the new user settings pUserData->pszUsername = pParams->pwszUser; CopyMemory(&(pUserData->User0), &RasUser0, sizeof(RAS_USER_0)); UserShowReport(pUserData, NULL); } while (FALSE); // Cleanup { UserFreeParameters(pParams); } return dwErr; } DWORD HandleUserShow( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description: Handler for displaying interfaces Arguments: ppwcArguments - Argument array dwCurrentIndex - ppwcArguments[dwCurrentIndex] is the first arg dwArgCount - ppwcArguments[dwArgCount - 1] is the last arg Return Value: NO_ERROR --*/ { DWORD dwErr = NO_ERROR; RASUSER_DATA UserData, *pUser = &UserData; PFN_RASUSER_ENUM_CB pEnumFunc = UserShowReport; TOKEN_VALUE rgEnumMode[] = { {TOKEN_REPORT, 0}, {TOKEN_PERMIT, 1} }; RASMON_CMD_ARG pArgs[] = { { RASMONTR_CMD_TYPE_STRING, {TOKEN_NAME, FALSE, FALSE}, NULL, 0, NULL }, { RASMONTR_CMD_TYPE_ENUM, {TOKEN_MODE, FALSE, FALSE}, rgEnumMode, sizeof(rgEnumMode)/sizeof(*rgEnumMode), NULL } }; do { // Initialize ZeroMemory(pUser, sizeof(RASUSER_DATA)); // Parse // dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, NULL, pArgs, sizeof(pArgs)/sizeof(*pArgs)); if (dwErr isnot NO_ERROR) { break; } // // Name // pUser->pszUsername = RASMON_CMD_ARG_GetPsz(&pArgs[0]); // // Mode // if (pArgs[1].rgTag.bPresent) { if (pArgs[1].Val.dwValue == 0) { pEnumFunc = UserShowReport; } else if (pArgs[1].Val.dwValue == 1) { pEnumFunc = UserShowPermit; } } // No user, enumerate all // if(pUser->pszUsername is NULL) { dwErr = UserEnumUsers( g_pServerInfo, pEnumFunc, NULL); if (dwErr isnot NO_ERROR) { DisplayMessage( g_hModule, EMSG_UNABLE_TO_ENUM_USERS); } } // Specific user named // else { // Get the user parms // dwErr = UserGetRasProperties( g_pServerInfo, pUser->pszUsername, &(pUser->User0)); if (dwErr isnot NO_ERROR) { break; } // Display user properties // (*pEnumFunc)(pUser, NULL); } } while (FALSE); // Cleanup { RutlFree(pUser->pszUsername); } return dwErr; } DWORD UserParseSetOptions( IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, OUT USERMON_PARAMS** ppParams ) /*++ Routine Description: Converts a set of command line arguments into a USERMON_PARAMS structure. The set operation is assumed. Arguments: ppwcArguments - Argument array dwCurrentIndex - ppwcArguments[dwCurrentIndex] is the first arg dwArgCount - ppwcArguments[dwArgCount - 1] is the last arg ppParams - receives the parameters Return Value: NO_ERROR --*/ { USERMON_PARAMS* pParams = NULL; DWORD i, dwErr; BOOL bDone = FALSE; TOKEN_VALUE rgEnumDialin[] = { {TOKEN_PERMIT, RASPRIV_DialinPrivilege}, {TOKEN_POLICY, RASPRIV_DialinPolicy}, {TOKEN_DENY, 0} }; TOKEN_VALUE rgEnumPolicy[] = { {TOKEN_NONE, RASPRIV_NoCallback}, {TOKEN_CALLER, RASPRIV_CallerSetCallback}, {TOKEN_ADMIN, RASPRIV_AdminSetCallback} }; RASMON_CMD_ARG pArgs[] = { { RASMONTR_CMD_TYPE_STRING, {TOKEN_NAME, TRUE, FALSE}, NULL, 0, NULL }, { RASMONTR_CMD_TYPE_ENUM, {TOKEN_DIALIN,FALSE,FALSE}, rgEnumDialin, sizeof(rgEnumDialin)/sizeof(*rgEnumDialin), NULL }, { RASMONTR_CMD_TYPE_ENUM, {TOKEN_CBPOLICY, FALSE,FALSE}, rgEnumPolicy, sizeof(rgEnumPolicy)/sizeof(*rgEnumPolicy), NULL }, { RASMONTR_CMD_TYPE_STRING, {TOKEN_CBNUMBER, FALSE,FALSE}, NULL, 0, NULL } }; do { // Allocate and initialize the return value // pParams = RutlAlloc(sizeof(USERMON_PARAMS), TRUE); if (pParams is NULL) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; } // Parse the command line // dwErr = RutlParse( ppwcArguments, dwCurrentIndex, dwArgCount, &bDone, pArgs, sizeof(pArgs) / sizeof(*pArgs)); if (dwErr != NO_ERROR) { break; } // Get strings // pParams->pwszUser = RASMON_CMD_ARG_GetPsz(&pArgs[0]); pParams->pwszCbNumber = RASMON_CMD_ARG_GetPsz(&pArgs[3]); // Dialin // if (pArgs[1].rgTag.bPresent) { pParams->lpdwDialin = RutlDwordDup(pArgs[1].Val.dwValue); } // Callback policy // if (pArgs[2].rgTag.bPresent) { pParams->lpdwCallback = RutlDwordDup(pArgs[2].Val.dwValue); } } while (FALSE); // Cleanup // { if (dwErr is NO_ERROR) { *ppParams = pParams; } else { RutlFree(pParams); *ppParams = NULL; } } return dwErr; } DWORD UserFreeParameters( IN USERMON_PARAMS * pParams ) /*++ Routine Description: Frees the parameter structure returned by UserParseSetOptions Arguments: pParams - the parameters to be freed Return Value: NO_ERROR --*/ { if (pParams) { RutlFree(pParams->pwszUser); RutlFree(pParams->lpdwDialin); RutlFree(pParams->lpdwCallback); RutlFree(pParams->pwszCbNumber); RutlFree(pParams); } return NO_ERROR; }