Source code of Windows XP (NT5)
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.
|
|
/********************************************************************/ /** 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 ); }
|