/* * See if a user has access to a room. If room is fixed to private then * it is considered a wizroom so grant permission to any user of WIZ and * above for those. */ int has_room_access(UR_OBJECT user, RM_OBJECT rm) { size_t i; /* level room checks */ for (i = 0; priv_room[i].name; ++i) { if (!strcmp(rm->name, priv_room[i].name)) { break; } } if (user->invite_room == rm) { return 1; } if (priv_room[i].name && user->level < priv_room[i].level) { return 0; } if (!is_private_room(rm)) { return 1; } if (is_personal_room(rm)) { return is_my_room(user, rm) || has_room_key(user->name, rm) || user->level == GOD; } if (is_fixed_room(rm)) { return user->level >= WIZ; } return user->level >= amsys->gatecrash_level; }
/*** Wipe some messages off the board ***/ void wipe_board(UR_OBJECT user) { int cnt; char fname[FNAME_LEN],*name,rmname[ROOM_NAME_LEN+1]; RM_OBJECT rm=user->room; set_crash(); if (word_count<2 && ((user->level>=WIZ && !is_personal_room(rm)) || (is_personal_room(rm) && (is_my_room(user,rm) || user->level>=GOD)))) { write_usage(user,"wipe all"); write_usage(user,"wipe <#>"); write_usage(user,"wipe to <#>"); write_usage(user,"wipe from <#> to <#>"); return; } else if (word_count<2 && ((user->level<WIZ && !is_personal_room(rm)) || (is_personal_room(rm) && !is_my_room(user,rm) && user->level<GOD ) ) ) { write_usage(user,"wipe <#>"); return; } switch (is_personal_room(rm)) { case 0: if (user->level<WIZ && !(check_board_wipe(user))) return; else if (get_wipe_parameters(user)==-1) return; break; case 1: if (!is_my_room(user,rm) && user->level<GOD && !check_board_wipe(user)) return; else if (get_wipe_parameters(user)==-1) return; break; } if (user->vis) name=user->recap; else name=invisname; if (rm->access==PERSONAL_LOCKED || rm->access==PERSONAL_UNLOCKED) { midcpy(rm->name,rmname,1,strlen(rm->name)-2); rmname[0]=toupper(rmname[0]); sprintf(fname,"%s/%s.B", USERROOMS, rmname); } else sprintf(fname,"%s/%s.B", ROOMFILES, rm->name); if (!rm->mesg_cnt) { write_user(user, wipe_empty_board); return; } if (user->wipe_from==-1) { unlink(fname); write_user(user, wipe_user_all_deleted); if (user->level<GOD || user->vis) vwrite_room_except(rm, user, wipe_room_all_deleted, name); write_syslog(SYSLOG,1,"%s wiped all messages from the board in the %s.\n",user->name,rm->name); rm->mesg_cnt=0; return; } if (user->wipe_from>rm->mesg_cnt) { vwrite_user(user,"There %s only %d message%s on the board.\n",PLTEXT_IS(rm->mesg_cnt),rm->mesg_cnt,PLTEXT_S(rm->mesg_cnt)); return; } cnt=wipe_messages(fname,user->wipe_from,user->wipe_to,0); if (cnt==rm->mesg_cnt) { unlink(fname); vwrite_user(user, wipe_too_many, rm->mesg_cnt, grm_num(8, rm->mesg_cnt)); if (user->level<GOD || user->vis) vwrite_room_except(rm,user,"%s maze nastenku.\n",name); write_syslog(SYSLOG,1,"%s wiped all messages from the board in the %s.\n",user->name,rm->name); rm->mesg_cnt=0; return; } rm->mesg_cnt-=cnt; vwrite_user(user, wipe_user_delete_range, cnt, grm_num(8, cnt), grm_num(9, cnt)); if (user->level<GOD || user->vis) vwrite_room_except(rm,user,"%s wipes some messages from the board.\n",name); write_syslog(SYSLOG,1,"%s wiped %d message%s from the board in the %s.\n",user->name,cnt,PLTEXT_S(cnt),rm->name); }