/*
* Server functions which perform operations on room objects.
*
- * Copyright (c) 1987-2012 by the citadel.org team
+ * Copyright (c) 1987-2015 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 3.
#include "citserver.h"
#include "ctdl_module.h"
#include "room_ops.h"
+#include "config.h"
/*
* Back-back-end for all room listing commands
*/
void cmd_goto(char *gargs)
{
+ struct CitContext *CCC = CC;
struct ctdlroom QRscratch;
int c;
int ok = 0;
extract_token(password, gargs, 1, '|', sizeof password);
transiently = extract_int(gargs, 2);
- CtdlGetUser(&CC->user, CC->curr_user);
+ CtdlGetUser(&CCC->user, CCC->curr_user);
/*
* Handle some of the macro named rooms
/* Then try a mailbox name match */
if (c != 0) {
CtdlMailboxName(augmented_roomname, sizeof augmented_roomname,
- &CC->user, towhere);
+ &CCC->user, towhere);
c = CtdlGetRoom(&QRscratch, augmented_roomname);
if (c == 0)
safestrncpy(towhere, augmented_roomname, sizeof towhere);
if (c == 0) {
/* Let internal programs go directly to any room. */
- if (CC->internal_pgm) {
- memcpy(&CC->room, &QRscratch,
+ if (CCC->internal_pgm) {
+ memcpy(&CCC->room, &QRscratch,
sizeof(struct ctdlroom));
- CtdlUserGoto(NULL, 1, transiently, NULL, NULL);
+ CtdlUserGoto(NULL, 1, transiently, NULL, NULL, NULL, NULL);
return;
}
/* See if there is an existing user/room relationship */
- CtdlRoomAccess(&QRscratch, &CC->user, &ra, NULL);
+ CtdlRoomAccess(&QRscratch, &CCC->user, &ra, NULL);
/* normal clients have to pass through security */
if (ra & UA_GOTOALLOWED) {
if (ok == 1) {
if ((QRscratch.QRflags & QR_MAILBOX) &&
((ra & UA_GOTOALLOWED))) {
- memcpy(&CC->room, &QRscratch,
+ memcpy(&CCC->room, &QRscratch,
sizeof(struct ctdlroom));
- CtdlUserGoto(NULL, 1, transiently, NULL, NULL);
+ CtdlUserGoto(NULL, 1, transiently, NULL, NULL, NULL, NULL);
return;
} else if ((QRscratch.QRflags & QR_PASSWORDED) &&
((ra & UA_KNOWN) == 0) &&
(strcasecmp(QRscratch.QRpasswd, password)) &&
- (CC->user.axlevel < AxAideU)
+ (CCC->user.axlevel < AxAideU)
) {
cprintf("%d wrong or missing passwd\n",
ERROR + PASSWORD_REQUIRED);
((QRscratch.QRflags & QR_PASSWORDED) == 0) &&
((QRscratch.QRflags & QR_GUESSNAME) == 0) &&
((ra & UA_KNOWN) == 0) &&
- (CC->user.axlevel < AxAideU)
+ (CCC->user.axlevel < AxAideU)
) {
- syslog(LOG_DEBUG, "Failed to acquire private room\n");
+ CTDLM_syslog(LOG_DEBUG, "Failed to acquire private room");
} else {
- memcpy(&CC->room, &QRscratch,
+ memcpy(&CCC->room, &QRscratch,
sizeof(struct ctdlroom));
- CtdlUserGoto(NULL, 1, transiently, NULL, NULL);
+ CtdlUserGoto(NULL, 1, transiently, NULL, NULL, NULL, NULL);
return;
}
}
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);
+ cprintf("%d %s|%s/%s\n", LISTING_FOLLOWS, CtdlGetConfigStr("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");
CC->room.QRflags |= QR_PRIVATE;
/* Some changes can't apply to BASEROOM */
- if (!strncasecmp(CC->room.QRname, config.c_baseroom,
- ROOMNAMELEN)) {
+ if (!strncasecmp(CC->room.QRname, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN)) {
CC->room.QRorder = 0;
CC->room.QRpasswd[0] = '\0';
CC->room.QRflags &= ~(QR_PRIVATE & QR_PASSWORDED &
}
}
/* Some changes can't apply to AIDEROOM */
- if (!strncasecmp(CC->room.QRname, config.c_baseroom,
- ROOMNAMELEN)) {
+ if (!strncasecmp(CC->room.QRname, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN)) {
CC->room.QRorder = 0;
CC->room.QRflags &= ~QR_MAILBOX;
CC->room.QRflags |= QR_PERMANENT;
}
/*
- * retrieve info file for this room
+ * Retrieve info file for this room (this ought to be upgraded to handle non-plain-text)
*/
-void cmd_rinf(char *gargs)
+void cmd_rinf(char *argbuf)
{
- char filename[PATH_MAX];
- char buf[SIZ];
- FILE *info_fp;
-
- assoc_file_name(filename, sizeof filename, &CC->room, ctdl_info_dir);
- info_fp = fopen(filename, "r");
-
- if (info_fp == NULL) {
- cprintf("%d No info file.\n", ERROR + FILE_NOT_FOUND);
- return;
+ struct CtdlMessage *msg = CtdlFetchMessage(CC->room.msgnum_info, 1, 1);
+ if (msg != NULL) {
+ cprintf("%d Info:\n", LISTING_FOLLOWS);
+ CtdlOutputPreLoadedMsg(msg, MT_CITADEL, HEADERS_NONE, 0, 0, 0);
+ CM_Free(msg);
+ cprintf("000\n");
}
- cprintf("%d Info:\n", LISTING_FOLLOWS);
- while (fgets(buf, sizeof buf, info_fp) != NULL) {
- if (!IsEmptyStr(buf))
- buf[strlen(buf) - 1] = 0;
- cprintf("%s\n", buf);
+ else {
+ cprintf("%d No info file.\n", ERROR + FILE_NOT_FOUND);
}
- cprintf("000\n");
- fclose(info_fp);
}
CtdlScheduleRoomForDeletion(&CC->room);
/* Return to the Lobby */
- CtdlUserGoto(config.c_baseroom, 0, 0, NULL, NULL);
+ CtdlUserGoto(CtdlGetConfigStr("c_baseroom"), 0, 0, NULL, NULL, NULL, NULL);
/* tell the world what we did */
snprintf(msg, sizeof msg, "The room \"%s\" has been deleted by %s.\n",
if (CtdlAccessCheck(ac_logged_in)) return;
- if (CC->user.axlevel < config.c_createax && !CC->internal_pgm) {
+ if (CC->user.axlevel < CtdlGetConfigInt("c_createax") && !CC->internal_pgm) {
cprintf("%d You need higher access to create rooms.\n",
ERROR + HIGHER_ACCESS_REQUIRED);
return;
void cmd_einf(char *ok)
{ /* enter info file for current room */
+ struct CitContext *CCC = CC;
FILE *fp;
char infofilename[SIZ];
char buf[SIZ];
cprintf("%d Ok.\n", CIT_OK);
return;
}
- assoc_file_name(infofilename, sizeof infofilename, &CC->room, ctdl_info_dir);
- syslog(LOG_DEBUG, "opening\n");
+ assoc_file_name(infofilename, sizeof infofilename, &CCC->room, ctdl_info_dir);
+ CTDL_syslog(LOG_DEBUG, "opening %s", infofilename);
fp = fopen(infofilename, "w");
- syslog(LOG_DEBUG, "checking\n");
+ CTDLM_syslog(LOG_DEBUG, "checking");
if (fp == NULL) {
cprintf("%d Cannot open %s: %s\n",
ERROR + INTERNAL_ERROR, infofilename, strerror(errno));
fclose(fp);
/* now update the room index so people will see our new info */
- CtdlGetRoomLock(&CC->room, CC->room.QRname); /* lock so no one steps on us */
- CC->room.QRinfo = CC->room.QRhighest + 1L;
- CtdlPutRoomLock(&CC->room);
+ CtdlGetRoomLock(&CCC->room, CCC->room.QRname); /* lock so no one steps on us */
+ CtdlPutRoomLock(&CCC->room);
}