X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Froom_ops.c;h=44573dae34d985470c823f491b9005dba760efb8;hb=2d108c1f33c86b501a2540ba48eaedded8894f20;hp=c9bcd8000b4bb731c89e7e44830b1ed2ac1367a4;hpb=dbaf416c5e665af584ad1db3109cc5486fdfa96f;p=citadel.git diff --git a/citadel/room_ops.c b/citadel/room_ops.c index c9bcd8000..44573dae3 100644 --- a/citadel/room_ops.c +++ b/citadel/room_ops.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-2021 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. @@ -16,7 +16,6 @@ #include #include "citserver.h" - #include "ctdl_module.h" #include "config.h" #include "control.h" @@ -32,13 +31,14 @@ struct floor *floorcache[MAXFLOORS]; int CtdlDoIHavePermissionToReadMessagesInThisRoom(void) { if ( (!(CC->logged_in)) && (!(CC->internal_pgm)) - && (!config.c_guest_logins) + && (!CtdlGetConfigInt("c_guest_logins")) ) { return(om_not_logged_in); } return(om_ok); } + /* * Check to see whether we have permission to post a message in the current * room. Returns a *CITADEL ERROR CODE* and puts a message in errmsgbuf, or @@ -50,19 +50,17 @@ int CtdlDoIHavePermissionToPostInThisRoom( const char* RemoteIdentifier, PostType PostPublic, int is_reply - ) { +) { int ra; - if (!(CC->logged_in) && - (PostPublic == POST_LOGGED_IN)) { + if (!(CC->logged_in) && (PostPublic == POST_LOGGED_IN)) { snprintf(errmsgbuf, n, "Not logged in."); return (ERROR + NOT_LOGGED_IN); } else if (PostPublic == CHECK_EXISTANCE) { - return (0); // We're Evaling whether a recipient exists + return (0); // evaluate whether a recipient exists } else if (!(CC->logged_in)) { - if ((CC->room.QRflags & QR_READONLY)) { snprintf(errmsgbuf, n, "Not logged in."); return (ERROR + NOT_LOGGED_IN); @@ -71,16 +69,14 @@ int CtdlDoIHavePermissionToPostInThisRoom( snprintf(errmsgbuf, n, "Not logged in Moderation feature not yet implemented!"); return (ERROR + NOT_LOGGED_IN); } - if ((PostPublic!=POST_LMTP) &&(CC->room.QRflags2 & QR2_SMTP_PUBLIC) == 0) { - - return CtdlNetconfigCheckRoomaccess(errmsgbuf, n, RemoteIdentifier); - } + // FIXME what was this? AJC 2021 + //if ((PostPublic != POST_LMTP) && (CC->room.QRflags2 & QR2_SMTP_PUBLIC) == 0) { + //return CtdlNetconfigCheckRoomaccess(errmsgbuf, n, RemoteIdentifier); + //} return (0); - } - if ((CC->user.axlevel < AxProbU) - && ((CC->room.QRflags & QR_MAILBOX) == 0)) { + if ((CC->user.axlevel < AxProbU) && ((CC->room.QRflags & QR_MAILBOX) == 0)) { snprintf(errmsgbuf, n, "Need to be validated to enter (except in %s> to sysop)", MAILROOM); return (ERROR + HIGHER_ACCESS_REQUIRED); } @@ -113,6 +109,7 @@ int CtdlDoIHavePermissionToPostInThisRoom( } + /* * Check whether the current user has permission to delete messages from * the current room (returns 1 for yes, 0 for no) @@ -124,12 +121,12 @@ int CtdlDoIHavePermissionToDeleteMessagesFromThisRoom(void) { return(0); } + /* - * Retrieve access control information for any user/room pair + * Retrieve access control information for any user/room pair. + * Yes, it has a couple of gotos. If you don't like that, go die in a car fire. */ -void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf, - int *result, int *view) -{ +void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf, int *result, int *view) { int retval = 0; visit vbuf; int is_me = 0; @@ -139,7 +136,7 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf, is_me = 1; } - if ((is_me) && (config.c_guest_logins) && (!CC->logged_in)) { + if ((is_me) && (CtdlGetConfigInt("c_guest_logins")) && (!CC->logged_in)) { is_guest = 1; } @@ -166,7 +163,7 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf, } /* Force the properties of the Aide room */ - if (!strcasecmp(roombuf->QRname, config.c_aideroom)) { + if (!strcasecmp(roombuf->QRname, CtdlGetConfigStr("c_aideroom"))) { if (userbuf->axlevel >= AxAideU) { retval = UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED | UA_REPLYALLOWED; } else { @@ -330,27 +327,27 @@ SKIP_EVERYTHING: /* * Self-checking stuff for a room record read into memory */ -void room_sanity_check(struct ctdlroom *qrbuf) -{ +void room_sanity_check(struct ctdlroom *qrbuf) { /* Mailbox rooms are always on the lowest floor */ if (qrbuf->QRflags & QR_MAILBOX) { qrbuf->QRfloor = 0; } /* Listing order of 0 is illegal except for base rooms */ - if (qrbuf->QRorder == 0) - if (!(qrbuf->QRflags & QR_MAILBOX) && - strncasecmp(qrbuf->QRname, config.c_baseroom, ROOMNAMELEN) - && - strncasecmp(qrbuf->QRname, config.c_aideroom, ROOMNAMELEN)) + if (qrbuf->QRorder == 0) { + if ( !(qrbuf->QRflags & QR_MAILBOX) + && strncasecmp(qrbuf->QRname, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN) + && strncasecmp(qrbuf->QRname, CtdlGetConfigStr("c_aideroom"), ROOMNAMELEN) + ) { qrbuf->QRorder = 64; + } + } } /* * CtdlGetRoom() - retrieve room data from disk */ -int CtdlGetRoom(struct ctdlroom *qrbuf, const char *room_name) -{ +int CtdlGetRoom(struct ctdlroom *qrbuf, const char *room_name) { struct cdbdata *cdbqr; char lowercase_name[ROOMNAMELEN]; char personal_lowercase_name[ROOMNAMELEN]; @@ -360,7 +357,7 @@ int CtdlGetRoom(struct ctdlroom *qrbuf, const char *room_name) dptr = lowercase_name; sptr = room_name; eptr = (dptr + (sizeof lowercase_name - 1)); - while (!IsEmptyStr(sptr) && (dptr < eptr)){ + while (!IsEmptyStr(sptr) && (dptr < eptr)) { *dptr = tolower(*sptr); sptr++; dptr++; } @@ -369,37 +366,29 @@ int CtdlGetRoom(struct ctdlroom *qrbuf, const char *room_name) memset(qrbuf, 0, sizeof(struct ctdlroom)); /* First, try the public namespace */ - cdbqr = cdb_fetch(CDB_ROOMS, - lowercase_name, strlen(lowercase_name)); + cdbqr = cdb_fetch(CDB_ROOMS, lowercase_name, strlen(lowercase_name)); /* If that didn't work, try the user's personal namespace */ if (cdbqr == NULL) { - snprintf(personal_lowercase_name, - sizeof personal_lowercase_name, "%010ld.%s", - CC->user.usernum, lowercase_name); - cdbqr = cdb_fetch(CDB_ROOMS, - personal_lowercase_name, - strlen(personal_lowercase_name)); + snprintf(personal_lowercase_name, sizeof personal_lowercase_name, "%010ld.%s", CC->user.usernum, lowercase_name); + cdbqr = cdb_fetch(CDB_ROOMS, personal_lowercase_name, strlen(personal_lowercase_name)); } if (cdbqr != NULL) { - memcpy(qrbuf, cdbqr->ptr, - ((cdbqr->len > sizeof(struct ctdlroom)) ? - sizeof(struct ctdlroom) : cdbqr->len)); + memcpy(qrbuf, cdbqr->ptr, ((cdbqr->len > sizeof(struct ctdlroom)) ? sizeof(struct ctdlroom) : cdbqr->len)); cdb_free(cdbqr); - room_sanity_check(qrbuf); - return (0); - } else { + } + else { return (1); } } + /* * CtdlGetRoomLock() - same as getroom() but locks the record (if supported) */ -int CtdlGetRoomLock(struct ctdlroom *qrbuf, const char *room_name) -{ +int CtdlGetRoomLock(struct ctdlroom *qrbuf, const char *room_name) { register int retval; retval = CtdlGetRoom(qrbuf, room_name); if (retval == 0) begin_critical_section(S_ROOMS); @@ -419,8 +408,7 @@ void b_putroom(struct ctdlroom *qrbuf, char *room_name) aptr = room_name; bptr = lowercase_name; - while (!IsEmptyStr(aptr)) - { + while (!IsEmptyStr(aptr)) { *bptr = tolower(*aptr); aptr++; bptr++; @@ -430,7 +418,8 @@ void b_putroom(struct ctdlroom *qrbuf, char *room_name) len = bptr - lowercase_name; if (qrbuf == NULL) { cdb_delete(CDB_ROOMS, lowercase_name, len); - } else { + } + else { time(&qrbuf->QRmtime); cdb_store(CDB_ROOMS, lowercase_name, len, qrbuf, sizeof(struct ctdlroom)); } @@ -456,12 +445,9 @@ void b_deleteroom(char *room_name) { /* * CtdlPutRoomLock() - same as CtdlPutRoom() but unlocks the record (if supported) */ -void CtdlPutRoomLock(struct ctdlroom *qrbuf) -{ - +void CtdlPutRoomLock(struct ctdlroom *qrbuf) { CtdlPutRoom(qrbuf); end_critical_section(S_ROOMS); - } @@ -469,8 +455,7 @@ void CtdlPutRoomLock(struct ctdlroom *qrbuf) * CtdlGetFloorByName() - retrieve the number of the named floor * return < 0 if not found else return floor number */ -int CtdlGetFloorByName(const char *floor_name) -{ +int CtdlGetFloorByName(const char *floor_name) { int a; struct floor *flbuf = NULL; @@ -478,8 +463,7 @@ int CtdlGetFloorByName(const char *floor_name) flbuf = CtdlGetCachedFloor(a); /* check to see if it already exists */ - if ((!strcasecmp(flbuf->f_name, floor_name)) - && (flbuf->f_flags & F_INUSE)) { + if ((!strcasecmp(flbuf->f_name, floor_name)) && (flbuf->f_flags & F_INUSE)) { return a; } } @@ -497,13 +481,11 @@ int CtdlGetFloorByNameLock(const char *floor_name) } - /* * CtdlGetAvailableFloor() - Return number of first unused floor * return < 0 if none available */ -int CtdlGetAvailableFloor(void) -{ +int CtdlGetAvailableFloor(void) { int a; struct floor *flbuf = NULL; @@ -522,35 +504,28 @@ int CtdlGetAvailableFloor(void) /* * CtdlGetFloor() - retrieve floor data from disk */ -void CtdlGetFloor(struct floor *flbuf, int floor_num) -{ +void CtdlGetFloor(struct floor *flbuf, int floor_num) { struct cdbdata *cdbfl; memset(flbuf, 0, sizeof(struct floor)); cdbfl = cdb_fetch(CDB_FLOORTAB, &floor_num, sizeof(int)); if (cdbfl != NULL) { - memcpy(flbuf, cdbfl->ptr, - ((cdbfl->len > sizeof(struct floor)) ? - sizeof(struct floor) : cdbfl->len)); + memcpy(flbuf, cdbfl->ptr, ((cdbfl->len > sizeof(struct floor)) ? sizeof(struct floor) : cdbfl->len)); cdb_free(cdbfl); } else { if (floor_num == 0) { - safestrncpy(flbuf->f_name, "Main Floor", - sizeof flbuf->f_name); + safestrncpy(flbuf->f_name, "Main Floor", sizeof flbuf->f_name); flbuf->f_flags = F_INUSE; flbuf->f_ref_count = 3; } } - } /* * lgetfloor() - same as CtdlGetFloor() but locks the record (if supported) */ -void lgetfloor(struct floor *flbuf, int floor_num) -{ - +void lgetfloor(struct floor *flbuf, int floor_num) { begin_critical_section(S_FLOORTAB); CtdlGetFloor(flbuf, floor_num); } @@ -597,8 +572,7 @@ struct floor *CtdlGetCachedFloor(int floor_num) { /* * CtdlPutFloor() - store floor data on disk */ -void CtdlPutFloor(struct floor *flbuf, int floor_num) -{ +void CtdlPutFloor(struct floor *flbuf, int floor_num) { /* If we've cached this, clear it out, 'cuz it's WRONG now! */ begin_critical_section(S_FLOORCACHE); if (floorcache[floor_num] != NULL) { @@ -616,9 +590,7 @@ void CtdlPutFloor(struct floor *flbuf, int floor_num) /* * CtdlPutFloorLock() - same as CtdlPutFloor() but unlocks the record (if supported) */ -void CtdlPutFloorLock(struct floor *flbuf, int floor_num) -{ - +void CtdlPutFloorLock(struct floor *flbuf, int floor_num) { CtdlPutFloor(flbuf, floor_num); end_critical_section(S_FLOORTAB); @@ -628,66 +600,26 @@ void CtdlPutFloorLock(struct floor *flbuf, int floor_num) /* * lputfloor() - same as CtdlPutFloor() but unlocks the record (if supported) */ -void lputfloor(struct floor *flbuf, int floor_num) -{ +void lputfloor(struct floor *flbuf, int floor_num) { CtdlPutFloorLock(flbuf, floor_num); } - /* - * Traverse the room file... + * Iterate through the room table, performing a callback for each room. */ -void CtdlForEachRoom(ForEachRoomCallBack CB, void *in_data) -{ +void CtdlForEachRoom(ForEachRoomCallBack callback_func, void *in_data) { struct ctdlroom qrbuf; struct cdbdata *cdbqr; cdb_rewind(CDB_ROOMS); while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr != NULL) { - memset(&qrbuf, 0, sizeof(struct ctdlroom)); - memcpy(&qrbuf, cdbqr->ptr, - ((cdbqr->len > sizeof(struct ctdlroom)) ? - sizeof(struct ctdlroom) : cdbqr->len) - ); + memset(&qrbuf, 0, sizeof(struct ctdlroom)); + memcpy(&qrbuf, cdbqr->ptr, ((cdbqr->len > sizeof(struct ctdlroom)) ? sizeof(struct ctdlroom) : cdbqr->len) ); cdb_free(cdbqr); room_sanity_check(&qrbuf); if (qrbuf.QRflags & QR_INUSE) { - CB(&qrbuf, in_data); - } - } -} - -/* - * Traverse the room file... - */ -void CtdlForEachNetCfgRoom(ForEachRoomNetCfgCallBack CB, - void *in_data, - RoomNetCfg filter) -{ - struct ctdlroom qrbuf; - struct cdbdata *cdbqr; - - cdb_rewind(CDB_ROOMS); - - while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr != NULL) { - memset(&qrbuf, 0, sizeof(struct ctdlroom)); - memcpy(&qrbuf, cdbqr->ptr, - ((cdbqr->len > sizeof(struct ctdlroom)) ? - sizeof(struct ctdlroom) : cdbqr->len) - ); - cdb_free(cdbqr); - room_sanity_check(&qrbuf); - if (qrbuf.QRflags & QR_INUSE) - { - OneRoomNetCfg* RNCfg; - RNCfg = CtdlGetNetCfgForRoom(qrbuf.QRnumber); - if ((RNCfg != NULL) && - ((filter == maxRoomNetCfg) || - (RNCfg->NetConfigs[filter] != NULL))) - { - CB(&qrbuf, in_data, RNCfg); - } + callback_func(&qrbuf, in_data); } } } @@ -696,8 +628,7 @@ void CtdlForEachNetCfgRoom(ForEachRoomNetCfgCallBack CB, /* * delete_msglist() - delete room message pointers */ -void delete_msglist(struct ctdlroom *whichroom) -{ +void delete_msglist(struct ctdlroom *whichroom) { struct cdbdata *cdbml; /* Make sure the msglist we're deleting actually exists, otherwise @@ -727,8 +658,7 @@ int sort_msglist_cmp(const void *m1, const void *m2) { * sort message pointers * (returns new msg count) */ -int sort_msglist(long listptrs[], int oldcount) -{ +int sort_msglist(long listptrs[], int oldcount) { int numitems; int i = 0; @@ -743,8 +673,7 @@ int sort_msglist(long listptrs[], int oldcount) /* and yank any nulls */ while ((i < numitems) && (listptrs[i] == 0L)) i++; - if (i > 0) - { + if (i > 0) { memmove(&listptrs[0], &listptrs[i], (sizeof(long) * (numitems - i))); numitems-=i; } @@ -756,13 +685,12 @@ int sort_msglist(long listptrs[], int oldcount) /* * Determine whether a given room is non-editable. */ -int CtdlIsNonEditable(struct ctdlroom *qrbuf) -{ +int CtdlIsNonEditable(struct ctdlroom *qrbuf) { /* Mail> rooms are non-editable */ - if ( (qrbuf->QRflags & QR_MAILBOX) - && (!strcasecmp(&qrbuf->QRname[11], MAILROOM)) ) + if ( (qrbuf->QRflags & QR_MAILBOX) && (!strcasecmp(&qrbuf->QRname[11], MAILROOM)) ) { return (1); + } /* Everything else is editable */ return (0); @@ -778,7 +706,6 @@ int CtdlIsNonEditable(struct ctdlroom *qrbuf) void CtdlUserGoto(char *where, int display_result, int transiently, int *retmsgs, int *retnew, long *retoldest, long *retnewest) { - struct CitContext *CCC = CC; int a; int new_messages = 0; int old_messages = 0; @@ -806,40 +733,49 @@ void CtdlUserGoto(char *where, int display_result, int transiently, * we can skip the extra database fetch. */ if (where != NULL) { - safestrncpy(CCC->room.QRname, where, sizeof CCC->room.QRname); - CtdlGetRoom(&CCC->room, where); + safestrncpy(CC->room.QRname, where, sizeof CC->room.QRname); + CtdlGetRoom(&CC->room, where); } /* Take care of all the formalities. */ begin_critical_section(S_USERS); - CtdlGetRelationship(&vbuf, &CCC->user, &CCC->room); + CtdlGetRelationship(&vbuf, &CC->user, &CC->room); original_v_flags = vbuf.v_flags; /* Know the room ... but not if it's the page log room, or if the * caller specified that we're only entering this room transiently. */ - if ((strcasecmp(CCC->room.QRname, config.c_logpages)) - && (transiently == 0) ) { + int add_room_to_known_list = 1; + if (transiently == 1) { + add_room_to_known_list = 0; + } + char *c_logpages = CtdlGetConfigStr("c_logpages"); + if ( (c_logpages != NULL) && (!strcasecmp(CC->room.QRname, c_logpages)) ) { + add_room_to_known_list = 0; + } + if (add_room_to_known_list) { vbuf.v_flags = vbuf.v_flags & ~V_FORGET & ~V_LOCKOUT; vbuf.v_flags = vbuf.v_flags | V_ACCESS; } /* Only rewrite the database record if we changed something */ if (vbuf.v_flags != original_v_flags) { - CtdlSetRelationship(&vbuf, &CCC->user, &CCC->room); + CtdlSetRelationship(&vbuf, &CC->user, &CC->room); } end_critical_section(S_USERS); /* Check for new mail */ newmailcount = NewMailCount(); - /* set info to 1 if the user needs to read the room's info file */ - if (CCC->room.QRinfo > vbuf.v_lastseen) { + /* Set info to 1 if the room banner is new since our last visit. + * Some clients only want to display it when it changes. + */ + if (CC->room.msgnum_info > vbuf.v_lastseen) { info = 1; } - cdbfr = cdb_fetch(CDB_MSGLISTS, &CCC->room.QRnumber, sizeof(long)); + cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long)); if (cdbfr != NULL) { msglist = (long *) cdbfr->ptr; cdbfr->ptr = NULL; /* CtdlUserGoto() now owns this memory */ @@ -885,20 +821,18 @@ void CtdlUserGoto(char *where, int display_result, int transiently, if (msglist != NULL) free(msglist); - if (CCC->room.QRflags & QR_MAILBOX) + if (CC->room.QRflags & QR_MAILBOX) rmailflag = 1; else rmailflag = 0; - if ((CCC->room.QRroomaide == CCC->user.usernum) - || (CCC->user.axlevel >= AxAideU)) + if ((CC->room.QRroomaide == CC->user.usernum) || (CC->user.axlevel >= AxAideU)) raideflag = 1; else raideflag = 0; - safestrncpy(truncated_roomname, CCC->room.QRname, sizeof truncated_roomname); - if ( (CCC->room.QRflags & QR_MAILBOX) - && (atol(CCC->room.QRname) == CCC->user.usernum) ) { + safestrncpy(truncated_roomname, CC->room.QRname, sizeof truncated_roomname); + if ( (CC->room.QRflags & QR_MAILBOX) && (atol(CC->room.QRname) == CC->user.usernum) ) { safestrncpy(truncated_roomname, &truncated_roomname[11], sizeof truncated_roomname); } @@ -910,11 +844,11 @@ void CtdlUserGoto(char *where, int display_result, int transiently, if (retnew != NULL) *retnew = new_messages; if (retoldest != NULL) *retoldest = oldest_message; if (retnewest != NULL) *retnewest = newest_message; - MSG_syslog(LOG_INFO, "<%s> %d new of %d total messages, oldest=%ld, newest=%ld\n", - CCC->room.QRname, new_messages, total_messages, oldest_message, newest_message + syslog(LOG_DEBUG, "room_ops: %s : %d new of %d total messages, oldest=%ld, newest=%ld", + CC->room.QRname, new_messages, total_messages, oldest_message, newest_message ); - CCC->curr_view = (int)vbuf.v_view; + 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|%d|%ld|\n", @@ -923,18 +857,18 @@ void CtdlUserGoto(char *where, int display_result, int transiently, (int)new_messages, (int)total_messages, (int)info, - (int)CCC->room.QRflags, - (long)CCC->room.QRhighest, + (int)CC->room.QRflags, + (long)CC->room.QRhighest, (long)vbuf.v_lastseen, (int)rmailflag, (int)raideflag, (int)newmailcount, - (int)CCC->room.QRfloor, + (int)CC->room.QRfloor, (int)vbuf.v_view, - (int)CCC->room.QRdefaultview, + (int)CC->room.QRdefaultview, (int)is_trash, - (int)CCC->room.QRflags2, - (long)CCC->room.QRmtime + (int)CC->room.QRflags2, + (long)CC->room.QRmtime ); } } @@ -945,7 +879,7 @@ void CtdlUserGoto(char *where, int display_result, int transiently, */ void convert_room_name_macros(char *towhere, size_t maxlen) { if (!strcasecmp(towhere, "_BASEROOM_")) { - safestrncpy(towhere, config.c_baseroom, maxlen); + safestrncpy(towhere, CtdlGetConfigStr("c_baseroom"), maxlen); } else if (!strcasecmp(towhere, "_MAIL_")) { safestrncpy(towhere, MAILROOM, maxlen); @@ -957,7 +891,7 @@ void convert_room_name_macros(char *towhere, size_t maxlen) { safestrncpy(towhere, USERDRAFTROOM, maxlen); } else if (!strcasecmp(towhere, "_BITBUCKET_")) { - safestrncpy(towhere, config.c_twitroom, maxlen); + safestrncpy(towhere, CtdlGetConfigStr("c_twitroom"), maxlen); } else if (!strcasecmp(towhere, "_CALENDAR_")) { safestrncpy(towhere, USERCALENDARROOM, maxlen); @@ -992,8 +926,7 @@ int CtdlRenameRoom(char *old_name, char *new_name, int new_floor) { long owner = 0L; char actual_old_name[ROOMNAMELEN]; - syslog(LOG_DEBUG, "CtdlRenameRoom(%s, %s, %d)\n", - old_name, new_name, new_floor); + syslog(LOG_DEBUG, "room_ops: CtdlRenameRoom(%s, %s, %d)", old_name, new_name, new_floor); if (new_floor >= 0) { fl = CtdlGetCachedFloor(new_floor); @@ -1004,8 +937,7 @@ int CtdlRenameRoom(char *old_name, char *new_name, int new_floor) { begin_critical_section(S_ROOMS); - if ( (CtdlGetRoom(&qrtmp, new_name) == 0) - && (strcasecmp(new_name, old_name)) ) { + if ( (CtdlGetRoom(&qrtmp, new_name) == 0) && (strcasecmp(new_name, old_name)) ) { ret = crr_already_exists; } @@ -1039,8 +971,9 @@ int CtdlRenameRoom(char *old_name, char *new_name, int new_floor) { } /* Reject change of floor for baseroom/aideroom */ - if (!strncasecmp(old_name, config.c_baseroom, ROOMNAMELEN) || - !strncasecmp(old_name, config.c_aideroom, ROOMNAMELEN)) { + if (!strncasecmp(old_name, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN) || + !strncasecmp(old_name, CtdlGetConfigStr("c_aideroom"), ROOMNAMELEN)) + { new_floor = 0; } @@ -1055,13 +988,11 @@ int CtdlRenameRoom(char *old_name, char *new_name, int new_floor) { begin_critical_section(S_CONFIG); /* If baseroom/aideroom name changes, update config */ - if (!strncasecmp(old_name, config.c_baseroom, ROOMNAMELEN)) { - safestrncpy(config.c_baseroom, new_name, ROOMNAMELEN); - put_config(); + if (!strncasecmp(old_name, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN)) { + CtdlSetConfigStr("c_baseroom", new_name); } - if (!strncasecmp(old_name, config.c_aideroom, ROOMNAMELEN)) { - safestrncpy(config.c_aideroom, new_name, ROOMNAMELEN); - put_config(); + if (!strncasecmp(old_name, CtdlGetConfigStr("c_aideroom"), ROOMNAMELEN)) { + CtdlSetConfigStr("c_aideroom", new_name); } end_critical_section(S_CONFIG); @@ -1083,11 +1014,11 @@ int CtdlRenameRoom(char *old_name, char *new_name, int new_floor) { lgetfloor(&flbuf, old_floor); --flbuf.f_ref_count; lputfloor(&flbuf, old_floor); - syslog(LOG_DEBUG, "Reference count for floor %d is now %d\n", old_floor, flbuf.f_ref_count); + syslog(LOG_DEBUG, "room_ops: reference count for floor %d is now %d", old_floor, flbuf.f_ref_count); lgetfloor(&flbuf, new_floor); ++flbuf.f_ref_count; lputfloor(&flbuf, new_floor); - syslog(LOG_DEBUG, "Reference count for floor %d is now %d\n", new_floor, flbuf.f_ref_count); + syslog(LOG_DEBUG, "room_ops: reference count for floor %d is now %d", new_floor, flbuf.f_ref_count); } /* ...and everybody say "YATTA!" */ @@ -1095,22 +1026,19 @@ int CtdlRenameRoom(char *old_name, char *new_name, int new_floor) { } - /* - * Asynchronously schedule a room for deletion. The room will appear - * deleted to the user(s), but it won't actually get purged from the - * database until THE DREADED AUTO-PURGER makes its next run. + * Asynchronously schedule a room for deletion. By placing the room into an invalid private namespace, + * the room will appear deleted to the user(s), but the session doesn't need to block while waiting for + * database operations to complete. Instead, the room gets purged when THE DREADED AUTO-PURGER makes + * its next run. Aren't we so clever?!! */ -void CtdlScheduleRoomForDeletion(struct ctdlroom *qrbuf) -{ +void CtdlScheduleRoomForDeletion(struct ctdlroom *qrbuf) { char old_name[ROOMNAMELEN]; static int seq = 0; - syslog(LOG_NOTICE, "Scheduling room <%s> for deletion\n", - qrbuf->QRname); + syslog(LOG_NOTICE, "room_ops: scheduling room <%s> for deletion", qrbuf->QRname); safestrncpy(old_name, qrbuf->QRname, sizeof old_name); - CtdlGetRoom(qrbuf, qrbuf->QRname); /* Turn the room into a private mailbox owned by a user who doesn't @@ -1124,39 +1052,26 @@ void CtdlScheduleRoomForDeletion(struct ctdlroom *qrbuf) ); qrbuf->QRflags |= QR_MAILBOX; time(&qrbuf->QRgen); /* Use a timestamp as the new generation number */ - CtdlPutRoom(qrbuf); - b_deleteroom(old_name); } - /* * Back end processing to delete a room and everything associated with it * (This one is synchronous and should only get called by THE DREADED * AUTO-PURGER in serv_expire.c. All user-facing code should call * the asynchronous schedule_room_for_deletion() instead.) */ -void CtdlDeleteRoom(struct ctdlroom *qrbuf) -{ +void CtdlDeleteRoom(struct ctdlroom *qrbuf) { struct floor flbuf; - char filename[100]; - /* TODO: filename magic? does this realy work? */ - - syslog(LOG_NOTICE, "Deleting room <%s>\n", qrbuf->QRname); + char configdbkeyname[25]; - /* Delete the info file */ - assoc_file_name(filename, sizeof filename, qrbuf, ctdl_info_dir); - unlink(filename); + syslog(LOG_NOTICE, "room_ops: deleting room <%s>", qrbuf->QRname); - /* Delete the image file */ - 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, ctdl_netcfg_dir); - unlink(filename); + /* Delete the room's network configdb entry */ + netcfg_keyname(configdbkeyname, qrbuf->QRnumber); + CtdlDelConfig(configdbkeyname); /* Delete the messages in the room * (Careful: this opens an S_ROOMS critical section!) @@ -1178,7 +1093,6 @@ void CtdlDeleteRoom(struct ctdlroom *qrbuf) } - /* * Check access control for deleting a room */ @@ -1217,7 +1131,6 @@ int CtdlDoIHavePermissionToDeleteThisRoom(struct ctdlroom *qr) { } - /* * Internal code to create a new room (returns room flags) * @@ -1232,16 +1145,14 @@ unsigned CtdlCreateRoom(char *new_room_name, int avoid_access, int new_room_view) { - struct ctdlroom qrbuf; struct floor flbuf; visit vbuf; - syslog(LOG_DEBUG, "CtdlCreateRoom(name=%s, type=%d, view=%d)\n", - new_room_name, new_room_type, new_room_view); + syslog(LOG_DEBUG, "room_ops: CtdlCreateRoom(name=%s, type=%d, view=%d)", new_room_name, new_room_type, new_room_view); if (CtdlGetRoom(&qrbuf, new_room_name) == 0) { - syslog(LOG_DEBUG, "%s already exists.\n", new_room_name); + syslog(LOG_DEBUG, "room_ops: cannot create room <%s> - already exists", new_room_name); return(0); }