*
*/
-#ifdef DLL_EXPORT
-#define IN_LIBCIT
-#endif
-
#include "sysdep.h"
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <ctype.h>
#include <string.h>
+#include <dirent.h> /* for cmd_rdir to read contents of the directory */
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
#include <limits.h>
#include <errno.h>
#include "citadel.h"
+#include <libcitadel.h>
#include "server.h"
-#include "serv_extensions.h"
#include "database.h"
#include "config.h"
#include "room_ops.h"
#include "msgbase.h"
#include "citserver.h"
#include "control.h"
-#include "tools.h"
+#include "citadel_dirs.h"
+#include "threads.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 | UA_POSTALLOWED;
}
NEWMSG: /* By the way, we also check for the presence of new messages */
struct cdbdata *cdbqr;
char lowercase_name[ROOMNAMELEN];
char personal_lowercase_name[ROOMNAMELEN];
- int a;
+ char *dptr, *sptr, *eptr;
- for (a = 0; room_name[a] && a < sizeof lowercase_name - 1; ++a) {
- lowercase_name[a] = tolower(room_name[a]);
+ dptr = lowercase_name;
+ sptr = room_name;
+ eptr = (dptr + (sizeof lowercase_name - 1));
+ while (!IsEmptyStr(sptr) && (dptr < eptr)){
+ *dptr = tolower(*sptr);
+ sptr++; dptr++;
}
- lowercase_name[a] = 0;
+ *dptr = '\0';
memset(qrbuf, 0, sizeof(struct ctdlroom));
void b_putroom(struct ctdlroom *qrbuf, char *room_name)
{
char lowercase_name[ROOMNAMELEN];
- int a;
+ char *aptr, *bptr;
+ long len;
- for (a = 0; a <= strlen(room_name); ++a) {
- lowercase_name[a] = tolower(room_name[a]);
+ aptr = room_name;
+ bptr = lowercase_name;
+ while (!IsEmptyStr(aptr))
+ {
+ *bptr = tolower(*aptr);
+ aptr++;
+ bptr++;
}
+ *bptr='\0';
+ len = bptr - lowercase_name;
if (qrbuf == NULL) {
cdb_delete(CDB_ROOMS,
- lowercase_name, strlen(lowercase_name));
+ lowercase_name, len);
} else {
time(&qrbuf->QRmtime);
cdb_store(CDB_ROOMS,
- lowercase_name, strlen(lowercase_name),
+ lowercase_name, len,
qrbuf, sizeof(struct ctdlroom));
}
}
+/*
+ * Message pointer compare function for sort_msglist()
+ */
+int sort_msglist_cmp(long *m1, long *m2) {
+ if (*m1 > *m2) return(1);
+ if (*m1 < *m2) return(-1);
+ return(0);
+}
+
/*
* sort message pointers
*/
int sort_msglist(long listptrs[], int oldcount)
{
- int a, b;
- long hold1, hold2;
int numitems;
numitems = oldcount;
- if (numitems < 2)
+ if (numitems < 2) {
return (oldcount);
+ }
/* do the sort */
- for (a = numitems - 2; a >= 0; --a) {
- for (b = 0; b <= a; ++b) {
- if (listptrs[b] > (listptrs[b + 1])) {
- hold1 = listptrs[b];
- hold2 = listptrs[b + 1];
- listptrs[b] = hold2;
- listptrs[b + 1] = hold1;
- }
- }
- }
+ qsort(listptrs, numitems, sizeof(long), sort_msglist_cmp);
/* and yank any nulls */
while ((numitems > 0) && (listptrs[0] == 0L)) {
- memcpy(&listptrs[0], &listptrs[1],
+ memmove(&listptrs[0], &listptrs[1],
(sizeof(long) * (numitems - 1)));
--numitems;
}
/*
* 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)
{
int FloorBeingSearched = (-1);
- if (strlen(argbuf) > 0)
+ if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
if (CtdlAccessCheck(ac_logged_in)) return;
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)
{
int FloorBeingSearched = (-1);
- if (strlen(argbuf) > 0)
+ if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
if (CtdlAccessCheck(ac_logged_in)) return;
&& ((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)
{
int FloorBeingSearched = (-1);
- if (strlen(argbuf) > 0)
+ if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
cprintf("%d Publiic rooms:\n", LISTING_FOLLOWS);
&& (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)
{
int FloorBeingSearched = (-1);
- if (strlen(argbuf) > 0)
+ if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
if (CtdlAccessCheck(ac_logged_in)) return;
&& ((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)
{
int FloorBeingSearched = (-1);
- if (strlen(argbuf) > 0)
+ if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
if (CtdlAccessCheck(ac_logged_in)) return;
&& (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 FloorBeingSearched = (-1);
- if (strlen(argbuf) > 0)
+ if (!IsEmptyStr(argbuf))
FloorBeingSearched = extract_int(argbuf, 0);
if (CtdlAccessCheck(ac_logged_in)) return;
{
int a;
int new_messages = 0;
+ int old_messages = 0;
int total_messages = 0;
int info = 0;
int rmailflag;
long *msglist = NULL;
int num_msgs = 0;
unsigned int original_v_flags;
+ int num_sets;
+ 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 = malloc(cdbfr->len);
- memcpy(msglist, cdbfr->ptr, cdbfr->len);
+ msglist = (long *) cdbfr->ptr;
+ cdbfr->ptr = NULL; /* usergoto() now owns this memory */
num_msgs = cdbfr->len / sizeof(long);
cdb_free(cdbfr);
}
- if (num_msgs > 0) for (a = 0; a < num_msgs; ++a) {
- if (msglist[a] > 0L) {
- ++total_messages;
- if (is_msg_in_sequence_set(vbuf.v_seen, msglist[a]) == 0) {
- ++new_messages;
+ total_messages = 0;
+ for (a=0; a<num_msgs; ++a) {
+ if (msglist[a] > 0L) ++total_messages;
+ }
+ new_messages = num_msgs;
+ num_sets = num_tokens(vbuf.v_seen, ',');
+ for (s=0; s<num_sets; ++s) {
+ extract_token(setstr, vbuf.v_seen, s, ',', sizeof setstr);
+
+ extract_token(lostr, setstr, 0, ':', sizeof lostr);
+ if (num_tokens(setstr, ':') >= 2) {
+ extract_token(histr, setstr, 1, ':', sizeof histr);
+ if (!strcmp(histr, "*")) {
+ snprintf(histr, sizeof histr, "%ld", LONG_MAX);
+ }
+ }
+ else {
+ strcpy(histr, lostr);
+ }
+ lo = atol(lostr);
+ hi = atol(histr);
+
+ for (a=0; a<num_msgs; ++a) if (msglist[a] > 0L) {
+ if ((msglist[a] >= lo) && (msglist[a] <= hi)) {
+ ++old_messages;
+ msglist[a] = 0L;
}
}
}
+ new_messages = total_messages - old_messages;
if (msglist != NULL) free(msglist);
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",
+ CtdlLogPrintf(CTDL_DEBUG, "<%s> %d new of %d total messages\n",
CC->room.QRname,
new_messages, total_messages
);
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|%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,
+ (int)CC->room.QRflags2
);
}
}
+/*
+ * Handle some of the macro named rooms
+ */
+void convert_room_name_macros(char *towhere, size_t maxlen) {
+ if (!strcasecmp(towhere, "_BASEROOM_")) {
+ safestrncpy(towhere, config.c_baseroom, maxlen);
+ }
+ else if (!strcasecmp(towhere, "_MAIL_")) {
+ safestrncpy(towhere, MAILROOM, maxlen);
+ }
+ else if (!strcasecmp(towhere, "_TRASH_")) {
+ safestrncpy(towhere, USERTRASHROOM, maxlen);
+ }
+ else if (!strcasecmp(towhere, "_BITBUCKET_")) {
+ safestrncpy(towhere, config.c_twitroom, maxlen);
+ }
+ else if (!strcasecmp(towhere, "_CALENDAR_")) {
+ safestrncpy(towhere, USERCALENDARROOM, maxlen);
+ }
+ else if (!strcasecmp(towhere, "_TASKS_")) {
+ safestrncpy(towhere, USERTASKSROOM, maxlen);
+ }
+ else if (!strcasecmp(towhere, "_CONTACTS_")) {
+ safestrncpy(towhere, USERCONTACTSROOM, maxlen);
+ }
+ else if (!strcasecmp(towhere, "_NOTES_")) {
+ safestrncpy(towhere, USERNOTESROOM, maxlen);
+ }
+}
+
+
/*
* cmd_goto() - goto a new room
*/
getuser(&CC->user, CC->curr_user);
- if (!strcasecmp(towhere, "_BASEROOM_"))
- safestrncpy(towhere, config.c_baseroom, sizeof towhere);
-
- if (!strcasecmp(towhere, "_MAIL_"))
- safestrncpy(towhere, MAILROOM, sizeof towhere);
-
- if (!strcasecmp(towhere, "_BITBUCKET_"))
- safestrncpy(towhere, config.c_twitroom, sizeof towhere);
-
+ /*
+ * Handle some of the macro named rooms
+ */
+ convert_room_name_macros(towhere, sizeof towhere);
/* First try a regular match */
c = getroom(&QRscratch, towhere);
((ra & UA_KNOWN) == 0) &&
(CC->user.axlevel < 6)
) {
- lprintf(CTDL_DEBUG, "Failed to acquire private room\n");
+ CtdlLogPrintf(CTDL_DEBUG, "Failed to acquire private room\n");
} else {
memcpy(&CC->room, &QRscratch,
sizeof(struct ctdlroom));
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) {
void cmd_rdir(void)
{
char buf[256];
- char flnm[256];
char comment[256];
- FILE *ls, *fd;
+ FILE *fd;
struct stat statbuf;
- char tempfilename[PATH_MAX];
-
+ DIR *filedir = NULL;
+ struct dirent *filedir_entry;
+ int d_namelen;
+ char buf2[SIZ];
+ char mimebuf[64];
+ long len;
+
if (CtdlAccessCheck(ac_logged_in)) return;
- tmpnam(tempfilename);
getroom(&CC->room, CC->room.QRname);
getuser(&CC->user, CC->curr_user);
cprintf("%d not here.\n", ERROR + HIGHER_ACCESS_REQUIRED);
return;
}
- cprintf("%d %s|%s/files/%s\n",
- LISTING_FOLLOWS, config.c_fqdn, CTDLDIR, CC->room.QRdirname);
-
- snprintf(buf, sizeof buf, "ls %s/files/%s >%s 2> /dev/null",
- CTDLDIR, CC->room.QRdirname, tempfilename);
- system(buf);
- snprintf(buf, sizeof buf, "%s/files/%s/filedir", CTDLDIR, CC->room.QRdirname);
+ snprintf(buf, sizeof buf, "%s/%s", ctdl_file_dir, CC->room.QRdirname);
+ filedir = opendir (buf);
+
+ if (filedir == NULL) {
+ cprintf("%d not here.\n", ERROR + HIGHER_ACCESS_REQUIRED);
+ return;
+ }
+ cprintf("%d %s|%s/%s\n", LISTING_FOLLOWS, config.c_fqdn, ctdl_file_dir, CC->room.QRdirname);
+
+ snprintf(buf, sizeof buf, "%s/%s/filedir", ctdl_file_dir, CC->room.QRdirname);
fd = fopen(buf, "r");
if (fd == NULL)
fd = fopen("/dev/null", "r");
-
- ls = fopen(tempfilename, "r");
- while (fgets(flnm, sizeof flnm, ls) != NULL) {
- flnm[strlen(flnm) - 1] = 0;
- if (strcasecmp(flnm, "filedir")) {
- snprintf(buf, sizeof buf, "%s/files/%s/%s",
- CTDLDIR, CC->room.QRdirname, flnm);
- stat(buf, &statbuf);
+ while ((filedir_entry = readdir(filedir)))
+ {
+ if (strcasecmp(filedir_entry->d_name, "filedir") && filedir_entry->d_name[0] != '.')
+ {
+#ifdef _DIRENT_HAVE_D_NAMELEN
+ d_namelen = filedir_entry->d_namelen;
+#else
+ d_namelen = strlen(filedir_entry->d_name);
+#endif
+ snprintf(buf, sizeof buf, "%s/%s/%s", ctdl_file_dir, CC->room.QRdirname, filedir_entry->d_name);
+ stat(buf, &statbuf); /* stat the file */
+ if (!(statbuf.st_mode & S_IFREG))
+ {
+ snprintf(buf2, sizeof buf2, "Command RDIR found something that is not a useable file. It should be cleaned up.\n RDIR found this non regular file:\n%s\n", buf);
+ aide_message(buf2, "RDIR found bad file");
+ continue; /* not a useable file type so don't show it */
+ }
safestrncpy(comment, "", sizeof comment);
- fseek(fd, 0L, 0);
- while ((fgets(buf, sizeof buf, fd) != NULL)
- && (strlen(comment) == 0)) {
+ fseek(fd, 0L, 0); /* rewind descriptions file */
+ /* Get the description from the descriptions file */
+ while ((fgets(buf, sizeof buf, fd) != NULL) && (IsEmptyStr(comment)))
+ {
buf[strlen(buf) - 1] = 0;
- if ((!strncasecmp(buf, flnm, strlen(flnm)))
- && (buf[strlen(flnm)] == ' '))
- safestrncpy(comment,
- &buf[strlen(flnm) + 1],
- sizeof comment);
+ if ((!strncasecmp(buf, filedir_entry->d_name, d_namelen)) && (buf[d_namelen] == ' '))
+ safestrncpy(comment, &buf[d_namelen + 1], sizeof comment);
+ }
+ len = extract_token (mimebuf, comment, 0,' ', 64);
+ if ((len <0) || strchr(mimebuf, '/') == NULL)
+ {
+ snprintf (mimebuf, 64, "application/octetstream");
+ len = 0;
}
- cprintf("%s|%ld|%s\n", flnm, (long)statbuf.st_size, comment);
+ cprintf("%s|%ld|%s|%s\n",
+ filedir_entry->d_name,
+ (long)statbuf.st_size,
+ mimebuf,
+ &comment[len]);
}
}
- fclose(ls);
fclose(fd);
- unlink(tempfilename);
-
+ closedir(filedir);
+
cprintf("000\n");
}
long owner = 0L;
char actual_old_name[ROOMNAMELEN];
- lprintf(CTDL_DEBUG, "CtdlRenameRoom(%s, %s, %d)\n",
+ CtdlLogPrintf(CTDL_DEBUG, "CtdlRenameRoom(%s, %s, %d)\n",
old_name, new_name, new_floor);
if (new_floor >= 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;
lgetfloor(&flbuf, old_floor);
--flbuf.f_ref_count;
lputfloor(&flbuf, old_floor);
- lprintf(CTDL_DEBUG, "Reference count for floor %d is now %d\n", old_floor, flbuf.f_ref_count);
+ CtdlLogPrintf(CTDL_DEBUG, "Reference count for floor %d is now %d\n", old_floor, flbuf.f_ref_count);
lgetfloor(&flbuf, new_floor);
++flbuf.f_ref_count;
lputfloor(&flbuf, new_floor);
- lprintf(CTDL_DEBUG, "Reference count for floor %d is now %d\n", new_floor, flbuf.f_ref_count);
+ CtdlLogPrintf(CTDL_DEBUG, "Reference count for floor %d is now %d\n", new_floor, flbuf.f_ref_count);
}
/* ...and everybody say "YATTA!" */
/* Create a room directory if necessary */
if (CC->room.QRflags & QR_DIRECTORY) {
- snprintf(buf, sizeof buf, "./files/%s", CC->room.QRdirname);
+ snprintf(buf, sizeof buf,"%s/%s",
+ ctdl_file_dir,
+ CC->room.QRdirname);
mkdir(buf, 0755);
}
- snprintf(buf, sizeof buf, "%s> edited by %s\n", CC->room.QRname, CC->curr_user);
- aide_message(buf);
+ snprintf(buf, sizeof buf, "The room \"%s\" has been edited by %s.\n",
+ CC->room.QRname, CC->curr_user);
+ 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 room aide for %s>\n",
+ "%s is now the room aide for \"%s\".\n",
usbuf.fullname, CC->room.QRname);
else
snprintf(buf, sizeof buf,
- "There is now no room aide for %s>\n",
+ "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) {
}
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);
}
char old_name[ROOMNAMELEN];
static int seq = 0;
- lprintf(CTDL_NOTICE, "Scheduling room <%s> for deletion\n",
+ CtdlLogPrintf(CTDL_NOTICE, "Scheduling room <%s> for deletion\n",
qrbuf->QRname);
safestrncpy(old_name, qrbuf->QRname, sizeof old_name);
{
struct floor flbuf;
char filename[100];
+ /* TODO: filename magic? does this realy work? */
- lprintf(CTDL_NOTICE, "Deleting room <%s>\n", qrbuf->QRname);
+ CtdlLogPrintf(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, "");
+ 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);
usergoto(config.c_baseroom, 0, 0, NULL, NULL);
/* tell the world what we did */
- snprintf(msg, sizeof msg, "%s> killed by %s\n",
+ 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);
struct floor flbuf;
struct visit vbuf;
- lprintf(CTDL_DEBUG, "create_room(name=%s, type=%d, view=%d)\n",
+ CtdlLogPrintf(CTDL_DEBUG, "create_room(name=%s, type=%d, view=%d)\n",
new_room_name, new_room_type, new_room_view);
if (getroom(&qrbuf, new_room_name) == 0) {
- lprintf(CTDL_DEBUG, "%s already exists.\n", new_room_name);
+ CtdlLogPrintf(CTDL_DEBUG, "%s already exists.\n", new_room_name);
return(0);
}
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)
/* 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 */
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;
}
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;
}
- 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;
}
/* post a message in Aide> describing the new room */
notification_message = malloc(1024);
snprintf(notification_message, 1024,
- "%s> created by %s%s%s%s%s%s\n",
+ "A new room called \"%s\" has been created by %s%s%s%s%s%s\n",
new_room_name,
CC->user.fullname,
((newflags & QR_MAILBOX) ? " [personal]" : ""),
((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");
- lprintf(CTDL_DEBUG, "opening\n");
+ assoc_file_name(infofilename, sizeof infofilename, &CC->room, ctdl_info_dir);
+ CtdlLogPrintf(CTDL_DEBUG, "opening\n");
fp = fopen(infofilename, "w");
- lprintf(CTDL_DEBUG, "checking\n");
+ CtdlLogPrintf(CTDL_DEBUG, "checking\n");
if (fp == NULL) {
cprintf("%d Cannot open %s: %s\n",
ERROR + INTERNAL_ERROR, infofilename, strerror(errno));
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;