/* -*- LPC -*- */
/*
* $Id: bastards.c,v 1.33 2003/08/12 22:56:19 ceres Exp $
*/
#include <access.h>
#include <mail.h>
#include <player_handler.h>
#include <login.h>
#include <playerinfo.h>
#include <playtesters.h>
// 2419200 == 28 days
#define TIMEOUT_TIME 2419200
/*
* New player banning changed by Pinkfish June 1996.
*
* Changed to make the site access stuff timeout. Pinkfish July 1997.
*/
nosave string *names;
mapping site_access; /* Site access control */
mapping suspended;
mapping lockedout;
mapping multiuser;
mapping temp_passwords;
int query_access(object ob);
protected void timeout_access();
private void save_me();
void create() {
seteuid("Root");
site_access = ([ ]);
suspended = ([ ]);
lockedout = ([ ]);
multiuser = ([ ]);
temp_passwords = ([ ]);
if(!unguarded((: restore_object, base_name(this_object()) :)))
write("Failed to restore bastards.\n");
if (!site_access) {
write("mmm, no site access\n");
site_access = ([ ]);
}
if(!lockedout)
lockedout = ([ ]);
if(!multiuser)
multiuser = ([ ]);
if(!temp_passwords) {
temp_passwords = ([ ]);
}
timeout_access();
if (find_object("/room/void"))
move_object(find_object("/room/void"));
}
string query_player_ob(string name) {
if("/secure/master"->query_administrator(name) ||
"/secure/master"->query_lord(name))
return "/global/lord";
if (PLAYER_HANDLER->test_creator(name))
return "/global/creator";
if (PLAYTESTER_HAND->query_playtester(name))
return "/global/playtester";
return "/global/player";
}
int query_prevent_shadow() { return 1; }
/*
* Ok, acces checking stuff...
*/
mapping query_all_access() { return copy(site_access); }
/*
* Look up the address and find out if it is nice and floppy
* Adress is of the format ({ "130", "95", "100", "2" })
*/
int query_access(object ob) {
string tmp;
tmp = query_ip_number(ob);
while(strlen(tmp)) {
if(site_access[tmp])
return site_access[tmp][ACCESS_LEVEL];
tmp = implode((string *)explode(tmp, ".")[0..<2], ".");
}
tmp = query_ip_name(ob);
while(strlen(tmp)) {
if(site_access[tmp])
return site_access[tmp][ACCESS_LEVEL];
tmp = implode(explode(tmp, ".")[1..], ".");
}
return DEFAULT;
}
int query_multi(object ob) {
string tmp;
tmp = query_ip_number(ob);
while(strlen(tmp)) {
if(multiuser[tmp])
return 1;
tmp = implode((string *)explode(tmp, ".")[0..<2], ".");
}
tmp = query_ip_name(ob);
while(strlen(tmp)) {
if(multiuser[tmp])
return 1;
tmp = implode(explode(tmp, ".")[1..], ".");
}
return 0;
}
mapping query_all_multi() { return copy(multiuser); }
string query_reason(string address) {
if(site_access[address])
return site_access[address][ACCESS_REASON];
return 0;
}
protected void add_multi(string address, int multi, int timeout) {
if(!multi)
map_delete(multiuser, address);
else
multiuser[address] = timeout;
}
protected void add_access(string address, int level, string reason,
int timeout) {
site_access[address] = ({ level, reason, timeout });
}
/*
* Runs through the array nibbling all the timed out bits...
*/
protected void timeout_access() {
string bit;
foreach(bit in keys(site_access))
if(site_access[bit][ACCESS_TIMEOUT] < time() ||
site_access[bit][ACCESS_LEVEL] == ACCESS)
map_delete(site_access, bit);
foreach(bit in keys(multiuser))
if(multiuser[bit] < time())
map_delete(multiuser, bit);
}
private void save_me() {
unguarded((: save_object, base_name(this_object()), 2 :));
}
int change_access(string address, int level, string reason, int timeout) {
if(!master()->query_lord(previous_object(-1)) &&
base_name(previous_object()) != "/cmds/creator/ban")
return 0;
if(!stringp(address) || !reason)
return notify_fail("Invalid parameters.\n");
if (!timeout)
timeout = time() + 100 * 24 * 60 * 60;
add_access(address, level, reason, timeout);
save_me();
unguarded((: write_file, "/log/ACCESS", ctime(time())[4..16] + " " +
address+" set to " + PERM_NAMES[level] + " for " + reason +
" until " + ctime(timeout) + " by "+
this_player()->query_name()+".\n" :));
return 1;
}
int change_multi(string address, int multi, int timeout) {
if(!master()->query_lord(previous_object(-1)) &&
base_name(previous_object()) != "/cmds/creator/multipl_ayer")
return 0;
if(!stringp(address))
return notify_fail("Invalid parameters.\n");
if (!timeout)
timeout = time() + 100 * 24 * 60 * 60;
add_multi(address, multi, timeout);
save_me();
unguarded((: write_file, "/log/ACCESS", ctime(time())[4..16] + " " +
address+" set to " + (multi?"allow":"disallow") +
" multiple users until " + ctime(timeout) + " by "+
this_player()->query_name()+".\n" :));
return 1;
}
int suspend_person(string str, int tim, string reason) {
if (!master()->query_lord(previous_object(-1)) &&
base_name(previous_object()) != "/cmds/creator/suspend") {
return 0;
}
if (!PLAYER_HANDLER->test_user(str)) {
return 0;
}
if (!reason) {
reason = "you have been bad";
}
suspended[str] = ({ time() + tim, reason });
save_me();
unguarded((: write_file, "/log/SUSPEND", ctime(time())[4..16] + " " +
str+" suspended until "+ ctime(time()+tim)+" by "+
this_player()->query_name()+" because "+ reason + ".\n" :));
PLAYERINFO_HANDLER->add_entry(this_player(), str, "suspend",
"Suspended until " + ctime(time() + tim) +
" for " + reason);
return 1;
}
int unsuspend_person(string str) {
if (!"/secure/master"->query_lord(previous_object(-1)) &&
base_name(previous_object()) !="/cmds/creator/unsuspend") {
return 0;
}
map_delete(suspended, str);
unguarded((: save_object, base_name(this_object()), 2 :));
unguarded((: write_file, "/log/SUSPEND",
ctime(time())[4..16] + " " + str+" unsuspended.\n" :));
PLAYERINFO_HANDLER->add_entry(this_player(), str, "suspend", "Unsuspended.");
return 1;
}
mixed *query_suspended(string name) {
if (suspended[name]) {
if (suspended[name][SUSPEND_TIME] > time()) {
return copy(suspended[name]);
}
map_delete(suspended, name);
save_me();
}
return suspended[name];
}
int lockout_person(string str, int tim, string reason) {
if (!master()->query_lord(previous_object(-1)) &&
base_name(previous_object()) != "/cmds/player/lockout") {
return 0;
}
if (!PLAYER_HANDLER->test_user(str)) {
return 0;
}
if (!reason) {
reason = "you have been bad";
}
lockedout[str] = ({ time() + tim, reason });
save_me();
unguarded((: write_file, "/log/LOCKOUT",
ctime(time())[4..16] + " " + str+" lockedout until "+
ctime(time()+tim)+" by "+this_player()->query_name()+" because "+
reason + ".\n" :));
PLAYERINFO_HANDLER->add_entry(this_player(), str, "lockedout",
"Locked out until " + ctime(time() + tim) +
" for " + reason);
return 1;
}
mixed *query_lockedout(string name) {
if (lockedout[name]) {
if (lockedout[name][SUSPEND_TIME] > time()) {
return copy(lockedout[name]);
}
map_delete(lockedout, name);
save_me();
}
return lockedout[name];
}
int set_temp_password(string name, string pass) {
temp_passwords[name] = ({ time(), pass });
save_me();
return 1;
}
mixed *query_temp_password(string name) {
int found;
string tmp;
foreach(tmp in keys(temp_passwords)) {
if(temp_passwords[tmp][0] < (time() - TIMEOUT_TIME)) {
map_delete(temp_passwords, tmp);
found = 1;
}
}
if(found)
save_me();
return copy(temp_passwords[name]);
}
void clear_temp_password(string name) {
if(temp_passwords[name]) {
map_delete(temp_passwords, name);
save_me();
}
}