windows-nt/Source/XPSP1/NT/net/rras/netsh/ras/userhndl.c

481 lines
11 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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;
}