Arrays to vectors.

This is the big push to get rid of the last of the
unadorned dynamic arrays.  Use ptr_vectors for things
like mail conferences etc.

Lots of incidental cleanup along the way.

Signed-off-by: Dan Cross <patchdev@fat-dragon.org>
This commit is contained in:
Dan Cross 2018-10-16 15:05:15 +00:00 committed by Andrew Pamment
parent d8dc2e8f7d
commit aacb1000c8
16 changed files with 1282 additions and 1304 deletions

View File

@ -50,7 +50,7 @@ ${UUID}:
${CUTEST}: ${CUTEST}:
cd ${DEPSDIR}/cutest-1.5 && make cd ${DEPSDIR}/cutest-1.5 && make
HDRS:= bbs.h HDRS:= bbs.h bluewave.h mail_utils.h
OBJS:= inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o \ OBJS:= inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o \
doors.o bbs_list.o chat_system.o email.o files.o settings.o \ doors.o bbs_list.o chat_system.o email.o files.o settings.o \
lua_glue.o strings.o bluewave.o hashmap/hashmap.o menus.o \ lua_glue.o strings.o bluewave.o hashmap/hashmap.o menus.o \

View File

@ -46,6 +46,14 @@
#define IAC_SUPPRESS_GO_AHEAD 3 #define IAC_SUPPRESS_GO_AHEAD 3
#define IAC_ECHO 1 #define IAC_ECHO 1
struct ptr_vector {
size_t len;
size_t capacity;
void **ptrs;
};
static const struct ptr_vector EMPTY_PTR_VECTOR = {0, 0, NULL};
struct fido_addr { struct fido_addr {
unsigned short zone; unsigned short zone;
unsigned short net; unsigned short net;
@ -91,8 +99,7 @@ struct mail_conference {
int nettype; int nettype;
int realnames; int realnames;
int sec_level; int sec_level;
int mail_area_count; struct ptr_vector mail_areas;
struct mail_area **mail_areas;
struct fido_addr *fidoaddr; struct fido_addr *fidoaddr;
int maginode; int maginode;
}; };
@ -110,8 +117,7 @@ struct file_directory {
char *path; char *path;
int sec_level; int sec_level;
int display_on_web; int display_on_web;
int file_sub_count; struct ptr_vector file_subs;
struct file_sub **file_subs;
}; };
struct archiver { struct archiver {
@ -194,21 +200,15 @@ struct bbs_config {
int ipguard_timeout; int ipguard_timeout;
int ipguard_tries; int ipguard_tries;
int mail_conference_count; struct ptr_vector mail_conferences;
struct mail_conference **mail_conferences; struct ptr_vector doors;
int door_count; struct ptr_vector file_directories;
struct door_config **doors; struct ptr_vector text_files;
int file_directory_count;
struct file_directory **file_directories;
int text_file_count;
struct text_file **text_files;
char *config_path; char *config_path;
int archiver_count; struct ptr_vector archivers;
struct archiver **archivers;
int protocol_count; struct ptr_vector protocols;
struct protocol **protocols;
}; };
struct sec_level_t { struct sec_level_t {
@ -268,14 +268,6 @@ struct blog_entry_t {
time_t date; time_t date;
}; };
struct ptr_vector {
size_t len;
size_t capacity;
void **ptrs;
};
static const struct ptr_vector EMPTY_PTR_VECTOR = {0, 0, NULL};
extern void init_ptr_vector(struct ptr_vector *vec); extern void init_ptr_vector(struct ptr_vector *vec);
extern void ptr_vector_clear(struct ptr_vector *vec); extern void ptr_vector_clear(struct ptr_vector *vec);
extern void *ptr_vector_get(struct ptr_vector *vec, size_t i); extern void *ptr_vector_get(struct ptr_vector *vec, size_t i);

View File

@ -6,11 +6,14 @@
#include <fcntl.h> #include <fcntl.h>
#include <sqlite3.h> #include <sqlite3.h>
#include <sys/wait.h> #include <sys/wait.h>
#include "bluewave.h"
#include "jamlib/jam.h" #include "jamlib/jam.h"
#include "bbs.h"
#include "libuuid/uuid.h" #include "libuuid/uuid.h"
#include "bluewave.h"
#include "bbs.h"
#include "mail_utils.h"
extern struct bbs_config conf; extern struct bbs_config conf;
extern struct user_record *gUser; extern struct user_record *gUser;
extern int mynode; extern int mynode;
@ -158,24 +161,24 @@ int bwave_scan_area(int confr, int area, int areano, int totmsgs, FILE *fti_file
return totmsgs; return totmsgs;
} }
jb = open_jam_base(conf.mail_conferences[confr]->mail_areas[area]->path); struct mail_area *ma = get_area(confr, area);
jb = open_jam_base(ma->path);
if (!jb) { if (!jb) {
dolog("Error opening JAM base.. %s", conf.mail_conferences[confr]->mail_areas[area]->path); dolog("Error opening JAM base.. %s", ma->path);
if (msghs != NULL) { if (msghs != NULL) {
free_message_headers(msghs); free_message_headers(msghs);
} }
return totmsgs; return totmsgs;
} else { }
all_unread = 0; all_unread = 0;
if (JAM_ReadLastRead(jb, gUser->id, &jlr) == JAM_NO_USER) { if (JAM_ReadLastRead(jb, gUser->id, &jlr) == JAM_NO_USER) {
jlr.LastReadMsg = 0; jlr.LastReadMsg = 0;
jlr.HighReadMsg = 0; jlr.HighReadMsg = 0;
jlr.UserCRC = JAM_Crc32(gUser->loginname, strlen(gUser->loginname)); jlr.UserCRC = JAM_Crc32(gUser->loginname, strlen(gUser->loginname));
jlr.UserID = gUser->id; jlr.UserID = gUser->id;
all_unread = 1; all_unread = 1;
} else if (jlr.LastReadMsg == 0 && jlr.HighReadMsg == 0) { } else if (jlr.LastReadMsg == 0 && jlr.HighReadMsg == 0) {
all_unread = 1; all_unread = 1;
}
} }
if (all_unread == 0) { if (all_unread == 0) {
@ -299,7 +302,6 @@ void bwave_create_packet() {
int area_count; int area_count;
tWORD flags; tWORD flags;
int lasttot; int lasttot;
int bpos;
int last_ptr = 0; int last_ptr = 0;
int stout; int stout;
int stin; int stin;
@ -323,8 +325,9 @@ void bwave_create_packet() {
init_ptr_vector(&areas); init_ptr_vector(&areas);
for (i = 0; i < conf.mail_conference_count; i++) { for (size_t i = 0; i < ptr_vector_len(&conf.mail_conferences); i++) {
for (j = 0; j < conf.mail_conferences[i]->mail_area_count; j++) { struct mail_conference *mc = ptr_vector_get(&conf.mail_conferences, i);
for (size_t j = 0; j < ptr_vector_len(&mc->mail_areas); j++) {
if (msgbase_is_subscribed(i, j)) { if (msgbase_is_subscribed(i, j)) {
tot_areas++; tot_areas++;
} }
@ -361,27 +364,27 @@ void bwave_create_packet() {
hdr.subject_len = 71; hdr.subject_len = 71;
memcpy(hdr.packet_id, conf.bwave_name, strlen(conf.bwave_name)); memcpy(hdr.packet_id, conf.bwave_name, strlen(conf.bwave_name));
snprintf(buffer, 1024, "%s/node%d", conf.bbs_path, mynode); snprintf(buffer, sizeof buffer, "%s/node%d", conf.bbs_path, mynode);
if (stat(buffer, &s) != 0) { if (stat(buffer, &s) != 0) {
mkdir(buffer, 0755); mkdir(buffer, 0755);
} }
snprintf(buffer, 1024, "%s/node%d/bwave/", conf.bbs_path, mynode); snprintf(buffer, sizeof buffer, "%s/node%d/bwave/", conf.bbs_path, mynode);
if (stat(buffer, &s) == 0) { if (stat(buffer, &s) == 0) {
recursive_delete(buffer); recursive_delete(buffer);
} }
mkdir(buffer, 0755); mkdir(buffer, 0755);
snprintf(buffer, 1024, "%s/node%d/bwave/%s.FTI", conf.bbs_path, mynode, conf.bwave_name); snprintf(buffer, sizeof buffer, "%s/node%d/bwave/%s.FTI", conf.bbs_path, mynode, conf.bwave_name);
fti_file = fopen(buffer, "wb"); fti_file = fopen(buffer, "wb");
snprintf(buffer, 1024, "%s/node%d/bwave/%s.MIX", conf.bbs_path, mynode, conf.bwave_name); snprintf(buffer, sizeof buffer, "%s/node%d/bwave/%s.MIX", conf.bbs_path, mynode, conf.bwave_name);
mix_file = fopen(buffer, "wb"); mix_file = fopen(buffer, "wb");
snprintf(buffer, 1024, "%s/node%d/bwave/%s.DAT", conf.bbs_path, mynode, conf.bwave_name); snprintf(buffer, sizeof buffer, "%s/node%d/bwave/%s.DAT", conf.bbs_path, mynode, conf.bwave_name);
dat_file = fopen(buffer, "wb"); dat_file = fopen(buffer, "wb");
s_printf("\r\n"); s_printf("\r\n");
@ -408,42 +411,41 @@ void bwave_create_packet() {
area_count++; area_count++;
if (totmsgs < conf.bwave_max_msgs) { if (totmsgs < conf.bwave_max_msgs) {
for (size_t i = 0; i < ptr_vector_len(&conf.mail_conferences); i++) {
for (i = 0; i < conf.mail_conference_count; i++) { struct mail_conference *mc = ptr_vector_get(&conf.mail_conferences, i);
for (j = 0; j < conf.mail_conferences[i]->mail_area_count; j++) { for (size_t j = 0; j < ptr_vector_len(&mc->mail_areas); j++) {
if (conf.mail_conferences[i]->mail_areas[j]->read_sec_level <= gUser->sec_level && conf.mail_conferences[i]->mail_areas[j]->qwkname != NULL && msgbase_is_subscribed(i, j)) { struct mail_area *ma = get_area(i, j);
if (ma->read_sec_level <= gUser->sec_level && ma->qwkname != NULL && msgbase_is_subscribed(i, j)) {
lasttot = totmsgs; lasttot = totmsgs;
totmsgs = bwave_scan_area(i, j, area_count + 1, totmsgs, fti_file, mix_file, dat_file, &last_ptr); totmsgs = bwave_scan_area(i, j, area_count + 1, totmsgs, fti_file, mix_file, dat_file, &last_ptr);
s_printf(get_string(195), conf.mail_conferences[i]->name, conf.mail_conferences[i]->mail_areas[j]->name, totmsgs - lasttot); s_printf(get_string(195), mc->name, ma->name, totmsgs - lasttot);
//if (lasttot == totmsgs) { //if (lasttot == totmsgs) {
// continue; // continue;
//} //}
flags = 0;
area = (INF_AREA_INFO *)malloz(sizeof(INF_AREA_INFO)); area = (INF_AREA_INFO *)malloz(sizeof(INF_AREA_INFO));
snprintf(area->areanum, sizeof area->areanum, "%d", area_count + 1); snprintf(area->areanum, sizeof area->areanum, "%d", area_count + 1);
strlcpy(area->echotag, ma->qwkname, sizeof area->echotag);
strlcpy(area->title, ma->name, sizeof area->title);
strlcpy(area->echotag, conf.mail_conferences[i]->mail_areas[j]->qwkname, sizeof area->echotag); flags = 0;
if (ma->write_sec_level <= gUser->sec_level) {
strlcpy(area->title, conf.mail_conferences[i]->mail_areas[j]->name, sizeof area->title);
if (conf.mail_conferences[i]->mail_areas[j]->write_sec_level <= gUser->sec_level) {
flags |= INF_POST; flags |= INF_POST;
} }
if (conf.mail_conferences[i]->mail_areas[j]->type == TYPE_NETMAIL_AREA) { if (ma->type == TYPE_NETMAIL_AREA) {
flags |= INF_NO_PUBLIC; flags |= INF_NO_PUBLIC;
flags |= INF_NETMAIL; flags |= INF_NETMAIL;
flags |= INF_ECHO; flags |= INF_ECHO;
} }
if (conf.mail_conferences[i]->mail_areas[j]->type == TYPE_ECHOMAIL_AREA || conf.mail_conferences[i]->mail_areas[j]->type == TYPE_NEWSGROUP_AREA) { if (ma->type == TYPE_ECHOMAIL_AREA || ma->type == TYPE_NEWSGROUP_AREA) {
flags |= INF_NO_PRIVATE; flags |= INF_NO_PRIVATE;
flags |= INF_ECHO; flags |= INF_ECHO;
} }
if (conf.mail_conferences[i]->mail_areas[j]->type == TYPE_LOCAL_AREA) { if (ma->type == TYPE_LOCAL_AREA) {
flags |= INF_NO_PRIVATE; flags |= INF_NO_PRIVATE;
} }
@ -485,7 +487,6 @@ void bwave_create_packet() {
if (totmsgs > 0) { if (totmsgs > 0) {
// create archive // create archive
bpos = 0;
if (gUser->bwavestyle) { if (gUser->bwavestyle) {
thetime = time(NULL); thetime = time(NULL);
localtime_r(&thetime, &time_tm); localtime_r(&thetime, &time_tm);
@ -494,29 +495,41 @@ void bwave_create_packet() {
gUser->bwavepktno = time_tm.tm_wday * 10; gUser->bwavepktno = time_tm.tm_wday * 10;
} }
snprintf(archive, 1024, "%s/node%d/%s.%s%d", conf.bbs_path, mynode, conf.bwave_name, weekday[time_tm.tm_wday], gUser->bwavepktno % 10); snprintf(archive, sizeof archive, "%s/node%d/%s.%s%d",
conf.bbs_path, mynode, conf.bwave_name, weekday[time_tm.tm_wday], gUser->bwavepktno % 10);
} else { } else {
snprintf(archive, 1024, "%s/node%d/%s.%03d", conf.bbs_path, mynode, conf.bwave_name, gUser->bwavepktno); snprintf(archive, sizeof archive, "%s/node%d/%s.%03d", conf.bbs_path, mynode, conf.bwave_name, gUser->bwavepktno);
} }
for (i = 0; i < strlen(conf.archivers[gUser->defarchiver - 1]->pack); i++) { struct archiver *arc = ptr_vector_get(&conf.archivers, gUser->defarchiver - 1);
if (conf.archivers[gUser->defarchiver - 1]->pack[i] == '*') { assert(arc != NULL);
i++; char *b = buffer;
if (conf.archivers[gUser->defarchiver - 1]->pack[i] == 'a') { size_t blen = sizeof buffer;
sprintf(&buffer[bpos], "%s", archive); for (const char *p = arc->pack; *p != '\0' && blen >= 1; ++p) {
bpos = strlen(buffer); if (*p != '*') {
} else if (conf.archivers[gUser->defarchiver - 1]->pack[i] == 'f') { *b++ = *p;
sprintf(&buffer[bpos], "%s/node%d/bwave/%s.INF %s/node%d/bwave/%s.MIX %s/node%d/bwave/%s.FTI %s/node%d/bwave/%s.DAT", conf.bbs_path, mynode, conf.bwave_name, conf.bbs_path, mynode, conf.bwave_name, conf.bbs_path, mynode, conf.bwave_name, conf.bbs_path, mynode, conf.bwave_name); --blen;
bpos = strlen(buffer); continue;
} else if (conf.archivers[gUser->defarchiver - 1]->pack[i] == '*') {
buffer[bpos++] = '*';
buffer[bpos] = '\0';
}
} else {
buffer[bpos++] = conf.archivers[gUser->defarchiver - 1]->pack[i];
buffer[bpos] = '\0';
} }
p++;
size_t alen = 0;
if (*p == 'a') {
strlcpy(b, archive, blen);
alen = strlen(archive);
} else if (*p == 'f') {
snprintf(b, blen, "%s/node%d/bwave/%s.INF %s/node%d/bwave/%s.MIX %s/node%d/bwave/%s.FTI %s/node%d/bwave/%s.DAT",
conf.bbs_path, mynode, conf.bwave_name, conf.bbs_path, mynode, conf.bwave_name, conf.bbs_path,
mynode, conf.bwave_name, conf.bbs_path, mynode, conf.bwave_name);
alen = strlen(b);
} else if (*p == '*') {
*b++ = '*';
alen = 1;
}
b += alen;
blen -= alen;
} }
*b = '\0';
if (sshBBS) { if (sshBBS) {
stout = dup(STDOUT_FILENO); stout = dup(STDOUT_FILENO);
stin = dup(STDIN_FILENO); stin = dup(STDIN_FILENO);
@ -580,16 +593,18 @@ int bwave_add_message(int confr, int area, unsigned int dwritten, char *to, char
char buffer[256]; char buffer[256];
uuid_t magi_msgid; uuid_t magi_msgid;
jb = open_jam_base(conf.mail_conferences[confr]->mail_areas[area]->path); struct mail_area *ma = get_area(confr, area);
jb = open_jam_base(ma->path);
if (!jb) { if (!jb) {
dolog("Error opening JAM base.. %s", conf.mail_conferences[confr]->mail_areas[area]->path); dolog("Error opening JAM base.. %s", ma->path);
return 1; return 1;
} }
JAM_ClearMsgHeader(&jmh); JAM_ClearMsgHeader(&jmh);
jmh.DateWritten = dwritten; jmh.DateWritten = dwritten;
jmh.Attribute |= JAM_MSG_LOCAL; jmh.Attribute |= JAM_MSG_LOCAL;
if (conf.mail_conferences[confr]->realnames == 0) { struct mail_conference *mc = get_conf(confr);
if (mc->realnames == 0) {
strlcpy(buffer, gUser->loginname, sizeof buffer); strlcpy(buffer, gUser->loginname, sizeof buffer);
} else { } else {
snprintf(buffer, sizeof buffer, "%s %s", gUser->firstname, gUser->lastname); snprintf(buffer, sizeof buffer, "%s %s", gUser->firstname, gUser->lastname);
@ -603,7 +618,7 @@ int bwave_add_message(int confr, int area, unsigned int dwritten, char *to, char
jsf.Buffer = (char *)buffer; jsf.Buffer = (char *)buffer;
JAM_PutSubfield(jsp, &jsf); JAM_PutSubfield(jsp, &jsf);
if (conf.mail_conferences[confr]->mail_areas[area]->type == TYPE_NEWSGROUP_AREA) { if (ma->type == TYPE_NEWSGROUP_AREA) {
strlcpy(buffer, "ALL", sizeof buffer); strlcpy(buffer, "ALL", sizeof buffer);
jsf.LoID = JAMSFLD_RECVRNAME; jsf.LoID = JAMSFLD_RECVRNAME;
jsf.HiID = 0; jsf.HiID = 0;
@ -625,21 +640,21 @@ int bwave_add_message(int confr, int area, unsigned int dwritten, char *to, char
jsf.Buffer = (char *)subject; jsf.Buffer = (char *)subject;
JAM_PutSubfield(jsp, &jsf); JAM_PutSubfield(jsp, &jsf);
if (conf.mail_conferences[confr]->mail_areas[area]->type == TYPE_ECHOMAIL_AREA || conf.mail_conferences[confr]->mail_areas[area]->type == TYPE_NEWSGROUP_AREA) { if (ma->type == TYPE_ECHOMAIL_AREA || ma->type == TYPE_NEWSGROUP_AREA) {
jmh.Attribute |= JAM_MSG_TYPEECHO; jmh.Attribute |= JAM_MSG_TYPEECHO;
struct mail_conference *mc = get_conf(confr);
if (conf.mail_conferences[confr]->nettype == NETWORK_FIDO) { if (mc->nettype == NETWORK_FIDO) {
if (conf.mail_conferences[confr]->fidoaddr->point) { if (mc->fidoaddr->point) {
snprintf(buffer, sizeof buffer, "%d:%d/%d.%d", snprintf(buffer, sizeof buffer, "%d:%d/%d.%d",
conf.mail_conferences[confr]->fidoaddr->zone, mc->fidoaddr->zone,
conf.mail_conferences[confr]->fidoaddr->net, mc->fidoaddr->net,
conf.mail_conferences[confr]->fidoaddr->node, mc->fidoaddr->node,
conf.mail_conferences[confr]->fidoaddr->point); mc->fidoaddr->point);
} else { } else {
snprintf(buffer, sizeof buffer, "%d:%d/%d", snprintf(buffer, sizeof buffer, "%d:%d/%d",
conf.mail_conferences[confr]->fidoaddr->zone, mc->fidoaddr->zone,
conf.mail_conferences[confr]->fidoaddr->net, mc->fidoaddr->net,
conf.mail_conferences[confr]->fidoaddr->node); mc->fidoaddr->node);
} }
jsf.LoID = JAMSFLD_OADDRESS; jsf.LoID = JAMSFLD_OADDRESS;
jsf.HiID = 0; jsf.HiID = 0;
@ -648,10 +663,10 @@ int bwave_add_message(int confr, int area, unsigned int dwritten, char *to, char
JAM_PutSubfield(jsp, &jsf); JAM_PutSubfield(jsp, &jsf);
snprintf(buffer, sizeof buffer, "%d:%d/%d.%d %08lx", snprintf(buffer, sizeof buffer, "%d:%d/%d.%d %08lx",
conf.mail_conferences[confr]->fidoaddr->zone, mc->fidoaddr->zone,
conf.mail_conferences[confr]->fidoaddr->net, mc->fidoaddr->net,
conf.mail_conferences[confr]->fidoaddr->node, mc->fidoaddr->node,
conf.mail_conferences[confr]->fidoaddr->point, mc->fidoaddr->point,
generate_msgid()); generate_msgid());
jsf.LoID = JAMSFLD_MSGID; jsf.LoID = JAMSFLD_MSGID;
@ -660,8 +675,8 @@ int bwave_add_message(int confr, int area, unsigned int dwritten, char *to, char
jsf.Buffer = (char *)buffer; jsf.Buffer = (char *)buffer;
JAM_PutSubfield(jsp, &jsf); JAM_PutSubfield(jsp, &jsf);
jmh.MsgIdCRC = JAM_Crc32(buffer, strlen(buffer)); jmh.MsgIdCRC = JAM_Crc32(buffer, strlen(buffer));
} else if (conf.mail_conferences[confr]->nettype == NETWORK_MAGI) { } else if (mc->nettype == NETWORK_MAGI) {
snprintf(buffer, sizeof buffer, "%d", conf.mail_conferences[confr]->maginode); snprintf(buffer, sizeof buffer, "%d", mc->maginode);
jsf.LoID = JAMSFLD_OADDRESS; jsf.LoID = JAMSFLD_OADDRESS;
jsf.HiID = 0; jsf.HiID = 0;
jsf.DatLen = strlen(buffer); jsf.DatLen = strlen(buffer);
@ -677,28 +692,28 @@ int bwave_add_message(int confr, int area, unsigned int dwritten, char *to, char
jsf.Buffer = (char *)buffer; jsf.Buffer = (char *)buffer;
JAM_PutSubfield(jsp, &jsf); JAM_PutSubfield(jsp, &jsf);
jmh.MsgIdCRC = JAM_Crc32(buffer, strlen(buffer)); jmh.MsgIdCRC = JAM_Crc32(buffer, strlen(buffer));
} else if (conf.mail_conferences[confr]->nettype == NETWORK_QWK) { } else if (mc->nettype == NETWORK_QWK) {
jsf.LoID = JAMSFLD_OADDRESS; jsf.LoID = JAMSFLD_OADDRESS;
jsf.HiID = 0; jsf.HiID = 0;
jsf.DatLen = strlen(conf.bwave_name); jsf.DatLen = strlen(conf.bwave_name);
jsf.Buffer = (char *)conf.bwave_name; jsf.Buffer = (char *)conf.bwave_name;
JAM_PutSubfield(jsp, &jsf); JAM_PutSubfield(jsp, &jsf);
} }
} else if (conf.mail_conferences[confr]->mail_areas[area]->type == TYPE_NETMAIL_AREA && conf.mail_conferences[confr]->nettype == NETWORK_FIDO) { } else if (ma->type == TYPE_NETMAIL_AREA && mc->nettype == NETWORK_FIDO) {
jmh.Attribute |= JAM_MSG_TYPENET; jmh.Attribute |= JAM_MSG_TYPENET;
jmh.Attribute |= JAM_MSG_PRIVATE; jmh.Attribute |= JAM_MSG_PRIVATE;
if (conf.mail_conferences[confr]->fidoaddr->point) { if (mc->fidoaddr->point) {
snprintf(buffer, sizeof buffer, "%d:%d/%d.%d", snprintf(buffer, sizeof buffer, "%d:%d/%d.%d",
conf.mail_conferences[confr]->fidoaddr->zone, mc->fidoaddr->zone,
conf.mail_conferences[confr]->fidoaddr->net, mc->fidoaddr->net,
conf.mail_conferences[confr]->fidoaddr->node, mc->fidoaddr->node,
conf.mail_conferences[confr]->fidoaddr->point); mc->fidoaddr->point);
} else { } else {
snprintf(buffer, sizeof buffer, "%d:%d/%d", snprintf(buffer, sizeof buffer, "%d:%d/%d",
conf.mail_conferences[confr]->fidoaddr->zone, mc->fidoaddr->zone,
conf.mail_conferences[confr]->fidoaddr->net, mc->fidoaddr->net,
conf.mail_conferences[confr]->fidoaddr->node); mc->fidoaddr->node);
} }
jsf.LoID = JAMSFLD_OADDRESS; jsf.LoID = JAMSFLD_OADDRESS;
jsf.HiID = 0; jsf.HiID = 0;
@ -727,10 +742,10 @@ int bwave_add_message(int confr, int area, unsigned int dwritten, char *to, char
} }
snprintf(buffer, sizeof buffer, "%d:%d/%d.%d %08lx", snprintf(buffer, sizeof buffer, "%d:%d/%d.%d %08lx",
conf.mail_conferences[confr]->fidoaddr->zone, mc->fidoaddr->zone,
conf.mail_conferences[confr]->fidoaddr->net, mc->fidoaddr->net,
conf.mail_conferences[confr]->fidoaddr->node, mc->fidoaddr->node,
conf.mail_conferences[confr]->fidoaddr->point, mc->fidoaddr->point,
generate_msgid()); generate_msgid());
jsf.LoID = JAMSFLD_MSGID; jsf.LoID = JAMSFLD_MSGID;
@ -777,7 +792,6 @@ void bwave_upload_reply() {
char msgbuffer[1024]; char msgbuffer[1024];
char originlinebuffer[256]; char originlinebuffer[256];
int i; int i;
int bpos;
UPL_HEADER upl_hdr; UPL_HEADER upl_hdr;
UPL_REC upl_rec; UPL_REC upl_rec;
int j; int j;
@ -836,25 +850,32 @@ void bwave_upload_reply() {
return; return;
} }
bpos = 0; struct archiver *arc = ptr_vector_get(&conf.archivers, gUser->defarchiver - 1);
for (i = 0; i < strlen(conf.archivers[gUser->defarchiver - 1]->unpack); i++) { assert(arc != NULL);
if (conf.archivers[gUser->defarchiver - 1]->unpack[i] == '*') { char *b = buffer;
i++; size_t blen = sizeof buffer;
if (conf.archivers[gUser->defarchiver - 1]->unpack[i] == 'a') { for (const char *p = arc->unpack; *p != '\0' && blen > 1; ++p) {
sprintf(&buffer[bpos], "%s", upload_filename); if (*p != '*') {
bpos = strlen(buffer); *b++ = *p;
} else if (conf.archivers[gUser->defarchiver - 1]->unpack[i] == 'd') { --blen;
sprintf(&buffer[bpos], "%s/node%d/bwave/", conf.bbs_path, mynode); continue;
bpos = strlen(buffer);
} else if (conf.archivers[gUser->defarchiver - 1]->unpack[i] == '*') {
buffer[bpos++] = '*';
buffer[bpos] = '\0';
}
} else {
buffer[bpos++] = conf.archivers[gUser->defarchiver - 1]->unpack[i];
buffer[bpos] = '\0';
} }
p++;
size_t alen = 0;
if (*p == 'a') {
strlcpy(b, upload_filename, blen);
alen = strlen(upload_filename);
} else if (*p == 'd') {
snprintf(b, blen, "%s/node%d/bwave/", conf.bbs_path, mynode);
alen = strlen(b);
} else if (*p == '*') {
*b++ = '*';
alen = 1;
}
b += alen;
blen -= alen;
} }
*b = '\0';
if (sshBBS) { if (sshBBS) {
stout = dup(STDOUT_FILENO); stout = dup(STDOUT_FILENO);
stin = dup(STDIN_FILENO); stin = dup(STDIN_FILENO);
@ -889,12 +910,12 @@ void bwave_upload_reply() {
unlink(upload_filename); unlink(upload_filename);
snprintf(buffer, 1024, "%s/node%d/bwave/%s.UPL", conf.bbs_path, mynode, conf.bwave_name); snprintf(buffer, sizeof buffer, "%s/node%d/bwave/%s.UPL", conf.bbs_path, mynode, conf.bwave_name);
upl_file = fopen(buffer, "r"); upl_file = fopen(buffer, "r");
if (!upl_file) { if (!upl_file) {
snprintf(buffer, 1024, "%s/node%d/bwave/%s.upl", conf.bbs_path, mynode, conf.bwave_name); snprintf(buffer, sizeof buffer, "%s/node%d/bwave/%s.upl", conf.bbs_path, mynode, conf.bwave_name);
upl_file = fopen(buffer, "r"); upl_file = fopen(buffer, "r");
if (!upl_file) { if (!upl_file) {
s_printf(get_string(196)); s_printf(get_string(196));
@ -924,13 +945,12 @@ void bwave_upload_reply() {
continue; continue;
} }
bpos = 0; char *b = body;
for (i = 0; i < strlen(body); i++) { for (char *p = body; *p != '\0'; ++p) {
if (body[i] != '\n') { if (*p != '\n')
body[bpos++] = body[i]; *b++ = *p;
}
} }
body[bpos] = '\0'; *b = '\0';
snprintf(buffer, sizeof buffer, "%s/email.sq3", conf.bbs_path); snprintf(buffer, sizeof buffer, "%s/email.sq3", conf.bbs_path);
@ -982,9 +1002,11 @@ void bwave_upload_reply() {
confr = -1; confr = -1;
area = -1; area = -1;
for (i = 0; i < conf.mail_conference_count; i++) { for (i = 0; i < ptr_vector_len(&conf.mail_conferences); i++) {
for (j = 0; j < conf.mail_conferences[i]->mail_area_count; j++) { struct mail_conference *mc = ptr_vector_get(&conf.mail_conferences, i);
if (strcmp(conf.mail_conferences[i]->mail_areas[j]->qwkname, upl_rec.echotag) == 0) { for (j = 0; j < ptr_vector_len(&mc->mail_areas); j++) {
struct mail_area *ma = ptr_vector_get(&mc->mail_areas, j);
if (strcmp(ma->qwkname, upl_rec.echotag) == 0) {
confr = i; confr = i;
area = j; area = j;
break; break;
@ -997,7 +1019,8 @@ void bwave_upload_reply() {
if (confr != -1 && area != -1) { if (confr != -1 && area != -1) {
// import message // import message
if (conf.mail_conferences[confr]->mail_areas[area]->write_sec_level <= gUser->sec_level) { struct mail_area *ma = get_area(confr, area);
if (ma->write_sec_level <= gUser->sec_level) {
msg_attr = converts(upl_rec.msg_attr); msg_attr = converts(upl_rec.msg_attr);
if (msg_attr & UPL_INACTIVE) { if (msg_attr & UPL_INACTIVE) {
@ -1013,7 +1036,7 @@ void bwave_upload_reply() {
addr.node = 0; addr.node = 0;
addr.zone = 0; addr.zone = 0;
if (conf.mail_conferences[confr]->mail_areas[area]->type == TYPE_NETMAIL_AREA) { if (ma->type == TYPE_NETMAIL_AREA) {
if (!(msg_attr & UPL_NETMAIL)) { if (!(msg_attr & UPL_NETMAIL)) {
continue; continue;
} }
@ -1022,7 +1045,7 @@ void bwave_upload_reply() {
addr.node = converts(upl_rec.destnode); addr.node = converts(upl_rec.destnode);
addr.zone = converts(upl_rec.destpoint); addr.zone = converts(upl_rec.destpoint);
netmail = 1; netmail = 1;
} else if (conf.mail_conferences[confr]->mail_areas[area]->type == TYPE_ECHOMAIL_AREA || conf.mail_conferences[confr]->mail_areas[area]->type == TYPE_NEWSGROUP_AREA) { } else if (ma->type == TYPE_ECHOMAIL_AREA || ma->type == TYPE_NEWSGROUP_AREA) {
if (msg_attr & UPL_PRIVATE) { if (msg_attr & UPL_PRIVATE) {
continue; continue;
} }
@ -1033,32 +1056,36 @@ void bwave_upload_reply() {
} }
} }
snprintf(msgbuffer, 1024, "%s/node%d/bwave/%s", conf.bbs_path, mynode, upl_rec.filename); snprintf(msgbuffer, sizeof buffer, "%s/node%d/bwave/%s", conf.bbs_path, mynode, upl_rec.filename);
if (conf.mail_conferences[confr]->tagline != NULL) { tagline = conf.default_tagline;
tagline = conf.mail_conferences[confr]->tagline; struct mail_conference *mc = get_conf(confr);
} else { if (mc->tagline != NULL) {
tagline = conf.default_tagline; tagline = mc->tagline;
} }
if (conf.mail_conferences[confr]->nettype == NETWORK_FIDO) { if (mc->nettype == NETWORK_FIDO) {
if (conf.mail_conferences[confr]->fidoaddr->point == 0) { if (mc->fidoaddr->point == 0) {
snprintf(originlinebuffer, 256, "\r--- %s\r * Origin: %s (%d:%d/%d)\r", upl_hdr.reader_tear, tagline, conf.mail_conferences[confr]->fidoaddr->zone, snprintf(originlinebuffer, sizeof originlinebuffer, "\r--- %s\r * Origin: %s (%d:%d/%d)\r",
conf.mail_conferences[confr]->fidoaddr->net, upl_hdr.reader_tear, tagline,
conf.mail_conferences[confr]->fidoaddr->node); mc->fidoaddr->zone, mc->fidoaddr->net, mc->fidoaddr->node);
} else { } else {
snprintf(originlinebuffer, 256, "\r--- %s\r * Origin: %s (%d:%d/%d.%d)\r", upl_hdr.reader_tear, tagline, conf.mail_conferences[confr]->fidoaddr->zone, snprintf(originlinebuffer, sizeof originlinebuffer, "\r--- %s\r * Origin: %s (%d:%d/%d.%d)\r",
conf.mail_conferences[confr]->fidoaddr->net, upl_hdr.reader_tear, tagline,
conf.mail_conferences[confr]->fidoaddr->node, mc->fidoaddr->zone,
conf.mail_conferences[confr]->fidoaddr->point); mc->fidoaddr->net,
mc->fidoaddr->node,
mc->fidoaddr->point);
} }
} else if (conf.mail_conferences[confr]->nettype == NETWORK_MAGI) { } else if (mc->nettype == NETWORK_MAGI) {
snprintf(originlinebuffer, 256, "\r--- %s\r * Origin: %s (@%d)\r", upl_hdr.reader_tear, tagline, conf.mail_conferences[confr]->maginode); snprintf(originlinebuffer, sizeof originlinebuffer, "\r--- %s\r * Origin: %s (@%d)\r",
} else if (conf.mail_conferences[confr]->nettype == NETWORK_QWK) { upl_hdr.reader_tear, tagline, mc->maginode);
snprintf(originlinebuffer, 256, "\r--- $s\r * Origin: %s (%s)\r", upl_hdr.reader_tear, tagline, conf.bwave_name); } else if (mc->nettype == NETWORK_QWK) {
snprintf(originlinebuffer, sizeof originlinebuffer, "\r--- $s\r * Origin: %s (%s)\r",
upl_hdr.reader_tear, tagline, conf.bwave_name);
} else { } else {
snprintf(originlinebuffer, 256, "\r"); snprintf(originlinebuffer, sizeof originlinebuffer, "\r");
} }
sa = file2stralloc(msgbuffer); sa = file2stralloc(msgbuffer);
@ -1089,7 +1116,7 @@ void bwave_upload_reply() {
} }
} }
snprintf(buffer, 1024, "%s/node%d/bwave/", conf.bbs_path, mynode); snprintf(buffer, sizeof buffer, "%s/node%d/bwave/", conf.bbs_path, mynode);
recursive_delete(buffer); recursive_delete(buffer);
if (netmail == 1) { if (netmail == 1) {

View File

@ -17,6 +17,7 @@
#include "lua/lua.h" #include "lua/lua.h"
#include "lua/lualib.h" #include "lua/lualib.h"
#include "lua/lauxlib.h" #include "lua/lauxlib.h"
extern struct bbs_config conf; extern struct bbs_config conf;
extern int gSocket; extern int gSocket;
extern int sshBBS; extern int sshBBS;
@ -47,6 +48,41 @@ struct tagged_file {
int fid; int fid;
}; };
static struct file_directory *get_dir(size_t d) {
struct file_directory *dir = ptr_vector_get(&conf.file_directories, d);
assert(dir != NULL);
return dir;
}
static struct file_directory *user_dir(struct user_record *user) {
assert(user != NULL);
return get_dir(user->cur_file_dir);
}
static struct file_sub *get_sub(size_t d, size_t s) {
struct file_directory *dir = get_dir(d);
struct file_sub *sub = ptr_vector_get(&dir->file_subs, s);
assert(sub != NULL);
return sub;
}
static struct file_sub *user_sub(struct user_record *user) {
assert(user != NULL);
return get_sub(user->cur_file_dir, user->cur_file_sub);
}
static void open_sub_db_or_die(sqlite3 **db, char *sub) {
char buffer[PATH_MAX];
snprintf(buffer, PATH_MAX, "%s/%s.sq3", conf.bbs_path, sub);
if (sqlite3_open(buffer, db) != SQLITE_OK) {
dolog("Cannot open database: %s", sqlite3_errmsg(*db));
sqlite3_close(*db);
exit(1);
}
assert(db != NULL);
sqlite3_busy_timeout(*db, 5000);
}
struct tagged_file **tagged_files; struct tagged_file **tagged_files;
int tagged_count = 0; int tagged_count = 0;
@ -122,12 +158,10 @@ char *upload_path;
char upload_filename[1024]; char upload_filename[1024];
FILE *ZOpenFile(char *name, u_long crc, ZModem *info) { FILE *ZOpenFile(char *name, u_long crc, ZModem *info) {
FILE *fptr; FILE *fptr;
struct stat s;
snprintf(upload_filename, 1023, "%s/%s", upload_path, basename(name)); snprintf(upload_filename, 1023, "%s/%s", upload_path, basename(name));
if (stat(upload_filename, &s) == 0) { if (access(upload_filename, F_OK) == 0) {
return NULL; return NULL;
} }
@ -287,7 +321,6 @@ void upload_zmodem(struct user_record *user, char *upload_p) {
char *get_file_id_diz(char *filename) { char *get_file_id_diz(char *filename) {
char *description; char *description;
char buffer[1024]; char buffer[1024];
struct stat s;
int bpos; int bpos;
int i; int i;
FILE *fptr; FILE *fptr;
@ -315,8 +348,10 @@ char *get_file_id_diz(char *filename) {
return NULL; return NULL;
} }
for (i = 0; i < conf.archiver_count; i++) { struct archiver *arc = NULL;
if (strcasecmp(&filename[ext], conf.archivers[i]->extension) == 0) { for (i = 0; i < ptr_vector_len(&conf.archivers); ++i) {
arc = ptr_vector_get(&conf.archivers, i);
if (strcasecmp(&filename[ext], arc->extension) == 0) {
arch = i; arch = i;
break; break;
} }
@ -325,41 +360,45 @@ char *get_file_id_diz(char *filename) {
if (arch == -1) { if (arch == -1) {
return NULL; return NULL;
} }
assert(arc != NULL);
snprintf(buffer, 1024, "%s/node%d", conf.bbs_path, mynode); snprintf(buffer, sizeof buffer, "%s/node%d", conf.bbs_path, mynode);
if (stat(buffer, &s) != 0) { if (access(buffer, X_OK) != 0) {
mkdir(buffer, 0755); mkdir(buffer, 0755);
} }
snprintf(buffer, 1024, "%s/node%d/temp", conf.bbs_path, mynode); snprintf(buffer, sizeof buffer, "%s/node%d/temp", conf.bbs_path, mynode);
if (stat(buffer, &s) == 0) { if (access(buffer, F_OK|W_OK) == 0) {
if (recursive_delete(buffer) != 0) { if (recursive_delete(buffer) != 0) {
return NULL; return NULL;
} }
} }
mkdir(buffer, 0755); mkdir(buffer, 0755);
bpos = 0; char *s = buffer;
for (i = 0; i < strlen(conf.archivers[arch]->unpack); i++) { size_t blen = sizeof buffer;
if (conf.archivers[arch]->unpack[i] == '*') { for (const char *p = arc->unpack; *p != '\0' && blen > 1; ++p) {
i++; if (*p != '*') {
if (conf.archivers[arch]->unpack[i] == 'a') { *s++ = *p;
sprintf(&buffer[bpos], "%s", filename); --blen;
bpos = strlen(buffer); continue;
} else if (conf.archivers[arch]->unpack[i] == 'd') {
sprintf(&buffer[bpos], "%s/node%d/temp/", conf.bbs_path, mynode);
bpos = strlen(buffer);
} else if (conf.archivers[arch]->unpack[i] == '*') {
buffer[bpos++] = '*';
buffer[bpos] = '\0';
}
} else {
buffer[bpos++] = conf.archivers[arch]->unpack[i];
buffer[bpos] = '\0';
} }
p++;
size_t slen = 0;
if (*p == 'a') {
strlcpy(s, filename, blen);
slen = strlen(s);
} else if (*p == 'd') {
snprintf(s, blen, "%s/node%d/temp/", conf.bbs_path, mynode);
slen = strlen(s);
} else if (*p == '*') {
*s++ = '*';
slen = 1;
}
s += slen;
blen -= slen;
} }
*s = '\0';
if (sshBBS) { if (sshBBS) {
stout = dup(STDOUT_FILENO); stout = dup(STDOUT_FILENO);
@ -384,7 +423,6 @@ char *get_file_id_diz(char *filename) {
free(args); free(args);
if (sshBBS) { if (sshBBS) {
dup2(stout, STDOUT_FILENO); dup2(stout, STDOUT_FILENO);
dup2(sterr, STDERR_FILENO); dup2(sterr, STDERR_FILENO);
dup2(stin, STDIN_FILENO); dup2(stin, STDIN_FILENO);
@ -394,13 +432,13 @@ char *get_file_id_diz(char *filename) {
close(sterr); close(sterr);
} }
snprintf(buffer, 1024, "%s/node%d/temp/FILE_ID.DIZ", conf.bbs_path, mynode); snprintf(buffer, sizeof buffer, "%s/node%d/temp/FILE_ID.DIZ", conf.bbs_path, mynode);
description = file2str(buffer); description = file2str(buffer);
if (description == NULL) { if (description == NULL) {
snprintf(buffer, 1024, "%s/node%d/temp/file_id.diz", conf.bbs_path, mynode); snprintf(buffer, sizeof buffer, "%s/node%d/temp/file_id.diz", conf.bbs_path, mynode);
description = file2str(buffer); description = file2str(buffer);
if (description == NULL) { if (description == NULL) {
snprintf(buffer, 1024, "%s/node%d/temp", conf.bbs_path, mynode); snprintf(buffer, sizeof buffer, "%s/node%d/temp", conf.bbs_path, mynode);
recursive_delete(buffer); recursive_delete(buffer);
return NULL; return NULL;
} }
@ -417,7 +455,7 @@ char *get_file_id_diz(char *filename) {
} }
description[bpos] = '\0'; description[bpos] = '\0';
snprintf(buffer, 1024, "%s/node%d/temp", conf.bbs_path, mynode); snprintf(buffer, sizeof buffer, "%s/node%d/temp", conf.bbs_path, mynode);
recursive_delete(buffer); recursive_delete(buffer);
return description; return description;
@ -436,7 +474,9 @@ int do_download(struct user_record *user, char *file) {
char iac_binary_will[] = {IAC, IAC_WILL, IAC_TRANSMIT_BINARY, '\0'}; char iac_binary_will[] = {IAC, IAC_WILL, IAC_TRANSMIT_BINARY, '\0'};
char iac_binary_do[] = {IAC, IAC_DO, IAC_TRANSMIT_BINARY, '\0'}; char iac_binary_do[] = {IAC, IAC_DO, IAC_TRANSMIT_BINARY, '\0'};
if (conf.protocols[user->defprotocol - 1]->internal_zmodem) { struct protocol *defproto = ptr_vector_get(&conf.protocols, user->defprotocol - 1);
assert(defproto != NULL);
if (defproto->internal_zmodem) {
if (sshBBS) { if (sshBBS) {
ttySetRaw(STDIN_FILENO, &oldit); ttySetRaw(STDIN_FILENO, &oldit);
ttySetRaw(STDOUT_FILENO, &oldot); ttySetRaw(STDOUT_FILENO, &oldot);
@ -456,30 +496,30 @@ int do_download(struct user_record *user, char *file) {
return 1; return 1;
} else { } else {
bpos = 0; bpos = 0;
for (i = 0; i < strlen(conf.protocols[user->defprotocol - 1]->download); i++) { for (i = 0; i < strlen(defproto->download); i++) {
if (conf.protocols[user->defprotocol - 1]->download[i] == '*') { if (defproto->download[i] == '*') {
i++; i++;
if (conf.protocols[user->defprotocol - 1]->download[i] == '*') { if (defproto->download[i] == '*') {
download_command[bpos++] = conf.protocols[user->defprotocol - 1]->download[i]; download_command[bpos++] = defproto->download[i];
download_command[bpos] = '\0'; download_command[bpos] = '\0';
continue; continue;
} else if (conf.protocols[user->defprotocol - 1]->download[i] == 'f') { } else if (defproto->download[i] == 'f') {
sprintf(&download_command[bpos], "%s", file); sprintf(&download_command[bpos], "%s", file);
bpos = strlen(download_command); bpos = strlen(download_command);
continue; continue;
} else if (conf.protocols[user->defprotocol - 1]->download[i] == 's') { } else if (defproto->download[i] == 's') {
if (!sshBBS) { if (!sshBBS) {
sprintf(&download_command[bpos], "%d", gSocket); sprintf(&download_command[bpos], "%d", gSocket);
bpos = strlen(download_command); bpos = strlen(download_command);
} else { } else {
s_printf(get_string(209), conf.protocols[user->defprotocol - 1]->name); s_printf(get_string(209), defproto->name);
return 0; return 0;
} }
} }
} else { } else {
download_command[bpos++] = conf.protocols[user->defprotocol - 1]->download[i]; download_command[bpos++] = defproto->download[i];
download_command[bpos] = '\0'; download_command[bpos] = '\0';
} }
} }
@ -521,7 +561,7 @@ int do_download(struct user_record *user, char *file) {
write(gSocket, iac_binary_do, 3); write(gSocket, iac_binary_do, 3);
} }
} }
runexternal(user, download_command, conf.protocols[user->defprotocol - 1]->stdio, arguments, conf.bbs_path, 1, NULL); runexternal(user, download_command, defproto->stdio, arguments, conf.bbs_path, 1, NULL);
free(arguments); free(arguments);
} }
@ -539,12 +579,12 @@ int do_upload(struct user_record *user, char *final_path) {
char **arguments; char **arguments;
DIR *inb; DIR *inb;
struct dirent *dent; struct dirent *dent;
struct stat s;
int len; int len;
char iac_binary_will[] = {IAC, IAC_WILL, IAC_TRANSMIT_BINARY, '\0'}; char iac_binary_will[] = {IAC, IAC_WILL, IAC_TRANSMIT_BINARY, '\0'};
char iac_binary_do[] = {IAC, IAC_DO, IAC_TRANSMIT_BINARY, '\0'}; char iac_binary_do[] = {IAC, IAC_DO, IAC_TRANSMIT_BINARY, '\0'};
if (conf.protocols[user->defprotocol - 1]->internal_zmodem) { struct protocol *defproto = ptr_vector_get(&conf.protocols, user->defprotocol - 1);
if (defproto->internal_zmodem) {
if (!sshBBS) { if (!sshBBS) {
if (telnet_bin_mode == 0) { if (telnet_bin_mode == 0) {
write(gSocket, iac_binary_will, 3); write(gSocket, iac_binary_will, 3);
@ -557,37 +597,37 @@ int do_upload(struct user_record *user, char *final_path) {
return 1; return 1;
} else { } else {
if (conf.protocols[user->defprotocol - 1]->upload_prompt) { if (defproto->upload_prompt) {
s_printf(get_string(210)); s_printf(get_string(210));
s_readstring(buffer3, 256); s_readstring(buffer3, 256);
s_printf("\r\n"); s_printf("\r\n");
} }
bpos = 0; bpos = 0;
for (i = 0; i < strlen(conf.protocols[user->defprotocol - 1]->upload); i++) { for (i = 0; i < strlen(defproto->upload); i++) {
if (conf.protocols[user->defprotocol - 1]->upload[i] == '*') { if (defproto->upload[i] == '*') {
i++; i++;
if (conf.protocols[user->defprotocol - 1]->upload[i] == '*') { if (defproto->upload[i] == '*') {
upload_command[bpos++] = conf.protocols[user->defprotocol - 1]->upload[i]; upload_command[bpos++] = defproto->upload[i];
upload_command[bpos] = '\0'; upload_command[bpos] = '\0';
continue; continue;
} else if (conf.protocols[user->defprotocol - 1]->upload[i] == 'f') { } else if (defproto->upload[i] == 'f') {
if (conf.protocols[user->defprotocol - 1]->upload_prompt) { if (defproto->upload_prompt) {
sprintf(&upload_command[bpos], "%s", buffer3); sprintf(&upload_command[bpos], "%s", buffer3);
bpos = strlen(upload_command); bpos = strlen(upload_command);
} }
continue; continue;
} else if (conf.protocols[user->defprotocol - 1]->upload[i] == 's') { } else if (defproto->upload[i] == 's') {
if (!sshBBS) { if (!sshBBS) {
sprintf(&upload_command[bpos], "%d", gSocket); sprintf(&upload_command[bpos], "%d", gSocket);
bpos = strlen(upload_command); bpos = strlen(upload_command);
} else { } else {
s_printf(get_string(209), conf.protocols[user->defprotocol - 1]->name); s_printf(get_string(209), defproto->name);
return 0; return 0;
} }
} }
} else { } else {
upload_command[bpos++] = conf.protocols[user->defprotocol - 1]->upload[i]; upload_command[bpos++] = defproto->upload[i];
upload_command[bpos] = '\0'; upload_command[bpos] = '\0';
} }
} }
@ -626,7 +666,7 @@ int do_upload(struct user_record *user, char *final_path) {
snprintf(upload_path, 1024, "%s/node%d/upload/", conf.bbs_path, mynode); snprintf(upload_path, 1024, "%s/node%d/upload/", conf.bbs_path, mynode);
if (stat(upload_path, &s) == 0) { if (access(upload_path, F_OK) == 0) {
recursive_delete(upload_path); recursive_delete(upload_path);
} }
@ -638,19 +678,19 @@ int do_upload(struct user_record *user, char *final_path) {
write(gSocket, iac_binary_do, 3); write(gSocket, iac_binary_do, 3);
} }
} }
runexternal(user, upload_command, conf.protocols[user->defprotocol - 1]->stdio, arguments, upload_path, 1, NULL); runexternal(user, upload_command, defproto->stdio, arguments, upload_path, 1, NULL);
free(arguments); free(arguments);
if (conf.protocols[user->defprotocol - 1]->upload_prompt) { if (defproto->upload_prompt) {
snprintf(upload_command, 1024, "%s%s", upload_path, buffer3); snprintf(upload_command, 1024, "%s%s", upload_path, buffer3);
if (stat(upload_command, &s) != 0) { if (access(upload_command, W_OK|X_OK) != 0) {
recursive_delete(upload_path); recursive_delete(upload_path);
return 0; return 0;
} }
snprintf(upload_filename, 1024, "%s/%s", final_path, buffer3); snprintf(upload_filename, 1024, "%s/%s", final_path, buffer3);
if (stat(upload_filename, &s) == 0) { if (access(upload_filename, F_OK) == 0) {
recursive_delete(upload_path); recursive_delete(upload_path);
s_printf(get_string(214)); s_printf(get_string(214));
return 0; return 0;
@ -670,6 +710,7 @@ int do_upload(struct user_record *user, char *final_path) {
while ((dent = readdir(inb)) != NULL) { while ((dent = readdir(inb)) != NULL) {
#ifdef __sun #ifdef __sun
snprintf(upload_command, 1024, "%s%s", upload_path, dent->d_name); snprintf(upload_command, 1024, "%s%s", upload_path, dent->d_name);
struct state s;
stat(upload_command, &s); stat(upload_command, &s);
if (S_ISREG(s.st_mode)) { if (S_ISREG(s.st_mode)) {
#else #else
@ -678,7 +719,7 @@ int do_upload(struct user_record *user, char *final_path) {
snprintf(upload_command, 1024, "%s%s", upload_path, dent->d_name); snprintf(upload_command, 1024, "%s%s", upload_path, dent->d_name);
snprintf(upload_filename, 1024, "%s/%s", final_path, dent->d_name); snprintf(upload_filename, 1024, "%s/%s", final_path, dent->d_name);
if (stat(upload_filename, &s) == 0) { if (access(upload_filename, F_OK) == 0) {
recursive_delete(upload_path); recursive_delete(upload_path);
s_printf(get_string(214)); s_printf(get_string(214));
closedir(inb); closedir(inb);
@ -719,12 +760,12 @@ void upload(struct user_record *user) {
sqlite3 *db; sqlite3 *db;
sqlite3_stmt *res; sqlite3_stmt *res;
int rc; int rc;
struct stat s;
char *err_msg = NULL; char *err_msg = NULL;
char *description; char *description;
time_t curtime; time_t curtime;
if (!do_upload(user, conf.file_directories[user->cur_file_dir]->file_subs[user->cur_file_sub]->upload_path)) { struct file_sub *sub = user_sub(user);
if (!do_upload(user, sub->upload_path)) {
s_printf(get_string(211)); s_printf(get_string(211));
return; return;
} }
@ -752,17 +793,7 @@ void upload(struct user_record *user) {
} else { } else {
s_printf(get_string(201)); s_printf(get_string(201));
} }
snprintf(pathname, sizeof pathname, "%s/%s.sq3", open_sub_db_or_die(&db, sub->database);
conf.bbs_path, conf.file_directories[user->cur_file_dir]->file_subs[user->cur_file_sub]->database);
rc = sqlite3_open(pathname, &db);
if (rc != SQLITE_OK) {
dolog("Cannot open database: %s", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
sqlite3_busy_timeout(db, 5000);
rc = sqlite3_exec(db, create_sql, 0, 0, &err_msg); rc = sqlite3_exec(db, create_sql, 0, 0, &err_msg);
if (rc != SQLITE_OK) { if (rc != SQLITE_OK) {
dolog("SQL error: %s", err_msg); dolog("SQL error: %s", err_msg);
@ -775,6 +806,7 @@ void upload(struct user_record *user) {
rc = sqlite3_prepare_v2(db, sql, -1, &res, 0); rc = sqlite3_prepare_v2(db, sql, -1, &res, 0);
if (rc == SQLITE_OK) { if (rc == SQLITE_OK) {
struct stat s;
stat(upload_filename, &s); stat(upload_filename, &s);
sqlite3_bind_text(res, 1, upload_filename, -1, 0); sqlite3_bind_text(res, 1, upload_filename, -1, 0);
@ -936,16 +968,8 @@ void download(struct user_record *user) {
do_download(user, tagged_files[i]->filename); do_download(user, tagged_files[i]->filename);
sprintf(buffer, "%s/%s.sq3", conf.bbs_path, conf.file_directories[tagged_files[i]->dir]->file_subs[tagged_files[i]->sub]->database); struct file_sub *sub = get_sub(tagged_files[i]->dir, tagged_files[i]->sub);
open_sub_db_or_die(&db, sub->database);
rc = sqlite3_open(buffer, &db);
if (rc != SQLITE_OK) {
dolog("Cannot open database: %s", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
sqlite3_busy_timeout(db, 5000);
rc = sqlite3_prepare_v2(db, ssql, -1, &res, 0); rc = sqlite3_prepare_v2(db, ssql, -1, &res, 0);
if (rc == SQLITE_OK) { if (rc == SQLITE_OK) {
@ -1049,7 +1073,7 @@ void do_list_files(struct file_entry **files_e, int files_c) {
} else { } else {
z = atoi(buffer); z = atoi(buffer);
if (z >= 0 && z < files_c) { if (z >= 0 && z < files_c) {
if (conf.file_directories[files_e[z]->dir]->file_subs[files_e[z]->sub]->download_sec_level <= gUser->sec_level) { if (get_sub(files_e[z]->dir, files_e[z]->sub)->download_sec_level <= gUser->sec_level) {
match = 0; match = 0;
for (k = 0; k < tagged_count; k++) { for (k = 0; k < tagged_count; k++) {
if (strcmp(tagged_files[k]->filename, files_e[z]->filename) == 0) { if (strcmp(tagged_files[k]->filename, files_e[z]->filename) == 0) {
@ -1104,7 +1128,7 @@ void do_list_files(struct file_entry **files_e, int files_c) {
} else { } else {
z = atoi(buffer); z = atoi(buffer);
if (z >= 0 && z < files_c) { if (z >= 0 && z < files_c) {
if (conf.file_directories[files_e[z]->dir]->file_subs[files_e[z]->sub]->download_sec_level <= gUser->sec_level) { if (get_sub(files_e[z]->dir, files_e[z]->sub)->download_sec_level <= gUser->sec_level) {
match = 0; match = 0;
for (k = 0; k < tagged_count; k++) { for (k = 0; k < tagged_count; k++) {
if (strcmp(tagged_files[k]->filename, files_e[z]->filename) == 0) { if (strcmp(tagged_files[k]->filename, files_e[z]->filename) == 0) {
@ -1148,7 +1172,7 @@ void do_list_files(struct file_entry **files_e, int files_c) {
} else { } else {
z = atoi(buffer); z = atoi(buffer);
if (z >= 0 && z < files_c) { if (z >= 0 && z < files_c) {
if (conf.file_directories[files_e[z]->dir]->file_subs[files_e[z]->sub]->download_sec_level <= gUser->sec_level) { if (get_sub(files_e[z]->dir, files_e[z]->sub)->download_sec_level <= gUser->sec_level) {
match = 0; match = 0;
for (k = 0; k < tagged_count; k++) { for (k = 0; k < tagged_count; k++) {
if (strcmp(tagged_files[k]->filename, files_e[z]->filename) == 0) { if (strcmp(tagged_files[k]->filename, files_e[z]->filename) == 0) {
@ -1256,16 +1280,9 @@ void file_search() {
if (!all) { if (!all) {
files_c = 0; files_c = 0;
snprintf(buffer, PATH_MAX, "%s/%s.sq3", conf.bbs_path, conf.file_directories[gUser->cur_file_dir]->file_subs[gUser->cur_file_sub]->database); struct file_sub *sub = user_sub(gUser);
open_sub_db_or_die(&db, sub->database);
rc = sqlite3_open(buffer, &db);
if (rc != SQLITE_OK) {
dolog("Cannot open database: %s", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
sqlite3_busy_timeout(db, 5000);
rc = sqlite3_prepare_v2(db, sqlbuffer, -1, &res, 0); rc = sqlite3_prepare_v2(db, sqlbuffer, -1, &res, 0);
if (rc != SQLITE_OK) { if (rc != SQLITE_OK) {
@ -1313,23 +1330,18 @@ void file_search() {
} }
} else { } else {
files_c = 0; files_c = 0;
for (search_dir = 0; search_dir < conf.file_directory_count; search_dir++) { for (search_dir = 0; search_dir < ptr_vector_len(&conf.file_directories); search_dir++) {
if (conf.file_directories[search_dir]->sec_level > gUser->sec_level) { struct file_directory *dir = ptr_vector_get(&conf.file_directories, search_dir);
if (dir->sec_level > gUser->sec_level) {
continue; continue;
} }
for (search_sub = 0; search_sub < conf.file_directories[search_dir]->file_sub_count; search_sub++) { for (search_sub = 0; search_sub < ptr_vector_len(&dir->file_subs); search_sub++) {
if (conf.file_directories[search_dir]->file_subs[search_sub]->download_sec_level > gUser->sec_level) { struct file_sub *sub = ptr_vector_get(&dir->file_subs, search_sub);
if (sub->download_sec_level > gUser->sec_level) {
continue; continue;
} }
snprintf(buffer, PATH_MAX, "%s/%s.sq3", conf.bbs_path, conf.file_directories[search_dir]->file_subs[search_sub]->database); open_sub_db_or_die(&db, sub->database);
rc = sqlite3_open(buffer, &db);
if (rc != SQLITE_OK) {
dolog("Cannot open database: %s", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
sqlite3_busy_timeout(db, 5000);
rc = sqlite3_prepare_v2(db, sqlbuffer, -1, &res, 0); rc = sqlite3_prepare_v2(db, sqlbuffer, -1, &res, 0);
if (rc != SQLITE_OK) { if (rc != SQLITE_OK) {
@ -1414,16 +1426,8 @@ void list_files(struct user_record *user) {
break; break;
} }
s_printf("\r\n"); s_printf("\r\n");
snprintf(buffer, PATH_MAX, "%s/%s.sq3", conf.bbs_path, conf.file_directories[user->cur_file_dir]->file_subs[user->cur_file_sub]->database); struct file_sub *sub = user_sub(user);
open_sub_db_or_die(&db, sub->database);
rc = sqlite3_open(buffer, &db);
if (rc != SQLITE_OK) {
dolog("Cannot open database: %s", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
sqlite3_busy_timeout(db, 5000);
rc = sqlite3_prepare_v2(db, sql, -1, &res, 0); rc = sqlite3_prepare_v2(db, sql, -1, &res, 0);
if (rc != SQLITE_OK) { if (rc != SQLITE_OK) {
sqlite3_close(db); sqlite3_close(db);
@ -1477,10 +1481,12 @@ void choose_subdir() {
struct ptr_vector subs; struct ptr_vector subs;
init_ptr_vector(&subs); init_ptr_vector(&subs);
for (i = 0; i < conf.file_directories[gUser->cur_file_dir]->file_sub_count; i++) { struct file_directory *dir = user_dir(gUser);
if (conf.file_directories[gUser->cur_file_dir]->file_subs[i]->download_sec_level <= gUser->sec_level) { for (i = 0; i < ptr_vector_len(&dir->file_subs); i++) {
struct file_sub *fsub = ptr_vector_get(&dir->file_subs, i);
if (fsub->download_sec_level <= gUser->sec_level) {
struct subdir_tmp_t *sub = (struct subdir_tmp_t *)malloz(sizeof(struct subdir_tmp_t)); struct subdir_tmp_t *sub = (struct subdir_tmp_t *)malloz(sizeof(struct subdir_tmp_t));
sub->sub = conf.file_directories[gUser->cur_file_dir]->file_subs[i]; sub->sub = fsub;
sub->index = i; sub->index = i;
ptr_vector_append(&subs, sub); ptr_vector_append(&subs, sub);
} }
@ -1491,7 +1497,7 @@ void choose_subdir() {
while (1) { while (1) {
if (redraw) { if (redraw) {
s_printf("\e[2J\e[1;1H"); s_printf("\e[2J\e[1;1H");
s_printf(get_string(252), conf.file_directories[gUser->cur_file_dir]->name); s_printf(get_string(252), user_dir(gUser)->name);
s_printf(get_string(248)); s_printf(get_string(248));
for (i = start; i < start + 22 && i < list_tmp; i++) { for (i = start; i < start + 22 && i < list_tmp; i++) {
if (i == selected) { if (i == selected) {
@ -1613,10 +1619,11 @@ void choose_directory() {
struct ptr_vector dirs; struct ptr_vector dirs;
init_ptr_vector(&dirs); init_ptr_vector(&dirs);
for (i = 0; i < conf.file_directory_count; i++) { for (i = 0; i < ptr_vector_len(&conf.file_directories); i++) {
if (conf.file_directories[i]->sec_level <= gUser->sec_level) { struct file_directory *fdir = ptr_vector_get(&conf.file_directories, i);
if (fdir->sec_level <= gUser->sec_level) {
struct dir_tmp_t *dir = (struct dir_tmp_t *)malloz(sizeof(struct dir_tmp_t)); struct dir_tmp_t *dir = (struct dir_tmp_t *)malloz(sizeof(struct dir_tmp_t));
dir->dir = conf.file_directories[i]; dir->dir = fdir;
dir->index = i; dir->index = i;
ptr_vector_append(&dirs, dir); ptr_vector_append(&dirs, dir);
} }
@ -1748,49 +1755,39 @@ void clear_tagged_files() {
} }
void next_file_dir(struct user_record *user) { void next_file_dir(struct user_record *user) {
int i; size_t n = ptr_vector_len(&conf.file_directories);
for (i = user->cur_file_dir; i < conf.file_directory_count; i++) { size_t start = user->cur_file_dir;
if (i + 1 == conf.file_directory_count) { size_t i;
i = -1; for (i = (start + 1) % n; i != start; i = (i + 1) % n) {
} struct file_directory *dir = get_dir(i);
if (conf.file_directories[i + 1]->sec_level <= user->sec_level) { if (dir->sec_level <= user->sec_level)
user->cur_file_dir = i + 1;
user->cur_file_sub = 0;
break; break;
}
} }
user->cur_file_dir = i;
user->cur_file_sub = 0;
} }
void prev_file_dir(struct user_record *user) { void prev_file_dir(struct user_record *user) {
int i; size_t n = ptr_vector_len(&conf.file_directories);
for (i = user->cur_file_dir; i >= 0; i--) { size_t start = user->cur_file_dir;
if (i - 1 == -1) { size_t i;
i = conf.file_directory_count; for (i = (start + n - 1) % n; i != start; i = (i + n - 1) % n) {
} struct file_directory *dir = get_dir(i);
if (conf.file_directories[i - 1]->sec_level <= user->sec_level) { if (dir->sec_level <= user->sec_level)
user->cur_file_dir = i - 1;
user->cur_file_sub = 0;
break; break;
}
} }
user->cur_file_dir = i;
user->cur_file_sub = 0;
} }
void next_file_sub(struct user_record *user) { void next_file_sub(struct user_record *user) {
int i; size_t n = ptr_vector_len(&conf.file_directories);
i = user->cur_file_sub; user->cur_file_sub = (user->cur_file_sub + 1) % n;
if (i + 1 == conf.file_directories[user->cur_file_dir]->file_sub_count) {
i = -1;
}
user->cur_file_sub = i + 1;
} }
void prev_file_sub(struct user_record *user) { void prev_file_sub(struct user_record *user) {
int i; size_t n = ptr_vector_len(&conf.file_directories);
i = user->cur_file_sub; user->cur_file_sub = (user->cur_file_sub + n - 1) % n;
if (i - 1 == -1) {
i = conf.file_directories[user->cur_file_dir]->file_sub_count;
}
user->cur_file_sub = i - 1;
} }
void file_scan() { void file_scan() {
@ -1809,30 +1806,24 @@ void file_scan() {
c = s_getc(); c = s_getc();
if (tolower(c) == 'y') { if (tolower(c) == 'y') {
for (i = 0; i < conf.file_directory_count; i++) { for (i = 0; i < ptr_vector_len(&conf.file_directories); i++) {
if (conf.file_directories[i]->sec_level > gUser->sec_level) { struct file_directory *dir = ptr_vector_get(&conf.file_directories, i);
if (dir->sec_level > gUser->sec_level) {
continue; continue;
} }
s_printf(get_string(140), i, conf.file_directories[i]->name); s_printf(get_string(140), i, dir->name);
lines += 2; lines += 2;
if (lines == 22) { if (lines == 22) {
s_printf(get_string(6)); s_printf(get_string(6));
s_getc(); s_getc();
lines = 0; lines = 0;
} }
for (j = 0; j < conf.file_directories[i]->file_sub_count; j++) { for (j = 0; j < ptr_vector_len(&dir->file_subs); j++) {
if (conf.file_directories[i]->file_subs[j]->download_sec_level > gUser->sec_level) { struct file_sub *sub = ptr_vector_get(&dir->file_subs, j);
if (sub->download_sec_level > gUser->sec_level) {
continue; continue;
} }
snprintf(buffer, PATH_MAX, "%s/%s.sq3", conf.bbs_path, conf.file_directories[i]->file_subs[j]->database); open_sub_db_or_die(&db, sub->database);
rc = sqlite3_open(buffer, &db);
if (rc != SQLITE_OK) {
dolog("Cannot open database: %s", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
sqlite3_busy_timeout(db, 5000);
rc = sqlite3_prepare_v2(db, sql, -1, &res, 0); rc = sqlite3_prepare_v2(db, sql, -1, &res, 0);
if (rc != SQLITE_OK) { if (rc != SQLITE_OK) {
@ -1845,7 +1836,7 @@ void file_scan() {
if (sqlite3_step(res) != SQLITE_ERROR) { if (sqlite3_step(res) != SQLITE_ERROR) {
new_files = sqlite3_column_int(res, 0); new_files = sqlite3_column_int(res, 0);
if (new_files > 0) { if (new_files > 0) {
s_printf(get_string(141), j, conf.file_directories[i]->file_subs[j]->name, new_files); s_printf(get_string(141), j, sub->name, new_files);
lines++; lines++;
} }
} }

View File

@ -157,19 +157,29 @@ int l_bbsDisplayAutoMsg(lua_State *L) {
} }
int l_getMailAreaInfo(lua_State *L) { int l_getMailAreaInfo(lua_State *L) {
assert(gUser != NULL);
lua_pushnumber(L, gUser->cur_mail_conf); lua_pushnumber(L, gUser->cur_mail_conf);
lua_pushstring(L, conf.mail_conferences[gUser->cur_mail_conf]->name); struct mail_conference *mc = ptr_vector_get(&conf.mail_conferences, gUser->cur_mail_conf);
assert(mc != NULL);
lua_pushstring(L, mc->name);
lua_pushnumber(L, gUser->cur_mail_area); lua_pushnumber(L, gUser->cur_mail_area);
lua_pushstring(L, conf.mail_conferences[gUser->cur_mail_conf]->mail_areas[gUser->cur_mail_area]->name); struct mail_area *ma = ptr_vector_get(&mc->mail_areas, gUser->cur_mail_area);
assert(ma != NULL);
lua_pushstring(L, ma->name);
return 4; return 4;
} }
int l_getFileAreaInfo(lua_State *L) { int l_getFileAreaInfo(lua_State *L) {
assert(gUser != NULL);
lua_pushnumber(L, gUser->cur_file_dir); lua_pushnumber(L, gUser->cur_file_dir);
lua_pushstring(L, conf.file_directories[gUser->cur_file_dir]->name); struct file_directory *dir = ptr_vector_get(&conf.file_directories, gUser->cur_file_dir);
assert(dir != NULL);
lua_pushstring(L, dir->name);
lua_pushnumber(L, gUser->cur_file_sub); lua_pushnumber(L, gUser->cur_file_sub);
lua_pushstring(L, conf.file_directories[gUser->cur_file_dir]->file_subs[gUser->cur_file_sub]->name); struct file_sub *sub = ptr_vector_get(&dir->file_subs, gUser->cur_file_sub);
assert(sub != NULL);
lua_pushstring(L, sub->name);
return 4; return 4;
} }
@ -204,9 +214,13 @@ int l_messageFound(lua_State *L) {
s_JamMsgHeader jmh; s_JamMsgHeader jmh;
s_JamSubPacket *jsp; s_JamSubPacket *jsp;
jb = open_jam_base(conf.mail_conferences[conference]->mail_areas[area]->path); struct mail_conference *mc = ptr_vector_get(&conf.mail_conferences, conference);
assert(mc != NULL);
struct mail_area *ma = ptr_vector_get(&mc->mail_areas, area);
assert(ma != NULL);
jb = open_jam_base(ma->path);
if (!jb) { if (!jb) {
dolog("Error opening JAM base.. %s", conf.mail_conferences[conference]->mail_areas[area]->path); dolog("Error opening JAM base.. %s", ma->path);
lua_pushnumber(L, 0); lua_pushnumber(L, 0);
return 1; return 1;
} }
@ -248,9 +262,13 @@ int l_readMessageHdr(lua_State *L) {
char *sender = NULL; char *sender = NULL;
char *recipient = NULL; char *recipient = NULL;
jb = open_jam_base(conf.mail_conferences[conference]->mail_areas[area]->path); struct mail_conference *mc = ptr_vector_get(&conf.mail_conferences, conference);
assert(mc != NULL);
struct mail_area *ma = ptr_vector_get(&mc->mail_areas, area);
assert(ma != NULL);
jb = open_jam_base(ma->path);
if (!jb) { if (!jb) {
dolog("Error opening JAM base.. %s", conf.mail_conferences[conference]->mail_areas[area]->path); dolog("Error opening JAM base.. %s", ma->path);
return 0; return 0;
} }
z = JAM_ReadMsgHeader(jb, id, &jmh, &jsp); z = JAM_ReadMsgHeader(jb, id, &jmh, &jsp);
@ -312,9 +330,13 @@ int l_readMessage(lua_State *L) {
char *body = NULL; char *body = NULL;
jb = open_jam_base(conf.mail_conferences[conference]->mail_areas[area]->path); struct mail_conference *mc = ptr_vector_get(&conf.mail_conferences, conference);
assert(mc != NULL);
struct mail_area *ma = ptr_vector_get(&mc->mail_areas, area);
assert(ma != NULL);
jb = open_jam_base(ma->path);
if (!jb) { if (!jb) {
dolog("Error opening JAM base.. %s", conf.mail_conferences[conference]->mail_areas[area]->path); dolog("Error opening JAM base.. %s", ma->path);
return 0; return 0;
} }
z = JAM_ReadMsgHeader(jb, id, &jmh, NULL); z = JAM_ReadMsgHeader(jb, id, &jmh, NULL);
@ -380,10 +402,10 @@ int l_postMessage(lua_State *L) {
int confr = lua_tointeger(L, 1); int confr = lua_tointeger(L, 1);
int area = lua_tointeger(L, 2); int area = lua_tointeger(L, 2);
time_t dwritten = utc_to_local(time(NULL)); time_t dwritten = utc_to_local(time(NULL));
char *to = lua_tostring(L, 3); const char *to = lua_tostring(L, 3);
char *from = lua_tostring(L, 4); const char *from = lua_tostring(L, 4);
char *subject = lua_tostring(L, 5); const char *subject = lua_tostring(L, 5);
char *body = lua_tostring(L, 6); const char *body = lua_tostring(L, 6);
int sem_fd; int sem_fd;
char buffer[256]; char buffer[256];
@ -398,9 +420,13 @@ int l_postMessage(lua_State *L) {
char *tagline; char *tagline;
struct utsname name; struct utsname name;
jb = open_jam_base(conf.mail_conferences[confr]->mail_areas[area]->path); struct mail_conference *mc = ptr_vector_get(&conf.mail_conferences, confr);
assert(mc != NULL);
struct mail_area *ma = ptr_vector_get(&mc->mail_areas, area);
assert(ma != NULL);
jb = open_jam_base(ma->path);
if (!jb) { if (!jb) {
dolog("Error opening JAM base.. %s", conf.mail_conferences[confr]->mail_areas[area]->path); dolog("Error opening JAM base.. %s", ma->path);
return 0; return 0;
} }
@ -416,7 +442,7 @@ int l_postMessage(lua_State *L) {
jsf.Buffer = (char *)from; jsf.Buffer = (char *)from;
JAM_PutSubfield(jsp, &jsf); JAM_PutSubfield(jsp, &jsf);
if (conf.mail_conferences[confr]->mail_areas[area]->type == TYPE_NEWSGROUP_AREA) { if (ma->type == TYPE_NEWSGROUP_AREA) {
sprintf(buffer, "ALL"); sprintf(buffer, "ALL");
jsf.LoID = JAMSFLD_RECVRNAME; jsf.LoID = JAMSFLD_RECVRNAME;
jsf.HiID = 0; jsf.HiID = 0;
@ -438,18 +464,20 @@ int l_postMessage(lua_State *L) {
jsf.Buffer = (char *)subject; jsf.Buffer = (char *)subject;
JAM_PutSubfield(jsp, &jsf); JAM_PutSubfield(jsp, &jsf);
if (conf.mail_conferences[confr]->mail_areas[area]->type == TYPE_ECHOMAIL_AREA || conf.mail_conferences[confr]->mail_areas[area]->type == TYPE_NEWSGROUP_AREA) { if (ma->type == TYPE_ECHOMAIL_AREA || ma->type == TYPE_NEWSGROUP_AREA) {
jmh.Attribute |= JAM_MSG_TYPEECHO; jmh.Attribute |= JAM_MSG_TYPEECHO;
if (conf.mail_conferences[confr]->fidoaddr->point) { if (mc->fidoaddr->point) {
sprintf(buffer, "%d:%d/%d.%d", conf.mail_conferences[confr]->fidoaddr->zone, snprintf(buffer, sizeof buffer, "%d:%d/%d.%d",
conf.mail_conferences[confr]->fidoaddr->net, mc->fidoaddr->zone,
conf.mail_conferences[confr]->fidoaddr->node, mc->fidoaddr->net,
conf.mail_conferences[confr]->fidoaddr->point); mc->fidoaddr->node,
mc->fidoaddr->point);
} else { } else {
sprintf(buffer, "%d:%d/%d", conf.mail_conferences[confr]->fidoaddr->zone, snprintf(buffer, sizeof buffer, "%d:%d/%d",
conf.mail_conferences[confr]->fidoaddr->net, mc->fidoaddr->zone,
conf.mail_conferences[confr]->fidoaddr->node); mc->fidoaddr->net,
mc->fidoaddr->node);
} }
jsf.LoID = JAMSFLD_OADDRESS; jsf.LoID = JAMSFLD_OADDRESS;
jsf.HiID = 0; jsf.HiID = 0;
@ -457,11 +485,12 @@ int l_postMessage(lua_State *L) {
jsf.Buffer = (char *)buffer; jsf.Buffer = (char *)buffer;
JAM_PutSubfield(jsp, &jsf); JAM_PutSubfield(jsp, &jsf);
sprintf(buffer, "%d:%d/%d.%d %08lx", conf.mail_conferences[confr]->fidoaddr->zone, snprintf(buffer, sizeof buffer, "%d:%d/%d.%d %08lx",
conf.mail_conferences[confr]->fidoaddr->net, mc->fidoaddr->zone,
conf.mail_conferences[confr]->fidoaddr->node, mc->fidoaddr->net,
conf.mail_conferences[confr]->fidoaddr->point, mc->fidoaddr->node,
generate_msgid()); mc->fidoaddr->point,
generate_msgid());
jsf.LoID = JAMSFLD_MSGID; jsf.LoID = JAMSFLD_MSGID;
jsf.HiID = 0; jsf.HiID = 0;
@ -469,8 +498,7 @@ int l_postMessage(lua_State *L) {
jsf.Buffer = (char *)buffer; jsf.Buffer = (char *)buffer;
JAM_PutSubfield(jsp, &jsf); JAM_PutSubfield(jsp, &jsf);
jmh.MsgIdCRC = JAM_Crc32(buffer, strlen(buffer)); jmh.MsgIdCRC = JAM_Crc32(buffer, strlen(buffer));
} else if (ma->type == TYPE_NETMAIL_AREA) {
} else if (conf.mail_conferences[confr]->mail_areas[area]->type == TYPE_NETMAIL_AREA) {
JAM_DelSubPacket(jsp); JAM_DelSubPacket(jsp);
JAM_CloseMB(jb); JAM_CloseMB(jb);
free(jb); free(jb);
@ -492,30 +520,29 @@ int l_postMessage(lua_State *L) {
} }
uname(&name); uname(&name);
if (conf.mail_conferences[confr]->tagline != NULL) { tagline = conf.default_tagline;
tagline = conf.mail_conferences[confr]->tagline; if (mc != NULL) {
} else { tagline = mc->tagline;
tagline = conf.default_tagline;
} }
if (conf.mail_conferences[confr]->nettype == NETWORK_FIDO) { if (mc->nettype == NETWORK_FIDO) {
if (conf.mail_conferences[confr]->fidoaddr->point == 0) { if (mc->fidoaddr->point == 0) {
snprintf(buffer, 256, "\r--- MagickaBBS v%d.%d%s (%s/%s)\r * Origin: %s (%d:%d/%d)\r", VERSION_MAJOR, VERSION_MINOR, VERSION_STR, name.sysname, name.machine, tagline, conf.mail_conferences[confr]->fidoaddr->zone, snprintf(buffer, sizeof buffer, "\r--- MagickaBBS v%d.%d%s (%s/%s)\r * Origin: %s (%d:%d/%d)\r",
conf.mail_conferences[confr]->fidoaddr->net, VERSION_MAJOR, VERSION_MINOR, VERSION_STR, name.sysname, name.machine, tagline,
conf.mail_conferences[confr]->fidoaddr->node); mc->fidoaddr->zone, mc->fidoaddr->net, mc->fidoaddr->node);
} else { } else {
snprintf(buffer, 256, "\r--- MagickaBBS v%d.%d%s (%s/%s)\r * Origin: %s (%d:%d/%d.%d)\r", VERSION_MAJOR, VERSION_MINOR, VERSION_STR, name.sysname, name.machine, tagline, conf.mail_conferences[confr]->fidoaddr->zone, snprintf(buffer, sizeof buffer, "\r--- MagickaBBS v%d.%d%s (%s/%s)\r * Origin: %s (%d:%d/%d.%d)\r",
conf.mail_conferences[confr]->fidoaddr->net, VERSION_MAJOR, VERSION_MINOR, VERSION_STR, name.sysname, name.machine, tagline,
conf.mail_conferences[confr]->fidoaddr->node, mc->fidoaddr->zone, mc->fidoaddr->net, mc->fidoaddr->node, mc->fidoaddr->point);
conf.mail_conferences[confr]->fidoaddr->point);
} }
} else { } else {
snprintf(buffer, 256, "\r--- MagickaBBS v%d.%d%s (%s/%s)\r * Origin: %s \r", VERSION_MAJOR, VERSION_MINOR, VERSION_STR, name.sysname, name.machine, tagline); snprintf(buffer, sizeof buffer, "\r--- MagickaBBS v%d.%d%s (%s/%s)\r * Origin: %s \r",
VERSION_MAJOR, VERSION_MINOR, VERSION_STR, name.sysname, name.machine, tagline);
} }
stralloc sa = EMPTY_STRALLOC; stralloc sa = EMPTY_STRALLOC;
stralloc_ready(&sa, strlen(body) + 2 + strlen(buffer)); stralloc_ready(&sa, strlen(body) + 2 + strlen(buffer));
for (char *p = body; *p != '\0'; ++p) for (const char *p = body; *p != '\0'; ++p)
if (*p != '\n') if (*p != '\n')
stralloc_append1(&sa, *p); stralloc_append1(&sa, *p);
stralloc_cats(&sa, buffer); stralloc_cats(&sa, buffer);
@ -538,7 +565,7 @@ int l_postMessage(lua_State *L) {
free(jb); free(jb);
free(msg); free(msg);
if (conf.mail_conferences[confr]->mail_areas[area]->type == TYPE_ECHOMAIL_AREA || conf.mail_conferences[confr]->mail_areas[area]->type == TYPE_NEWSGROUP_AREA) { if (ma->type == TYPE_ECHOMAIL_AREA || ma->type == TYPE_NEWSGROUP_AREA) {
if (conf.echomail_sem != NULL) { if (conf.echomail_sem != NULL) {
sem_fd = open(conf.echomail_sem, O_RDWR | O_CREAT | O_TRUNC, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH); sem_fd = open(conf.echomail_sem, O_RDWR | O_CREAT | O_TRUNC, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
close(sem_fd); close(sem_fd);
@ -616,9 +643,9 @@ void do_lua_script(char *script) {
} }
if (script[0] == '/') { if (script[0] == '/') {
snprintf(buffer, PATH_MAX, "%s.lua", script); snprintf(buffer, sizeof buffer, "%s.lua", script);
} else { } else {
snprintf(buffer, PATH_MAX, "%s/%s.lua", conf.script_path, script); snprintf(buffer, sizeof buffer, "%s/%s.lua", conf.script_path, script);
} }
L = luaL_newstate(); L = luaL_newstate();

File diff suppressed because it is too large Load Diff

28
src/mail_utils.h Normal file
View File

@ -0,0 +1,28 @@
#include <assert.h>
#include <stddef.h>
#include "bbs.h"
static inline struct mail_conference *get_conf(size_t c) {
extern struct bbs_config conf;
struct mail_conference *mc = ptr_vector_get(&conf.mail_conferences, c);
assert(mc != NULL);
return mc;
}
static inline struct mail_conference *get_user_conf(struct user_record *user) {
assert(user != NULL);
return get_conf(user->cur_mail_conf);
}
static inline struct mail_area *get_area(size_t c, size_t a) {
struct mail_conference *mc = get_conf(c);
struct mail_area *ma = ptr_vector_get(&mc->mail_areas, a);
assert(ma != NULL);
return ma;
}
static inline struct mail_area *get_user_area(struct user_record *user) {
assert(user != NULL);
return get_area(user->cur_mail_conf, user->cur_mail_area);
}

View File

@ -83,75 +83,37 @@ void sigchld_handler(int s) {
static int protocol_config_handler(void *user, const char *section, const char *name, static int protocol_config_handler(void *user, const char *section, const char *name,
const char *value) { const char *value) {
struct bbs_config *conf = (struct bbs_config *)user; struct bbs_config *conf = (struct bbs_config *)user;
int i;
for (i = 0; i < conf->protocol_count; i++) { struct protocol *proto = NULL;
if (strcasecmp(conf->protocols[i]->name, section) == 0) { for (size_t i = 0; i < ptr_vector_len(&conf->protocols); ++i) {
// found it struct protocol *aproto = ptr_vector_get(&conf->protocols, i);
if (strcasecmp(name, "upload command") == 0) { assert(aproto != NULL);
conf->protocols[i]->upload = strdup(value); if (strcasecmp(aproto->name, section) == 0) {
} else if (strcasecmp(name, "download command") == 0) { proto = aproto;
conf->protocols[i]->download = strdup(value); break;
} else if (strcasecmp(name, "internal zmodem") == 0) {
if (strcasecmp(value, "true") == 0) {
conf->protocols[i]->internal_zmodem = 1;
} else {
conf->protocols[i]->internal_zmodem = 0;
}
} else if (strcasecmp(name, "stdio") == 0) {
if (strcasecmp(value, "true") == 0) {
conf->protocols[i]->stdio = 1;
} else {
conf->protocols[i]->stdio = 0;
}
} else if (strcasecmp(name, "upload prompt") == 0) {
if (strcasecmp(value, "true") == 0) {
conf->protocols[i]->upload_prompt = 1;
} else {
conf->protocols[i]->upload_prompt = 0;
}
}
return 1;
} }
} }
if (proto == NULL) {
if (conf->protocol_count == 0) { proto = (struct protocol *)malloz(sizeof(struct protocol));
conf->protocols = (struct protocol **)malloz(sizeof(struct protocol *)); ptr_vector_append(&conf->protocols, proto);
} else { proto->name = strdup(section);
conf->protocols = (struct protocol **)realloc(conf->protocols, sizeof(struct protocol *) * (conf->protocol_count + 1)); proto->internal_zmodem = 0;
proto->upload_prompt = 0;
proto->stdio = 0;
} }
conf->protocols[conf->protocol_count] = (struct protocol *)malloz(sizeof(struct protocol));
conf->protocols[conf->protocol_count]->name = strdup(section);
conf->protocols[conf->protocol_count]->internal_zmodem = 0;
conf->protocols[conf->protocol_count]->upload_prompt = 0;
conf->protocols[conf->protocol_count]->stdio = 0;
if (strcasecmp(name, "upload command") == 0) { if (strcasecmp(name, "upload command") == 0) {
conf->protocols[conf->protocol_count]->upload = strdup(value); free(proto->upload);
proto->upload = strdup(value);
} else if (strcasecmp(name, "download command") == 0) { } else if (strcasecmp(name, "download command") == 0) {
conf->protocols[conf->protocol_count]->download = strdup(value); free(proto->download);
proto->download = strdup(value);
} else if (strcasecmp(name, "internal zmodem") == 0) { } else if (strcasecmp(name, "internal zmodem") == 0) {
if (strcasecmp(value, "true") == 0) { proto->internal_zmodem = (strcasecmp(value, "true") == 0);
conf->protocols[conf->protocol_count]->internal_zmodem = 1;
} else {
conf->protocols[conf->protocol_count]->internal_zmodem = 0;
}
} else if (strcasecmp(name, "stdio") == 0) { } else if (strcasecmp(name, "stdio") == 0) {
if (strcasecmp(value, "true") == 0) { proto->stdio = (strcasecmp(value, "true") == 0);
conf->protocols[conf->protocol_count]->stdio = 1;
} else {
conf->protocols[conf->protocol_count]->stdio = 0;
}
} else if (strcasecmp(name, "upload prompt") == 0) { } else if (strcasecmp(name, "upload prompt") == 0) {
if (strcasecmp(value, "true") == 0) { proto->upload_prompt = (strcasecmp(value, "true") == 0);
conf->protocols[conf->protocol_count]->upload_prompt = 1;
} else {
conf->protocols[conf->protocol_count]->upload_prompt = 0;
}
} }
conf->protocol_count++;
return 1; return 1;
} }
@ -159,40 +121,31 @@ static int protocol_config_handler(void *user, const char *section, const char *
static int archiver_config_handler(void *user, const char *section, const char *name, static int archiver_config_handler(void *user, const char *section, const char *name,
const char *value) { const char *value) {
struct bbs_config *conf = (struct bbs_config *)user; struct bbs_config *conf = (struct bbs_config *)user;
int i;
for (i = 0; i < conf->archiver_count; i++) { struct archiver *arc = NULL;
if (strcasecmp(conf->archivers[i]->name, section) == 0) { for (size_t i = 0; i < ptr_vector_len(&conf->archivers); ++i) {
// found it struct archiver *anarc = ptr_vector_get(&conf->archivers, i);
if (strcasecmp(name, "extension") == 0) { if (strcasecmp(anarc->name, section) == 0) {
conf->archivers[i]->extension = strdup(value); arc = anarc; // hy in the UK.
} else if (strcasecmp(name, "unpack") == 0) { break;
conf->archivers[i]->unpack = strdup(value);
} else if (strcasecmp(name, "pack") == 0) {
conf->archivers[i]->pack = strdup(value);
}
return 1;
} }
} }
if (arc == NULL) {
arc = malloz(sizeof(struct archiver));
ptr_vector_append(&conf->archivers, arc);
if (conf->archiver_count == 0) { arc->name = strdup(section);
conf->archivers = (struct archiver **)malloz(sizeof(struct archiver *));
} else {
conf->archivers = (struct archiver **)realloc(conf->archivers, sizeof(struct archiver *) * (conf->archiver_count + 1));
} }
conf->archivers[conf->archiver_count] = (struct archiver *)malloz(sizeof(struct archiver));
conf->archivers[conf->archiver_count]->name = strdup(section);
if (strcasecmp(name, "extension") == 0) { if (strcasecmp(name, "extension") == 0) {
conf->archivers[conf->archiver_count]->extension = strdup(value); free(arc->extension);
arc->extension = strdup(value);
} else if (strcasecmp(name, "unpack") == 0) { } else if (strcasecmp(name, "unpack") == 0) {
conf->archivers[conf->archiver_count]->unpack = strdup(value); free(arc->unpack);
arc->unpack = strdup(value);
} else if (strcasecmp(name, "pack") == 0) { } else if (strcasecmp(name, "pack") == 0) {
conf->archivers[conf->archiver_count]->pack = strdup(value); free(arc->pack);
arc->pack = strdup(value);
} }
conf->archiver_count++;
return 1; return 1;
} }
@ -200,49 +153,31 @@ static int archiver_config_handler(void *user, const char *section, const char *
static int door_config_handler(void *user, const char *section, const char *name, static int door_config_handler(void *user, const char *section, const char *name,
const char *value) { const char *value) {
struct bbs_config *conf = (struct bbs_config *)user; struct bbs_config *conf = (struct bbs_config *)user;
int i;
for (i = 0; i < conf->door_count; i++) { struct door_config *door = NULL;
if (strcasecmp(conf->doors[i]->name, section) == 0) { for (size_t i = 0; i < ptr_vector_len(&conf->doors); ++i) {
// found it struct door_config *adoor = ptr_vector_get(&conf->doors, i);
if (strcasecmp(name, "command") == 0) { assert(adoor != NULL);
conf->doors[i]->command = strdup(value); if (strcasecmp(adoor->name, section) == 0) {
} else if (strcasecmp(name, "stdio") == 0) { door = adoor;
if (strcasecmp(value, "true") == 0) { break;
conf->doors[i]->stdio = 1;
} else {
conf->doors[i]->stdio = 0;
}
} else if (strcasecmp(name, "codepage") == 0) {
conf->doors[i]->codepage = strdup(value);
}
return 1;
} }
} }
if (door == NULL) {
if (conf->door_count == 0) { door = malloz(sizeof(struct door_config));
conf->doors = (struct door_config **)malloz(sizeof(struct door_config *)); ptr_vector_append(&conf->doors, door);
} else { door->name = strdup(section);
conf->doors = (struct door_config **)realloc(conf->doors, sizeof(struct door_config *) * (conf->door_count + 1)); door->codepage = NULL;
} }
conf->doors[conf->door_count] = (struct door_config *)malloz(sizeof(struct door_config));
conf->doors[conf->door_count]->name = strdup(section);
conf->doors[conf->door_count]->codepage = NULL;
if (strcasecmp(name, "command") == 0) { if (strcasecmp(name, "command") == 0) {
conf->doors[conf->door_count]->command = strdup(value); free(door->command);
door->command = strdup(value);
} else if (strcasecmp(name, "stdio") == 0) { } else if (strcasecmp(name, "stdio") == 0) {
if (strcasecmp(value, "true") == 0) { door->stdio = (strcasecmp(value, "true") == 0);
conf->doors[conf->door_count]->stdio = 1;
} else {
conf->doors[conf->door_count]->stdio = 0;
}
} else if (strcasecmp(name, "codepage") == 0) { } else if (strcasecmp(name, "codepage") == 0) {
conf->doors[conf->door_count]->codepage = strdup(value); free(door->codepage);
door->codepage = strdup(value);
} }
conf->door_count++;
return 1; return 1;
} }
@ -250,53 +185,40 @@ static int door_config_handler(void *user, const char *section, const char *name
static int file_sub_handler(void *user, const char *section, const char *name, static int file_sub_handler(void *user, const char *section, const char *name,
const char *value) { const char *value) {
struct file_directory *fd = (struct file_directory *)user; struct file_directory *fd = (struct file_directory *)user;
int i;
if (strcasecmp(section, "main") == 0) { if (strcasecmp(section, "main") == 0) {
if (strcasecmp(name, "visible sec level") == 0) { if (strcasecmp(name, "visible sec level") == 0) {
fd->sec_level = atoi(value); fd->sec_level = atoi(value);
} else if (strcasecmp(name, "visible on web") == 0) { } else if (strcasecmp(name, "visible on web") == 0) {
if (strcasecmp(value, "true") == 0) { fd->display_on_web = (strcasecmp(value, "true") == 0);
fd->display_on_web = 1;
} else {
fd->display_on_web = 0;
}
} }
} else { return 1;
// check if it's partially filled in }
for (i = 0; i < fd->file_sub_count; i++) { // check if it's partially filled in
if (strcasecmp(fd->file_subs[i]->name, section) == 0) { struct file_sub *sub = NULL;
if (strcasecmp(name, "upload sec level") == 0) { for (size_t i = 0; i < ptr_vector_len(&fd->file_subs); ++i) {
fd->file_subs[i]->upload_sec_level = atoi(value); struct file_sub *asub = ptr_vector_get(&fd->file_subs, i);
} else if (strcasecmp(name, "download sec level") == 0) { assert(asub != NULL);
fd->file_subs[i]->download_sec_level = atoi(value); if (strcasecmp(asub->name, section) == 0) {
} else if (strcasecmp(name, "database") == 0) { sub = asub;
fd->file_subs[i]->database = strdup(value); break;
} else if (strcasecmp(name, "upload path") == 0) {
fd->file_subs[i]->upload_path = strdup(value);
}
return 1;
}
} }
if (fd->file_sub_count == 0) { }
fd->file_subs = (struct file_sub **)malloz(sizeof(struct file_sub *)); if (sub == NULL) {
} else { sub = (struct file_sub *)malloz(sizeof(struct file_sub));
fd->file_subs = (struct file_sub **)realloc(fd->file_subs, sizeof(struct file_sub *) * (fd->file_sub_count + 1)); ptr_vector_append(&fd->file_subs, sub);
} sub->name = strdup(section);
}
fd->file_subs[fd->file_sub_count] = (struct file_sub *)malloz(sizeof(struct file_sub)); if (strcasecmp(name, "upload sec level") == 0) {
sub->upload_sec_level = atoi(value);
fd->file_subs[fd->file_sub_count]->name = strdup(section); } else if (strcasecmp(name, "download sec level") == 0) {
if (strcasecmp(name, "upload sec level") == 0) { sub->download_sec_level = atoi(value);
fd->file_subs[fd->file_sub_count]->upload_sec_level = atoi(value); } else if (strcasecmp(name, "database") == 0) {
} else if (strcasecmp(name, "download sec level") == 0) { free(sub->database);
fd->file_subs[fd->file_sub_count]->download_sec_level = atoi(value); sub->database = strdup(value);
} else if (strcasecmp(name, "database") == 0) { } else if (strcasecmp(name, "upload path") == 0) {
fd->file_subs[fd->file_sub_count]->database = strdup(value); free(sub->upload_path);
} else if (strcasecmp(name, "upload path") == 0) { sub->upload_path = strdup(value);
fd->file_subs[fd->file_sub_count]->upload_path = strdup(value);
}
fd->file_sub_count++;
} }
return 1; return 1;
} }
@ -304,26 +226,19 @@ static int file_sub_handler(void *user, const char *section, const char *name,
static int mail_area_handler(void *user, const char *section, const char *name, static int mail_area_handler(void *user, const char *section, const char *name,
const char *value) { const char *value) {
struct mail_conference *mc = (struct mail_conference *)user; struct mail_conference *mc = (struct mail_conference *)user;
int i;
if (strcasecmp(section, "main") == 0) { if (strcasecmp(section, "main") == 0) {
if (strcasecmp(name, "visible sec level") == 0) { if (strcasecmp(name, "visible sec level") == 0) {
mc->sec_level = atoi(value); mc->sec_level = atoi(value);
} else if (strcasecmp(name, "networked") == 0) { } else if (strcasecmp(name, "networked") == 0) {
if (strcasecmp(value, "true") == 0) { mc->networked = (strcasecmp(value, "true") == 0);
mc->networked = 1;
} else {
mc->networked = 0;
}
} else if (strcasecmp(name, "real names") == 0) { } else if (strcasecmp(name, "real names") == 0) {
if (strcasecmp(value, "true") == 0) { mc->realnames = (strcasecmp(value, "true") == 0);
mc->realnames = 1;
} else {
mc->realnames = 0;
}
} else if (strcasecmp(name, "tagline") == 0) { } else if (strcasecmp(name, "tagline") == 0) {
free(mc->tagline);
mc->tagline = strdup(value); mc->tagline = strdup(value);
} else if (strcasecmp(name, "header") == 0) { } else if (strcasecmp(name, "header") == 0) {
free(mc->header);
mc->header = strdup(value); mc->header = strdup(value);
} }
} else if (strcasecmp(section, "network") == 0) { } else if (strcasecmp(section, "network") == 0) {
@ -338,74 +253,48 @@ static int mail_area_handler(void *user, const char *section, const char *name,
} else if (strcasecmp(name, "fido node") == 0) { } else if (strcasecmp(name, "fido node") == 0) {
mc->fidoaddr = parse_fido_addr(value); mc->fidoaddr = parse_fido_addr(value);
} else if (strcasecmp(name, "domain") == 0) { } else if (strcasecmp(name, "domain") == 0) {
free(mc->domain);
mc->domain = strdup(value); mc->domain = strdup(value);
} else if (strcasecmp(name, "magi node") == 0) { } else if (strcasecmp(name, "magi node") == 0) {
mc->maginode = atoi(value); mc->maginode = atoi(value);
} }
} else { } else {
// check if it's partially filled in // check if it's partially filled in
for (i = 0; i < mc->mail_area_count; i++) { struct mail_area *area = NULL;
if (strcasecmp(mc->mail_areas[i]->name, section) == 0) { for (size_t i = 0; i < ptr_vector_len(&mc->mail_areas); ++i) {
if (strcasecmp(name, "read sec level") == 0) { struct mail_area *anarea = ptr_vector_get(&mc->mail_areas, i);
mc->mail_areas[i]->read_sec_level = atoi(value); if (strcasecmp(anarea->name, section) == 0) {
} else if (strcasecmp(name, "write sec level") == 0) { area = anarea;
mc->mail_areas[i]->write_sec_level = atoi(value); break;
} else if (strcasecmp(name, "path") == 0) {
mc->mail_areas[i]->path = strdup(value);
} else if (strcasecmp(name, "type") == 0) {
if (strcasecmp(value, "local") == 0) {
mc->mail_areas[i]->type = TYPE_LOCAL_AREA;
} else if (strcasecmp(value, "echo") == 0) {
mc->mail_areas[i]->type = TYPE_ECHOMAIL_AREA;
} else if (strcasecmp(value, "netmail") == 0) {
mc->mail_areas[i]->type = TYPE_NETMAIL_AREA;
} else if (strcasecmp(value, "newsgroup") == 0) {
mc->mail_areas[i]->type = TYPE_NEWSGROUP_AREA;
}
} else if (strcasecmp(name, "qwk name") == 0) {
mc->mail_areas[i]->qwkname = strdup(value);
if (strlen(mc->mail_areas[i]->qwkname) > 8) {
mc->mail_areas[i]->qwkname[8] = '\0';
}
}
return 1;
} }
} }
if (mc->mail_area_count == 0) { if (area == NULL) {
mc->mail_areas = (struct mail_area **)malloz(sizeof(struct mail_area *)); area = (struct mail_area *)malloz(sizeof(struct mail_area));
} else { ptr_vector_append(&mc->mail_areas, area);
mc->mail_areas = (struct mail_area **)realloc(mc->mail_areas, sizeof(struct mail_area *) * (mc->mail_area_count + 1)); area->qwkname = NULL;
area->name = strdup(section);
} }
mc->mail_areas[mc->mail_area_count] = (struct mail_area *)malloz(sizeof(struct mail_area));
mc->mail_areas[mc->mail_area_count]->qwkname = NULL;
mc->mail_areas[mc->mail_area_count]->name = strdup(section);
if (strcasecmp(name, "read sec level") == 0) { if (strcasecmp(name, "read sec level") == 0) {
mc->mail_areas[mc->mail_area_count]->read_sec_level = atoi(value); area->read_sec_level = atoi(value);
} else if (strcasecmp(name, "write sec level") == 0) { } else if (strcasecmp(name, "write sec level") == 0) {
mc->mail_areas[mc->mail_area_count]->write_sec_level = atoi(value); area->write_sec_level = atoi(value);
} else if (strcasecmp(name, "path") == 0) { } else if (strcasecmp(name, "path") == 0) {
mc->mail_areas[mc->mail_area_count]->path = strdup(value); area->path = strdup(value);
} else if (strcasecmp(name, "type") == 0) { } else if (strcasecmp(name, "type") == 0) {
if (strcasecmp(value, "local") == 0) { if (strcasecmp(value, "local") == 0) {
mc->mail_areas[mc->mail_area_count]->type = TYPE_LOCAL_AREA; area->type = TYPE_LOCAL_AREA;
} else if (strcasecmp(value, "echo") == 0) { } else if (strcasecmp(value, "echo") == 0) {
mc->mail_areas[mc->mail_area_count]->type = TYPE_ECHOMAIL_AREA; area->type = TYPE_ECHOMAIL_AREA;
} else if (strcasecmp(value, "netmail") == 0) { } else if (strcasecmp(value, "netmail") == 0) {
mc->mail_areas[mc->mail_area_count]->type = TYPE_NETMAIL_AREA; area->type = TYPE_NETMAIL_AREA;
} else if (strcasecmp(value, "newsgroup") == 0) { } else if (strcasecmp(value, "newsgroup") == 0) {
mc->mail_areas[mc->mail_area_count]->type = TYPE_NEWSGROUP_AREA; area->type = TYPE_NEWSGROUP_AREA;
} }
} else if (strcasecmp(name, "qwk name") == 0) { } else if (strcasecmp(name, "qwk name") == 0) {
mc->mail_areas[mc->mail_area_count]->qwkname = strdup(value); area->qwkname = strndup(value, 8);
if (strlen(mc->mail_areas[mc->mail_area_count]->qwkname) > 8) {
mc->mail_areas[mc->mail_area_count]->qwkname[8] = '\0';
}
} }
mc->mail_area_count++;
} }
return 1; return 1;
} }
@ -564,45 +453,27 @@ static int handler(void *user, const char *section, const char *name,
conf->menu_path = strdup(value); conf->menu_path = strdup(value);
} }
} else if (strcasecmp(section, "mail conferences") == 0) { } else if (strcasecmp(section, "mail conferences") == 0) {
if (conf->mail_conference_count == 0) { struct mail_conference *conference = malloz(sizeof(struct mail_conference));
conf->mail_conferences = (struct mail_conference **)malloz(sizeof(struct mail_conference *)); conference->name = strdup(name);
} else { conference->path = strdup(value);
conf->mail_conferences = (struct mail_conference **)realloc(conf->mail_conferences, sizeof(struct mail_conference *) * (conf->mail_conference_count + 1)); conference->tagline = NULL;
} init_ptr_vector(&conference->mail_areas);
conference->nettype = 0;
conf->mail_conferences[conf->mail_conference_count] = (struct mail_conference *)malloz(sizeof(struct mail_conference)); conference->domain = NULL;
conf->mail_conferences[conf->mail_conference_count]->name = strdup(name); conference->header = NULL;
conf->mail_conferences[conf->mail_conference_count]->path = strdup(value); ptr_vector_append(&conf->mail_conferences, conference);
conf->mail_conferences[conf->mail_conference_count]->tagline = NULL;
conf->mail_conferences[conf->mail_conference_count]->mail_area_count = 0;
conf->mail_conferences[conf->mail_conference_count]->nettype = 0;
conf->mail_conferences[conf->mail_conference_count]->domain = NULL;
conf->mail_conferences[conf->mail_conference_count]->header = NULL;
conf->mail_conference_count++;
} else if (strcasecmp(section, "file directories") == 0) { } else if (strcasecmp(section, "file directories") == 0) {
if (conf->file_directory_count == 0) { struct file_directory *dir = malloz(sizeof(struct file_directory));
conf->file_directories = (struct file_directory **)malloz(sizeof(struct file_directory *)); dir->name = strdup(name);
} else { dir->path = strdup(value);
conf->file_directories = (struct file_directory **)realloc(conf->file_directories, sizeof(struct file_directory *) * (conf->file_directory_count + 1)); init_ptr_vector(&dir->file_subs);
} dir->display_on_web = 0;
ptr_vector_append(&conf->file_directories, dir);
conf->file_directories[conf->file_directory_count] = (struct file_directory *)malloz(sizeof(struct file_directory));
conf->file_directories[conf->file_directory_count]->name = strdup(name);
conf->file_directories[conf->file_directory_count]->path = strdup(value);
conf->file_directories[conf->file_directory_count]->file_sub_count = 0;
conf->file_directories[conf->file_directory_count]->display_on_web = 0;
conf->file_directory_count++;
} else if (strcasecmp(section, "text files") == 0) { } else if (strcasecmp(section, "text files") == 0) {
if (conf->text_file_count == 0) { struct text_file *file = malloz(sizeof(struct text_file));
conf->text_files = (struct text_file **)malloz(sizeof(struct text_file *)); file->name = strdup(name);
} else { file->path = strdup(value);
conf->text_files = (struct text_file **)realloc(conf->text_files, sizeof(struct text_file *) * (conf->text_file_count + 1)); ptr_vector_append(&conf->text_files, file);
}
conf->text_files[conf->text_file_count] = (struct text_file *)malloz(sizeof(struct text_file));
conf->text_files[conf->text_file_count]->name = strdup(name);
conf->text_files[conf->text_file_count]->path = strdup(value);
conf->text_file_count++;
} }
return 1; return 1;
@ -1268,13 +1139,13 @@ int main(int argc, char **argv) {
exit(1); exit(1);
} }
conf.mail_conference_count = 0; init_ptr_vector(&conf.mail_conferences);
conf.door_count = 0; init_ptr_vector(&conf.doors);
conf.file_directory_count = 0; init_ptr_vector(&conf.file_directories);
conf.mgchat_server = NULL; conf.mgchat_server = NULL;
conf.mgchat_port = 2025; conf.mgchat_port = 2025;
conf.mgchat_bbstag = NULL; conf.mgchat_bbstag = NULL;
conf.text_file_count = 0; init_ptr_vector(&conf.text_files);
conf.external_editor_cmd = NULL; conf.external_editor_cmd = NULL;
conf.external_editor_codepage = NULL; conf.external_editor_codepage = NULL;
conf.log_path = NULL; conf.log_path = NULL;
@ -1286,7 +1157,7 @@ int main(int argc, char **argv) {
conf.string_file = NULL; conf.string_file = NULL;
conf.www_path = NULL; conf.www_path = NULL;
conf.www_url = NULL; conf.www_url = NULL;
conf.archiver_count = 0; init_ptr_vector(&conf.archivers);
conf.broadcast_enable = 0; conf.broadcast_enable = 0;
conf.broadcast_port = 0; conf.broadcast_port = 0;
conf.broadcast_address = NULL; conf.broadcast_address = NULL;
@ -1297,12 +1168,13 @@ int main(int argc, char **argv) {
conf.ipguard_enable = 0; conf.ipguard_enable = 0;
conf.ipguard_tries = 4; conf.ipguard_tries = 4;
conf.ipguard_timeout = 120; conf.ipguard_timeout = 120;
conf.protocol_count = 0; init_ptr_vector(&conf.protocols);
conf.codepage = 0; conf.codepage = 0;
conf.date_style = 0; conf.date_style = 0;
conf.ipv6 = 0; conf.ipv6 = 0;
conf.uid = getuid(); conf.uid = getuid();
conf.gid = getgid(); conf.gid = getgid();
// Load BBS data // Load BBS data
if (ini_parse(argv[1], handler, &conf) < 0) { if (ini_parse(argv[1], handler, &conf) < 0) {
fprintf(stderr, "Unable to load configuration ini (%s)!\n", argv[1]); fprintf(stderr, "Unable to load configuration ini (%s)!\n", argv[1]);
@ -1320,22 +1192,24 @@ int main(int argc, char **argv) {
} }
// Load mail Areas // Load mail Areas
for (i = 0; i < conf.mail_conference_count; i++) { for (i = 0; i < ptr_vector_len(&conf.mail_conferences); i++) {
if (ini_parse(conf.mail_conferences[i]->path, mail_area_handler, conf.mail_conferences[i]) < 0) { struct mail_conference *conference = ptr_vector_get(&conf.mail_conferences, i);
fprintf(stderr, "Unable to load configuration ini (%s)!\n", conf.mail_conferences[i]->path); if (ini_parse(conference->path, mail_area_handler, conference) < 0) {
fprintf(stderr, "Unable to load configuration ini (%s)!\n", conference->path);
exit(-1); exit(-1);
} }
} }
// Load file Subs // Load file Subs
for (i = 0; i < conf.file_directory_count; i++) { for (i = 0; i < ptr_vector_len(&conf.file_directories); i++) {
if (ini_parse(conf.file_directories[i]->path, file_sub_handler, conf.file_directories[i]) < 0) { struct file_directory *dir = ptr_vector_get(&conf.file_directories, i);
fprintf(stderr, "Unable to load configuration ini (%s)!\n", conf.file_directories[i]->path); if (ini_parse(dir->path, file_sub_handler, dir) < 0) {
fprintf(stderr, "Unable to load configuration ini (%s)!\n", dir->path);
exit(-1); exit(-1);
} }
} }
snprintf(buffer, 1024, "%s/doors.ini", conf.config_path); snprintf(buffer, 1024, "%s/doors.ini", conf.config_path);
if (ini_parse(buffer, door_config_handler, &conf) < 0) { if (ini_parse(buffer, door_config_handler, &conf) < 0) {
fprintf(stderr, "Unable to load configuration ini (doors.ini)!\n"); fprintf(stderr, "Unable to load configuration ini (doors.ini)!\n");
exit(-1); exit(-1);

View File

@ -93,7 +93,7 @@ void display_textfiles() {
int selected = 0; int selected = 0;
char c; char c;
if (conf.text_file_count == 0) { if (ptr_vector_len(&conf.text_files) == 0) {
s_printf("\e[2J\e[1;1H"); s_printf("\e[2J\e[1;1H");
s_printf(get_string(148)); s_printf(get_string(148));
s_printf(get_string(185)); s_printf(get_string(185));
@ -107,12 +107,9 @@ void display_textfiles() {
s_printf("\e[2J\e[1;1H"); s_printf("\e[2J\e[1;1H");
s_printf(get_string(143)); s_printf(get_string(143));
s_printf(get_string(144)); s_printf(get_string(144));
for (i = start; i < start + 22 && i < conf.text_file_count; i++) { for (size_t i = start; i < start + 22 && i < ptr_vector_len(&conf.text_files); i++) {
if (i == selected) { struct text_file *file = ptr_vector_get(&conf.text_files, i);
s_printf(get_string(249), i - start + 2, i, conf.text_files[i]->name); s_printf(get_string(i == selected ? 249 : 250), i - start + 2, i, file->name);
} else {
s_printf(get_string(250), i - start + 2, i, conf.text_files[i]->name);
}
} }
s_printf("\e[%d;5H", selected - start + 2); s_printf("\e[%d;5H", selected - start + 2);
redraw = 0; redraw = 0;
@ -128,18 +125,22 @@ void display_textfiles() {
// down // down
if (selected + 1 >= start + 22) { if (selected + 1 >= start + 22) {
start += 22; start += 22;
if (start >= conf.text_file_count) { if (start >= ptr_vector_len(&conf.text_files)) {
start = conf.text_file_count - 22; start = ptr_vector_len(&conf.text_files) - 22;
} }
redraw = 1; redraw = 1;
} }
selected++; selected++;
if (selected >= conf.text_file_count) { if (selected >= ptr_vector_len(&conf.text_files)) {
selected = conf.text_file_count - 1; selected = ptr_vector_len(&conf.text_files) - 1;
} else { } else {
if (!redraw) { if (!redraw) {
s_printf(get_string(250), selected - start + 1, selected - 1, conf.text_files[selected - 1]->name); struct text_file *prev_file = ptr_vector_get(&conf.text_files, selected - 1);
s_printf(get_string(249), selected - start + 2, selected, conf.text_files[selected]->name); struct text_file *file = ptr_vector_get(&conf.text_files, selected);
assert(prev_file != NULL);
assert(file != NULL);
s_printf(get_string(250), selected - start + 1, selected - 1, prev_file->name);
s_printf(get_string(249), selected - start + 2, selected, file->name);
s_printf("\e[%d;5H", selected - start + 2); s_printf("\e[%d;5H", selected - start + 2);
} }
} }
@ -157,15 +158,17 @@ void display_textfiles() {
selected = 0; selected = 0;
} else { } else {
if (!redraw) { if (!redraw) {
s_printf(get_string(249), selected - start + 2, selected, conf.text_files[selected]->name); struct text_file *file = ptr_vector_get(&conf.text_files, selected);
s_printf(get_string(250), selected - start + 3, selected + 1, conf.text_files[selected + 1]->name); struct text_file *next_file = ptr_vector_get(&conf.text_files, selected + 1);
s_printf(get_string(249), selected - start + 2, selected, file->name);
s_printf(get_string(250), selected - start + 3, selected + 1, next_file->name);
s_printf("\e[%d;5H", selected - start + 2); s_printf("\e[%d;5H", selected - start + 2);
} }
} }
} else if (c == 75) { } else if (c == 75) {
// END KEY // END KEY
selected = conf.text_file_count - 1; selected = ptr_vector_len(&conf.text_files) - 1;
start = conf.text_file_count - 22; start = selected - 21;
if (start < 0) { if (start < 0) {
start = 0; start = 0;
} }
@ -192,16 +195,18 @@ void display_textfiles() {
} }
// PAGE DOWN // PAGE DOWN
selected = selected + 22; selected = selected + 22;
if (selected >= conf.text_file_count) { if (selected >= ptr_vector_len(&conf.text_files)) {
selected = conf.text_file_count - 1; selected = ptr_vector_len(&conf.text_files) - 1;
} }
start = selected; start = selected;
redraw = 1; redraw = 1;
} }
} }
} else if (c == 13) { } else if (c == 13) {
struct text_file *file = ptr_vector_get(&conf.text_files, selected);
assert(file != NULL);
s_printf("\e[2J\e[1;1H"); s_printf("\e[2J\e[1;1H");
s_displayansi_p(conf.text_files[selected]->path); s_displayansi_p(file->path);
s_printf(get_string(185)); s_printf(get_string(185));
s_getc(); s_getc();
s_printf("\r\n"); s_printf("\r\n");

View File

@ -3,11 +3,13 @@
#include <stdlib.h> #include <stdlib.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
#include "bbs.h"
#include "lua/lua.h" #include "lua/lua.h"
#include "lua/lualib.h" #include "lua/lualib.h"
#include "lua/lauxlib.h" #include "lua/lauxlib.h"
#include "bbs.h"
#define MENU_SUBMENU 1 #define MENU_SUBMENU 1
#define MENU_LOGOFF 2 #define MENU_LOGOFF 2
#define MENU_PREVMENU 3 #define MENU_PREVMENU 3
@ -382,12 +384,13 @@ int menu_system(char *menufile) {
settings_menu(gUser); settings_menu(gUser);
break; break;
case MENU_DOOR: { case MENU_DOOR: {
for (m = 0; m < conf.door_count; m++) { for (m = 0; m < ptr_vector_len(&conf.doors); m++) {
if (strcasecmp(cmd->data, conf.doors[m]->name) == 0) { struct door_config *door = ptr_vector_get(&conf.doors, m);
dolog("%s launched door %s, on node %d", gUser->loginname, conf.doors[m]->name, mynode); if (strcasecmp(cmd->data, door->name) == 0) {
broadcast("USER: %s; NODE:%d; STATUS: Executing Door %s.", gUser->loginname, mynode, conf.doors[m]->name); dolog("%s launched door %s, on node %d", gUser->loginname, door->name, mynode);
rundoor(gUser, conf.doors[m]->command, conf.doors[m]->stdio, conf.doors[m]->codepage); broadcast("USER: %s; NODE:%d; STATUS: Executing Door %s.", gUser->loginname, mynode, door->name);
dolog("%s returned from door %s, on node %d", gUser->loginname, conf.doors[m]->name, mynode); rundoor(gUser, door->command, door->stdio, door->codepage);
dolog("%s returned from door %s, on node %d", gUser->loginname, door->name, mynode);
break; break;
} }
} }
@ -452,14 +455,19 @@ int menu_system(char *menufile) {
broadcast("USER: %s; NODE:%d; STATUS: Browsing Files.", gUser->loginname, mynode); broadcast("USER: %s; NODE:%d; STATUS: Browsing Files.", gUser->loginname, mynode);
list_files(gUser); list_files(gUser);
break; break;
case MENU_UPLOAD: case MENU_UPLOAD: {
if (gUser->sec_level >= conf.file_directories[gUser->cur_file_dir]->file_subs[gUser->cur_file_sub]->upload_sec_level) { struct file_directory *dir = ptr_vector_get(&conf.file_directories, gUser->cur_file_dir);
assert(dir != NULL);
struct file_sub *sub = ptr_vector_get(&dir->file_subs, gUser->cur_file_sub);
assert(sub != NULL);
if (gUser->sec_level >= sub->upload_sec_level) {
broadcast("USER: %s; NODE:%d; STATUS: Uploading a File.", gUser->loginname, mynode); broadcast("USER: %s; NODE:%d; STATUS: Uploading a File.", gUser->loginname, mynode);
upload(gUser); upload(gUser);
} else { } else {
s_printf(get_string(84)); s_printf(get_string(84));
} }
break; break;
}
case MENU_DOWNLOAD: case MENU_DOWNLOAD:
broadcast("USER: %s; NODE:%d; STATUS: Downloading Files.", gUser->loginname, mynode); broadcast("USER: %s; NODE:%d; STATUS: Downloading Files.", gUser->loginname, mynode);
download(gUser); download(gUser);

View File

@ -93,7 +93,9 @@ void nl_browser() {
return; return;
} }
sqlite3_bind_text(res, 1, conf.mail_conferences[gUser->cur_mail_conf]->domain, -1, 0); struct mail_conference *mc = ptr_vector_get(&conf.mail_conferences, gUser->cur_mail_conf);
assert(mc != NULL);
sqlite3_bind_text(res, 1, mc->domain, -1, 0);
init_ptr_vector(&vec); init_ptr_vector(&vec);
while (sqlite3_step(res) == SQLITE_ROW) { while (sqlite3_step(res) == SQLITE_ROW) {

View File

@ -16,12 +16,14 @@ void settings_menu(struct user_record *user) {
char *sig; char *sig;
while (!dosettings) { while (!dosettings) {
struct archiver *arc = ptr_vector_get(&conf.archivers, user->defarchiver - 1);
struct protocol *proto = ptr_vector_get(&conf.protocols, user->defprotocol - 1);
s_printf(get_string(149)); s_printf(get_string(149));
s_printf(get_string(150)); s_printf(get_string(150));
s_printf(get_string(151)); s_printf(get_string(151));
s_printf(get_string(152), user->location); s_printf(get_string(152), user->location);
s_printf(get_string(205), conf.archivers[user->defarchiver - 1]->name); s_printf(get_string(205), arc->name);
s_printf(get_string(213), conf.protocols[user->defprotocol - 1]->name); s_printf(get_string(213), proto->name);
s_printf(get_string(215), (user->nodemsgs ? "TRUE" : "FALSE")); s_printf(get_string(215), (user->nodemsgs ? "TRUE" : "FALSE"));
s_printf(get_string(221), (user->codepage ? "UTF-8" : "CP437")); s_printf(get_string(221), (user->codepage ? "UTF-8" : "CP437"));
switch (user->exteditor) { switch (user->exteditor) {
@ -84,15 +86,16 @@ void settings_menu(struct user_record *user) {
case 'a': { case 'a': {
s_printf(get_string(206)); s_printf(get_string(206));
for (i = 0; i < conf.archiver_count; i++) { for (i = 0; i < ptr_vector_len(&conf.archivers); i++) {
s_printf(get_string(207), i + 1, conf.archivers[i]->name); struct archiver *arc = ptr_vector_get(&conf.archivers, i);
s_printf(get_string(207), i + 1, arc->name);
} }
s_printf(get_string(208)); s_printf(get_string(208));
s_readstring(buffer, 5); s_readstring(buffer, 5);
new_arc = atoi(buffer); new_arc = atoi(buffer);
if (new_arc - 1 < 0 || new_arc > conf.archiver_count) { if (new_arc - 1 < 0 || new_arc > ptr_vector_len(&conf.archivers)) {
break; break;
} else { } else {
user->defarchiver = new_arc; user->defarchiver = new_arc;
@ -103,15 +106,16 @@ void settings_menu(struct user_record *user) {
case 'o': { case 'o': {
s_printf(get_string(212)); s_printf(get_string(212));
for (i = 0; i < conf.protocol_count; i++) { for (i = 0; i < ptr_vector_len(&conf.protocols); i++) {
s_printf(get_string(207), i + 1, conf.protocols[i]->name); struct protocol *proto = ptr_vector_get(&conf.protocols, i);
s_printf(get_string(207), i + 1, proto->name);
} }
s_printf(get_string(208)); s_printf(get_string(208));
s_readstring(buffer, 5); s_readstring(buffer, 5);
new_arc = atoi(buffer); new_arc = atoi(buffer);
if (new_arc - 1 < 0 || new_arc > conf.protocol_count) { if (new_arc - 1 < 0 || new_arc > ptr_vector_len(&conf.protocols)) {
break; break;
} else { } else {
user->defprotocol = new_arc; user->defprotocol = new_arc;

View File

@ -486,16 +486,20 @@ struct user_record *check_user_pass(char *loginname, char *password) {
dolog("Unable to load sec Level ini (%s)!", pathbuf); dolog("Unable to load sec Level ini (%s)!", pathbuf);
exit(-1); exit(-1);
} }
if (user->cur_mail_conf >= conf.mail_conference_count) { if (user->cur_mail_conf >= ptr_vector_len(&conf.mail_conferences)) {
user->cur_mail_conf = 0; user->cur_mail_conf = 0;
} }
if (user->cur_file_dir >= conf.file_directory_count) { if (user->cur_file_dir >= ptr_vector_len(&conf.file_directories)) {
user->cur_file_dir = 0; user->cur_file_dir = 0;
} }
if (user->cur_mail_area >= conf.mail_conferences[user->cur_mail_conf]->mail_area_count) { struct mail_conference *mc = ptr_vector_get(&conf.mail_conferences, user->cur_mail_conf);
assert(mc != NULL);
if (user->cur_mail_area >= ptr_vector_len(&mc->mail_areas)) {
user->cur_mail_area = 0; user->cur_mail_area = 0;
} }
if (user->cur_file_sub >= conf.file_directories[user->cur_file_dir]->file_sub_count) { struct file_directory *dir = ptr_vector_get(&conf.file_directories, user->cur_file_dir);
assert(dir != NULL);
if (user->cur_file_sub >= ptr_vector_len(&dir->file_subs)) {
user->cur_file_sub = 0; user->cur_file_sub = 0;
} }

View File

@ -789,14 +789,17 @@ int www_handler(void *cls, struct MHD_Connection *connection, const char *url, c
free(url_copy); free(url_copy);
if (file_dir != -1 && file_sub != -1 && filen == NULL) { if (file_dir != -1 && file_sub != -1 && filen == NULL) {
if (file_dir >= 0 && file_dir < conf.file_directory_count && file_sub >= 0 && file_sub < conf.file_directories[file_dir]->file_sub_count) { if (file_dir >= 0 && file_dir < ptr_vector_len(&conf.file_directories)) {
if (conf.file_directories[file_dir]->display_on_web) { struct file_directory *dir = ptr_vector_get(&conf.file_directories, file_dir);
assert(dir != NULL);
if (dir->display_on_web && file_sub >= 0 && file_sub < ptr_vector_len(&dir->file_subs)) {
page = www_files_display_listing(file_dir, file_sub); page = www_files_display_listing(file_dir, file_sub);
} }
} }
} else if (file_dir != -1 && file_sub != -1 && filen != NULL) { } else if (file_dir != -1 && file_sub != -1 && filen != NULL) {
if (file_dir >= 0 && file_dir < conf.file_directory_count && file_sub >= 0 && file_sub < conf.file_directories[file_dir]->file_sub_count) { if (file_dir >= 0 && file_dir < ptr_vector_len(&conf.file_directories)) {
if (conf.file_directories[file_dir]->display_on_web) { struct file_directory *dir = ptr_vector_get(&conf.file_directories, file_dir);
if (dir->display_on_web && file_sub >= 0 && file_sub < ptr_vector_len(&dir->file_subs)) {
// send file // send file
filename = www_files_get_from_area(file_dir, file_sub, filen); filename = www_files_get_from_area(file_dir, file_sub, filen);
free(filen); free(filen);

View File

@ -4,9 +4,11 @@
#include <time.h> #include <time.h>
#include <sqlite3.h> #include <sqlite3.h>
#include <libgen.h> #include <libgen.h>
#include "bbs.h"
#include "../deps/hashids/hashids.h" #include "../deps/hashids/hashids.h"
#include "bbs.h"
extern struct bbs_config conf; extern struct bbs_config conf;
extern struct user_record *gUser; extern struct user_record *gUser;
extern char *aha(char *input); extern char *aha(char *input);
@ -222,12 +224,17 @@ char *www_decode_hash(char *hash) {
sub = (int)numbers[2]; sub = (int)numbers[2];
fid = (int)numbers[3]; fid = (int)numbers[3];
if (dir >= conf.file_directory_count || sub >= conf.file_directories[dir]->file_sub_count) { if (dir >= ptr_vector_len(&conf.file_directories))
return NULL; return NULL;
} struct file_directory *fdir = ptr_vector_get(&conf.file_directories, dir);
assert(fdir != NULL);
if (sub >= ptr_vector_len(&fdir->file_subs))
return NULL;
struct file_sub *fsub = ptr_vector_get(&fdir->file_subs, sub);
assert(fsub != NULL);
// get filename from database // get filename from database
snprintf(pathbuf, PATH_MAX, "%s/%s.sq3", conf.bbs_path, conf.file_directories[dir]->file_subs[sub]->database); snprintf(pathbuf, sizeof pathbuf, "%s/%s.sq3", conf.bbs_path, fsub->database);
rc = sqlite3_open(pathbuf, &db); rc = sqlite3_open(pathbuf, &db);
if (rc != SQLITE_OK) { if (rc != SQLITE_OK) {
return NULL; return NULL;
@ -260,11 +267,13 @@ char *www_create_link(int dir, int sub, int fid) {
hashids_t *hashids = hashids_init(conf.bbs_name); hashids_t *hashids = hashids_init(conf.bbs_name);
sizereq = hashids_estimate_encoded_size_v(hashids, 4, (unsigned long long)gUser->id, (unsigned long long)dir, (unsigned long long)sub, (unsigned long long)fid); sizereq = hashids_estimate_encoded_size_v(hashids, 4, (unsigned long long)gUser->id,
(unsigned long long)dir, (unsigned long long)sub, (unsigned long long)fid);
hashid = (char *)malloz(sizereq + 1); hashid = (char *)malloz(sizereq + 1);
if (hashids_encode_v(hashids, hashid, 4, (unsigned long long)gUser->id, (unsigned long long)dir, (unsigned long long)sub, (unsigned long long)fid) == 0) { if (hashids_encode_v(hashids, hashid, 4, (unsigned long long)gUser->id,
(unsigned long long)dir, (unsigned long long)sub, (unsigned long long)fid) == 0) {
hashids_free(hashids); hashids_free(hashids);
free(hashid); free(hashid);
return NULL; return NULL;
@ -272,7 +281,7 @@ char *www_create_link(int dir, int sub, int fid) {
hashids_free(hashids); hashids_free(hashids);
snprintf(url, PATH_MAX, "%sfiles/%s", conf.www_url, hashid); snprintf(url, sizeof url, "%sfiles/%s", conf.www_url, hashid);
// add link into hash database // add link into hash database
expiry = time(NULL) + 86400; expiry = time(NULL) + 86400;
@ -285,28 +294,31 @@ char *www_create_link(int dir, int sub, int fid) {
return ret; return ret;
} }
char *www_files_display_listing(int dir, int sub) { char *www_files_display_listing(int dir, int sub) {
static const char *sql = "select id, filename, description, size, dlcount, uploaddate from files where approved=1 ORDER BY filename";
stralloc page = EMPTY_STRALLOC; stralloc page = EMPTY_STRALLOC;
char pathbuf[PATH_MAX]; char pathbuf[PATH_MAX];
char *sql = "select id, filename, description, size, dlcount, uploaddate from files where approved=1 ORDER BY filename"; char *aha_out = NULL;
char *filename; sqlite3 *db = NULL;
char c; sqlite3_stmt *res = NULL;
int size; int rc = 0;
char *aha_out;
char *description; if (dir >= ptr_vector_len(&conf.file_directories))
sqlite3 *db; return NULL;
sqlite3_stmt *res; struct file_directory *fdir = ptr_vector_get(&conf.file_directories, dir);
int rc; assert(fdir != NULL);
int i; if (sub >= ptr_vector_len(&fdir->file_subs))
char *clean_url; return NULL;
struct file_sub *fsub = ptr_vector_get(&fdir->file_subs, sub);
assert(fsub != NULL);
stralloc_copys(&page, "<div class=\"content-header\"><h2>Files: "); stralloc_copys(&page, "<div class=\"content-header\"><h2>Files: ");
stralloc_cats(&page, conf.file_directories[dir]->name); stralloc_cats(&page, fdir->name);
stralloc_cats(&page, " - "); stralloc_cats(&page, " - ");
stralloc_cats(&page, conf.file_directories[dir]->file_subs[sub]->name); stralloc_cats(&page, fsub->name);
stralloc_cats(&page, "</h2></div>\n"); stralloc_cats(&page, "</h2></div>\n");
snprintf(pathbuf, sizeof pathbuf, "%s/%s.sq3", snprintf(pathbuf, sizeof pathbuf, "%s/%s.sq3", conf.bbs_path, fsub->database);
conf.bbs_path, conf.file_directories[dir]->file_subs[sub]->database);
rc = sqlite3_open(pathbuf, &db); rc = sqlite3_open(pathbuf, &db);
if (rc != SQLITE_OK) { if (rc != SQLITE_OK) {
free(page.s); free(page.s);
@ -321,7 +333,7 @@ char *www_files_display_listing(int dir, int sub) {
} }
stralloc_cats(&page, "<table class=\"fileentry\"><thead><tr><td>Filename</td><td>Size</td><td>Description</td></tr></thead><tbody>\n"); stralloc_cats(&page, "<table class=\"fileentry\"><thead><tr><td>Filename</td><td>Size</td><td>Description</td></tr></thead><tbody>\n");
while (sqlite3_step(res) == SQLITE_ROW) { while (sqlite3_step(res) == SQLITE_ROW) {
filename = strdup((char *)sqlite3_column_text(res, 1)); char *filename = strdup((char *)sqlite3_column_text(res, 1));
char *base_filename = basename(filename); char *base_filename = basename(filename);
stralloc_cats(&page, "<tr><td class=\"filename\"><a href=\""); stralloc_cats(&page, "<tr><td class=\"filename\"><a href=\"");
stralloc_cats(&page, conf.www_url); stralloc_cats(&page, conf.www_url);
@ -335,7 +347,7 @@ char *www_files_display_listing(int dir, int sub) {
stralloc_cats(&page, base_filename); stralloc_cats(&page, base_filename);
stralloc_cats(&page, "</a></td>"); stralloc_cats(&page, "</a></td>");
size = sqlite3_column_int(res, 3); int size = sqlite3_column_int(res, 3);
stralloc_cats(&page, "<td class=\"filesize\">"); stralloc_cats(&page, "<td class=\"filesize\">");
int c = 'b'; int c = 'b';
if (size > 1024) { if (size > 1024) {
@ -355,7 +367,7 @@ char *www_files_display_listing(int dir, int sub) {
stralloc_cats(&page, "</td>"); stralloc_cats(&page, "</td>");
stralloc_cats(&page, "<td class=\"filedesc\">"); stralloc_cats(&page, "<td class=\"filedesc\">");
description = strdup((char *)sqlite3_column_text(res, 2)); char *description = strdup((char *)sqlite3_column_text(res, 2));
for (char *p = description; *p != '\0'; ++p) { for (char *p = description; *p != '\0'; ++p) {
if (*p == '\n') if (*p == '\n')
*p = '\r'; *p = '\r';
@ -381,13 +393,15 @@ char *www_files_areas() {
stralloc page = EMPTY_STRALLOC; stralloc page = EMPTY_STRALLOC;
stralloc_copys(&page, "<div class=\"content-header\"><h2>File Directories</h2></div>\n"); stralloc_copys(&page, "<div class=\"content-header\"><h2>File Directories</h2></div>\n");
for (int i = 0; i < conf.file_directory_count; i++) { for (size_t i = 0; i < ptr_vector_len(&conf.file_directories); ++i) {
if (!conf.file_directories[i]->display_on_web) struct file_directory *dir = ptr_vector_get(&conf.file_directories, i);
if (!dir->display_on_web)
continue; continue;
stralloc_cats(&page, "<div class=\"conference-list-item\">"); stralloc_cats(&page, "<div class=\"conference-list-item\">");
stralloc_cats(&page, conf.file_directories[i]->name); stralloc_cats(&page, dir->name);
stralloc_cats(&page, "</div>\n"); stralloc_cats(&page, "</div>\n");
for (int j = 0; j < conf.file_directories[i]->file_sub_count; j++) { for (size_t j = 0; j < ptr_vector_len(&dir->file_subs); ++j) {
struct file_sub *sub = ptr_vector_get(&dir->file_subs, j);
stralloc_cats(&page, "<div class=\"area-list-item\"><a href=\""); stralloc_cats(&page, "<div class=\"area-list-item\"><a href=\"");
stralloc_cats(&page, conf.www_url); stralloc_cats(&page, conf.www_url);
stralloc_cats(&page, "files/areas/"); stralloc_cats(&page, "files/areas/");
@ -395,7 +409,7 @@ char *www_files_areas() {
stralloc_append1(&page, '/'); stralloc_append1(&page, '/');
stralloc_cat_long(&page, j); stralloc_cat_long(&page, j);
stralloc_cats(&page, "/\">"); stralloc_cats(&page, "/\">");
stralloc_cats(&page, conf.file_directories[i]->file_subs[j]->name); stralloc_cats(&page, sub->name);
stralloc_cats(&page, "</a></div>\n"); stralloc_cats(&page, "</a></div>\n");
} }
} }
@ -405,17 +419,15 @@ char *www_files_areas() {
} }
char *www_files_get_from_area(int dir, int sub, char *clean_file) { char *www_files_get_from_area(int dir, int sub, char *clean_file) {
char *sql = "SELECT filename FROM files WHERE approved=1 AND filename LIKE ? ESCAPE \"^\""; static const char *sql = "SELECT filename FROM files WHERE approved=1 AND filename LIKE ? ESCAPE \"^\"";
stralloc filenamelike = EMPTY_STRALLOC; stralloc filenamelike = EMPTY_STRALLOC;
sqlite3 *db; sqlite3 *db = NULL;
sqlite3_stmt *res; sqlite3_stmt *res = NULL;
int rc; int rc = 0;
char pathbuf[PATH_MAX]; char pathbuf[PATH_MAX];
char *ret = NULL; char *ret = NULL;
int i; char *file = NULL;
int extra = 0;
int j;
char *file;
file = www_decode(clean_file); file = www_decode(clean_file);
stralloc_copys(&filenamelike, "%"); stralloc_copys(&filenamelike, "%");
@ -427,7 +439,16 @@ char *www_files_get_from_area(int dir, int sub, char *clean_file) {
stralloc_0(&filenamelike); stralloc_0(&filenamelike);
free(file); free(file);
snprintf(pathbuf, PATH_MAX, "%s/%s.sq3", conf.bbs_path, conf.file_directories[dir]->file_subs[sub]->database); if (dir >= ptr_vector_len(&conf.file_directories))
return NULL;
struct file_directory *fdir = ptr_vector_get(&conf.file_directories, dir);
assert(fdir != NULL);
if (sub >= ptr_vector_len(&fdir->file_subs))
return NULL;
struct file_sub *fsub = ptr_vector_get(&fdir->file_subs, sub);
assert(fsub != NULL);
snprintf(pathbuf, sizeof pathbuf, "%s/%s.sq3", conf.bbs_path, fsub->database);
rc = sqlite3_open(pathbuf, &db); rc = sqlite3_open(pathbuf, &db);
if (rc != SQLITE_OK) { if (rc != SQLITE_OK) {
free(filenamelike.s); free(filenamelike.s);

View File

@ -6,10 +6,13 @@
#include <sys/utsname.h> #include <sys/utsname.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <iconv.h> #include <iconv.h>
#include "bbs.h"
#include "jamlib/jam.h" #include "jamlib/jam.h"
#include "libuuid/uuid.h" #include "libuuid/uuid.h"
#include "bbs.h"
#include "mail_utils.h"
#define IN 0 #define IN 0
#define OUT 1 #define OUT 1
extern char *aha(char *input); extern char *aha(char *input);
@ -59,16 +62,17 @@ char *www_sanitize(char *inp) {
char *www_msgs_arealist(struct user_record *user) { char *www_msgs_arealist(struct user_record *user) {
stralloc page = EMPTY_STRALLOC; stralloc page = EMPTY_STRALLOC;
int i, j;
stralloc_copys(&page, "<div class=\"content-header\"><h2>Message Conferences</h2></div>\n"); stralloc_copys(&page, "<div class=\"content-header\"><h2>Message Conferences</h2></div>\n");
for (i = 0; i < conf.mail_conference_count; i++) { for (size_t i = 0; i < ptr_vector_len(&conf.mail_conferences); i++) {
if (conf.mail_conferences[i]->sec_level <= user->sec_level) { struct mail_conference *mc = get_conf(i);
if (mc->sec_level <= user->sec_level) {
stralloc_cats(&page, "<div class=\"conference-list-item\">"); stralloc_cats(&page, "<div class=\"conference-list-item\">");
stralloc_cats(&page, conf.mail_conferences[i]->name); stralloc_cats(&page, mc->name);
stralloc_cats(&page, "</div>\n"); stralloc_cats(&page, "</div>\n");
for (j = 0; j < conf.mail_conferences[i]->mail_area_count; j++) { for (size_t j = 0; j < ptr_vector_len(&mc->mail_areas); j++) {
if (conf.mail_conferences[i]->mail_areas[j]->read_sec_level > user->sec_level) { struct mail_area *ma = get_area(i, j);
if (ma->read_sec_level > user->sec_level) {
continue; continue;
} }
stralloc_cats(&page, "<div class=\"area-list-"); stralloc_cats(&page, "<div class=\"area-list-");
@ -80,7 +84,7 @@ char *www_msgs_arealist(struct user_record *user) {
stralloc_append1(&page, '/'); stralloc_append1(&page, '/');
stralloc_cat_long(&page, j); stralloc_cat_long(&page, j);
stralloc_cats(&page, "/\">"); stralloc_cats(&page, "/\">");
stralloc_cats(&page, conf.mail_conferences[i]->mail_areas[j]->name); stralloc_cats(&page, ma->name);
stralloc_cats(&page, "</a></div>\n"); stralloc_cats(&page, "</a></div>\n");
} }
} }
@ -104,16 +108,20 @@ char *www_msgs_messagelist(struct user_record *user, int conference, int area, i
char *from; char *from;
char *subject; char *subject;
if (conference < 0 || conference >= conf.mail_conference_count || area < 0 || area >= conf.mail_conferences[conference]->mail_area_count) { if (conference < 0 || conference >= ptr_vector_len(&conf.mail_conferences))
return NULL; return NULL;
} struct mail_conference *mc = get_conf(conference);
if (area < 0 || area >= ptr_vector_len(&mc->mail_areas))
return NULL;
struct mail_area *ma = get_area(conference, area);
stralloc_copys(&page, "<div class=\"content-header\"><h2>"); stralloc_copys(&page, "<div class=\"content-header\"><h2>");
stralloc_cats(&page, conf.mail_conferences[conference]->name); stralloc_cats(&page, mc->name);
stralloc_cats(&page, " - "); stralloc_cats(&page, " - ");
stralloc_cats(&page, conf.mail_conferences[conference]->mail_areas[area]->name); stralloc_cats(&page, ma->name);
stralloc_cats(&page, "</h2></div>\n"); stralloc_cats(&page, "</h2></div>\n");
if (conf.mail_conferences[conference]->mail_areas[area]->type != TYPE_NETMAIL_AREA) { if (ma->type != TYPE_NETMAIL_AREA) {
stralloc_cats(&page, "<div class=\"button\"><a href=\""); stralloc_cats(&page, "<div class=\"button\"><a href=\"");
stralloc_cats(&page, conf.www_url); stralloc_cats(&page, conf.www_url);
stralloc_cats(&page, "msgs/new/"); stralloc_cats(&page, "msgs/new/");
@ -130,7 +138,7 @@ char *www_msgs_messagelist(struct user_record *user, int conference, int area, i
stralloc_cats(&page, "<div class=\"div-table\">\n"); stralloc_cats(&page, "<div class=\"div-table\">\n");
jb = open_jam_base(conf.mail_conferences[conference]->mail_areas[area]->path); jb = open_jam_base(ma->path);
if (!jb) { if (!jb) {
free(page.s); free(page.s);
free_message_headers(mhrs); free_message_headers(mhrs);
@ -236,14 +244,14 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i
char *nodename; char *nodename;
struct fido_addr *nodeno; struct fido_addr *nodeno;
if (conference < 0 || conference >= conf.mail_conference_count || area < 0 || area >= conf.mail_conferences[conference]->mail_area_count) { if (conference < 0 || conference >= ptr_vector_len(&conf.mail_conferences))
return NULL; return NULL;
} struct mail_conference *mc = get_conf(conference);
if (area < 0 || area >= ptr_vector_len(&mc->mail_areas))
return NULL;
struct mail_area *ma = get_area(conference, area);
if (!(conf.mail_conferences[conference]->sec_level <= user->sec_level && conf.mail_conferences[conference]->mail_areas[area]->read_sec_level <= user->sec_level)) { jb = open_jam_base(ma->path);
return NULL;
}
jb = open_jam_base(conf.mail_conferences[conference]->mail_areas[area]->path);
if (!jb) { if (!jb) {
return NULL; return NULL;
} }
@ -296,11 +304,10 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i
} }
if (jmh.Attribute & JAM_MSG_PRIVATE) { if (jmh.Attribute & JAM_MSG_PRIVATE) {
if (!msg_is_to(user, to, daddress, conf.mail_conferences[conference]->nettype, conf.mail_conferences[conference]->realnames, conference) && if (!msg_is_to(user, to, daddress, mc->nettype, mc->realnames, conference) &&
!msg_is_from(user, from, oaddress, conf.mail_conferences[conference]->nettype, conf.mail_conferences[conference]->realnames, conference) && !msg_is_from(user, from, oaddress, mc->nettype, mc->realnames, conference) &&
!msg_is_to(user, to, daddress, conf.mail_conferences[conference]->nettype, !conf.mail_conferences[conference]->realnames, conference) && !msg_is_to(user, to, daddress, mc->nettype, !mc->realnames, conference) &&
!msg_is_from(user, from, oaddress, conf.mail_conferences[conference]->nettype, !conf.mail_conferences[conference]->realnames, conference)) { !msg_is_from(user, from, oaddress, mc->nettype, !mc->realnames, conference)) {
free(subject); free(subject);
free(from); free(from);
free(to); free(to);
@ -339,9 +346,9 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i
stralloc_append1(&page, '/'); stralloc_append1(&page, '/');
stralloc_cat_long(&page, area); stralloc_cat_long(&page, area);
stralloc_cats(&page, "\"><h2>"); stralloc_cats(&page, "\"><h2>");
stralloc_cats(&page, conf.mail_conferences[conference]->name); stralloc_cats(&page, mc->name);
stralloc_cats(&page, " - "); stralloc_cats(&page, " - ");
stralloc_cats(&page, conf.mail_conferences[conference]->mail_areas[area]->name); stralloc_cats(&page, ma->name);
stralloc_cats(&page, "</h2></a></div>\n"); stralloc_cats(&page, "</h2></a></div>\n");
if (msgbase_is_flagged(user, conference, area, msg)) { if (msgbase_is_flagged(user, conference, area, msg)) {
@ -357,17 +364,19 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i
free(subject_s); free(subject_s);
from_s = www_sanitize(from); from_s = www_sanitize(from);
if (conf.mail_conferences[conference]->mail_areas[area]->type != TYPE_LOCAL_AREA && oaddress != NULL) { if (ma->type != TYPE_LOCAL_AREA && oaddress != NULL) {
if (conf.mail_conferences[conference]->nettype == NETWORK_MAGI) { if (mc->nettype == NETWORK_MAGI) {
snprintf(buffer, sizeof buffer, "<div class=\"msg-view-from\">From: %s (@%s)</div>\n", from_s, oaddress); snprintf(buffer, sizeof buffer, "<div class=\"msg-view-from\">From: %s (@%s)</div>\n", from_s, oaddress);
} else if (conf.mail_conferences[conference]->nettype == NETWORK_FIDO) { } else if (mc->nettype == NETWORK_FIDO) {
nodeno = parse_fido_addr(oaddress); nodeno = parse_fido_addr(oaddress);
if (nodeno != NULL) { if (nodeno != NULL) {
nodename = nl_get_bbsname(nodeno, conf.mail_conferences[conference]->domain); nodename = nl_get_bbsname(nodeno, mc->domain);
if (strcmp(nodename, "Unknown") == 0) { if (strcmp(nodename, "Unknown") == 0) {
snprintf(buffer, sizeof buffer, "<div class=\"msg-view-from\">From: %s (%s)</div>\n", from_s, oaddress); snprintf(buffer, sizeof buffer, "<div class=\"msg-view-from\">From: %s (%s)</div>\n", from_s, oaddress);
} else { } else {
snprintf(buffer, sizeof buffer, "<div class=\"msg-view-from\">From: %s (<span class=\"bbsname\">%s</span> - %s)</div>\n", from_s, nodename, oaddress); snprintf(buffer, sizeof buffer,
"<div class=\"msg-view-from\">From: %s (<span class=\"bbsname\">%s</span> - %s)</div>\n",
from_s, nodename, oaddress);
} }
free(nodename); free(nodename);
free(nodeno); free(nodeno);
@ -393,14 +402,18 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i
date = (time_t)jmh.DateWritten; date = (time_t)jmh.DateWritten;
gmtime_r(&date, &msg_date); gmtime_r(&date, &msg_date);
if (conf.date_style == 1) { if (conf.date_style == 1) {
snprintf(buffer, sizeof buffer, "<div class=\"msg-view-date\">Date: %.2d:%.2d %.2d-%.2d-%.2d</div>\n", msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mon + 1, msg_date.tm_mday, msg_date.tm_year - 100); snprintf(buffer, sizeof buffer, "<div class=\"msg-view-date\">Date: %.2d:%.2d %.2d-%.2d-%.2d</div>\n",
msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mon + 1, msg_date.tm_mday, msg_date.tm_year - 100);
} else { } else {
snprintf(buffer, sizeof buffer, "<div class=\"msg-view-date\">Date: %.2d:%.2d %.2d-%.2d-%.2d</div>\n", msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, msg_date.tm_year - 100); snprintf(buffer, sizeof buffer, "<div class=\"msg-view-date\">Date: %.2d:%.2d %.2d-%.2d-%.2d</div>\n",
msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, msg_date.tm_year - 100);
} }
stralloc_cats(&page, buffer); stralloc_cats(&page, buffer);
snprintf(buffer, sizeof buffer, "<div class=\"msg-view-options\"><a href=\"%smsgs/flag/%d/%d/%d\"><img src=\"%sstatic/flag.png\" /></a></div>", conf.www_url, conference, area, msg, conf.www_url); snprintf(buffer, sizeof buffer,
"<div class=\"msg-view-options\"><a href=\"%smsgs/flag/%d/%d/%d\"><img src=\"%sstatic/flag.png\" /></a></div>",
conf.www_url, conference, area, msg, conf.www_url);
stralloc_cats(&page, buffer); stralloc_cats(&page, buffer);
stralloc_cats(&page, "</div>\n"); stralloc_cats(&page, "</div>\n");
@ -416,7 +429,7 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i
stralloc_cats(&page, "</div>\n"); stralloc_cats(&page, "</div>\n");
stralloc_cats(&page, "<div class=\"msg-reply-form\">\n"); stralloc_cats(&page, "<div class=\"msg-reply-form\">\n");
if (conf.mail_conferences[conference]->mail_areas[area]->write_sec_level <= user->sec_level && conf.mail_conferences[conference]->mail_areas[area]->type != TYPE_NETMAIL_AREA) { if (ma->write_sec_level <= user->sec_level && ma->type != TYPE_NETMAIL_AREA) {
stralloc_cats(&page, "<h3>Reply</h3>\n"); stralloc_cats(&page, "<h3>Reply</h3>\n");
stralloc_cats(&page, "<form action=\""); stralloc_cats(&page, "<form action=\"");
stralloc_cats(&page, conf.www_url); stralloc_cats(&page, conf.www_url);
@ -658,14 +671,19 @@ int www_send_msg(struct user_record *user, char *to, char *subj, int conference,
uuid_t magi_msgid; uuid_t magi_msgid;
if (conference < 0 || conference >= conf.mail_conference_count || area < 0 || area >= conf.mail_conferences[conference]->mail_area_count) {
return 0;
}
if (subj == NULL || to == NULL || body == NULL) { if (subj == NULL || to == NULL || body == NULL) {
return 0; return 0;
} }
if (conf.mail_conferences[conference]->mail_areas[area]->write_sec_level <= user->sec_level && conf.mail_conferences[conference]->mail_areas[area]->type != TYPE_NETMAIL_AREA) {
jb = open_jam_base(conf.mail_conferences[conference]->mail_areas[area]->path); if (conference < 0 || conference >= ptr_vector_len(&conf.mail_conferences))
return 0;
struct mail_conference *mc = get_conf(conference);
if (area < 0 || area >= ptr_vector_len(&mc->mail_areas))
return 0;
struct mail_area *ma = get_area(conference, area);
if (ma->write_sec_level <= user->sec_level && ma->type != TYPE_NETMAIL_AREA) {
jb = open_jam_base(ma->path);
if (!jb) { if (!jb) {
return 0; return 0;
} }
@ -674,7 +692,7 @@ int www_send_msg(struct user_record *user, char *to, char *subj, int conference,
jmh.DateWritten = (uint32_t)utc_to_local(time(NULL)); jmh.DateWritten = (uint32_t)utc_to_local(time(NULL));
jmh.Attribute |= JAM_MSG_LOCAL; jmh.Attribute |= JAM_MSG_LOCAL;
if (conf.mail_conferences[conference]->realnames == 0) { if (mc->realnames == 0) {
strlcpy(buffer, user->loginname, sizeof buffer); strlcpy(buffer, user->loginname, sizeof buffer);
} else { } else {
snprintf(buffer, sizeof buffer, "%s %s", user->firstname, user->lastname); snprintf(buffer, sizeof buffer, "%s %s", user->firstname, user->lastname);
@ -699,21 +717,21 @@ int www_send_msg(struct user_record *user, char *to, char *subj, int conference,
jsf.Buffer = (char *)subj; jsf.Buffer = (char *)subj;
JAM_PutSubfield(jsp, &jsf); JAM_PutSubfield(jsp, &jsf);
if (conf.mail_conferences[conference]->mail_areas[area]->type == TYPE_ECHOMAIL_AREA) { if (ma->type == TYPE_ECHOMAIL_AREA) {
jmh.Attribute |= JAM_MSG_TYPEECHO; jmh.Attribute |= JAM_MSG_TYPEECHO;
if (conf.mail_conferences[conference]->nettype == NETWORK_FIDO) { if (mc->nettype == NETWORK_FIDO) {
if (conf.mail_conferences[conference]->fidoaddr->point) { if (mc->fidoaddr->point) {
snprintf(buffer, sizeof buffer, "%d:%d/%d.%d", snprintf(buffer, sizeof buffer, "%d:%d/%d.%d",
conf.mail_conferences[conference]->fidoaddr->zone, mc->fidoaddr->zone,
conf.mail_conferences[conference]->fidoaddr->net, mc->fidoaddr->net,
conf.mail_conferences[conference]->fidoaddr->node, mc->fidoaddr->node,
conf.mail_conferences[conference]->fidoaddr->point); mc->fidoaddr->point);
} else { } else {
snprintf(buffer, sizeof buffer, "%d:%d/%d", snprintf(buffer, sizeof buffer, "%d:%d/%d",
conf.mail_conferences[conference]->fidoaddr->zone, mc->fidoaddr->zone,
conf.mail_conferences[conference]->fidoaddr->net, mc->fidoaddr->net,
conf.mail_conferences[conference]->fidoaddr->node); mc->fidoaddr->node);
} }
jsf.LoID = JAMSFLD_OADDRESS; jsf.LoID = JAMSFLD_OADDRESS;
jsf.HiID = 0; jsf.HiID = 0;
@ -722,10 +740,10 @@ int www_send_msg(struct user_record *user, char *to, char *subj, int conference,
JAM_PutSubfield(jsp, &jsf); JAM_PutSubfield(jsp, &jsf);
snprintf(buffer, sizeof buffer, "%d:%d/%d.%d %08lx", snprintf(buffer, sizeof buffer, "%d:%d/%d.%d %08lx",
conf.mail_conferences[conference]->fidoaddr->zone, mc->fidoaddr->zone,
conf.mail_conferences[conference]->fidoaddr->net, mc->fidoaddr->net,
conf.mail_conferences[conference]->fidoaddr->node, mc->fidoaddr->node,
conf.mail_conferences[conference]->fidoaddr->point, mc->fidoaddr->point,
generate_msgid()); generate_msgid());
jsf.LoID = JAMSFLD_MSGID; jsf.LoID = JAMSFLD_MSGID;
@ -743,8 +761,8 @@ int www_send_msg(struct user_record *user, char *to, char *subj, int conference,
JAM_PutSubfield(jsp, &jsf); JAM_PutSubfield(jsp, &jsf);
jmh.ReplyCRC = JAM_Crc32(buffer, strlen(replyid)); jmh.ReplyCRC = JAM_Crc32(buffer, strlen(replyid));
} }
} else if (conf.mail_conferences[conference]->nettype == NETWORK_MAGI) { } else if (mc->nettype == NETWORK_MAGI) {
snprintf(buffer, sizeof buffer, "%d", conf.mail_conferences[conference]->maginode); snprintf(buffer, sizeof buffer, "%d", mc->maginode);
jsf.LoID = JAMSFLD_OADDRESS; jsf.LoID = JAMSFLD_OADDRESS;
jsf.HiID = 0; jsf.HiID = 0;
jsf.DatLen = strlen(buffer); jsf.DatLen = strlen(buffer);
@ -789,29 +807,28 @@ int www_send_msg(struct user_record *user, char *to, char *subj, int conference,
return 0; return 0;
} }
if (conf.mail_conferences[conference]->tagline != NULL) { tagline = conf.default_tagline;
tagline = conf.mail_conferences[conference]->tagline; if (mc->tagline != NULL) {
} else { tagline = mc->tagline;
tagline = conf.default_tagline;
} }
uname(&name); uname(&name);
if (conf.mail_conferences[conference]->nettype == NETWORK_FIDO) { if (mc->nettype == NETWORK_FIDO) {
if (conf.mail_conferences[conference]->fidoaddr->point == 0) { if (mc->fidoaddr->point == 0) {
snprintf(buffer, 256, "\r\r--- MagickaBBS v%d.%d%s (%s/%s)\r * Origin: %s (%d:%d/%d)\r", VERSION_MAJOR, VERSION_MINOR, VERSION_STR, name.sysname, name.machine, tagline, conf.mail_conferences[conference]->fidoaddr->zone, snprintf(buffer, sizeof buffer, "\r\r--- MagickaBBS v%d.%d%s (%s/%s)\r * Origin: %s (%d:%d/%d)\r",
conf.mail_conferences[conference]->fidoaddr->net, VERSION_MAJOR, VERSION_MINOR, VERSION_STR, name.sysname, name.machine, tagline,
conf.mail_conferences[conference]->fidoaddr->node); mc->fidoaddr->zone, mc->fidoaddr->net, mc->fidoaddr->node);
} else { } else {
snprintf(buffer, 256, "\r\r--- MagickaBBS v%d.%d%s (%s/%s)\r * Origin: %s (%d:%d/%d.%d)\r", VERSION_MAJOR, VERSION_MINOR, VERSION_STR, name.sysname, name.machine, tagline, conf.mail_conferences[conference]->fidoaddr->zone, snprintf(buffer, sizeof buffer, "\r\r--- MagickaBBS v%d.%d%s (%s/%s)\r * Origin: %s (%d:%d/%d.%d)\r",
conf.mail_conferences[conference]->fidoaddr->net, VERSION_MAJOR, VERSION_MINOR, VERSION_STR, name.sysname, name.machine, tagline,
conf.mail_conferences[conference]->fidoaddr->node, mc->fidoaddr->zone, mc->fidoaddr->net, mc->fidoaddr->node, mc->fidoaddr->point);
conf.mail_conferences[conference]->fidoaddr->point);
} }
} else if (conf.mail_conferences[conference]->nettype == NETWORK_MAGI) { } else if (mc->nettype == NETWORK_MAGI) {
snprintf(buffer, 256, "\r\r--- MagickaBBS v%d.%d%s (%s/%s)\r * Origin: %s (@%d)\r", VERSION_MAJOR, VERSION_MINOR, VERSION_STR, name.sysname, name.machine, tagline, conf.mail_conferences[conference]->maginode); snprintf(buffer, sizeof buffer, "\r\r--- MagickaBBS v%d.%d%s (%s/%s)\r * Origin: %s (@%d)\r",
VERSION_MAJOR, VERSION_MINOR, VERSION_STR, name.sysname, name.machine, tagline, mc->maginode);
} else { } else {
snprintf(buffer, 256, "\r"); snprintf(buffer, sizeof buffer, "\r");
} }
body2 = www_wordwrap(body, 73); body2 = www_wordwrap(body, 73);
if (body2 == NULL) { if (body2 == NULL) {
@ -853,7 +870,7 @@ int www_send_msg(struct user_record *user, char *to, char *subj, int conference,
iconv_close(ic); iconv_close(ic);
return 0; return 0;
} else { } else {
if (conf.mail_conferences[conference]->mail_areas[area]->type == TYPE_ECHOMAIL_AREA) { if (ma->type == TYPE_ECHOMAIL_AREA) {
if (conf.echomail_sem != NULL) { if (conf.echomail_sem != NULL) {
sem_fd = open(conf.echomail_sem, O_RDWR | O_CREAT, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH); sem_fd = open(conf.echomail_sem, O_RDWR | O_CREAT, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
close(sem_fd); close(sem_fd);