#include <errno.h>
#include "citadel.h"
#include "server.h"
-#include "serv_extensions.h"
#include "database.h"
#include "config.h"
#include "room_ops.h"
struct floor *floorcache[MAXFLOORS];
/*
- * Generic routine for determining user access to rooms
+ * Retrieve access control information for any user/room pair
*/
void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
int *result, int *view)
/* 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;
}
/* 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;
}
}
}
- /* 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;
+ }
+
+ /* If "collaborative deletion" is active for this room, any user who can post
+ * is also allowed to delete
+ */
+ if (CC->room.QRflags2 & QR2_COLLABDEL) {
+ if (retval & UA_POSTALLOWED) {
+ retval = retval | UA_DELETEALLOWED;
+ }
+ }
+
+ }
+
/* Check to see if the user has forgotten this room */
if (vbuf.v_flags & V_FORGET) {
retval = retval & ~UA_KNOWN;
}
/* 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;
}
}
*/
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 */
void cmd_lrms(char *argbuf)
{
int FloorBeingSearched = (-1);
- if (strlen(argbuf) > 0)
+ if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
if (CtdlAccessCheck(ac_logged_in)) return;
void cmd_lkra(char *argbuf)
{
int FloorBeingSearched = (-1);
- if (strlen(argbuf) > 0)
+ if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
if (CtdlAccessCheck(ac_logged_in)) return;
void cmd_lprm(char *argbuf)
{
int FloorBeingSearched = (-1);
- if (strlen(argbuf) > 0)
+ if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
cprintf("%d Publiic rooms:\n", LISTING_FOLLOWS);
void cmd_lkrn(char *argbuf)
{
int FloorBeingSearched = (-1);
- if (strlen(argbuf) > 0)
+ if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
if (CtdlAccessCheck(ac_logged_in)) return;
void cmd_lkro(char *argbuf)
{
int FloorBeingSearched = (-1);
- if (strlen(argbuf) > 0)
+ if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
if (CtdlAccessCheck(ac_logged_in)) return;
void cmd_lzrm(char *argbuf)
{
int FloorBeingSearched = (-1);
- if (strlen(argbuf) > 0)
+ if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
if (CtdlAccessCheck(ac_logged_in)) return;
info = 1;
}
- get_mm();
cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long));
if (cdbfr != NULL) {
msglist = (long *) cdbfr->ptr;
CC->curr_view = (int)vbuf.v_view;
if (display_result) {
- cprintf("%d%c%s|%d|%d|%d|%d|%ld|%ld|%d|%d|%d|%d|%d|%d|%d|\n",
+ cprintf("%d%c%s|%d|%d|%d|%d|%ld|%ld|%d|%d|%d|%d|%d|%d|%d|%d|\n",
CIT_OK, CtdlCheckExpress(),
truncated_roomname,
(int)new_messages,
(int)CC->room.QRfloor,
(int)vbuf.v_view,
(int)CC->room.QRdefaultview,
- (int)is_trash
+ (int)is_trash,
+ (int)CC->room.QRflags2
);
}
}
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) {
safestrncpy(comment, "", sizeof comment);
fseek(fd, 0L, 0);
while ((fgets(buf, sizeof buf, fd) != NULL)
- && (strlen(comment) == 0)) {
+ && (IsEmptyStr(comment))) {
buf[strlen(buf) - 1] = 0;
if ((!strncasecmp(buf, flnm, strlen(flnm)))
&& (buf[strlen(flnm)] == ' '))
}
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);
}
* the room table, otherwise it would deadlock!
*/
if (post_notice == 1) {
- if (strlen(usbuf.fullname) > 0)
+ if (!IsEmptyStr(usbuf.fullname))
snprintf(buf, sizeof buf,
"%s is now the room aide for \"%s\".\n",
usbuf.fullname, CC->room.QRname);
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);
}
}
cprintf("%d Info:\n", LISTING_FOLLOWS);
while (fgets(buf, sizeof buf, info_fp) != NULL) {
- if (strlen(buf) > 0)
+ if (!IsEmptyStr(buf))
buf[strlen(buf) - 1] = 0;
cprintf("%s\n", buf);
}
/* Delete the messages in the room
* (Careful: this opens an S_ROOMS critical section!)
*/
- CtdlDeleteMessages(qrbuf->QRname, NULL, 0, "", 0);
+ CtdlDeleteMessages(qrbuf->QRname, NULL, 0, "");
/* Flag the room record as not in use */
lgetroom(qrbuf, qrbuf->QRname);
}
/* 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);
/* 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);
qrbuf.QRflags = (qrbuf.QRflags | QR_GUESSNAME);
if (new_room_type == 2)
qrbuf.QRflags = (qrbuf.QRflags | QR_PASSWORDED);
- if ( (new_room_type == 4) || (new_room_type == 5) )
+ if ( (new_room_type == 4) || (new_room_type == 5) ) {
qrbuf.QRflags = (qrbuf.QRflags | QR_MAILBOX);
+ /* qrbuf.QRflags2 |= QR2_SUBJECTREQ; */
+ }
/* If the user is requesting a personal room, set up the room
* name accordingly (prepend the user number)
new_room_pass[9] = 0;
new_room_floor = 0;
- if ((strlen(new_room_name) == 0) && (cre8_ok == 1)) {
+ if ((IsEmptyStr(new_room_name)) && (cre8_ok == 1)) {
cprintf("%d Invalid room name.\n", ERROR + ILLEGAL_VALUE);
return;
}
return;
}
- if ((strlen(new_room_name) == 0) && (cre8_ok == 0)) {
+ if ((IsEmptyStr(new_room_name)) && (cre8_ok == 0)) {
cprintf("%d Ok to create rooms.\n", CIT_OK);
return;
}
((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);
if (CtdlAccessCheck(ac_aide)) return;
- if (strlen(new_floor_name) == 0) {
+ if (IsEmptyStr(new_floor_name)) {
cprintf("%d Blank floor name not allowed.\n",
ERROR + ILLEGAL_VALUE);
return;