X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Froom_ops.c;h=8174dc97833b485950a786a05e1fbf3d99ed2b34;hb=61ced2537ea36d1ff269e4695c6bee4f45f06dc4;hp=a0fd868800c9a33ccdfa414936eb50a149d0c94f;hpb=1248e88ae490d17b4896ada5a74a0a9ea23b365c;p=citadel.git diff --git a/citadel/room_ops.c b/citadel/room_ops.c index a0fd86880..8174dc978 100644 --- a/citadel/room_ops.c +++ b/citadel/room_ops.c @@ -54,7 +54,7 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf, /* for internal programs, always do everything */ if (((CC->internal_pgm)) && (roombuf->QRflags & QR_INUSE)) { - retval = (UA_KNOWN | UA_GOTOALLOWED); + retval = (UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED); vbuf.v_view = 0; goto SKIP_EVERYTHING; } @@ -65,7 +65,7 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf, /* Force the properties of the Aide room */ if (!strcasecmp(roombuf->QRname, config.c_aideroom)) { if (userbuf->axlevel >= 6) { - retval = UA_KNOWN | UA_GOTOALLOWED; + retval = UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED; } else { retval = 0; } @@ -103,17 +103,36 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf, } } - /* For mailbox rooms, also check the generation number matchups */ + /* For mailbox rooms, also check the namespace */ + /* Also, mailbox owners can delete their messages */ if (roombuf->QRflags & QR_MAILBOX) { if (userbuf->usernum == atol(roombuf->QRname)) { - retval = retval | UA_KNOWN | UA_GOTOALLOWED; + retval = retval | UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED; } /* An explicit match means the user belongs in this room */ if (vbuf.v_flags & V_ACCESS) { - retval = retval | UA_KNOWN | UA_GOTOALLOWED; + retval = retval | UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED; } } + /* For non-mailbox rooms... */ + else { + + /* User is allowed to post in the room unless: + * - User is not validated + * - User has no net privileges and it is a shared network room + * - It is a read-only room + */ + int post_allowed = 1; + if (CC->user.axlevel < 2) post_allowed = 0; + if ((CC->user.axlevel < 4) && (CC->room.QRflags & QR_NETWORK)) post_allowed = 0; + if (roombuf->QRflags & QR_READONLY) post_allowed = 0; + if (post_allowed) { + retval = retval | UA_POSTALLOWED; + } + + } + /* Check to see if the user has forgotten this room */ if (vbuf.v_flags & V_FORGET) { retval = retval & ~UA_KNOWN; @@ -126,17 +145,17 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf, } /* If user is explicitly locked out of this room, deny everything */ if (vbuf.v_flags & V_LOCKOUT) { - retval = retval & ~UA_KNOWN & ~UA_GOTOALLOWED; + retval = retval & ~UA_KNOWN & ~UA_GOTOALLOWED & ~UA_POSTALLOWED; } /* Aides get access to all private rooms */ if ( (userbuf->axlevel >= 6) && ((roombuf->QRflags & QR_MAILBOX) == 0) ) { if (vbuf.v_flags & V_FORGET) { - retval = retval | UA_GOTOALLOWED; + retval = retval | UA_GOTOALLOWED | UA_POSTALLOWED; } else { - retval = retval | UA_KNOWN | UA_GOTOALLOWED; + retval = retval | UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED; } } @@ -145,7 +164,14 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf, */ if ( (userbuf->axlevel >= 6) && (roombuf->QRflags & QR_MAILBOX) ) { - retval = retval | UA_GOTOALLOWED; + retval = retval | UA_GOTOALLOWED | UA_POSTALLOWED; + } + + /* Aides and Room Aides have admin privileges */ + if ( (userbuf->axlevel >= 6) + || (userbuf->usernum == roombuf->QRroomaide) + ) { + retval = retval | UA_ADMINALLOWED | UA_DELETEALLOWED; } NEWMSG: /* By the way, we also check for the presence of new messages */ @@ -503,7 +529,7 @@ int is_noneditable(struct ctdlroom *qrbuf) /* * Back-back-end for all room listing commands */ -void list_roomname(struct ctdlroom *qrbuf, int ra, int view) +void list_roomname(struct ctdlroom *qrbuf, int ra, int current_view, int default_view) { char truncated_roomname[ROOMNAMELEN]; @@ -520,13 +546,15 @@ void list_roomname(struct ctdlroom *qrbuf, int ra, int view) } /* ...and now the other parameters */ - cprintf("|%u|%d|%d|%d|%d|%d|\n", + cprintf("|%u|%d|%d|%d|%d|%d|%d|%ld|\n", qrbuf->QRflags, (int) qrbuf->QRfloor, (int) qrbuf->QRorder, (int) qrbuf->QRflags2, ra, - view + current_view, + default_view, + qrbuf->QRmtime ); } @@ -546,7 +574,7 @@ void cmd_lrms_backend(struct ctdlroom *qrbuf, void *data) if ((( ra & (UA_KNOWN | UA_ZAPPED))) && ((qrbuf->QRfloor == (FloorBeingSearched)) || ((FloorBeingSearched) < 0))) - list_roomname(qrbuf, ra, view); + list_roomname(qrbuf, ra, view, qrbuf->QRdefaultview); } void cmd_lrms(char *argbuf) @@ -584,7 +612,7 @@ void cmd_lkra_backend(struct ctdlroom *qrbuf, void *data) if ((( ra & (UA_KNOWN))) && ((qrbuf->QRfloor == (FloorBeingSearched)) || ((FloorBeingSearched) < 0))) - list_roomname(qrbuf, ra, view); + list_roomname(qrbuf, ra, view, qrbuf->QRdefaultview); } void cmd_lkra(char *argbuf) @@ -620,7 +648,7 @@ void cmd_lprm_backend(struct ctdlroom *qrbuf, void *data) && ((qrbuf->QRflags & QR_MAILBOX) == 0) && ((qrbuf->QRfloor == (FloorBeingSearched)) || ((FloorBeingSearched) < 0))) - list_roomname(qrbuf, ra, view); + list_roomname(qrbuf, ra, view, qrbuf->QRdefaultview); } void cmd_lprm(char *argbuf) @@ -653,7 +681,7 @@ void cmd_lkrn_backend(struct ctdlroom *qrbuf, void *data) && (ra & UA_HASNEWMSGS) && ((qrbuf->QRfloor == (FloorBeingSearched)) || ((FloorBeingSearched) < 0))) - list_roomname(qrbuf, ra, view); + list_roomname(qrbuf, ra, view, qrbuf->QRdefaultview); } void cmd_lkrn(char *argbuf) @@ -692,7 +720,7 @@ void cmd_lkro_backend(struct ctdlroom *qrbuf, void *data) && ((ra & UA_HASNEWMSGS) == 0) && ((qrbuf->QRfloor == (FloorBeingSearched)) || ((FloorBeingSearched) < 0))) - list_roomname(qrbuf, ra, view); + list_roomname(qrbuf, ra, view, qrbuf->QRdefaultview); } void cmd_lkro(char *argbuf) @@ -731,7 +759,7 @@ void cmd_lzrm_backend(struct ctdlroom *qrbuf, void *data) && (ra & UA_ZAPPED) && ((qrbuf->QRfloor == (FloorBeingSearched)) || ((FloorBeingSearched) < 0))) - list_roomname(qrbuf, ra, view); + list_roomname(qrbuf, ra, view, qrbuf->QRdefaultview); } void cmd_lzrm(char *argbuf) @@ -819,7 +847,6 @@ void usergoto(char *where, int display_result, int transiently, info = 1; } - get_mm(); cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long)); if (cdbfr != NULL) { msglist = (long *) cdbfr->ptr; @@ -1043,23 +1070,6 @@ void cmd_whok(void) struct cdbdata *cdbus; int ra; - getuser(&CC->user, CC->curr_user); - - /* - * This command is only allowed by aides, room aides, - * and room namespace owners - */ - if (is_room_aide() - || (atol(CC->room.QRname) == CC->user.usernum) ) { - /* access granted */ - } - else { - /* access denied */ - cprintf("%d Higher access or room ownership required.\n", - ERROR + HIGHER_ACCESS_REQUIRED); - return; - } - cprintf("%d Who knows room:\n", LISTING_FOLLOWS); cdb_rewind(CDB_USERS); while (cdbus = cdb_next_item(CDB_USERS), cdbus != NULL) { @@ -1227,7 +1237,7 @@ int CtdlRenameRoom(char *old_name, char *new_name, int new_floor) { ret = crr_room_not_found; } - else if ( (CC->user.axlevel < 6) + else if ( (CC->user.axlevel < 6) && (!CC->internal_pgm) && (CC->user.usernum != qrbuf.QRroomaide) && ( (((qrbuf.QRflags & QR_MAILBOX) == 0) || (atol(qrbuf.QRname) != CC->user.usernum))) ) { ret = crr_access_denied; @@ -1447,7 +1457,7 @@ void cmd_setr(char *args) } snprintf(buf, sizeof buf, "The room \"%s\" has been edited by %s.\n", CC->room.QRname, CC->curr_user); - aide_message(buf); + aide_message(buf, "Room modification Message"); cprintf("%d Ok\n", CIT_OK); } @@ -1509,7 +1519,7 @@ void cmd_seta(char *new_ra) snprintf(buf, sizeof buf, "There is now no room aide for \"%s\".\n", CC->room.QRname); - aide_message(buf); + aide_message(buf, "Aide Room Modification"); } cprintf("%d Ok\n", CIT_OK); } @@ -1605,7 +1615,7 @@ void delete_room(struct ctdlroom *qrbuf) /* Delete the messages in the room * (Careful: this opens an S_ROOMS critical section!) */ - CtdlDeleteMessages(qrbuf->QRname, 0L, "", 0); + CtdlDeleteMessages(qrbuf->QRname, NULL, 0, ""); /* Flag the room record as not in use */ lgetroom(qrbuf, qrbuf->QRname); @@ -1648,7 +1658,7 @@ int CtdlDoIHavePermissionToDeleteThisRoom(struct ctdlroom *qr) { } /* Can't delete your Mail> room */ - if (!strcasecmp(&qr->QRname[12], MAILROOM)) return(0); + if (!strcasecmp(&qr->QRname[11], MAILROOM)) return(0); /* Otherwise it's ok */ return(1); @@ -1692,7 +1702,7 @@ void cmd_kill(char *argbuf) /* tell the world what we did */ snprintf(msg, sizeof msg, "The room \"%s\" has been deleted by %s.\n", deleted_room_name, CC->curr_user); - aide_message(msg); + aide_message(msg, "Room Purger Message"); cprintf("%d '%s' deleted.\n", CIT_OK, deleted_room_name); } else { cprintf("%d ok to delete.\n", CIT_OK); @@ -1849,7 +1859,7 @@ void cmd_cre8(char *args) if (CtdlAccessCheck(ac_logged_in)) return; - if (CC->user.axlevel < config.c_createax) { + if (CC->user.axlevel < config.c_createax || CC->internal_pgm) { cprintf("%d You need higher access to create rooms.\n", ERROR + HIGHER_ACCESS_REQUIRED); return; @@ -1906,7 +1916,7 @@ void cmd_cre8(char *args) ((newflags & QR_PASSWORDED) ? " Password: " : ""), ((newflags & QR_PASSWORDED) ? new_room_pass : "") ); - aide_message(notification_message); + aide_message(notification_message, "Room Creation Message"); free(notification_message); cprintf("%d '%s' has been created.\n", CIT_OK, new_room_name);