#include "citserver.h"
#include "control.h"
#include "tools.h"
+#include "citadel_dirs.h"
struct floor *floorcache[MAXFLOORS];
/* 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;
}
+
}
/* Check to see if the user has forgotten this room */
}
/* 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 */
/*
* 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];
}
/* ...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
);
}
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)
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)
&& ((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)
&& (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)
&& ((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)
&& (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)
int s;
char setstr[128], lostr[64], histr[64];
long lo, hi;
+ int is_trash = 0;
/* If the supplied room name is NULL, the caller wants us to know that
* it has already copied the room record into CC->room, so
info = 1;
}
- get_mm();
cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long));
if (cdbfr != NULL) {
msglist = (long *) cdbfr->ptr;
safestrncpy(truncated_roomname, &truncated_roomname[11], sizeof truncated_roomname);
}
+ if (!strcasecmp(truncated_roomname, USERTRASHROOM)) {
+ is_trash = 1;
+ }
+
if (retmsgs != NULL) *retmsgs = total_messages;
if (retnew != NULL) *retnew = new_messages;
lprintf(CTDL_DEBUG, "<%s> %d new of %d total messages\n",
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|\n",
+ cprintf("%d%c%s|%d|%d|%d|%d|%ld|%ld|%d|%d|%d|%d|%d|%d|%d|\n",
CIT_OK, CtdlCheckExpress(),
truncated_roomname,
(int)new_messages,
(int)newmailcount,
(int)CC->room.QRfloor,
(int)vbuf.v_view,
- (int)CC->room.QRdefaultview
+ (int)CC->room.QRdefaultview,
+ (int)is_trash
);
}
}
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) {
cprintf("%d not here.\n", ERROR + HIGHER_ACCESS_REQUIRED);
return;
}
- cprintf("%d %s|"
-#ifndef HAVE_DATA_DIR
- "."
-#else
- DATA_DIR
-#endif
- "/files/%s\n",
- LISTING_FOLLOWS, config.c_fqdn, CC->room.QRdirname);
+ cprintf("%d %s|%s/%s\n",
+ LISTING_FOLLOWS,
+ config.c_fqdn,
+ ctdl_file_dir,
+ CC->room.QRdirname);
- snprintf(buf, sizeof buf, "ls "
-#ifndef HAVE_DATA_DIR
- "."
-#else
- DATA_DIR
-#endif
- "/files/%s >%s 2> /dev/null",
- CC->room.QRdirname, tempfilename);
+ snprintf(buf, sizeof buf,
+ "ls %s/%s >%s 2>/dev/null",
+ ctdl_file_dir,
+ CC->room.QRdirname,
+ tempfilename);
system(buf);
snprintf(buf, sizeof buf,
-#ifndef HAVE_DATA_DIR
- "."
-#else
- DATA_DIR
-#endif
- "/files/%s/filedir", CC->room.QRdirname);
+ "%s/%s/filedir",
+ ctdl_file_dir,
+ CC->room.QRdirname);
fd = fopen(buf, "r");
if (fd == NULL)
fd = fopen("/dev/null", "r");
flnm[strlen(flnm) - 1] = 0;
if (strcasecmp(flnm, "filedir")) {
snprintf(buf, sizeof buf,
-#ifndef HAVE_DATA_DIR
- "."
-#else
- DATA_DIR
-#endif
- "/files/%s/%s",
- CC->room.QRdirname, flnm);
+ "%s/%s/%s",
+ ctdl_file_dir,
+ CC->room.QRdirname,
+ flnm);
stat(buf, &statbuf);
safestrncpy(comment, "", sizeof comment);
fseek(fd, 0L, 0);
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;
/* Create a room directory if necessary */
if (CC->room.QRflags & QR_DIRECTORY) {
- snprintf(buf, sizeof buf,
-#ifndef HAVE_DATA_DIR
- "."
-#else
- DATA_DIR
-#endif
- "/files/%s", CC->room.QRdirname);
+ snprintf(buf, sizeof buf,"%s/%s",
+ ctdl_file_dir,
+ CC->room.QRdirname);
mkdir(buf, 0755);
}
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);
}
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);
}
-/*
- * Generate an associated file name for a room
- */
-void assoc_file_name(char *buf, size_t n,
- struct ctdlroom *qrbuf, const char *prefix)
-{
- snprintf(buf, n, "./%s/%ld", prefix, qrbuf->QRnumber);
-}
-
/*
* retrieve info file for this room
*/
char buf[SIZ];
FILE *info_fp;
- assoc_file_name(filename, sizeof filename, &CC->room, "info");
+ assoc_file_name(filename, sizeof filename, &CC->room, ctdl_info_dir);
info_fp = fopen(filename, "r");
if (info_fp == NULL) {
{
struct floor flbuf;
char filename[100];
+ /* TODO: filename magic? does this realy work? */
lprintf(CTDL_NOTICE, "Deleting room <%s>\n", qrbuf->QRname);
/* Delete the info file */
- assoc_file_name(filename, sizeof filename, qrbuf, "info");
+ assoc_file_name(filename, sizeof filename, qrbuf, ctdl_info_dir);
unlink(filename);
/* Delete the image file */
- assoc_file_name(filename, sizeof filename, qrbuf, "images");
+ assoc_file_name(filename, sizeof filename, qrbuf, ctdl_image_dir);
unlink(filename);
/* Delete the room's network config file */
- assoc_file_name(filename, sizeof filename, qrbuf, "netconfigs");
+ assoc_file_name(filename, sizeof filename, qrbuf, ctdl_netcfg_dir);
unlink(filename);
/* 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);
}
/* 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);
/* Grant the creator access to the room unless the avoid_access
* parameter was specified.
*/
- if (avoid_access == 0) {
- lgetuser(&CC->user, CC->curr_user);
+ if ( (CC->logged_in) && (avoid_access == 0) ) {
CtdlGetRelationship(&vbuf, &CC->user, &qrbuf);
vbuf.v_flags = vbuf.v_flags & ~V_FORGET & ~V_LOCKOUT;
vbuf.v_flags = vbuf.v_flags | V_ACCESS;
CtdlSetRelationship(&vbuf, &CC->user, &qrbuf);
- lputuser(&CC->user);
}
/* resume our happy day */
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;
((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);
cprintf("%d Ok.\n", CIT_OK);
return;
}
- assoc_file_name(infofilename, sizeof infofilename, &CC->room, "info");
+ assoc_file_name(infofilename, sizeof infofilename, &CC->room, ctdl_info_dir);
lprintf(CTDL_DEBUG, "opening\n");
fp = fopen(infofilename, "w");
lprintf(CTDL_DEBUG, "checking\n");