void prim_unblessprop(PRIM_PROTOTYPE) { CHECKOP(2); oper2 = POP(); oper1 = POP(); if (oper2->type != PROG_STRING) abort_interp("Non-string argument (2)"); if (!oper2->data.string) abort_interp("Empty string argument (2)"); if (!valid_object(oper1)) abort_interp("Non-object argument (1)"); CHECKREMOTE(oper1->data.objref); if (mlev < 4) abort_interp("Permission denied."); { char *tmpe; char tname[BUFFER_LEN]; int len = oper2->data.string->length; tmpe = oper2->data.string->data; while (*tmpe && *tmpe != '\r' && *tmpe != ':') tmpe++; if (*tmpe) abort_interp("Illegal propname"); strcpyn(tname, sizeof(tname), oper2->data.string->data); while (len-- > 0 && tname[len] == PROPDIR_DELIMITER) { tname[len] = '\0'; } clear_property_flags(oper1->data.objref, tname, PROP_BLESSED); #ifdef LOG_PROPS log2file("props.log", "#%d (%d) BLESSPROP: o=%d n=\"%s\"", program, pc->line, oper1->data.objref, tname); #endif ts_modifyobject(oper1->data.objref); } CLEAR(oper1); CLEAR(oper2); }
void prim_remove_prop(PRIM_PROTOTYPE) { CHECKOP(2); oper1 = POP(); oper2 = POP(); if (oper1->type != PROG_STRING) abort_interp("Non-string argument (2)"); if (!valid_object(oper2)) abort_interp("Non-object argument (1)"); CHECKREMOTE(oper2->data.objref); strncpy(buf, DoNullInd(oper1->data.string), BUFFER_LEN); buf[BUFFER_LEN - 1] = '\0'; { int len = strlen(buf); char* ptr = buf + len; while((--len >= 0) && (*--ptr == PROPDIR_DELIMITER)) *ptr = '\0'; } if (!*buf) abort_interp("Can't remove root propdir (2)"); if (!prop_write_perms(ProgUID, oper2->data.objref, buf, mlev)) abort_interp("Permission denied."); remove_property(oper2->data.objref, buf); #ifdef LOG_PROPS log2file("props.log", "#%d (%d) REMOVEPROP: o=%d n=\"%s\"", program, pc->line, oper2->data.objref, buf); #endif ts_modifyobject(oper2->data.objref); CLEAR(oper1); CLEAR(oper2); }
void do_password(dbref player, const char *old, const char *newobj) { if(Guest(player)) { anotify(player, CFAIL NOGUEST_MESG); return; } if ((!DBFETCH(player)->sp.player.password) || (!*DBFETCH(player)->sp.player.password) || strcmp(old, DBFETCH(player)->sp.player.password) ) { anotify(player, CFAIL "Sorry."); } else if (!ok_password(newobj)) { anotify(player, CFAIL "Bad new password."); } else { free((void *) DBFETCH(player)->sp.player.password); DBSTORE(player, sp.player.password, alloc_string(newobj)); ts_modifyobject(player); remove_property(player, PROP_PW); anotify(player, CSUCC "Password changed."); } }
void prim_addprop(PRIM_PROTOTYPE) { CHECKOP(4); oper1 = POP(); oper2 = POP(); oper3 = POP(); oper4 = POP(); if (oper1->type != PROG_INTEGER) abort_interp("Non-integer argument (4)"); if (oper2->type != PROG_STRING) abort_interp("Non-string argument (3)"); if (oper3->type != PROG_STRING) abort_interp("Non-string argument (2)"); if (!oper3->data.string) abort_interp("Empty string argument (2)"); if (!valid_object(oper4)) abort_interp("Non-object argument (1)"); CHECKREMOTE(oper4->data.objref); if ((mlev < 2) && (!permissions(ProgUID, oper4->data.objref))) abort_interp("Permission denied."); if (!prop_write_perms(ProgUID, oper4->data.objref, oper3->data.string->data, mlev)) abort_interp("Permission denied."); { const char *temp; char *tmpe; char tname[BUFFER_LEN]; int len = oper3->data.string->length; temp = (oper2->data.string ? oper2->data.string->data : 0); tmpe = oper3->data.string->data; while (*tmpe && *tmpe != '\r') tmpe++; if (*tmpe) abort_interp("CRs not allowed in propname"); strcpyn(tname, sizeof(tname), oper3->data.string->data); while (len-- > 0 && tname[len] == PROPDIR_DELIMITER) { tname[len] = '\0'; } /* if ((temp) || (oper1->data.number)) */ { add_property(oper4->data.objref, tname, temp, oper1->data.number); #ifdef LOG_PROPS log2file("props.log", "#%d (%d) ADDPROP: o=%d n=\"%s\" s=\"%s\" v=%d", program, pc->line, oper4->data.objref, tname, temp, oper1->data.number); #endif ts_modifyobject(oper4->data.objref); } } CLEAR(oper1); CLEAR(oper2); CLEAR(oper3); CLEAR(oper4); }
void prim_setprop(PRIM_PROTOTYPE) { CHECKOP(3); oper1 = POP(); oper2 = POP(); oper3 = POP(); if ((oper1->type != PROG_STRING) && (oper1->type != PROG_INTEGER) && (oper1->type != PROG_LOCK) && (oper1->type != PROG_OBJECT) && (oper1->type != PROG_FLOAT)) abort_interp("Invalid argument type (3)"); if (oper2->type != PROG_STRING) abort_interp("Non-string argument (2)"); if (!oper2->data.string) abort_interp("Empty string argument (2)"); if (!valid_object(oper3)) abort_interp("Non-object argument (1)"); CHECKREMOTE(oper3->data.objref); if ((mlev < 2) && (!permissions(ProgUID, oper3->data.objref))) abort_interp("Permission denied."); if (!prop_write_perms(ProgUID, oper3->data.objref, oper2->data.string->data, mlev)) abort_interp("Permission denied."); { char *tmpe; char tname[BUFFER_LEN]; PData propdat; int len = oper2->data.string->length; tmpe = oper2->data.string->data; while (*tmpe && *tmpe != '\r' && *tmpe != ':') tmpe++; if (*tmpe) abort_interp("Illegal propname"); strcpyn(tname, sizeof(tname), oper2->data.string->data); while (len-- > 0 && tname[len] == PROPDIR_DELIMITER) { tname[len] = '\0'; } switch (oper1->type) { case PROG_STRING: propdat.flags = PROP_STRTYP; propdat.data.str = oper1->data.string ? oper1->data.string->data : 0; break; case PROG_INTEGER: propdat.flags = PROP_INTTYP; propdat.data.val = oper1->data.number; break; case PROG_FLOAT: propdat.flags = PROP_FLTTYP; propdat.data.fval = oper1->data.fnumber; break; case PROG_OBJECT: propdat.flags = PROP_REFTYP; propdat.data.ref = oper1->data.objref; break; case PROG_LOCK: propdat.flags = PROP_LOKTYP; propdat.data.lok = copy_bool(oper1->data.lock); break; } set_property(oper3->data.objref, tname, &propdat); #ifdef LOG_PROPS log2file("props.log", "#%d (%d) SETPROP: o=%d n=\"%s\"", program, pc->line, oper3->data.objref, tname); #endif ts_modifyobject(oper3->data.objref); } CLEAR(oper1); CLEAR(oper2); CLEAR(oper3); }