/* lockout.c */
#include "config.h"
/*
* This file is part of TeenyMUD II.
* Copyright(C) 1993, 1994, 1995 by Jason Downs.
* All rights reserved.
*
* TeenyMUD II is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* TeenyMUD II is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (see the file 'COPYING'); if not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
*/
#include <stdio.h>
#include <sys/types.h>
#ifdef HAVE_STRING_H
#include <string.h>
#else
#include <strings.h>
#endif /* HAVE_STRING_H */
#ifdef TM_IN_SYS_TIME
#include <sys/time.h>
#else
#include <time.h>
#endif /* TM_IN_SYS_TIME */
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif /* HAVE_STDLIB_H */
#include "conf.h"
#include "teeny.h"
#include "commands.h"
#include "externs.h"
/* lockout routines are here, since they're wholly config options */
struct locklist {
int type;
char *host;
char *mesg;
short shour;
short ehour;
short limit;
struct locklist *next;
};
static struct locklist *lockout = (struct locklist *)NULL;
static struct locklist *allow = (struct locklist *)NULL;
int lockout_add(cmd, host, mesg)
char *cmd, *host, *mesg;
{
struct locklist *new;
int add = 1;
int type;
register char *hptr, *lptr;
if(*cmd == '-') {
add = 0;
cmd++;
} else if(*cmd == '+')
cmd++;
if(!*cmd)
return(-1);
if(strcasecmp(cmd, "lockout") == 0) {
type = LOCK_DISCONNECT;
} else if(strcasecmp(cmd, "register") == 0) {
type = LOCK_REGISTER;
} else
return(-1);
for(hptr = host; *hptr && (*hptr != ':'); hptr++);
if(*hptr == ':') {
*hptr++ = '\0';
for(lptr = hptr; *lptr && (*lptr != ':'); lptr++);
if(*lptr == ':')
*lptr++ = '\0';
else
lptr = (char *)NULL;
} else {
hptr = (char *)NULL;
lptr = (char *)NULL;
}
new = (struct locklist *)ty_malloc(sizeof(struct locklist), "lockout_add");
new->type = type;
new->host = (char *)ty_strdup(host, "lockout_add");
new->mesg = (char *)ty_strdup(mesg, "lockout_add");
if((hptr != (char *)NULL) && *hptr) {
char *yptr, *zptr;
new->shour = (short)strtol(hptr, &yptr, 10);
if((yptr == hptr) || (*yptr != '-')) {
new->shour = -1;
new->ehour = -1;
} else {
if(new->shour >= 100)
new->shour /= 100;
yptr++;
new->ehour = (short)strtol(yptr, &zptr, 10);
if(zptr == yptr) {
new->shour = -1;
new->ehour = -1;
} else {
if(new->ehour >= 100)
new->ehour /= 100;
}
}
} else {
new->shour = -1;
new->ehour = -1;
}
if((lptr != (char *)NULL) && *lptr) {
char *zptr;
new->limit = (short)strtol(lptr, &zptr, 10);
if(zptr == lptr)
new->limit = -1;
} else
new->limit = -1;
/* add it to the right list */
if(add) {
new->next = lockout;
lockout = new;
} else {
new->next = allow;
allow = new;
}
return(0);
}
/* lockout command. */
VOID do_lockout(player, cause, switches, argone, argtwo)
int player, cause, switches;
char *argone, *argtwo;
{
struct locklist *new, *curr;
int type = LOCK_DISCONNECT;
char buffer[MEDBUFFSIZ];
register char *hptr, *lptr;
if(switches & LOCKOUT_CLEAR) {
for(curr = lockout; curr != (struct locklist *)NULL; curr = new) {
new = curr->next;
ty_free((VOID *)curr);
}
for(curr = allow; curr != (struct locklist *)NULL; curr = new) {
new = curr->next;
ty_free((VOID *)curr);
}
lockout = (struct locklist *)NULL;
allow = (struct locklist *)NULL;
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "Lockout lists cleared.",
NOT_QUIET);
return;
}
if(switches & LOCKOUT_REGISTER)
type = LOCK_REGISTER;
if(switches & LOCKOUT_ALL) {
mudstat.logins = LOGINS_DISABLED;
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "All logins disabled.", NOT_QUIET);
return;
}
if(switches & LOCKOUT_ENABLE) {
mudstat.logins = LOGINS_ENABLED;
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "Logins enabled.", NOT_QUIET);
return;
}
if(switches & LOCKOUT_DUMP) {
notify_player(player, cause, player, "Lockout list:", 0);
for(curr = lockout; curr != (struct locklist *)NULL; curr = curr->next) {
if(((curr->shour == -1) || (curr->ehour == -1)) && (curr->limit == -1)) {
snprintf(buffer, sizeof(buffer), "%s: %s \"%s\"",
((curr->type == LOCK_DISCONNECT) ? "lockout" : "register"),
curr->host, ((curr->mesg == (char *)NULL) ? "" : curr->mesg));
} else if(curr->limit == -1) {
snprintf(buffer, sizeof(buffer), "%s: %s [%d-%d] \"%s\"",
((curr->type == LOCK_DISCONNECT) ? "lockout" : "register"),
curr->host, curr->shour, curr->ehour,
((curr->mesg == (char *)NULL) ? "" : curr->mesg));
} else if((curr->shour == -1) || (curr->ehour == -1)) {
snprintf(buffer, sizeof(buffer), "%s: %s {%d} \"%s\"",
((curr->type == LOCK_DISCONNECT) ? "lockout" : "register"),
curr->host, curr->limit,
((curr->mesg == (char *)NULL) ? "" : curr->mesg));
} else {
snprintf(buffer, sizeof(buffer), "%s: %s [%d-%d]{%d} \"%s\"",
((curr->type == LOCK_DISCONNECT) ? "lockout" : "register"),
curr->host, curr->shour, curr->ehour, curr->limit,
((curr->mesg == (char *)NULL) ? "" : curr->mesg));
}
notify_player(player, cause, player, buffer, 0);
}
notify_player(player, cause, player, "Allow list:", 0);
for(curr = lockout; curr != (struct locklist *)NULL; curr = curr->next) {
if(((curr->shour == -1) || (curr->ehour == -1)) && (curr->limit == -1)) {
snprintf(buffer, sizeof(buffer), "%s: %s \"%s\"",
((curr->type == LOCK_DISCONNECT) ? "lockout" : "register"),
curr->host, ((curr->mesg == (char *)NULL) ? "" : curr->mesg));
} else if(curr->limit == -1) {
snprintf(buffer, sizeof(buffer), "%s: %s [%d-%d] \"%s\"",
((curr->type == LOCK_DISCONNECT) ? "lockout" : "register"),
curr->host, curr->shour, curr->ehour,
((curr->mesg == (char *)NULL) ? "" : curr->mesg));
} else if((curr->shour == -1) || (curr->ehour == -1)) {
snprintf(buffer, sizeof(buffer), "%s: %s {%d} \"%s\"",
((curr->type == LOCK_DISCONNECT) ? "lockout" : "register"),
curr->host, curr->limit,
((curr->mesg == (char *)NULL) ? "" : curr->mesg));
} else {
snprintf(buffer, sizeof(buffer), "%s: %s [%d-%d]{%d} \"%s\"",
((curr->type == LOCK_DISCONNECT) ? "lockout" : "register"),
curr->host, curr->shour, curr->ehour, curr->limit,
((curr->mesg == (char *)NULL) ? "" : curr->mesg));
}
notify_player(player, cause, player, buffer, 0);
}
notify_player(player, cause, player, "***End of lists***", 0);
return;
}
if((argone == (char *)NULL) || (argone[0] == '\0')) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "But who do you wish to lockout?",
NOT_QUIET);
return;
}
for(hptr = argone; *hptr && (*hptr != ':'); hptr++);
if(*hptr == ':') {
*hptr++ = '\0';
for(lptr = hptr; *lptr && (*lptr != ':'); lptr++);
if(*lptr == ':')
*lptr++ = '\0';
else
lptr = (char *)NULL;
} else {
hptr = (char *)NULL;
lptr = (char *)NULL;
}
new = (struct locklist *)ty_malloc(sizeof(struct locklist), "do_lockout.new");
new->type = type;
new->host = (char *)ty_strdup(argone, "do_lockout.new");
if((hptr != (char *)NULL) && *hptr) {
char *yptr, *zptr;
new->shour = (short)strtol(hptr, &yptr, 10);
if((yptr == hptr) || (*yptr != '-')) {
new->shour = -1;
new->ehour = -1;
} else {
yptr++;
new->ehour = (short)strtol(yptr, &zptr, 10);
if(zptr == yptr) {
new->shour = -1;
new->ehour = -1;
}
}
} else {
new->shour = -1;
new->ehour = -1;
}
if((lptr != (char *)NULL) && *lptr) {
char *zptr;
new->limit = (short)strtol(lptr, &zptr, 10);
if(zptr == lptr)
new->limit = -1;
} else
new->limit = -1;
if((argtwo != (char *)NULL) && argtwo[0])
new->mesg = (char *)ty_strdup(argtwo, "do_lockout.mesg");
else
new->mesg = (char *)NULL;
if(switches & LOCKOUT_ALLOW) {
new->next = allow;
allow = new;
} else {
new->next = lockout;
lockout = new;
}
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "Entry added.", NOT_QUIET);
}
/* lockout/registration checker for the rest of the system */
int check_host(host, type, mesg)
char *host;
int type;
char **mesg;
{
register struct locklist *entry;
struct tm *now;
*mesg = (char *)NULL;
now = localtime(&mudstat.now);
/* check allow list first */
for(entry = allow; entry != (struct locklist *)NULL; entry = entry->next) {
if((entry->type == type) && quick_wild(entry->host, host)) {
register int ret = 0;
if((entry->shour != -1) && (entry->ehour != -1)) {
ret = !((now->tm_hour >= entry->shour)
&& (now->tm_hour <= entry->ehour));
}
if(entry->limit != -1)
ret = (count_logins(host) <= entry->limit);
*mesg = entry->mesg;
return(ret);
}
}
for(entry = lockout; entry != (struct locklist *)NULL; entry = entry->next) {
if((entry->type == type) && quick_wild(entry->host, host)) {
register int ret = 1;
if((entry->shour != -1) && (entry->ehour != -1)) {
ret = ((now->tm_hour >= entry->shour)
&& (now->tm_hour <= entry->ehour));
}
if(entry->limit != -1)
ret = (count_logins(host) > entry->limit);
*mesg = entry->mesg;
return(ret);
}
}
return(0);
}