Files
sics/token.c
2016-10-31 15:33:31 +01:00

144 lines
4.1 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 exists ??? !!", 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);
SCSetGrab(pCon,0); /* to enable us to do commands */
SCSendOK(pCon);
return 1;
} else if (strcmp(argv[1], "release") == 0) {
if (SCGetGrab(pCon) != 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 */
snprintf(pBueffel,sizeof(pBueffel)-1, "ERROR: subcommand %s to token NOT understood",
argv[1]);
SCWrite(pCon, pBueffel, eError);
return 0;
}