Ejemplo n.º 1
0
int message_done()
{
	ACCESS_CHECK(previous_object() <- LIB_CONN);
	ACCESS_CHECK(previous_object()->query_user() == this_object());

	return call_limited("limited_message_done");
}
Ejemplo n.º 2
0
void logout(int quit)
{
	ACCESS_CHECK(previous_object() <- LIB_CONN);
	ACCESS_CHECK(previous_object()->query_user() == this_object());

	call_limited("limited_logout", quit);
}
Ejemplo n.º 3
0
int receive_message(string str)
{
	ACCESS_CHECK(previous_object() <- LIB_CONN);
	ACCESS_CHECK(previous_object()->query_user() == this_object());

	return call_limited("limited_receive_message", str);
}
Ejemplo n.º 4
0
int login(string str)
{
	ACCESS_CHECK(previous_object() <- LIB_CONN);
	ACCESS_CHECK(previous_object()->query_user() == this_object());

	return call_limited("limited_login", str);
}
Ejemplo n.º 5
0
void receive_datagram(string packet)
{
	ACCESS_CHECK(previous_object() <- LIB_CONN);
	ACCESS_CHECK(previous_object()->query_user() == this_object());

	call_limited("limited_receive_datagram", packet);
}
Ejemplo n.º 6
0
void open_datagram()
{
	ACCESS_CHECK(previous_object() <- LIB_CONN);
	ACCESS_CHECK(previous_object()->query_user() == this_object());

	call_limited("limited_open_datagram");
}
Ejemplo n.º 7
0
void begin()
{
	int i;

	ACCESS_CHECK(previous_object() == query_user());

	::begin();

	speed = 5.0;
	send_out("\033[1;1H\033[2J");

	particles = allocate(NPARTICLES);

	for (i = 0; i < NPARTICLES; i++) {
		float *particle;
		particle = particles[i] = allocate_float(3);

		do {
			particle[2] = (1.0 - pow(MATHD->rnd(), 2.0)) * 11.0;
		} while (particle[2] < 1.0);

		particle[0] = (MATHD->rnd() * 80.0 - 40.0) * particle[2];
		particle[1] = (MATHD->rnd() * 27.5 - 15.0) * particle[2];
	}
}
Ejemplo n.º 8
0
// They answered our finger request.  Nice of them.
void incoming_request(mapping info)
{
   object ob;
   mapping mudinfo;

   if(!ACCESS_CHECK(previous_object())) return;

   if (info["PORTUDP"] && info["NAME"]) {
     // dont want to finger ourselves
     if (info["NAME"] == Mud_name()) return ;

     // if we haven't got an entry for the mud, get one.
     if (!DNS_MASTER->dns_mudp(info["NAME"]))
        PING_Q->send_ping_q(info["HOSTADDRESS"], info["PORTUDP"]);

     // send the info to the player
     ob = find_player(info["ASKWIZ"]);
     if (ob) {
       mudinfo=DNS_MASTER->query_mud_info(info["NAME"]);
       message("finger", "\n"+
         ((!mudinfo || undefinedp(mudinfo["MUDNAME"]))?
           info["NAME"]:mudinfo["MUDNAME"])+
           "告诉你:\n"+info["MSG"],ob);
     }      
   }
}
Ejemplo n.º 9
0
// We received an answer answer to our 'do you support xx' request.
void incoming_request(mapping info)
{
	int idx;




	if(!ACCESS_CHECK(previous_object())) return;




	if (stringp(info["PORTUDP"]) && stringp(info["NAME"])) {
		// don't want requests from ourself
		if (info["NAME"] == Mud_name()) return ;




		// if we don't have an entry for the mud, then we ping it
		if (!DNS_MASTER->dns_mudp(info["NAME"]))
			PING_Q->send_ping_q(info["HOSTADDRESS"], info["PORTUDP"]);




		if(info["ANSWERID"] && sscanf(info["ANSWERID"], "%d", idx))
			index_call(idx, info);
	}
}
Ejemplo n.º 10
0
int authenticate(string trial_password)
{
	ACCESS_CHECK(ACCOUNT());

	if (!password) {
		return !trial_password;
	}

	if (password == hash_string("crypt", trial_password, password)) {
		return TRUE;
	}

	if (password == hash_string("SHA1", trial_password)) {
		set_password(trial_password);
		return TRUE;
	}

	if (password == hash_string("MD5", trial_password)) {
		set_password(trial_password);
		return TRUE;
	}

	if (password == hash_string("crypt", trial_password, name)) {
		set_password(trial_password);
		return TRUE;
	}
}
Ejemplo n.º 11
0
// Support.  Do we support this protocol?
void incoming_request(mapping info)
{
	if(!ACCESS_CHECK(previous_object())) return;

	if (stringp(info["NAME"]) && stringp(info["PORTUDP"])) {
		// dont want requests from ourself
		if(info["NAME"] == Mud_name()) return;

		if(!DNS_MASTER->dns_mudp(info["NAME"]))
			PING_Q->send_ping_q(info["HOSTADDRESS"], info["PORTUDP"]);

		// if the file exists that is enough to know that we support
		// it, unless there is a param request, in which case we have
		// to call_other to the file to check.
		if( file_size(AUX_PATH+info["CMD"]+".c") <= 0
		||	(!undefinedp(info["PARAM"])
		&&	call_other(AUX_PATH+info["CMD"], "support_"+info["PARAM"]))) {
			// we don't support it
			DNS_MASTER->send_udp(info["HOSTADDRESS"], info["PORTUDP"],
				sprintf("@@@%s||NAME:%s||PORTUDP:%d||CMD:%s||NOTSUPPORTED:yes||ANSWERID:%s@@@\n",
					DNS_SUPPORT_A, Mud_name(), udp_port(),
					info["CMD"]+ (!undefinedp(info["PARAM"]) ? "||PARAM:"+info["PARAM"] : ""),
					info["ANSWERID"]));
		} else {
			// we do support it
			DNS_MASTER->send_udp(info["HOSTADDRESS"], info["PORTUDP"],
				sprintf("@@@%s||NAME:%s||PORTUDP:%d||CMD:%s||SUPPORTED:yes||ANSWERID:%s@@@\n",
					DNS_SUPPORT_A, Mud_name(), udp_port(),
					info["CMD"]+(!undefinedp(info["PARAM"]) ? "||PARAM:"+info["PARAM"] : ""),
					info["ANSWERID"]));
		}
	} //if (stringp(info["NAME"]) && stringp(info["PORTUDP"]))
}
Ejemplo n.º 12
0
void open_datagram()
{
	ACCESS_CHECK(previous_program() == LIB_CONN
		|| calling_object() == this_object());

	conn::open_datagram(nil);
}
Ejemplo n.º 13
0
int send_gtell(string mud, string wiz_to, object source, string msg)
{
	mapping minfo;

	if (! ACCESS_CHECK(previous_object()) &&
	    is_root(previous_object())) return 0;

	mud = htonn(mud);
	if (mud == mud_nname() || ! source) return 0;

	minfo = (mapping)DNS_MASTER->query_mud_info(mud);
	if (! minfo)
        {
                write(LOCAL_MUD_NAME() + "并没有和 " + mud + " 联系上。\n");
                return 0;
        }


	msg = replace_string(msg, "|", "");
	msg = replace_string(msg, "@@@", "");
	DNS_MASTER->send_udp(minfo["HOSTADDRESS"], minfo["PORTUDP"],
		"@@@" + DNS_GTELL +
		"||NAME:" + Mud_name() +
		"||PORTUDP:" + udp_port() +
		"||WIZTO:" + wiz_to +
		"||WIZFROM:" + capitalize(source->query("id")) +
		"||CNAME:" + source->name(1) +
                "||WIZ_LEVEL:" + wiz_level(source) +
		"||MSG:" + msg + "@@@\n");
        return 1;
}
Ejemplo n.º 14
0
void disconnect()
{
	ACCESS_CHECK(previous_object() == query_user()
		|| calling_object() == this_object());

	user::disconnect();
}
Ejemplo n.º 15
0
void datagram_challenge(string str)
{
	ACCESS_CHECK(previous_object() == query_user()
		|| calling_object() == this_object());

	user::datagram_challenge(str);
}
Ejemplo n.º 16
0
int message(string str)
{
	ACCESS_CHECK(previous_object() == query_user()
		|| calling_object() == this_object());

	return user::message(str);
}
Ejemplo n.º 17
0
void receive_datagram(string packet)
{
	ACCESS_CHECK(previous_program() == LIB_CONN
		|| calling_object() == this_object());

	conn::receive_datagram(nil, packet);
}
Ejemplo n.º 18
0
object get_wiztool(string user)
{
	object wiztool;
	int firstchar;

	string creator;

	ACCESS_CHECK(PRIVILEGED() || INTERFACE());

	creator = DRIVER->creator(previous_program());

	CHECKARG(user && user != "" &&
		STRINGD->is_valid_username(user), 1, "get_proxy");

	check_security(user, creator);

	wiztool = new_object("~/lwo/wiztool", user);

	if (audit) {
		INITD->message("Wiztool being issued to " +
			creator + " for " + user);
	}

	return wiztool;
}
Ejemplo n.º 19
0
int datagram(string str)
{
	ACCESS_CHECK(previous_object() == query_user()
		|| calling_object() == this_object());

	return user::datagram(str);
}
Ejemplo n.º 20
0
void set_mode(int new_mode)
{
	object conn;

	ACCESS_CHECK(previous_program() == LIB_CONN || SYSTEM() ||
		calling_object() == this_object());

	if (!this_object() || !query_conn() || new_mode == MODE_NOCHANGE) {
		return;
	}

	/* we have to do it this way because set_mode is also called to handle return values for hooks in the user object */
	/* this can happen more than once in a connection chain, so we need to intercept disconnects and do them */
	/* in a 0 callout to avoid double destruction */

	/* since network events are asynchronous anyway we aren't causing any actual harm */
	if (new_mode == MODE_DISCONNECT) {
		query_conn()->set_mode(MODE_BLOCK);
		conn::close(nil, 1);
		call_out("self_disconnect", 0);
		return;
	}

	query_conn()->set_mode(new_mode);
}
Ejemplo n.º 21
0
object get_proxy(string user)
{
	object proxy;
	int firstchar;

	string creator;

	ACCESS_CHECK(PRIVILEGED() || INTERFACE());

	creator = DRIVER->creator(previous_program());

	CHECKARG(user && user != "" &&
		STRINGD->is_valid_username(user), 1, "get_proxy");

	check_security(user, creator);

	proxy = new_object("~/lwo/proxy", user);

	/* only the object who requested a proxy is allowed to use it */
	proxy->set_client(previous_object());

	if (audit) {
		INITD->message("User access proxy being issued to " +
			creator + " for " + user + ", assigned to " +
			object_name(previous_object()));
	}

	return proxy;
}
Ejemplo n.º 22
0
// Someone has ping'd us
void incoming_request(mapping info)
{
	if(!ACCESS_CHECK(previous_object())) return;




	if(info["NAME"] == Mud_name()) {
		dns_warning("ping_q::incoming_request: ping from ourselves\n");
		// we pinged ourselves!
		return;
	}




	if (info["PORTUDP"]) {
		// check we have an entry for the sender
		if (!DNS_MASTER->dns_mudp(info["NAME"]))
			PING_Q->send_ping_q(info["HOSTADDRESS"], info["PORTUDP"]);




		// send a ping answer along with our mud info
		DNS_MASTER->send_udp(info["HOSTADDRESS"], info["PORTUDP"],
			"@@@" + DNS_PING_A + (string)DNS_MASTER->start_message()+ "@@@\n");
    }
}
Ejemplo n.º 23
0
void incoming_request(mapping info)
{
	object ob;
	string msg;
	mapping minfo;

	if( !ACCESS_CHECK(previous_object())) return;

	minfo = (mapping)DNS_MASTER->query_mud_info(info["NAME"]);
	if (!minfo) return ;

	if (stringp(info["PORTUDP"]) && stringp(info["HOSTADDRESS"])) {
		if (info["NAME"] == Mud_name())	return ;
		if (!DNS_MASTER->dns_mudp(info["NAME"]))
			PING_Q->send_ping_q(info["HOSTADDRESS"], info["PORTUDP"]);
		ob = find_player(lower_case(info["SOURCE_ID"]));
		if (!ob) return;

		msg = EMOTE_D->do_emote(ob,lower_case(info["MSG"]),info["TARGET"],4);

#ifdef DEBUG
	CHANNEL_D->do_channel(this_object(), DEBUG, sprintf("%s %s.\n",info["MSG"],info["TARGET"] ));
#endif

		if (!stringp(msg)) {
			CHANNEL_D->do_channel(ob,"sys","error : Nothing get from emoted.c");
			return;
			}

		if(!userp(ob)) return;
		CHANNEL_D->do_channel(ob, info["CHANNEL"],msg,1,1);

	}
}
Ejemplo n.º 24
0
nomask void _F_touch(string func)
{
	object this;
	string name;
	string path;
	string *patches;
	int oindex;
	int sz;

	ACCESS_CHECK(previous_program() == OBJECTD);

	this = this_object();

	name = object_name(this);

	if (!sscanf(name, "%*s#%d", oindex)) {
		oindex = status(this, O_INDEX);
	}

	patches = TOUCHD->query_patches(oindex);
	TOUCHD->clear_patches(oindex);

	if (patches) {
		for (sz = sizeof(patches) - 1; sz >= 0; --sz) {
			catch {
				call_other(this_object(), patches[sz]);
			}
		}
	}

	touch();
}
Ejemplo n.º 25
0
cp_grant_id_t
cpf_grant_magic(endpoint_t who_to, endpoint_t who_from,
	vir_bytes addr, size_t bytes, int access)
{
/* Grant process A access into process B. Not everyone can do this. */
	cp_grant_id_t g;
	int r;

	ACCESS_CHECK(access);

	/* Obtain new slot. */
	if((g = cpf_new_grantslot()) < 0)
		return -1;

	/* Basic sanity checks. */
	assert(GRANT_VALID(g));
	assert(g >= 0);
	assert(g < ngrants);
	assert(!(grants[g].cp_flags & CPF_USED));

	if((r=cpf_setgrant_magic(g, who_to, who_from, addr,
		bytes, access)) < 0) {
		cpf_revoke(g);
		return -1;
	}

	return g;
}
Ejemplo n.º 26
0
// This is the interface to the intermud channels
void send_remote_q(string mud,string channel,string me,string who,string msg)
{
	mapping rhost;

	if( !this_player() || !ACCESS_CHECK(previous_object())) return;

	mud = htonn( mud );
	if (mud == mud_nname()) return;

	rhost = (mapping)DNS_MASTER->query_mud_info(mud);
	if (!rhost) return ;

	msg = replace_string(msg, "|", "");
	msg = replace_string(msg, "@@@", "");

#ifdef DEBUG
	CHANNEL_D->do_channel(this_object(), DEBUG,
		sprintf("send remote to host %s channel %s\n message (%s %s %s).", mud, channel, me, msg, who));
#endif

	DNS_MASTER->send_udp(rhost["HOSTADDRESS"], rhost["PORTUDP"],
			"@@@" + "remote_q" +
			"||NAME:" + Mud_name() +
			"||PORTUDP:" + udp_port() +
			"||CHANNEL:" + channel +
			"||SOURCE_ID:" + lower_case(me) +
			"||TARGET_ID:" + lower_case(who) +
			"||MSG:"     + msg+"@@@\n");
}
Ejemplo n.º 27
0
Archivo: gtell.c Proyecto: cosin/XYJ
void send_gtell(string mud, string wiz_to, object source, string msg)
{
	mapping minfo;

	if(!ACCESS_CHECK(previous_object())
	&&	base_name(previous_object()) != TELL_CMD) return;

	mud = htonn( mud );

	if(mud == mud_nname() || !geteuid(source)) return;

	minfo = (mapping)DNS_MASTER->query_mud_info(mud);
	if (!minfo) return ;

	msg = replace_string(msg, "|", "");
	msg = replace_string(msg, "@@@", "");
	DNS_MASTER->send_udp(minfo["HOSTADDRESS"], minfo["PORTUDP"],
		"@@@" + DNS_GTELL +
		"||NAME:" + Mud_name() +
		"||PORTUDP:" + udp_port() +
		"||WIZTO:" + wiz_to +
		"||WIZFROM:" + capitalize(geteuid(source)) +
		"||CNAME:" + source->name(1) +
		"||MSG:"+msg+"@@@\n");
}
Ejemplo n.º 28
0
void pop_front()
{
	ACCESS_CHECK(BIGSTRUCT());

	ASSERT(begin < end);

	sub[begin++] = nil;
}
Ejemplo n.º 29
0
int login(string str)
{
	ACCESS_CHECK(previous_program() == LIB_CONN);

	previous_object()->message("Welcome to Shentino's mudclient extension.\n");

	return ::login(str);
}
Ejemplo n.º 30
0
void pop_back()
{
	ACCESS_CHECK(BIGSTRUCT());

	ASSERT(begin < end);

	sub[--end] = nil;
}