-/*
- * Server functions which perform operations on room objects.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
+// Server functions which perform operations on room objects.
+//
+// Copyright (c) 1987-2022 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.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
#include <stdio.h>
#include <libcitadel.h>
struct floor *floorcache[MAXFLOORS];
-/*
- * Determine whether the currently logged in session has permission to read
- * messages in the current room.
- */
+// Determine whether the currently logged in session has permission to read
+// messages in the current room.
int CtdlDoIHavePermissionToReadMessagesInThisRoom(void) {
if ( (!(CC->logged_in))
&& (!(CC->internal_pgm))
}
-/*
- * 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
- * returns 0 on success.
- */
+// 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
+// returns 0 on success.
int CtdlDoIHavePermissionToPostInThisRoom(
char *errmsgbuf,
size_t n,
snprintf(errmsgbuf, n, "Not logged in.");
return (ERROR + NOT_LOGGED_IN);
}
- else if (PostPublic == CHECK_EXISTANCE) {
+ else if (PostPublic == CHECK_EXIST) {
return (0); // evaluate whether a recipient exists
}
else if (!(CC->logged_in)) {
snprintf(errmsgbuf, n, "Not logged in.");
return (ERROR + NOT_LOGGED_IN);
}
- if (CC->room.QRflags2 & QR2_MODERATED) {
- snprintf(errmsgbuf, n, "Not logged in Moderation feature not yet implemented!");
- return (ERROR + NOT_LOGGED_IN);
- }
- // 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 ( (ra & UA_REPLYALLOWED) && (is_reply) ) {
- /*
- * To be thorough, we ought to check to see if the message they are
- * replying to is actually a valid one in this room, but unless this
- * actually becomes a problem we'll go with high performance instead.
- */
+ // To be thorough, we ought to check to see if the message they are
+ // replying to is actually a valid one in this room, but unless this
+ // actually becomes a problem we'll go with high performance instead.
strcpy(errmsgbuf, "OK to reply here");
return(0);
}
if ( (ra & UA_REPLYALLOWED) && (!is_reply) ) {
- /* Clarify what happened with a better error message */
+ // Clarify what happened with a better error message
snprintf(errmsgbuf, n, "You may only reply to existing messages here.");
return (ERROR + HIGHER_ACCESS_REQUIRED);
}
}
-/*
- * Check whether the current user has permission to delete messages from
- * the current room (returns 1 for yes, 0 for no)
- */
+// Check whether the current user has permission to delete messages from
+// the current room (returns 1 for yes, 0 for no)
int CtdlDoIHavePermissionToDeleteMessagesFromThisRoom(void) {
int ra;
CtdlRoomAccess(&CC->room, &CC->user, &ra, NULL);
}
-/*
- * 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.
- */
+// 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) {
int retval = 0;
visit vbuf;
is_guest = 1;
}
- /* for internal programs, always do everything */
+ // for internal programs, always do everything
if (((CC->internal_pgm)) && (roombuf->QRflags & QR_INUSE)) {
retval = (UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED | UA_REPLYALLOWED);
vbuf.v_view = 0;
goto SKIP_EVERYTHING;
}
- /* If guest mode is enabled, always grant access to the Lobby */
+ // If guest mode is enabled, always grant access to the Lobby
if ((is_guest) && (!strcasecmp(roombuf->QRname, BASEROOM))) {
retval = (UA_KNOWN | UA_GOTOALLOWED);
vbuf.v_view = 0;
goto SKIP_EVERYTHING;
}
- /* Locate any applicable user/room relationships */
+ // Locate any applicable user/room relationships
if (is_guest) {
memset(&vbuf, 0, sizeof vbuf);
}
CtdlGetRelationship(&vbuf, userbuf, roombuf);
}
- /* Force the properties of the Aide room */
+ // Force the properties of the Aide room
if (!strcasecmp(roombuf->QRname, CtdlGetConfigStr("c_aideroom"))) {
if (userbuf->axlevel >= AxAideU) {
retval = UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED | UA_REPLYALLOWED;
goto NEWMSG;
}
- /* If this is a public room, it's accessible... */
+ // If this is a public room, it's accessible...
if ( ((roombuf->QRflags & QR_PRIVATE) == 0)
&& ((roombuf->QRflags & QR_MAILBOX) == 0)
) {
retval = retval | UA_KNOWN | UA_GOTOALLOWED;
}
- /* If this is a preferred users only room, check access level */
+ // If this is a preferred users only room, check access level
if (roombuf->QRflags & QR_PREFONLY) {
if (userbuf->axlevel < AxPrefU) {
retval = retval & ~UA_KNOWN & ~UA_GOTOALLOWED;
}
}
- /* For private rooms, check the generation number matchups */
+ // For private rooms, check the generation number matchups
if ( (roombuf->QRflags & QR_PRIVATE)
&& ((roombuf->QRflags & QR_MAILBOX) == 0)
) {
- /* An explicit match means the user belongs in this room */
+ // An explicit match means the user belongs in this room
if (vbuf.v_flags & V_ACCESS) {
retval = retval | UA_KNOWN | UA_GOTOALLOWED;
}
- /* Otherwise, check if this is a guess-name or passworded
- * room. If it is, a goto may at least be attempted
- */
+ // Otherwise, check if this is a guess-name or passworded
+ // room. If it is, a goto may at least be attempted
else if ( (roombuf->QRflags & QR_PRIVATE)
|| (roombuf->QRflags & QR_PASSWORDED)
) {
}
}
- /* For mailbox rooms, also check the namespace */
- /* Also, mailbox owners can delete their messages */
+ // For mailbox rooms, also check the namespace. Also, mailbox owners can delete their messages
if ( (roombuf->QRflags & QR_MAILBOX) && (atol(roombuf->QRname) != 0)) {
if (userbuf->usernum == atol(roombuf->QRname)) {
retval = retval | UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED | UA_REPLYALLOWED;
}
- /* An explicit match means the user belongs in this room */
+ // An explicit match means the user belongs in this room
if (vbuf.v_flags & V_ACCESS) {
retval = retval | UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED | UA_REPLYALLOWED;
}
}
- /* For non-mailbox rooms... */
+ // 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
- * - It is a blog room (in which case we only allow replies to existing messages)
- */
+ // 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
+ // - It is a blog room (in which case we only allow replies to existing messages)
int post_allowed = 1;
int reply_allowed = 1;
if (userbuf->axlevel < AxProbU) {
retval = retval | UA_REPLYALLOWED;
}
- /* If "collaborative deletion" is active for this room, any user who can post
- * is also allowed to delete
- */
+ // If "collaborative deletion" is active for this room, any user who can post
+ // is also allowed to delete
if (roombuf->QRflags2 & QR2_COLLABDEL) {
if (retval & UA_POSTALLOWED) {
retval = retval | UA_DELETEALLOWED;
}
- /* Check to see if the user has forgotten this room */
+ // Check to see if the user has forgotten this room
if (vbuf.v_flags & V_FORGET) {
retval = retval & ~UA_KNOWN;
if ( ( ((roombuf->QRflags & QR_PRIVATE) == 0)
}
}
- /* If user is explicitly locked out of this room, deny everything */
+ // If user is explicitly locked out of this room, deny everything
if (vbuf.v_flags & V_LOCKOUT) {
retval = retval & ~UA_KNOWN & ~UA_GOTOALLOWED & ~UA_POSTALLOWED & ~UA_REPLYALLOWED;
}
- /* Aides get access to all private rooms */
+ // Aides get access to all private rooms
if ( (userbuf->axlevel >= AxAideU)
&& ((roombuf->QRflags & QR_MAILBOX) == 0)
) {
}
}
- /* Aides can gain access to mailboxes as well, but they don't show
- * by default.
- */
+ // Aides can gain access to mailboxes as well, but they don't show by default.
if ( (userbuf->axlevel >= AxAideU)
&& (roombuf->QRflags & QR_MAILBOX)
) {
retval = retval | UA_GOTOALLOWED | UA_POSTALLOWED | UA_REPLYALLOWED;
}
- /* Aides and Room Aides have admin privileges */
+ // Aides and Room Aides have admin privileges
if ( (userbuf->axlevel >= AxAideU)
|| (userbuf->usernum == roombuf->QRroomaide)
) {
retval = retval | UA_ADMINALLOWED | UA_DELETEALLOWED | UA_POSTALLOWED | UA_REPLYALLOWED;
}
-NEWMSG: /* By the way, we also check for the presence of new messages */
+NEWMSG: // By the way, we also check for the presence of new messages
if (is_msg_in_sequence_set(vbuf.v_seen, roombuf->QRhighest) == 0) {
retval = retval | UA_HASNEWMSGS;
}
- /* System rooms never show up in the list. */
+ // System rooms never show up in the list.
if (roombuf->QRflags2 & QR2_SYSTEM) {
retval = retval & ~UA_KNOWN;
}
SKIP_EVERYTHING:
- /* Now give the caller the information it wants. */
+ // Now give the caller the information it wants.
if (result != NULL) *result = retval;
if (view != NULL) *view = vbuf.v_view;
}
-/*
- * Self-checking stuff for a room record read into memory
- */
+// Self-checking stuff for a room record read into memory
void room_sanity_check(struct ctdlroom *qrbuf) {
- /* Mailbox rooms are always on the lowest floor */
+ // 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 */
+ // Listing order of 0 is illegal except for base rooms
if (qrbuf->QRorder == 0) {
if ( !(qrbuf->QRflags & QR_MAILBOX)
&& strncasecmp(qrbuf->QRname, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN)
}
-/*
- * CtdlGetRoom() - retrieve room data from disk
- */
+// CtdlGetRoom() - retrieve room data from disk
int CtdlGetRoom(struct ctdlroom *qrbuf, const char *room_name) {
struct cdbdata *cdbqr;
char lowercase_name[ROOMNAMELEN];
memset(qrbuf, 0, sizeof(struct ctdlroom));
- /* First, try the public namespace */
+ if (IsEmptyStr(lowercase_name)) {
+ return(1); // empty room name , not valid
+ }
+
+ // First, try the public namespace
cdbqr = cdb_fetch(CDB_ROOMS, lowercase_name, strlen(lowercase_name));
- /* If that didn't work, try the user's personal namespace */
+ // 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));
}
-/*
- * CtdlGetRoomLock() - same as getroom() but locks the record (if supported)
- */
+// CtdlGetRoomLock() - same as getroom() but locks the record (if supported)
int CtdlGetRoomLock(struct ctdlroom *qrbuf, const char *room_name) {
register int retval;
retval = CtdlGetRoom(qrbuf, room_name);
}
-/*
- * b_putroom() - back end to putroom() and b_deleteroom()
- * (if the supplied buffer is NULL, delete the room record)
- */
-void b_putroom(struct ctdlroom *qrbuf, char *room_name)
-{
+// b_putroom() - back end to putroom() and b_deleteroom()
+// (if the supplied buffer is NULL, delete the room record)
+void b_putroom(struct ctdlroom *qrbuf, char *room_name) {
char lowercase_name[ROOMNAMELEN];
char *aptr, *bptr;
long len;
}
-/*
- * CtdlPutRoom() - store room data to disk
- */
+// CtdlPutRoom() - store room data to disk
void CtdlPutRoom(struct ctdlroom *qrbuf) {
b_putroom(qrbuf, qrbuf->QRname);
}
-/*
- * b_deleteroom() - delete a room record from disk
- */
+// b_deleteroom() - delete a room record from disk
void b_deleteroom(char *room_name) {
b_putroom(NULL, room_name);
}
-/*
- * CtdlPutRoomLock() - same as CtdlPutRoom() but unlocks the record (if supported)
- */
+// CtdlPutRoomLock() - same as CtdlPutRoom() but unlocks the record (if supported)
void CtdlPutRoomLock(struct ctdlroom *qrbuf) {
CtdlPutRoom(qrbuf);
end_critical_section(S_ROOMS);
}
-/*
- * CtdlGetFloorByName() - retrieve the number of the named floor
- * return < 0 if not found else return floor number
- */
+// CtdlGetFloorByName() - retrieve the number of the named floor
+// return < 0 if not found else return floor number
int CtdlGetFloorByName(const char *floor_name) {
int a;
struct floor *flbuf = NULL;
for (a = 0; a < MAXFLOORS; ++a) {
flbuf = CtdlGetCachedFloor(a);
- /* check to see if it already exists */
+ // check to see if it already exists
if ((!strcasecmp(flbuf->f_name, floor_name)) && (flbuf->f_flags & F_INUSE)) {
return a;
}
}
-/*
- * CtdlGetFloorByNameLock() - retrieve floor number for given floor and lock the floor list.
- */
-int CtdlGetFloorByNameLock(const char *floor_name)
-{
+// CtdlGetFloorByNameLock() - retrieve floor number for given floor and lock the floor list.
+int CtdlGetFloorByNameLock(const char *floor_name) {
begin_critical_section(S_FLOORTAB);
return CtdlGetFloorByName(floor_name);
}
CtdlPutFloorLock(flbuf, floor_num);
}
+
/*
* Iterate through the room table, performing a callback for each room.
*/
}
-
/*
* Make the specified room the current room for this session. No validation
* or access control is done here -- the caller should make sure that the
syslog(LOG_NOTICE, "room_ops: deleting room <%s>", qrbuf->QRname);
- /* Delete the room's network configdb entry */
+ // 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!)
- */
+ // Delete the messages in the room
+ // (Careful: this opens an S_ROOMS critical section!)
CtdlDeleteMessages(qrbuf->QRname, NULL, 0, "");
- /* Flag the room record as not in use */
+ // Flag the room record as not in use
CtdlGetRoomLock(qrbuf, qrbuf->QRname);
qrbuf->QRflags = 0;
CtdlPutRoomLock(qrbuf);
- /* then decrement the reference count for the floor */
+ // then decrement the reference count for the floor
lgetfloor(&flbuf, (int) (qrbuf->QRfloor));
flbuf.f_ref_count = flbuf.f_ref_count - 1;
lputfloor(&flbuf, (int) (qrbuf->QRfloor));
- /* Delete the room record from the database! */
+ // Delete the room record from the database!
b_deleteroom(qrbuf->QRname);
}