Files
sics/token.c
2000-02-07 10:38:55 +00:00

157 lines
4.6 KiB
C

/*---------------------------------------------------------------------------
S I C S T O K E N
This files implements the SICS token command. Manages the token status
and creates the user interface.
Mark Koennecke, January 1998
copyright: see copyright.h
-----------------------------------------------------------------------------*/
#include "sics.h"
#include "token.h"
#include "status.h"
/*---------------------- token Management ----------------------------------*/
static int iToken = 0;
static char pTokenPassword[256];
/*--------------------------------------------------------------------------*/
int TokenGrabActive(void)
{
return iToken;
}
/*-------------------------------------------------------------------------*/
void TokenRelease(void)
{
iToken = 0;
}
/*-------------------------------------------------------------------------*/
int TokenInit(SConnection *pCon, SicsInterp *pSics, void *pData,
int argc, char *argv[])
{
int iRet;
/* we need a password for token forcing as a parameter */
if(argc < 2)
{
SCWrite(pCon,"ERROR: I need a password for token forcing!", eError);
return 0;
}
if(strlen(argv[1]) > 255)
{
SCWrite(pCon, "ERROR: TokenPassword to long!",eError);
return 0;
}
memset(pTokenPassword,0,255);
strcpy(pTokenPassword,argv[1]);
/* create command */
iRet = AddCommand(pSics,
"token",
TokenWrapper,
NULL,
NULL);
if(!iRet)
{
SCWrite(pCon,"ERROR: token command already exixts???!!",eError);
}
return iRet;
}
/*-------------------------------------------------------------------------*/
int TokenWrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
int argc, char *argv[])
{
char pBueffel[256];
if(argc < 2)
{
SCWrite(pCon,"ERROR: expected subcommand to token",eError);
return 0;
}
/* handle grab */
if(strcmp(argv[1],"grab") == 0)
{
/* check user rights */
if(usUser < SCGetRights(pCon))
{
SCWrite(pCon,"ERROR: you are not authorised to grab anything at all!",
eError);
return 0;
}
/* is there already a grab? */
if(iToken)
{
SCWrite(pCon,"ERROR: Somebody else has already control! You are REJECTED",
eError);
return 0;
}
/* is somebody doing a scan ? */
if(GetStatus() != eEager)
{
SCWrite(pCon,"ERROR: you cannot grab control while a scan is still running",
eError);
return 0;
}
/* we can do it */
iToken = 1;
TaskSignal(pServ->pTasker,TOKENGRAB,NULL);
pCon->iGrab = 0; /* to enable us to do commands */
SCSendOK(pCon);
return 1;
}
else if(strcmp(argv[1],"release") == 0)
{
if(pCon->iGrab != 0)
{
SCWrite(pCon,"ERROR: you cannot release somebody elses control token!",
eError);
return 0;
}
iToken = 0;
TaskSignal(pServ->pTasker,TOKENRELEASE,NULL);
SCSendOK(pCon);
return 1;
}
else if(strcmp(argv[1],"force") == 0)
{
/* check force password */
if(argc < 3)
{
SCWrite(pCon,"ERROR: I need a password for this operation! Request REJECTED",
eError);
return 0;
}
if(strcmp(argv[2],pTokenPassword) == 0)
{
if(usMugger < SCGetRights(pCon))
{
SCWrite(pCon,"ERROR: Manager privilege required to force your way into a SICS server",
eError);
SCWrite(pCon,"ERROR: You are REJECTED",eError);
return 0;
}
iToken = 0;
TaskSignal(pServ->pTasker,TOKENRELEASE,0);
SCWrite(pCon,"Token forcefully released, no grab active",eWarning);
return 1;
}
else
{
SCWrite(pCon,"ERROR: The specified password is WRONG!",eError);
SCWrite(pCon,"ERROR: Your request has been REJECTED",eError);
return 0;
}
}
/* default */
sprintf(pBueffel,"ERROR: subcommand %s to token NOT understood",
argv[1]);
SCWrite(pCon,pBueffel,eError);
return 0;
}