X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fctdlproto%2Fserv_rooms.c;h=10ddfc1f3ff87a9923d41de8703b8e308ff7e32a;hb=0c9cb3fbc797de34635bc6748937b710a4d37bcb;hp=14673274baabd90bd5e0318b7d4bf7ac3754cae2;hpb=60f03c2407f834ba677dfac9fe545db255ac8263;p=citadel.git diff --git a/citadel/modules/ctdlproto/serv_rooms.c b/citadel/modules/ctdlproto/serv_rooms.c index 14673274b..10ddfc1f3 100644 --- a/citadel/modules/ctdlproto/serv_rooms.c +++ b/citadel/modules/ctdlproto/serv_rooms.c @@ -1,7 +1,7 @@ /* * Server functions which perform operations on room objects. * - * Copyright (c) 1987-2012 by the citadel.org team + * Copyright (c) 1987-2017 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. @@ -19,6 +19,7 @@ #include "citserver.h" #include "ctdl_module.h" #include "room_ops.h" +#include "config.h" /* * Back-back-end for all room listing commands @@ -265,6 +266,7 @@ void cmd_lzrm(char *argbuf) */ void cmd_goto(char *gargs) { + struct CitContext *CCC = CC; struct ctdlroom QRscratch; int c; int ok = 0; @@ -280,7 +282,7 @@ void cmd_goto(char *gargs) 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 @@ -293,7 +295,7 @@ void cmd_goto(char *gargs) /* 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); @@ -303,15 +305,15 @@ void cmd_goto(char *gargs) 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, 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) { @@ -321,14 +323,14 @@ void cmd_goto(char *gargs) 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, 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); @@ -337,11 +339,11 @@ void cmd_goto(char *gargs) ((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"); + syslog(LOG_DEBUG, "rooms: failed to acquire private room"); } else { - memcpy(&CC->room, &QRscratch, + memcpy(&CCC->room, &QRscratch, sizeof(struct ctdlroom)); CtdlUserGoto(NULL, 1, transiently, NULL, NULL, NULL, NULL); return; @@ -416,7 +418,7 @@ void cmd_rdir(char *cmdbuf) 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"); @@ -595,8 +597,7 @@ void cmd_setr(char *args) 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 & @@ -619,8 +620,7 @@ void cmd_setr(char *args) } } /* 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; @@ -708,29 +708,20 @@ void cmd_seta(char *new_ra) } /* - * 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); } @@ -761,7 +752,7 @@ void cmd_kill(char *argbuf) CtdlScheduleRoomForDeletion(&CC->room); /* Return to the Lobby */ - CtdlUserGoto(config.c_baseroom, 0, 0, NULL, NULL, 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", @@ -831,7 +822,7 @@ void cmd_cre8(char *args) 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; @@ -895,13 +886,13 @@ void cmd_cre8(char *args) } - +/* + * Upload the room banner text for this room. + * This should be amended to handle content types other than plain text. + */ void cmd_einf(char *ok) { /* enter info file for current room */ - FILE *fp; - char infofilename[SIZ]; char buf[SIZ]; - unbuffer_output(); if (CtdlAccessCheck(ac_room_aide)) return; @@ -910,28 +901,27 @@ void cmd_einf(char *ok) cprintf("%d Ok.\n", CIT_OK); return; } - assoc_file_name(infofilename, sizeof infofilename, &CC->room, ctdl_info_dir); - syslog(LOG_DEBUG, "opening\n"); - fp = fopen(infofilename, "w"); - syslog(LOG_DEBUG, "checking\n"); - if (fp == NULL) { - cprintf("%d Cannot open %s: %s\n", - ERROR + INTERNAL_ERROR, infofilename, strerror(errno)); - return; + + StrBuf *NewBanner = NewStrBufPlain("Content-type: text/plain; charset=UTF-8\nContent-transfer-encoding: 8bit\n\n", -1); + + cprintf("%d Transmit new banner in plain text now.\n", SEND_LISTING); + while(client_getln(buf, sizeof buf) >= 0 && strcmp(buf,"000")) { + StrBufAppendBufPlain(NewBanner, buf, -1, 0); + StrBufAppendBufPlain(NewBanner, HKEY("\n"), 0); } - cprintf("%d Send info...\n", SEND_LISTING); - - do { - client_getln(buf, sizeof buf); - if (strcmp(buf, "000")) - fprintf(fp, "%s\n", buf); - } while (strcmp(buf, "000")); - 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; + + // We have read the new banner from the user , now save it + long new_msgnum = quickie_message("Citadel", NULL, NULL, SYSCONFIGROOM, ChrPtr(NewBanner), FMT_RFC822, "Banner submitted with EINF command"); + FreeStrBuf(&NewBanner); + + // Update the room record with a pointer to our new banner + CtdlGetRoomLock(&CC->room, CC->room.QRname); + long old_msgnum = CC->room.msgnum_info; + CC->room.msgnum_info = new_msgnum; CtdlPutRoomLock(&CC->room); + + // Delete the old one + CtdlDeleteMessages(SYSCONFIGROOM, &old_msgnum, 1, ""); }