#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"
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)
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 */
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));
}
}
/* 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;
}
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
);
}
}
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];
+
if (CtdlAccessCheck(ac_logged_in)) return;
- CtdlMakeTempFileName(tempfilename, sizeof 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/%s\n",
- LISTING_FOLLOWS,
- config.c_fqdn,
- ctdl_file_dir,
- CC->room.QRdirname);
-
- snprintf(buf, sizeof buf,
- "ls %s/%s >%s 2>/dev/null",
- ctdl_file_dir,
- CC->room.QRdirname,
- tempfilename);
- system(buf);
-
- 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/%s/%s",
- ctdl_file_dir,
- CC->room.QRdirname,
- flnm);
- stat(buf, &statbuf);
- safestrncpy(comment, "", sizeof comment);
- fseek(fd, 0L, 0);
- while ((fgets(buf, sizeof buf, fd) != NULL)
- && (strlen(comment) == 0)) {
- buf[strlen(buf) - 1] = 0;
- if ((!strncasecmp(buf, flnm, strlen(flnm)))
- && (buf[strlen(flnm)] == ' '))
- safestrncpy(comment,
- &buf[strlen(flnm) + 1],
- sizeof comment);
+ cprintf("%d %s|%s/%s\n", LISTING_FOLLOWS, config.c_fqdn, ctdl_file_dir, CC->room.QRdirname);
+
+ snprintf(buf, sizeof buf, "%s/%s", ctdl_file_dir, CC->room.QRdirname);
+ filedir = opendir (buf);
+ if (filedir)
+ {
+ 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");
+ 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); /* 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, filedir_entry->d_name, d_namelen)) && (buf[d_namelen] == ' '))
+ safestrncpy(comment, &buf[d_namelen + 1], sizeof comment);
+ }
+ cprintf("%s|%ld|%s\n", filedir_entry->d_name, (long)statbuf.st_size, comment);
}
- cprintf("%s|%ld|%s\n", flnm, (long)statbuf.st_size, comment);
}
+ fclose(fd);
+ closedir(filedir);
}
- fclose(ls);
- fclose(fd);
- unlink(tempfilename);
-
cprintf("000\n");
}
* 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);
}
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);
}
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;
}
if (CtdlAccessCheck(ac_logged_in)) return;
- if (CC->user.axlevel < config.c_createax || CC->internal_pgm) {
+ 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;
}
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;