144 lines
4.1 KiB
C
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;
|
|
|
|
}
|