// file: /adm/obj/simul_efun/overrides.c // mudlib: originally written for Basis, adapted by TMI-2 // Pallando (93-02-22) Allowed LOGIN_D to use exec. // Buddha (93-04-21) made functions secure to protect against inheritance // Watcher (93-06-28) made the mudlib snoop command the only allowed // snoop originator. // Buddha (93-07-30) Added entries for query_snoop() and query_snooping() // Mobydick (93-111-23) Added void protection on destruct #include <config.h> #include <commands.h> #include <daemons.h> #include <login.h> #include <uid.h> #include <logs.h> int destruct(object destructee) { string destee, dester; if (!destructee || file_name(this_object()) != SIMUL_EFUN_OB) return 0; destee = geteuid(destructee); dester = geteuid(previous_object()); /* let's see if we have the power... */ if (!destee || dester == destee || dester == ROOT_UID || adminp(dester)) return efun::destruct(destructee); /* if not, hopefully this message will go to the right place */ else { write(capitalize(dester) + " is not allowed to destruct " + capitalize(destee) + "\n"); return 0; } } nomask varargs void shutdown(int code) { object prev; seteuid(getuid(this_object())); prev = previous_object(); if (geteuid(prev) != ROOT_UID) { return; } log_file(SHUTDOWN_LOG, "Game shut down by " + (this_player() ? capitalize(geteuid(this_player())) : ROOT_UID) + " at " + ctime(time()) + "\n"); efun::shutdown(code); } nomask varargs object snoop(object snooper, object snoopee) { if (file_name(this_object()) != SIMUL_EFUN_OB) return 0; if (file_name(previous_object()) != CMD_SNOOP) return 0; if (!snoopee) return efun::snoop(snooper); if (!wizardp(snooper)) return 0; if (adminp(snooper) || snoopee->query("snoopable")) { // Don't need this notification now that the snoop command does it. #ifdef 0 if (adminp(snoopee)) tell_object(snoopee, "Game driver tells you: " + (string)snooper->query("cap_name") + " starts snooping you!\n"); #endif return efun::snoop(snooper, snoopee); } return 0; } nomask int exec(object to_obj, object from_obj) { string prev; string New; if (file_name(this_object()) != SIMUL_EFUN_OB){ return 0; } prev = base_name(previous_object()); New = base_name( to_obj ); if( New != CONNECTION && member_array("/std/body.c", deep_inherit_list( to_obj ) ) == -1 ) return 0; if (prev == CONNECTION || prev == CMD_SU || prev == LOGIN_D) { return efun::exec(to_obj, from_obj); } return 0; } nomask int export_uid(object ob) { if (ob == master()) return 0; seteuid(geteuid(previous_object())); return efun::export_uid(ob); } nomask object query_snoop(object who) { string prev; prev = geteuid(previous_object()); if (prev != ROOT_UID && !adminp(prev)) return 0; else return efun::query_snoop(who); } nomask object query_snooping(object who) { string prev; prev = geteuid(previous_object()); if (prev != ROOT_UID && !adminp(prev)) return 0; else return efun::query_snooping(who); } nomask int set_eval_limit(int num) { if ( getuid(previous_object()) != ROOT_UID ) return 0; efun::set_eval_limit(num); return 1; }