/* * Initialize the SMTP outbound queue */ void smtp_init_spoolout(void) { struct ctdlroom qrbuf; /* * Create the room. This will silently fail if the room already * exists, and that's perfectly ok, because we want it to exist. */ CtdlCreateRoom(SMTP_SPOOLOUT_ROOM, 3, "", 0, 1, 0, VIEW_QUEUE); /* * Make sure it's set to be a "system room" so it doesn't show up * in the <K>nown rooms list for Aides. */ if (CtdlGetRoomLock(&qrbuf, SMTP_SPOOLOUT_ROOM) == 0) { qrbuf.QRflags2 |= QR2_SYSTEM; CtdlPutRoomLock(&qrbuf); } }
/* * set the room admin for this room */ void cmd_seta(char *new_ra) { struct ctdluser usbuf; long newu; char buf[SIZ]; int post_notice; if (CtdlAccessCheck(ac_room_aide)) return; if (CtdlGetUser(&usbuf, new_ra) != 0) { newu = (-1L); } else { newu = usbuf.usernum; } CtdlGetRoomLock(&CC->room, CC->room.QRname); post_notice = 0; if (CC->room.QRroomaide != newu) { post_notice = 1; } CC->room.QRroomaide = newu; CtdlPutRoomLock(&CC->room); /* * We have to post the change notice _after_ writing changes to * the room table, otherwise it would deadlock! */ if (post_notice == 1) { if (!IsEmptyStr(usbuf.fullname)) snprintf(buf, sizeof buf, "%s is now the room admin for \"%s\".\n", usbuf.fullname, CC->room.QRname); else snprintf(buf, sizeof buf, "There is now no room admin for \"%s\".\n", CC->room.QRname); CtdlAideMessage(buf, "Admin Room Modification"); } cprintf("%d Ok\n", CIT_OK); }
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; if (atoi(ok) == 0) { 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; } 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; CtdlPutRoomLock(&CC->room); }
/* * set room parameters (admin or room admin command) */ void cmd_setr(char *args) { char buf[256]; int new_order = 0; int r; int new_floor; char new_name[ROOMNAMELEN]; if (CtdlAccessCheck(ac_logged_in)) return; if (num_parms(args) >= 6) { new_floor = extract_int(args, 5); } else { new_floor = (-1); /* don't change the floor */ } /* When is a new name more than just a new name? When the old name * has a namespace prefix. */ if (CC->room.QRflags & QR_MAILBOX) { sprintf(new_name, "%010ld.", atol(CC->room.QRname) ); } else { safestrncpy(new_name, "", sizeof new_name); } extract_token(&new_name[strlen(new_name)], args, 0, '|', (sizeof new_name - strlen(new_name))); r = CtdlRenameRoom(CC->room.QRname, new_name, new_floor); if (r == crr_room_not_found) { cprintf("%d Internal error - room not found?\n", ERROR + INTERNAL_ERROR); } else if (r == crr_already_exists) { cprintf("%d '%s' already exists.\n", ERROR + ALREADY_EXISTS, new_name); } else if (r == crr_noneditable) { cprintf("%d Cannot edit this room.\n", ERROR + NOT_HERE); } else if (r == crr_invalid_floor) { cprintf("%d Target floor does not exist.\n", ERROR + INVALID_FLOOR_OPERATION); } else if (r == crr_access_denied) { cprintf("%d You do not have permission to edit '%s'\n", ERROR + HIGHER_ACCESS_REQUIRED, CC->room.QRname); } else if (r != crr_ok) { cprintf("%d Error: CtdlRenameRoom() returned %d\n", ERROR + INTERNAL_ERROR, r); } if (r != crr_ok) { return; } CtdlGetRoom(&CC->room, new_name); /* Now we have to do a bunch of other stuff */ if (num_parms(args) >= 7) { new_order = extract_int(args, 6); if (new_order < 1) new_order = 1; if (new_order > 127) new_order = 127; } CtdlGetRoomLock(&CC->room, CC->room.QRname); /* Directory room */ extract_token(buf, args, 2, '|', sizeof buf); buf[15] = 0; safestrncpy(CC->room.QRdirname, buf, sizeof CC->room.QRdirname); /* Default view */ if (num_parms(args) >= 8) { CC->room.QRdefaultview = extract_int(args, 7); } /* Second set of flags */ if (num_parms(args) >= 9) { CC->room.QRflags2 = extract_int(args, 8); } /* Misc. flags */ CC->room.QRflags = (extract_int(args, 3) | QR_INUSE); /* Clean up a client boo-boo: if the client set the room to * guess-name or passworded, ensure that the private flag is * also set. */ if ((CC->room.QRflags & QR_GUESSNAME) || (CC->room.QRflags & QR_PASSWORDED)) CC->room.QRflags |= QR_PRIVATE; /* Some changes can't apply to BASEROOM */ 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 & QR_GUESSNAME & QR_PREFONLY & QR_MAILBOX); CC->room.QRflags |= QR_PERMANENT; } else { /* March order (doesn't apply to AIDEROOM) */ if (num_parms(args) >= 7) CC->room.QRorder = (char) new_order; /* Room password */ extract_token(buf, args, 1, '|', sizeof buf); buf[10] = 0; safestrncpy(CC->room.QRpasswd, buf, sizeof CC->room.QRpasswd); /* Kick everyone out if the client requested it * (by changing the room's generation number) */ if (extract_int(args, 4)) { time(&CC->room.QRgen); } } /* Some changes can't apply to AIDEROOM */ if (!strncasecmp(CC->room.QRname, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN)) { CC->room.QRorder = 0; CC->room.QRflags &= ~QR_MAILBOX; CC->room.QRflags |= QR_PERMANENT; } /* Write the room record back to disk */ CtdlPutRoomLock(&CC->room); /* Create a room directory if necessary */ if (CC->room.QRflags & QR_DIRECTORY) { snprintf(buf, sizeof buf,"%s/%s", ctdl_file_dir, CC->room.QRdirname); mkdir(buf, 0755); } snprintf(buf, sizeof buf, "The room \"%s\" has been edited by %s.\n", CC->room.QRname, (CC->logged_in ? CC->curr_user : "******") ); CtdlAideMessage(buf, "Room modification Message"); cprintf("%d Ok\n", CIT_OK); }