#include "path.h"
/* domain administration room */
#include "access.h"
inherit "/std/room/basic_room";
#define MASTER "/secure/master"
int do_banish(string);
int do_access(); /* Show the current access list. */
int do_suspend(string);
int do_unsuspend(string);
void setup() {
// string *doms, com;
// int i;
set_light(100);
set_short("site-access control room");
add_property("determinate", "the ");
set_long(
"In front of you teem hundreds of small packages. They rush around "+
"yelling out strange numbers and get directed into various parts "+
"of the maze by large mice with red flags. Everything happens at "+
"break neck speed. Every now and then one of the packages "+
"spontaneously combusts.\n"+
"Available commands:\n"+
" ban : Ban a site.\n"+
" access : Show the current access of various sites.\n"+
" suspend : Suspend someones access.\n"+
" unsuspend : Unsuspend someones access.\n");
seteuid("Admin");
add_exit("north", ROOM+"domain_control", "corridor");
} /* setup() */
#if efun_defined(add_action)
#define NUM
#else
#define NUM 1
#endif
void init() {
::init();
if (!interactive(previous_object(NUM))) return 0;
if ("/secure/master"->query_lord(geteuid(previous_object(NUM))))
add_command("ban", "<string>", (:do_banish($4[0]):));
add_command("access", "", (:do_access():));
add_command("suspend", "<string'person'>", (:do_suspend($4[0]):));
add_command("unsuspend", "<string'person'>", (:do_unsuspend($4[0]):));
} /* init() */
int print_access(string bit, mapping bing, int depth, int cols) {
mixed *bits;
int i;
if (this_player() != this_player(1))
return 0;
bits = m_indices(bing);
if (depth == 4) {
/* Do the ident printing... */
for (i=0;i<sizeof(bits);i++)
switch (bing[bits[i]][0]) {
case NO_NEW :
printf("%s@%-=*s", bits[i], cols - strlen(bits[i]), bit +
" set to no new characters.\n");
break;
case NO_ACCESS :
printf("%s@%-=*s", bits[i], cols - strlen(bits[i]), bit +
" set to no characters.\n");
break;
case ACCESS :
printf("%s@%-=*s", bits[i], cols - strlen(bits[i]), bit +
" set to normal access.\n");
break;
}
return 1;
}
for (i=0;i<sizeof(bits);i++)
print_access(bit+"."+bits[i], bing[bits[i]], depth+1, cols);
return 1;
} /* print_access() */
int do_access() {
mixed bing;
if (this_player() != this_player(1))
return 0;
bing = (mixed)"/secure/bastards"->query_all_access();
if (!m_sizeof(bing)) {
notify_fail("No access control defined.\n");
return 0;
}
write("Current access list:\n");
print_access("", bing, 0, (int)this_player()->query_cols());
return 1;
} /* do_access() */
int do_banish(string str) {
string ip, ident, reason;
int level;
if (this_player() != this_player(1))
return 0;
if (!"/secure/master"->high_programmer(geteuid(previous_object())))
return 0;
notify_fail("Syntax: banish <ip number> <ident> <level> <reason>\n"+
" <level> := 0 delete ident, 1 normal access,\n"+
" 2 no new players, 3 No access.\n");
if (!str)
return 0;
if (sscanf(str, "%s %s %d %s", ip, ident, level, reason) != 4)
return 0;
if (!"/secure/bastards"->change_access(explode(ip, "."), ident, level,
reason))
return 0;
write("Access permisions changed.\n");
return 1;
} /* do_banish() */
int do_suspend(string str) {
string reason;
string name;
int tim;
if (this_player() != this_player(1))
return 0;
if (!"/secure/master"->query_lord(geteuid(previous_object())))
return 0;
if (!str || sscanf(str, "%s %d %s", name, tim, reason) != 3) {
notify_fail("Syntax: suspend <name> <time> <reason>\nWhere time is in hours.\n");
return 0;
}
notify_fail("We failed!\n");
if (!"/secure/bastards"->suspend_person(name, tim*60*60, reason))
return 0;
write(name+" suspended until "+ctime(time()+tim*60*60)+"\n");
return 1;
} /* do_suspend() */
int do_unsuspend(string str) {
if (this_player() != this_player(1))
return 0;
if (!"/secure/master"->query_lord(geteuid(previous_object())))
return 0;
notify_fail("We failed!\n");
if (!"/secure/bastards"->unsuspend_person(str))
return 0;
write(str+" unsuspended.\n");
return 1;
} /* do_unsuspend() */