lima-1.0b5/
lima-1.0b5/driver/
lima-1.0b5/driver/ChangeLog.old/
lima-1.0b5/driver/Win32/
lima-1.0b5/driver/compat/
lima-1.0b5/driver/include/
lima-1.0b5/driver/testsuite/
lima-1.0b5/driver/testsuite/clone/
lima-1.0b5/driver/testsuite/command/
lima-1.0b5/driver/testsuite/data/
lima-1.0b5/driver/testsuite/etc/
lima-1.0b5/driver/testsuite/include/
lima-1.0b5/driver/testsuite/inherit/
lima-1.0b5/driver/testsuite/inherit/master/
lima-1.0b5/driver/testsuite/log/
lima-1.0b5/driver/testsuite/single/
lima-1.0b5/driver/testsuite/single/tests/compiler/
lima-1.0b5/driver/testsuite/single/tests/efuns/
lima-1.0b5/driver/testsuite/single/tests/operators/
lima-1.0b5/driver/testsuite/u/
lima-1.0b5/driver/tmp/
lima-1.0b5/etc/
lima-1.0b5/lib/WWW/help/
lima-1.0b5/lib/cmds/
lima-1.0b5/lib/cmds/create/
lima-1.0b5/lib/cmds/player/attic/
lima-1.0b5/lib/contrib/bboard/
lima-1.0b5/lib/contrib/boards/
lima-1.0b5/lib/contrib/marriage/
lima-1.0b5/lib/contrib/roommaker/
lima-1.0b5/lib/contrib/transient_effect/
lima-1.0b5/lib/daemons/channel/
lima-1.0b5/lib/daemons/imud/
lima-1.0b5/lib/data/
lima-1.0b5/lib/data/config/
lima-1.0b5/lib/data/links/
lima-1.0b5/lib/data/news/
lima-1.0b5/lib/data/players/
lima-1.0b5/lib/data/secure/
lima-1.0b5/lib/domains/
lima-1.0b5/lib/domains/std/2.4.5/maze1/
lima-1.0b5/lib/domains/std/2.4.5/npc/
lima-1.0b5/lib/domains/std/2.4.5/post_dir/
lima-1.0b5/lib/domains/std/2.4.5/sub/
lima-1.0b5/lib/domains/std/camera/
lima-1.0b5/lib/domains/std/config/
lima-1.0b5/lib/domains/std/cult/
lima-1.0b5/lib/domains/std/effects/
lima-1.0b5/lib/domains/std/misc/
lima-1.0b5/lib/domains/std/monsters/
lima-1.0b5/lib/domains/std/recorder/
lima-1.0b5/lib/domains/std/rooms/
lima-1.0b5/lib/domains/std/rooms/beach/
lima-1.0b5/lib/domains/std/rooms/labyrinth/
lima-1.0b5/lib/domains/std/school/
lima-1.0b5/lib/domains/std/school/O/
lima-1.0b5/lib/domains/std/spells/
lima-1.0b5/lib/domains/std/spells/stock-mage/
lima-1.0b5/lib/domains/std/spells/stock-priest/
lima-1.0b5/lib/help/
lima-1.0b5/lib/help/admin/
lima-1.0b5/lib/help/hints/General_Questions/
lima-1.0b5/lib/help/hints/Pirate_Quest/
lima-1.0b5/lib/help/player/
lima-1.0b5/lib/help/player/bin/
lima-1.0b5/lib/help/player/quests/
lima-1.0b5/lib/help/wizard/
lima-1.0b5/lib/help/wizard/coding/guilds/
lima-1.0b5/lib/help/wizard/coding/rooms/
lima-1.0b5/lib/help/wizard/lib/daemons/
lima-1.0b5/lib/help/wizard/lib/lfun/
lima-1.0b5/lib/help/wizard/lib/std/
lima-1.0b5/lib/help/wizard/mudos_doc/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/interactive/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/concepts/
lima-1.0b5/lib/help/wizard/mudos_doc/driver/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/arrays/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/buffers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/compile/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/filesystem/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/floats/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/functions/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/general/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mappings/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mixed/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/numbers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/constructs/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/types/
lima-1.0b5/lib/include/driver/
lima-1.0b5/lib/log/
lima-1.0b5/lib/obj/admtool/
lima-1.0b5/lib/obj/admtool/internal/
lima-1.0b5/lib/obj/admtool/mudinfo/
lima-1.0b5/lib/obj/admtool/secure/
lima-1.0b5/lib/obj/secure/
lima-1.0b5/lib/obj/secure/cmd/
lima-1.0b5/lib/obj/secure/mailers/
lima-1.0b5/lib/obj/secure/shell/
lima-1.0b5/lib/obj/secure/shell/classes/
lima-1.0b5/lib/obj/tasktool/
lima-1.0b5/lib/obj/tasktool/internal/
lima-1.0b5/lib/open/
lima-1.0b5/lib/secure/
lima-1.0b5/lib/secure/cgi/
lima-1.0b5/lib/secure/modules/
lima-1.0b5/lib/secure/simul_efun/
lima-1.0b5/lib/std/adversary/
lima-1.0b5/lib/std/adversary/advancement/
lima-1.0b5/lib/std/adversary/armor/
lima-1.0b5/lib/std/adversary/blows/
lima-1.0b5/lib/std/adversary/death/
lima-1.0b5/lib/std/adversary/formula/
lima-1.0b5/lib/std/adversary/health/
lima-1.0b5/lib/std/adversary/pulse/
lima-1.0b5/lib/std/adversary/wield/
lima-1.0b5/lib/std/classes/event_info/
lima-1.0b5/lib/std/container/
lima-1.0b5/lib/std/living/
lima-1.0b5/lib/std/modules/contrib/
lima-1.0b5/lib/std/patterns/
lima-1.0b5/lib/std/race/
lima-1.0b5/lib/std/race/restricted/
lima-1.0b5/lib/std/room/
lima-1.0b5/lib/tmp/
lima-1.0b5/lib/trans/
lima-1.0b5/lib/trans/admincmds/
lima-1.0b5/lib/trans/obj/
lima-1.0b5/lib/wiz/
/* Do not remove the headers from this file! see /USAGE for more info. */

/*
** user_d.c -- user/body information access
**
** Interface:
**
**   mixed * query_variable(string userid, string * varlist)
**
**     Return an array of variable values.  0 is returned if
**     the specified user does not exist.
**
**
**   void set_variable(string userid, string varname, mixed value)
**
**     Set a variable to some value in the specified user.  An
**     error is thrown if the user does not exist.
**
**
** The calls are not orthogonal (one queries multiple, one sets a
** single value).  This is because we do not want to error() on the
** query of a non-existent user.  If the query returned a single
** value, then there would be no way to represent "no such user."
** Further, requesting multiple values with individual requests
** would be dog slow.
**
** NOTE: On both calls, you must have privilege 1 for them to succeed.
**       This is because bind() is used to access user/body objects and
**       because the save files for the user/body are read-protected.
**       In both cases, privilege 1 is required to fulfill the request.
**
** 950823, Deathblade: created
*/

#include <mudlib.h>
#include <security.h>

inherit M_ACCESS;

nosave private string *	legal_user_query =
({
    "failures",
    "email",
    "real_name",
    "password",
    "url",
});
nosave private string *	legal_user_set =
({
    "failures",
    "password",
});

nosave private string *	legal_body_query =
({
    "nickname",
    "plan",		/* only when EVERYONE_HAS_A_PLAN */
    "wiz_position",
    "title",		/* only when USE_TITLES */
});
nosave private string *	legal_body_set =
({
    "plan",		/* only when EVERYONE_HAS_A_PLAN */
    "wiz_position",
});

class var_info
{
    object	ob;
    string	fname;
    string *	lines;
}

void create() {
    set_privilege(1);
}

private nomask mixed query_online_object(object ob, string varname)
{
    return evaluate(bind((: fetch_variable, varname :), ob));
}

private nomask mixed set_online_object(object ob, string varname, mixed value)
{
    evaluate(bind((: store_variable, varname, value :), ob));
}

private nomask mixed query_filed_object(string * lines, string varname)
{
    lines = regexp(lines, "^" + varname + " ");
    if ( !sizeof(lines) )
	return 0;
    return restore_variable(lines[0][sizeof(varname) + 1..]);
}

nomask mixed * query_variable(string userid, string * vlist)
{
    class var_info user;
    class var_info body;
    class var_info which;
    mixed * results;
    string var;

    if ( !check_privilege(1) )
	error("insufficient privilege to query variables\n");

    results = ({ });
    
    foreach ( var in vlist )
    {
	if ( member_array(var, legal_user_query) != -1 )
	{
	    if ( !user )
	    {
		user = new(class var_info);
		user->ob = find_user(userid);
		user->fname = LINK_PATH(userid) + __SAVE_EXTENSION__;
	    }

	    which = user;
	}
	else if ( member_array(var, legal_body_query) != -1 )
	{
	    if ( !body )
	    {
		body = new(class var_info);
		body->ob = find_body(userid);
		body->fname = USER_PATH(userid) + __SAVE_EXTENSION__;
	    }

	    which = body;
	}
	else
	    error("illegal variable request\n");

	if ( which->ob )
	{
	    results += ({ query_online_object(which->ob, var) });
	}
	else
	{
	    if ( !which->lines )
	    {
		if ( !is_file(which->fname) )
		{
		    /* no such player */
		    return 0;
		}

		which->lines = explode(read_file(which->fname), "\n");
	    }

	    results += ({ query_filed_object(which->lines, var) });
	}
    }

    return results;
}

nomask void set_variable(string userid, string varname, mixed value)
{
    string fname;
    object ob;
    mixed * lines;

    if ( !check_privilege(1) )
	error("insufficient privilege to set variables\n");

    if ( member_array(varname, legal_user_set) != -1 )
    {
	fname = LINK_PATH(userid);
	ob = find_user(userid);
    }
    else if ( member_array(varname, legal_body_set) != -1 )
    {
	fname = USER_PATH(userid);
	ob = find_body(userid);
    }

    if ( !fname )
	error("illegal variable assignment\n");

    if ( ob )
	return set_online_object(ob, varname, value);

    fname += __SAVE_EXTENSION__;
    if ( !is_file(fname) )
	error("no such user\n");

    lines = regexp(explode(read_file(fname), "\n"),
		  "^" + varname + " ",
		   2);
    write_file(fname, implode(lines, "\n") +
	       sprintf("\n%s %s\n", varname, save_variable(value)),
	       1);
}

nomask int user_exists(string s)
{
  return unguarded(1, (: is_file(LINK_PATH($(s)) + __SAVE_EXTENSION__) :));
}