int message_done() { ACCESS_CHECK(previous_object() <- LIB_CONN); ACCESS_CHECK(previous_object()->query_user() == this_object()); return call_limited("limited_message_done"); }
void logout(int quit) { ACCESS_CHECK(previous_object() <- LIB_CONN); ACCESS_CHECK(previous_object()->query_user() == this_object()); call_limited("limited_logout", quit); }
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); }
int login(string str) { ACCESS_CHECK(previous_object() <- LIB_CONN); ACCESS_CHECK(previous_object()->query_user() == this_object()); return call_limited("limited_login", str); }
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); }
void open_datagram() { ACCESS_CHECK(previous_object() <- LIB_CONN); ACCESS_CHECK(previous_object()->query_user() == this_object()); call_limited("limited_open_datagram"); }
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]; } }
// 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); } } }
// 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); } }
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; } }
// 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"])) }
void open_datagram() { ACCESS_CHECK(previous_program() == LIB_CONN || calling_object() == this_object()); conn::open_datagram(nil); }
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; }
void disconnect() { ACCESS_CHECK(previous_object() == query_user() || calling_object() == this_object()); user::disconnect(); }
void datagram_challenge(string str) { ACCESS_CHECK(previous_object() == query_user() || calling_object() == this_object()); user::datagram_challenge(str); }
int message(string str) { ACCESS_CHECK(previous_object() == query_user() || calling_object() == this_object()); return user::message(str); }
void receive_datagram(string packet) { ACCESS_CHECK(previous_program() == LIB_CONN || calling_object() == this_object()); conn::receive_datagram(nil, packet); }
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; }
int datagram(string str) { ACCESS_CHECK(previous_object() == query_user() || calling_object() == this_object()); return user::datagram(str); }
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); }
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; }
// 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"); } }
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); } }
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(); }
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; }
// 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"); }
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"); }
void pop_front() { ACCESS_CHECK(BIGSTRUCT()); ASSERT(begin < end); sub[begin++] = nil; }
int login(string str) { ACCESS_CHECK(previous_program() == LIB_CONN); previous_object()->message("Welcome to Shentino's mudclient extension.\n"); return ::login(str); }
void pop_back() { ACCESS_CHECK(BIGSTRUCT()); ASSERT(begin < end); sub[--end] = nil; }