windows-nt/Source/XPSP1/NT/net/sfm/afp/service/server/validate.c
2020-09-26 16:20:57 +08:00

710 lines
13 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************************************************/
/** Copyright(c) 1989 Microsoft Corporation. **/
/********************************************************************/
//***
//
// Filename: validate.c
//
// Description: Contains routines to validate AFP_***_INFO structure
// fields. These routines are called to validate information
// passed by the user and information read from the registry.
//
// History:
// July 11,1992. NarenG Created original version.
//
#include "afpsvcp.h"
#include <lmcons.h> // UNLEN and GNLEN
//**
//
// Call: IsAfpServerNameValid
//
// Returns: TRUE - valid
// FALSE - invalid
//
// Description: Validated server name field.
//
BOOL
IsAfpServerNameValid(
IN LPVOID pAfpServerName
)
{
BOOL fValid = TRUE;
DWORD dwLength;
try {
dwLength = STRLEN( (LPWSTR)pAfpServerName );
if ( ( dwLength > AFP_SERVERNAME_LEN ) || ( dwLength == 0 ) )
fValid = FALSE;
}
except( EXCEPTION_EXECUTE_HANDLER ) {
fValid = FALSE;
}
return( fValid );
}
//**
//
// Call: IsAfpServerOptionsValid
//
// Returns: TRUE - valid
// FALSE - invalid
//
// Description: Validates Server options field.
//
BOOL
IsAfpServerOptionsValid(
IN LPVOID pServerOptions
)
{
DWORD ServerOptions = *((LPDWORD)pServerOptions);
BOOL fValid = TRUE;
try {
// Make sure only valid bits are set
//
if ( ServerOptions & ~( AFP_SRVROPT_GUESTLOGONALLOWED |
AFP_SRVROPT_CLEARTEXTLOGONALLOWED |
AFP_SRVROPT_4GB_VOLUMES |
AFP_SRVROPT_MICROSOFT_UAM |
AFP_SRVROPT_NATIVEAPPLEUAM |
AFP_SRVROPT_ALLOWSAVEDPASSWORD ))
fValid = FALSE;
}
except( EXCEPTION_EXECUTE_HANDLER ) {
fValid = FALSE;
}
return( fValid );
}
//**
//
// Call: IsAfpMaxSessionsValid
//
// Returns: TRUE - valid
// FALSE - invalid
//
// Description: Validates Max sessions field.
//
BOOL
IsAfpMaxSessionsValid(
IN LPVOID pMaxSessions
)
{
BOOL fValid = TRUE;
try {
if ( *((LPDWORD)pMaxSessions) > AFP_MAX_ALLOWED_SRV_SESSIONS )
fValid = FALSE;
}
except( EXCEPTION_EXECUTE_HANDLER ) {
fValid = FALSE;
}
return( fValid );
}
//**
//
// Call: IsAfpMsgValid
//
// Returns: TRUE - valid
// FALSE - invalid
//
// Description: Validates message field.
//
BOOL
IsAfpMsgValid(
IN LPVOID pMsg
)
{
BOOL fValid = TRUE;
try {
if ( STRLEN( (LPWSTR)pMsg ) > AFP_MESSAGE_LEN )
fValid = FALSE;
}
except( EXCEPTION_EXECUTE_HANDLER ) {
fValid = FALSE;
}
return( fValid );
}
//**
//
// Call: IsAfpCodePageValid
//
// Returns: TRUE - valid
// FALSE - invalid
//
// Description: Validates code page path.
//
BOOL
IsAfpCodePageValid(
IN LPVOID pCodePagePath
)
{
BOOL fValid = TRUE;
DWORD dwLength;
try {
dwLength = STRLEN( (LPWSTR)pCodePagePath );
if ( ( dwLength == 0 ) || ( dwLength > MAX_PATH ) )
fValid = FALSE;
}
except( EXCEPTION_EXECUTE_HANDLER ) {
fValid = FALSE;
}
return( fValid );
}
//**
//
// Call: IsAfpExtensionValid
//
// Returns: TRUE - valid
// FALSE - invalid
//
// Description: Validated the extension field in the AFP_EXTENSION structure.
//
BOOL
IsAfpExtensionValid(
IN PAFP_EXTENSION pAfpExtension
)
{
BOOL fValid = TRUE;
DWORD dwLength;
try {
// NULL extensions are not allowed
//
dwLength = STRLEN( pAfpExtension->afpe_extension );
if ( ( dwLength == 0 ) || ( dwLength > AFP_EXTENSION_LEN ) )
fValid = FALSE;
STRUPR( pAfpExtension->afpe_extension );
}
except( EXCEPTION_EXECUTE_HANDLER ) {
fValid = FALSE;
}
return( fValid );
}
//**
//
// Call: IsAfpMaxPagedMemValid
//
// Returns: TRUE - valid
// FALSE - invalid
//
// Description: Validates Max. pages memory field.
//
BOOL
IsAfpMaxPagedMemValid(
IN LPVOID pMaxPagedMem
)
{
BOOL fValid = TRUE;
try {
if ((*((LPDWORD)pMaxPagedMem) < AFP_MIN_ALLOWED_PAGED_MEM ) ||
(*((LPDWORD)pMaxPagedMem) > AFP_MAX_ALLOWED_PAGED_MEM ))
fValid = FALSE;
}
except( EXCEPTION_EXECUTE_HANDLER ) {
fValid = FALSE;
}
return( fValid );
}
//**
//
// Call: IsAfpServerInfoValid
//
// Returns: TRUE - valid
// FALSE - invalid
//
// Description: Validates the AFP_SERER_INFO structure.
//
BOOL
IsAfpServerInfoValid(
IN DWORD dwParmNum,
IN PAFP_SERVER_INFO pAfpServerInfo
)
{
// Can only set 5 fields
//
if ( dwParmNum & ~( AFP_SERVER_PARMNUM_MAX_SESSIONS |
AFP_SERVER_PARMNUM_OPTIONS |
AFP_SERVER_PARMNUM_NAME |
AFP_SERVER_PARMNUM_LOGINMSG |
AFP_SERVER_GUEST_ACCT_NOTIFY ))
return( FALSE );
// Null out the fields the are not allowed to be set so that RPC does
// not think that they are valid pointers.
//
pAfpServerInfo->afpsrv_codepage = NULL;
if ( dwParmNum & AFP_SERVER_PARMNUM_NAME ){
if ( pAfpServerInfo->afpsrv_name != NULL ) {
if ( !IsAfpServerNameValid( pAfpServerInfo->afpsrv_name ) )
return( FALSE );
}
}
else
pAfpServerInfo->afpsrv_name = NULL;
if ( dwParmNum & AFP_SERVER_PARMNUM_MAX_SESSIONS ) {
if ( !IsAfpMaxSessionsValid( &(pAfpServerInfo->afpsrv_max_sessions) ))
return( FALSE );
}
if ( dwParmNum & AFP_SERVER_PARMNUM_OPTIONS ){
if ( !IsAfpServerOptionsValid( &(pAfpServerInfo->afpsrv_options) ))
return( FALSE );
}
if ( dwParmNum & AFP_SERVER_PARMNUM_LOGINMSG ){
if ( pAfpServerInfo->afpsrv_login_msg != NULL ) {
if( !IsAfpMsgValid( pAfpServerInfo->afpsrv_login_msg ) )
return( FALSE );
}
}
else
pAfpServerInfo->afpsrv_login_msg = NULL;
return( TRUE );
}
//**
//
// Call: IsAfpTypeCreatorValid
//
// Returns: TRUE - valid
// FALSE - invalid
//
// Description: Validates the AFP_TYPE_CREATOR structure.
//
BOOL
IsAfpTypeCreatorValid(
IN PAFP_TYPE_CREATOR pAfpTypeCreator
)
{
BOOL fValid = TRUE;
DWORD dwLength;
try {
dwLength = STRLEN( pAfpTypeCreator->afptc_type );
if ( ( dwLength == 0 ) || ( dwLength > AFP_TYPE_LEN ) )
fValid = FALSE;
dwLength = STRLEN( pAfpTypeCreator->afptc_creator );
if ( ( dwLength == 0 ) || ( dwLength > AFP_CREATOR_LEN ) )
fValid = FALSE;
dwLength = STRLEN(pAfpTypeCreator->afptc_comment);
if ( dwLength > AFP_ETC_COMMENT_LEN )
fValid = FALSE;
}
except( EXCEPTION_EXECUTE_HANDLER ) {
fValid = FALSE;
}
return( fValid );
}
//**
//
// Call: IsAfpMaxNonPagedMemValid
//
// Returns: TRUE - valid
// FALSE - invalid
//
// Description: Validates the max non-paged memory field.
//
BOOL
IsAfpMaxNonPagedMemValid(
IN LPVOID pMaxNonPagedMem
)
{
BOOL fValid = TRUE;
try {
if ((*((LPDWORD)pMaxNonPagedMem) < AFP_MIN_ALLOWED_NONPAGED_MEM ) ||
(*((LPDWORD)pMaxNonPagedMem) > AFP_MAX_ALLOWED_NONPAGED_MEM ))
fValid = FALSE;
}
except( EXCEPTION_EXECUTE_HANDLER ) {
fValid = FALSE;
}
return( fValid );
}
//**
//
// Call: IsAfpVolumeInfoValid
//
// Returns: TRUE - valid
// FALSE - invalid
//
// Description: Wil validate a volume info structure and the associated
// parm number. If the parm number is zero it is assume that
// the user is trying to add a volume vs. trying to set
// information for that volume. If the parm number is not
// zero, then all string pointer values that are not being
// set by the user, are set to NULL, otherwise RPC might mistake
// these fields for valid string poiters.
//
//
BOOL
IsAfpVolumeInfoValid(
IN DWORD dwParmNum,
IN PAFP_VOLUME_INFO pAfpVolume
)
{
BOOL fValid = TRUE;
if ( !IsAfpVolumeNameValid( pAfpVolume->afpvol_name ) )
return( FALSE );
try {
// User is wants to set info
//
if ( dwParmNum != AFP_VALIDATE_ALL_FIELDS ) {
if ( ~AFP_VOL_PARMNUM_ALL & dwParmNum )
fValid = FALSE;
if ( dwParmNum & AFP_VOL_PARMNUM_PASSWORD ){
// Validate password
//
if ( pAfpVolume->afpvol_password != NULL
&&
( STRLEN(pAfpVolume->afpvol_password) > AFP_VOLPASS_LEN ))
fValid = FALSE;
}
else
pAfpVolume->afpvol_password = NULL;
if ( dwParmNum & AFP_VOL_PARMNUM_PROPSMASK ) {
if ( ~AFP_VOLUME_ALL & pAfpVolume->afpvol_props_mask )
fValid = FALSE;
}
// Set path to NULL since user cannot change this
//
pAfpVolume->afpvol_path = NULL;
}
else {
if ( pAfpVolume->afpvol_password != NULL
&&
( STRLEN(pAfpVolume->afpvol_password) > AFP_VOLPASS_LEN ))
fValid = FALSE;
if ( ~AFP_VOLUME_ALL & pAfpVolume->afpvol_props_mask )
fValid = FALSE;
// Just make sure this is a valid string pointer
//
STRLEN( pAfpVolume->afpvol_path );
}
}
except( EXCEPTION_EXECUTE_HANDLER ) {
fValid = FALSE;
}
return( fValid );
}
//**
//
// Call: IsAfpVolumeNameValid
//
// Returns: TRUE - valid
// FALSE - invalid
//
// Description: Will validate the volume name
//
BOOL
IsAfpVolumeNameValid(
IN LPWSTR lpwsVolumeName
)
{
BOOL fValid = TRUE;
DWORD dwLength;
try {
dwLength = STRLEN( lpwsVolumeName );
if ( ( dwLength > AFP_VOLNAME_LEN ) || ( dwLength == 0 ) )
fValid = FALSE;
}
except( EXCEPTION_EXECUTE_HANDLER ) {
fValid = FALSE;
}
return( fValid );
}
//**
//
// Call: IsAfpDirInfoValid
//
// Returns: TRUE - valid
// FALSE - invalid
//
// Description: Will validate various field in the AFP_VOLUME_INFO
// structure depending on the parm number.
//
BOOL
IsAfpDirInfoValid(
IN DWORD dwParmNum,
IN PAFP_DIRECTORY_INFO pAfpDirInfo
)
{
BOOL fValid = TRUE;
DWORD dwLength;
if ( ~AFP_DIR_PARMNUM_ALL & dwParmNum )
return( FALSE );
try {
// Make sure path is a valid string
//
dwLength = STRLEN( pAfpDirInfo->afpdir_path );
if ( ( dwLength == 0 ) || ( dwLength > MAX_PATH ) )
fValid = FALSE;
if ( dwParmNum & AFP_DIR_PARMNUM_OWNER ) {
dwLength = STRLEN( pAfpDirInfo->afpdir_owner );
if ( ( dwLength == 0 ) || ( dwLength > UNLEN ) )
fValid = FALSE;
}
else
pAfpDirInfo->afpdir_owner = NULL;
if ( dwParmNum & AFP_DIR_PARMNUM_GROUP ){
dwLength = STRLEN( pAfpDirInfo->afpdir_group );
if ( ( dwLength == 0 ) || ( dwLength > GNLEN ) )
fValid = FALSE;
}
else
pAfpDirInfo->afpdir_group = NULL;
if ( dwParmNum & AFP_DIR_PARMNUM_PERMS ) {
if ( ~( AFP_PERM_OWNER_MASK |
AFP_PERM_GROUP_MASK |
AFP_PERM_WORLD_MASK |
AFP_PERM_INHIBIT_MOVE_DELETE |
AFP_PERM_SET_SUBDIRS ) &
pAfpDirInfo->afpdir_perms )
fValid = FALSE;
}
}
except( EXCEPTION_EXECUTE_HANDLER ) {
fValid = FALSE;
}
return( fValid );
}
//**
//
// Call: IsAfpIconValid
//
// Returns: TRUE - valid
// FALSE - invalid
//
// Description: Will validate a AFP_ICON_INFO data structure.
//
BOOL
IsAfpIconValid(
IN PAFP_ICON_INFO pAfpIconInfo
)
{
BOOL fValid = TRUE;
DWORD dwLength;
try {
dwLength = STRLEN( pAfpIconInfo->afpicon_type );
if ( ( dwLength == 0 ) || ( dwLength > AFP_TYPE_LEN ) )
fValid = FALSE;
dwLength = STRLEN( pAfpIconInfo->afpicon_creator );
if ( ( dwLength == 0 ) || ( dwLength > AFP_CREATOR_LEN ) )
fValid = FALSE;
switch( pAfpIconInfo->afpicon_icontype ) {
case ICONTYPE_SRVR:
case ICONTYPE_ICN:
if ( pAfpIconInfo->afpicon_length == ICONSIZE_ICN )
pAfpIconInfo->afpicon_data[pAfpIconInfo->afpicon_length-1];
else
fValid = FALSE;
break;
case ICONTYPE_ICS:
if ( pAfpIconInfo->afpicon_length == ICONSIZE_ICS )
pAfpIconInfo->afpicon_data[pAfpIconInfo->afpicon_length-1];
else
fValid = FALSE;
break;
case ICONTYPE_ICN4:
if ( pAfpIconInfo->afpicon_length == ICONSIZE_ICN4 )
pAfpIconInfo->afpicon_data[pAfpIconInfo->afpicon_length-1];
else
fValid = FALSE;
break;
case ICONTYPE_ICN8:
if ( pAfpIconInfo->afpicon_length == ICONSIZE_ICN8 )
pAfpIconInfo->afpicon_data[pAfpIconInfo->afpicon_length-1];
else
fValid = FALSE;
break;
case ICONTYPE_ICS4:
if ( pAfpIconInfo->afpicon_length == ICONSIZE_ICS4 )
pAfpIconInfo->afpicon_data[pAfpIconInfo->afpicon_length-1];
else
fValid = FALSE;
break;
case ICONTYPE_ICS8:
if ( pAfpIconInfo->afpicon_length == ICONSIZE_ICS8 )
pAfpIconInfo->afpicon_data[pAfpIconInfo->afpicon_length-1];
else
fValid = FALSE;
break;
default:
fValid = FALSE;
}
}
except( EXCEPTION_EXECUTE_HANDLER ) {
fValid = FALSE;
}
return( fValid );
}
//**
//
// Call: IsAfpFinderInfoValid
//
// Returns: TRUE - valid
// FALSE - invalid
//
// Description: Validates the Type, Creator, Path and ParmNum values
//
BOOL
IsAfpFinderInfoValid(
IN LPWSTR pType,
IN LPWSTR pCreator,
IN LPWSTR pData,
IN LPWSTR pResource,
IN LPWSTR pPath,
IN DWORD dwParmNum
)
{
BOOL fValid = TRUE;
try {
if ( dwParmNum & ~AFP_FD_PARMNUM_ALL )
return( FALSE );
if ( STRLEN( pPath ) == 0 )
return( FALSE );
if ( pData != NULL ) {
if ( STRLEN( pData ) == 0 )
return( FALSE );
}
if ( pResource != NULL ) {
if ( STRLEN( pResource ) == 0 )
return( FALSE );
}
if ( pType != NULL ) {
if ( ( STRLEN( pType ) == 0 ) ||
( STRLEN( pType ) > AFP_TYPE_LEN ) )
return( FALSE );
}
if ( pCreator != NULL ) {
if ( ( STRLEN( pCreator ) == 0 ) ||
( STRLEN( pCreator ) > AFP_CREATOR_LEN ) )
return( FALSE );
}
return( TRUE );
}
except( EXCEPTION_EXECUTE_HANDLER ) {
fValid = FALSE;
}
return( fValid );
}