231 lines
6.5 KiB
C
231 lines
6.5 KiB
C
/********************************************************************/
|
||
/** Copyright(c) 1989 Microsoft Corporation. **/
|
||
/********************************************************************/
|
||
|
||
//***
|
||
//
|
||
// Filename: server.c
|
||
//
|
||
// Description: This module contains support routines for the server
|
||
// category API's for the AFP server service. These routines
|
||
// are called by the RPC runtime.
|
||
//
|
||
// History:
|
||
// December 15,1992. NarenG Created original version.
|
||
//
|
||
#include "afpsvcp.h"
|
||
|
||
//**
|
||
//
|
||
// Call: AfpAdminrServerGetInfo
|
||
//
|
||
// Returns: NO_ERROR
|
||
// ERROR_ACCESS_DENIED
|
||
// non-zero retunrs from AfpServerIOCtrlGetInfo
|
||
//
|
||
// Description: This routine communicates with the AFP FSD to implement
|
||
// the AfpAdminServerGetInfo function.
|
||
//
|
||
DWORD
|
||
AfpAdminrServerGetInfo(
|
||
IN AFP_SERVER_HANDLE hServer,
|
||
OUT PAFP_SERVER_INFO* ppAfpServerInfo
|
||
)
|
||
{
|
||
AFP_REQUEST_PACKET AfpSrp;
|
||
DWORD dwRetCode=0;
|
||
DWORD dwAccessStatus=0;
|
||
|
||
|
||
// Check if caller has access
|
||
//
|
||
if ( dwRetCode = AfpSecObjAccessCheck( AFPSVC_ALL_ACCESS, &dwAccessStatus))
|
||
{
|
||
AFP_PRINT(( "SFMSVC: AfpAdminrServerGetInfo, AfpSecObjAccessCheck failed %ld\n",dwRetCode));
|
||
AfpLogEvent( AFPLOG_CANT_CHECK_ACCESS, 0, NULL,
|
||
dwRetCode, EVENTLOG_ERROR_TYPE );
|
||
return( ERROR_ACCESS_DENIED );
|
||
}
|
||
|
||
if ( dwAccessStatus )
|
||
{
|
||
AFP_PRINT(( "SFMSVC: AfpAdminrServerGetInfo, AfpSecObjAccessCheck returned %ld\n",dwRetCode));
|
||
return( ERROR_ACCESS_DENIED );
|
||
}
|
||
|
||
// Make IOCTL to get info
|
||
//
|
||
AfpSrp.dwRequestCode = OP_SERVER_GET_INFO;
|
||
AfpSrp.dwApiType = AFP_API_TYPE_GETINFO;
|
||
AfpSrp.Type.GetInfo.pInputBuf = NULL;
|
||
AfpSrp.Type.GetInfo.cbInputBufSize = 0;
|
||
|
||
dwRetCode = AfpServerIOCtrlGetInfo( &AfpSrp );
|
||
|
||
if ( dwRetCode != ERROR_MORE_DATA && dwRetCode != NO_ERROR )
|
||
return( dwRetCode );
|
||
|
||
*ppAfpServerInfo = (PAFP_SERVER_INFO)(AfpSrp.Type.GetInfo.pOutputBuf);
|
||
|
||
// Convert all offsets to pointers
|
||
//
|
||
AfpBufOffsetToPointer((LPBYTE)*ppAfpServerInfo,1,AFP_SERVER_STRUCT);
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: AfpAdminrServerSetInfo
|
||
//
|
||
// Returns: NO_ERROR
|
||
// ERROR_ACCESS_DENIED
|
||
// non-zero retunrs from AfpServerIOCtrl
|
||
//
|
||
// Description: This routine communicates with the AFP FSD to implement
|
||
// the AfpAdminServerSetInfo function.
|
||
//
|
||
DWORD
|
||
AfpAdminrServerSetInfo(
|
||
IN AFP_SERVER_HANDLE hServer,
|
||
IN PAFP_SERVER_INFO pAfpServerInfo,
|
||
IN DWORD dwParmNum
|
||
)
|
||
{
|
||
AFP_REQUEST_PACKET AfpSrp;
|
||
PAFP_SERVER_INFO pAfpServerInfoSR;
|
||
DWORD cbAfpServerInfoSRSize;
|
||
DWORD dwRetCode=0;
|
||
DWORD dwAccessStatus=0;
|
||
LPWSTR lpwsServerName = NULL;
|
||
|
||
|
||
|
||
//
|
||
// if this is a "notification" that Guest account changed (disable to enable
|
||
// or vice versa), don't bother checking access for caller: see if guest
|
||
// account was indeed flipped, and let afp server know.
|
||
// NOTICE we don't do (dwParmNum & AFP_SERVER_GUEST_ACCT_NOTIFY) here, as an
|
||
// extra precaution.
|
||
//
|
||
if (dwParmNum == AFP_SERVER_GUEST_ACCT_NOTIFY)
|
||
{
|
||
if (pAfpServerInfo->afpsrv_options ^
|
||
(AfpGlobals.dwServerOptions & AFP_SRVROPT_GUESTLOGONALLOWED))
|
||
{
|
||
AfpGlobals.dwServerOptions ^= AFP_SRVROPT_GUESTLOGONALLOWED;
|
||
}
|
||
else
|
||
{
|
||
AFP_PRINT(( "AFPSVC_server: no change in GuestAcct, nothing done\n"));
|
||
return(NO_ERROR);
|
||
}
|
||
}
|
||
|
||
// Check if caller has access
|
||
//
|
||
if ( dwRetCode = AfpSecObjAccessCheck( AFPSVC_ALL_ACCESS, &dwAccessStatus))
|
||
{
|
||
AFP_PRINT(( "AFPSVC_server: Sorry, accessCheck failed! %ld\n",dwRetCode));
|
||
AfpLogEvent( AFPLOG_CANT_CHECK_ACCESS, 0, NULL,
|
||
dwRetCode, EVENTLOG_ERROR_TYPE );
|
||
return( ERROR_ACCESS_DENIED );
|
||
}
|
||
|
||
if ( dwAccessStatus )
|
||
{
|
||
AFP_PRINT(("AFPSVC_server: Sorry, accessCheck failed at 2! %ld\n",dwAccessStatus));
|
||
return( ERROR_ACCESS_DENIED );
|
||
}
|
||
|
||
// Check to see if the client wants to set the server name as well
|
||
//
|
||
if ( dwParmNum & AFP_SERVER_PARMNUM_NAME )
|
||
{
|
||
lpwsServerName = pAfpServerInfo->afpsrv_name;
|
||
pAfpServerInfo->afpsrv_name = NULL;
|
||
dwParmNum &= (~AFP_SERVER_PARMNUM_NAME);
|
||
}
|
||
|
||
// Make buffer self relative.
|
||
//
|
||
if ( dwRetCode = AfpBufMakeFSDRequest( (LPBYTE)pAfpServerInfo,
|
||
sizeof(SETINFOREQPKT),
|
||
AFP_SERVER_STRUCT,
|
||
(LPBYTE*)&pAfpServerInfoSR,
|
||
&cbAfpServerInfoSRSize ) )
|
||
{
|
||
return( dwRetCode );
|
||
}
|
||
|
||
// Make IOCTL to set info
|
||
//
|
||
AfpSrp.dwRequestCode = OP_SERVER_SET_INFO;
|
||
AfpSrp.dwApiType = AFP_API_TYPE_SETINFO;
|
||
AfpSrp.Type.SetInfo.pInputBuf = pAfpServerInfoSR;
|
||
AfpSrp.Type.SetInfo.cbInputBufSize = cbAfpServerInfoSRSize;
|
||
AfpSrp.Type.SetInfo.dwParmNum = dwParmNum;
|
||
|
||
dwRetCode = AfpServerIOCtrl( &AfpSrp );
|
||
|
||
if ( dwRetCode == NO_ERROR )
|
||
{
|
||
|
||
LPBYTE pServerInfo;
|
||
|
||
// guest-account notification? nothing to write to registry, done here
|
||
if (dwParmNum == AFP_SERVER_GUEST_ACCT_NOTIFY)
|
||
{
|
||
LocalFree( pAfpServerInfoSR );
|
||
return( dwRetCode );
|
||
}
|
||
|
||
// If the client wants to set the servername as well
|
||
//
|
||
if ( lpwsServerName != NULL ) {
|
||
|
||
LocalFree( pAfpServerInfoSR );
|
||
|
||
// Make another self relative buffer with the server name.
|
||
//
|
||
pAfpServerInfo->afpsrv_name = lpwsServerName;
|
||
|
||
dwParmNum |= AFP_SERVER_PARMNUM_NAME;
|
||
|
||
if ( dwRetCode = AfpBufMakeFSDRequest(
|
||
(LPBYTE)pAfpServerInfo,
|
||
sizeof(SETINFOREQPKT),
|
||
AFP_SERVER_STRUCT,
|
||
(LPBYTE*)&pAfpServerInfoSR,
|
||
&cbAfpServerInfoSRSize ) )
|
||
{
|
||
return( dwRetCode );
|
||
}
|
||
AfpSrp.dwRequestCode = OP_SERVER_SET_INFO;
|
||
AfpSrp.dwApiType = AFP_API_TYPE_SETINFO;
|
||
AfpSrp.Type.SetInfo.pInputBuf = pAfpServerInfoSR;
|
||
AfpSrp.Type.SetInfo.cbInputBufSize = cbAfpServerInfoSRSize;
|
||
AfpSrp.Type.SetInfo.dwParmNum = dwParmNum;
|
||
|
||
dwRetCode = AfpServerIOCtrl( &AfpSrp );
|
||
}
|
||
|
||
pServerInfo = ((LPBYTE)pAfpServerInfoSR)+sizeof(SETINFOREQPKT);
|
||
|
||
if (dwRetCode == NO_ERROR)
|
||
{
|
||
dwRetCode = AfpRegServerSetInfo( (PAFP_SERVER_INFO)pServerInfo,
|
||
dwParmNum );
|
||
}
|
||
else
|
||
{
|
||
AFP_PRINT(("AFPSVC_server: AfpServerIOCtrl failed %lx\n",dwRetCode));
|
||
}
|
||
}
|
||
|
||
|
||
LocalFree( pAfpServerInfoSR );
|
||
|
||
return( dwRetCode );
|
||
}
|