WWW improvements, fixes and a bug.

This commit is contained in:
Andrew Pamment 2018-01-21 15:02:21 +10:00
parent 3f1f8f9749
commit 6ac2e6f125
10 changed files with 202 additions and 107 deletions

1
.gitignore vendored
View File

@ -75,3 +75,4 @@ menus/file.mnu
menus/logoff.mnu
menus/mail.mnu
menus/main.mnu
.vscode/settings.json

1
dist/config/bbs.ini vendored
View File

@ -16,6 +16,7 @@ Automessage Write Level = 10
Fork = false
Enable WWW = false
WWW Port = 8080
WWW URL = http://127.0.0.1:8080/
Enable SSH = false
SSH Port = 2024
SSH DSA Key = /home/andrew/MagickaBBS/keys/ssh_host_dsa_key

12
dist/www/header.tpl vendored
View File

@ -1,19 +1,19 @@
<HTML>
<HEAD>
<TITLE>Magicka BBS</TITLE>
<link rel="stylesheet" type="text/css" href="/static/style.css">
<link rel="stylesheet" type="text/css" href="@@WWW_URL@@static/style.css">
<meta charset="utf-8">
</HEAD>
<BODY>
<div class="header">
<img src="/static/header.png" alt="Magicka BBS" />
<img src="@@WWW_URL@@static/header.png" alt="Magicka BBS" />
</div>
<div class="menu">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/last10/">Last 10 Callers</a></li>
<li><a href="/email/">Email</a></li>
<li><a href="/msgs/">Conferences</a></li>
<li><a href="@@WWW_URL@@">Home</a></li>
<li><a href="@@WWW_URL@@last10/">Last 10 Callers</a></li>
<li><a href="@@WWW_URL@@email/">Email</a></li>
<li><a href="@@WWW_URL@@msgs/">Conferences</a></li>
</ul>
</div>
<hr />

View File

@ -1,6 +1,6 @@
. . . .__ .__ __.
|\/| _. _ * _.;_/ _. [__)[__)(__
| |(_](_]|(_.| \(_] [__)[__).__) v0.8a
| |(_](_]|(_.| \(_] [__)[__).__) v0.9a
-------._|----------------------------------
Magicka BBS is a Free BBS System for Linux,
macOS, FreeBSD, NetBSD, OpenIndiana,

View File

@ -1075,3 +1075,49 @@ int copy_file(char *src, char *dest) {
fclose(dest_file);
return 0;
}
char *str_replace(char *orig, char *rep, char *with) {
char *result; // the return string
char *ins; // the next insert point
char *tmp; // varies
int len_rep; // length of rep (the string to remove)
int len_with; // length of with (the string to replace rep with)
int len_front; // distance between rep and end of last rep
int count; // number of replacements
// sanity checks and initialization
if (!orig || !rep)
return NULL;
len_rep = strlen(rep);
if (len_rep == 0)
return NULL; // empty rep causes infinite loop during count
if (!with)
with = "";
len_with = strlen(with);
// count the number of replacements needed
ins = orig;
for (count = 0; tmp = strstr(ins, rep); ++count) {
ins = tmp + len_rep;
}
tmp = result = malloc(strlen(orig) + (len_with - len_rep) * count + 1);
if (!result)
return NULL;
// first time through the loop, all the variable are set correctly
// from here on,
// tmp points to the end of the result string
// ins points to the next occurrence of rep in orig
// orig points to the remainder of orig after "end of rep"
while (count--) {
ins = strstr(orig, rep);
len_front = ins - orig;
tmp = strncpy(tmp, orig, len_front) + len_front;
tmp = strcpy(tmp, with) + len_with;
orig += len_front + len_rep; // move to next "end of rep"
}
strcpy(tmp, orig);
return result;
}

View File

@ -12,7 +12,7 @@
#include "jamlib/jam.h"
#define VERSION_MAJOR 0
#define VERSION_MINOR 8
#define VERSION_MINOR 9
#define VERSION_STR "alpha"
#define NETWORK_FIDO 1
@ -128,6 +128,7 @@ struct bbs_config {
char *netmail_sem;
char *default_tagline;
int telnet_port;
char *www_url;
int www_server;
int www_port;
char *www_path;
@ -227,6 +228,8 @@ struct msg_headers {
struct jam_msg **msgs;
int msg_count;
};
extern char *str_replace(char *orig, char *rep, char *with);
extern int copy_file(char *src, char *dest);
extern int recursive_delete(const char *dir);
extern void automessage_write(struct user_record *user);

View File

@ -425,6 +425,13 @@ static int handler(void* user, const char* section, const char* name,
}
} else if (strcasecmp(name, "www port") == 0) {
conf->www_port = atoi(value);
} else if (strcasecmp(name, "www url") == 0) {
if (value[strlen(value) - 1] == '/') {
conf->www_url = strdup(value);
} else {
conf->www_url = (char *)malloc(strlen(value) + 2);
sprintf(conf->www_url, "%s/", value);
}
} else if (strcasecmp(name, "ssh port") == 0) {
conf->ssh_port = atoi(value);
} else if (strcasecmp(name, "ssh dsa key") == 0) {
@ -1065,7 +1072,7 @@ void server(int port, int ipv6) {
}
#if defined(ENABLE_WWW)
if (conf.www_server && conf.www_path != NULL) {
if (conf.www_server && conf.www_path != NULL && conf.www_url != NULL) {
if (!conf.fork) {
printf(" - HTTP Starting on Port %d (IPv%d)\n", conf.www_port, (ipv6 ? 6 : 4));
}
@ -1241,6 +1248,7 @@ int main(int argc, char **argv) {
conf.telnet_port = 0;
conf.string_file = NULL;
conf.www_path = NULL;
conf.www_url = NULL;
conf.archiver_count = 0;
conf.broadcast_enable = 0;
conf.broadcast_port = 0;

189
src/www.c
View File

@ -40,8 +40,14 @@ struct connection_info_s {
};
void *www_logger(void * cls, const char * uri, struct MHD_Connection *con) {
struct sockaddr_in *so = (struct sockaddr_in *)MHD_get_connection_info(con, MHD_CONNECTION_INFO_CLIENT_ADDRESS)->client_addr;
ipaddress = strdup(inet_ntoa(so->sin_addr));
struct sockaddr *so = (struct sockaddr *)MHD_get_connection_info(con, MHD_CONNECTION_INFO_CLIENT_ADDRESS)->client_addr;
if (so->sa_family == AF_INET) {
ipaddress = (char *)malloc(INET_ADDRSTRLEN + 1);
inet_ntop(AF_INET, &((struct sockaddr_in *)so)->sin_addr, ipaddress, INET_ADDRSTRLEN);
} else if (so->sa_family == AF_INET6) {
ipaddress = (char *)malloc(INET6_ADDRSTRLEN + 1);
inet_ntop(AF_INET6, &((struct sockaddr_in6 *)so)->sin6_addr, ipaddress, INET6_ADDRSTRLEN);
}
dolog("%s", uri);
free(ipaddress);
ipaddress = NULL;
@ -78,6 +84,7 @@ void www_request_completed(void *cls, struct MHD_Connection *connection, void **
free(con_info->user->email);
free(con_info->user->location);
free(con_info->user->sec_info);
free(con_info->user->signature);
free(con_info->user);
}
@ -181,7 +188,7 @@ char *www_get_mime_type(const char *extension) {
int www_401(char *header, char *footer, struct MHD_Connection * connection) {
char buffer[4096];
char *page;
char *page, *page_tmp;
struct stat s;
char *whole_page;
struct MHD_Response *response;
@ -190,32 +197,35 @@ int www_401(char *header, char *footer, struct MHD_Connection * connection) {
snprintf(buffer, 4096, "%s/401.tpl", conf.www_path);
page = NULL;
page_tmp = NULL;
if (stat(buffer, &s) == 0) {
page = (char *)malloc(s.st_size + 1);
if (page == NULL) {
page_tmp = (char *)malloc(s.st_size + 1);
if (page_tmp == NULL) {
return -1;
}
memset(page, 0, s.st_size + 1);
memset(page_tmp, 0, s.st_size + 1);
fptr = fopen(buffer, "r");
if (fptr) {
fread(page, s.st_size, 1, fptr);
fread(page_tmp, s.st_size, 1, fptr);
fclose(fptr);
} else {
free(page);
page = NULL;
free(page_tmp);
page_tmp = NULL;
}
}
if (page == NULL) {
page = (char *)malloc(16);
if (page == NULL) {
if (page_tmp == NULL) {
page_tmp = (char *)malloc(16);
if (page_tmp == NULL) {
return -1;
}
sprintf(page, "Missing Content");
sprintf(page_tmp, "Missing Content");
}
page = str_replace(page_tmp, "@@WWW_URL@@", conf.www_url);
free(page_tmp);
whole_page = (char *)malloc(strlen(header) + strlen(page) + strlen(footer) + 1);
sprintf(whole_page, "%s%s%s", header, page, footer);
@ -233,7 +243,7 @@ int www_401(char *header, char *footer, struct MHD_Connection * connection) {
int www_404(char *header, char *footer, struct MHD_Connection * connection) {
char buffer[4096];
char *page;
char *page, *page_tmp;
struct stat s;
char *whole_page;
struct MHD_Response *response;
@ -242,32 +252,35 @@ int www_404(char *header, char *footer, struct MHD_Connection * connection) {
snprintf(buffer, 4096, "%s/404.tpl", conf.www_path);
page = NULL;
page_tmp = NULL;
if (stat(buffer, &s) == 0) {
page = (char *)malloc(s.st_size + 1);
if (page == NULL) {
page_tmp = (char *)malloc(s.st_size + 1);
if (page_tmp == NULL) {
return -1;
}
memset(page, 0, s.st_size + 1);
memset(page_tmp, 0, s.st_size + 1);
fptr = fopen(buffer, "r");
if (fptr) {
fread(page, s.st_size, 1, fptr);
fread(page_tmp, s.st_size, 1, fptr);
fclose(fptr);
} else {
free(page);
free(page_tmp);
page = NULL;
}
}
if (page == NULL) {
page = (char *)malloc(16);
if (page == NULL) {
if (page_tmp == NULL) {
page_tmp = (char *)malloc(16);
if (page_tmp == NULL) {
return -1;
}
sprintf(page, "Missing Content");
sprintf(page_tmp, "Missing Content");
}
page = str_replace(page_tmp, "@@WWW_URL@@", conf.www_url);
free(page_tmp);
whole_page = (char *)malloc(strlen(header) + strlen(page) + strlen(footer) + 1);
sprintf(whole_page, "%s%s%s", header, page, footer);
@ -283,7 +296,7 @@ int www_404(char *header, char *footer, struct MHD_Connection * connection) {
int www_403(char *header, char *footer, struct MHD_Connection * connection) {
char buffer[4096];
char *page;
char *page, *page_tmp;
struct stat s;
char *whole_page;
struct MHD_Response *response;
@ -292,32 +305,35 @@ int www_403(char *header, char *footer, struct MHD_Connection * connection) {
snprintf(buffer, 4096, "%s/403.tpl", conf.www_path);
page = NULL;
page_tmp = NULL;
if (stat(buffer, &s) == 0) {
page = (char *)malloc(s.st_size + 1);
if (page == NULL) {
page_tmp = (char *)malloc(s.st_size + 1);
if (page_tmp == NULL) {
return -1;
}
memset(page, 0, s.st_size + 1);
memset(page_tmp, 0, s.st_size + 1);
fptr = fopen(buffer, "r");
if (fptr) {
fread(page, s.st_size, 1, fptr);
fread(page_tmp, s.st_size, 1, fptr);
fclose(fptr);
} else {
free(page);
page = NULL;
free(page_tmp);
page_tmp = NULL;
}
}
if (page == NULL) {
page = (char *)malloc(16);
if (page == NULL) {
if (page_tmp == NULL) {
page_tmp = (char *)malloc(16);
if (page_tmp == NULL) {
return -1;
}
sprintf(page, "Missing Content");
sprintf(page_tmp, "Missing Content");
}
page = str_replace(page_tmp, "@@WWW_URL@@", conf.www_url);
free(page_tmp);
whole_page = (char *)malloc(strlen(header) + strlen(page) + strlen(footer) + 1);
sprintf(whole_page, "%s%s%s", header, page, footer);
@ -376,11 +392,11 @@ int www_handler(void * cls, struct MHD_Connection * connection, const char * url
struct MHD_Response *response;
int ret;
char *page;
char *page, *page_tmp;
char buffer[4096];
struct stat s;
char *header;
char *footer;
char *header, *header_tmp;
char *footer, *footer_tmp;
char *whole_page;
FILE *fptr;
char *mime;
@ -432,97 +448,106 @@ int www_handler(void * cls, struct MHD_Connection * connection, const char * url
snprintf(buffer, 4096, "%s/header.tpl", conf.www_path);
header = NULL;
header_tmp = NULL;
if (stat(buffer, &s) == 0) {
header = (char *)malloc(s.st_size + 1);
if (header == NULL) {
header_tmp = (char *)malloc(s.st_size + 1);
if (header_tmp == NULL) {
return MHD_NO;
}
memset(header, 0, s.st_size + 1);
memset(header_tmp, 0, s.st_size + 1);
fptr = fopen(buffer, "r");
if (fptr) {
fread(header, s.st_size, 1, fptr);
fread(header_tmp, s.st_size, 1, fptr);
fclose(fptr);
} else {
free(header);
header = NULL;
free(header_tmp);
header_tmp = NULL;
}
}
if (header == NULL) {
header = (char *)malloc(strlen(conf.bbs_name) * 2 + 61);
if (header == NULL) {
if (header_tmp == NULL) {
header_tmp = (char *)malloc(strlen(conf.bbs_name) * 2 + 61);
if (header_tmp == NULL) {
return MHD_NO;
}
sprintf(header, "<HTML>\n<HEAD>\n<TITLE>%s</TITLE>\n</HEAD>\n<BODY>\n<H1>%s</H1><HR />", conf.bbs_name, conf.bbs_name);
sprintf(header_tmp, "<HTML>\n<HEAD>\n<TITLE>%s</TITLE>\n</HEAD>\n<BODY>\n<H1>%s</H1><HR />", conf.bbs_name, conf.bbs_name);
}
header = str_replace(header_tmp, "@@WWW_URL@@", conf.www_url);
free(header_tmp);
snprintf(buffer, 4096, "%s/footer.tpl", conf.www_path);
footer = NULL;
if (stat(buffer, &s) == 0) {
footer = (char *)malloc(s.st_size + 1);
if (footer == NULL) {
footer_tmp = (char *)malloc(s.st_size + 1);
if (footer_tmp == NULL) {
free(header);
return MHD_NO;
}
memset(footer, 0, s.st_size + 1);
memset(footer_tmp, 0, s.st_size + 1);
fptr = fopen(buffer, "r");
if (fptr) {
fread(footer, s.st_size, 1, fptr);
fread(footer_tmp, s.st_size, 1, fptr);
fclose(fptr);
} else {
free(footer);
footer = NULL;
free(footer_tmp);
footer_tmp = NULL;
}
}
if (footer == NULL) {
footer = (char *)malloc(43);
if (footer == NULL) {
if (footer_tmp == NULL) {
footer_tmp = (char *)malloc(43);
if (footer_tmp == NULL) {
free(header);
return MHD_NO;
}
sprintf(footer, "<HR />Powered by Magicka BBS</BODY></HTML>");
sprintf(footer_tmp, "<HR />Powered by Magicka BBS</BODY></HTML>");
}
footer = str_replace(footer_tmp, "@@WWW_URL@@", conf.www_url);
free(footer_tmp);
if (strcmp(method, "GET") == 0) {
if (strcasecmp(url, "/") == 0) {
snprintf(buffer, 4096, "%s/index.tpl", conf.www_path);
page = NULL;
page_tmp = NULL;
if (stat(buffer, &s) == 0) {
page = (char *)malloc(s.st_size + 1);
if (page == NULL) {
page_tmp = (char *)malloc(s.st_size + 1);
if (page_tmp == NULL) {
free(header);
free(footer);
return MHD_NO;
}
memset(page, 0, s.st_size + 1);
memset(page_tmp, 0, s.st_size + 1);
fptr = fopen(buffer, "r");
if (fptr) {
fread(page, s.st_size, 1, fptr);
fread(page_tmp, s.st_size, 1, fptr);
fclose(fptr);
} else {
free(page);
page = NULL;
free(page_tmp);
page_tmp = NULL;
}
}
if (page == NULL) {
page = (char *)malloc(16);
if (page == NULL) {
if (page_tmp == NULL) {
page_tmp = (char *)malloc(16);
if (page_tmp == NULL) {
free(header);
free(footer);
return MHD_NO;
}
sprintf(page, "Missing Content");
sprintf(page_tmp, "Missing Content");
}
page = str_replace(page_tmp, "@@WWW_URL@@", conf.www_url);
free(page_tmp);
whole_page = (char *)malloc(strlen(header) + strlen(page) + strlen(footer) + 1);
sprintf(whole_page, "%s%s%s", header, page, footer);
@ -756,7 +781,7 @@ int www_handler(void * cls, struct MHD_Connection * connection, const char * url
MHD_destroy_response (response);
free(header);
free(footer);
return MHD_YES;
return ret;
} else {
if (www_403(header, footer, connection) != 0) {
free(header);
@ -864,7 +889,8 @@ int www_handler(void * cls, struct MHD_Connection * connection, const char * url
to = NULL;
body = NULL;
replyid = NULL;
conference = -1;
area = -1;
for (i=0;i<con_inf->count;i++) {
if (strcmp(con_inf->keys[i], "recipient") == 0) {
@ -881,8 +907,9 @@ int www_handler(void * cls, struct MHD_Connection * connection, const char * url
replyid = con_inf->values[i];
}
}
if (!www_send_msg(con_inf->user, to, subj, conference, area, replyid, body)) {
page = (char *)malloc(50);
page = (char *)malloc(31);
if (page == NULL) {
free(header);
free(footer);
@ -890,7 +917,7 @@ int www_handler(void * cls, struct MHD_Connection * connection, const char * url
}
sprintf(page, "<h1>Error Sending Message</h1>");
} else {
page = (char *)malloc(21);
page = (char *)malloc(23);
if (page == NULL) {
free(header);
free(footer);

View File

@ -80,10 +80,16 @@ int www_send_email(struct user_record *user, char *recipient, char *subject, cha
int i;
int pos;
if (recipient == NULL || subject == NULL || ibody == NULL) {
return 0;
}
if (check_user(recipient)) {
return 0;
}
uname(&name);
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, conf.default_tagline);
@ -159,7 +165,7 @@ char *www_new_email() {
strcat(page, buffer);
len += strlen(buffer);
sprintf(buffer, "<form action=\"/email/\" method=\"POST\" enctype=\"application/x-www-form-urlencoded\">\n");
sprintf(buffer, "<form action=\"%semail/\" method=\"POST\" enctype=\"application/x-www-form-urlencoded\">\n", conf.www_url);
if (len + strlen(buffer) > max_len - 1) {
max_len += 4096;
page = (char *)realloc(page, max_len);
@ -380,7 +386,7 @@ char *www_email_display(struct user_record *user, int email) {
strcat(page, buffer);
len += strlen(buffer);
sprintf(buffer, "<form action=\"/email/\" method=\"POST\" enctype=\"application/x-www-form-urlencoded\">\n");
sprintf(buffer, "<form action=\"%semail/\" method=\"POST\" enctype=\"application/x-www-form-urlencoded\">\n", conf.www_url);
if (len + strlen(buffer) > max_len - 1) {
max_len += 4096;
page = (char *)realloc(page, max_len);
@ -612,7 +618,7 @@ sqlite3_busy_timeout(db, 5000);
date = (time_t)sqlite3_column_int(res, 4);
localtime_r(&date, &msg_date);
if (seen == 0) {
sprintf(buffer, "<div class=\"email-summary\"><div class=\"email-id\">%d</div><div class=\"email-subject\"><a href=\"/email/%d\">%s</a></div><div class=\"email-from\">%s</div><div class=\"email-date\">%.2d:%.2d %.2d-%.2d-%.2d</div><div class=\"email-delete\"><a href=\"/email/delete/%d\"><img src=\"/static/delete.png\" alt=\"delete\" /></a></div></div>\n", msgid + 1, msgid + 1, subject, from, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, msg_date.tm_year - 100, id);
sprintf(buffer, "<div class=\"email-summary\"><div class=\"email-id\">%d</div><div class=\"email-subject\"><a href=\"%semail/%d\">%s</a></div><div class=\"email-from\">%s</div><div class=\"email-date\">%.2d:%.2d %.2d-%.2d-%.2d</div><div class=\"email-delete\"><a href=\"%semail/delete/%d\"><img src=\"%sstatic/delete.png\" alt=\"delete\" /></a></div></div>\n", msgid + 1, conf.www_url, msgid + 1, subject, from, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, msg_date.tm_year - 100, conf.www_url, id, conf.www_url);
if (len + strlen(buffer) > max_len - 1) {
max_len += 4096;
page = (char *)realloc(page, max_len);
@ -620,7 +626,7 @@ sqlite3_busy_timeout(db, 5000);
strcat(page, buffer);
len += strlen(buffer);
} else {
sprintf(buffer, "<div class=\"email-summary-seen\"><div class=\"email-id\">%d</div><div class=\"email-subject\"><a href=\"/email/%d\">%s</a></div><div class=\"email-from\">%s</div><div class=\"email-date\">%.2d:%.2d %.2d-%.2d-%.2d</div><div class=\"email-delete\"><a href=\"/email/delete/%d\"><img src=\"/static/delete.png\" alt=\"delete\" /></a></div></div>\n", msgid + 1, msgid + 1, subject, from, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, msg_date.tm_year - 100, id);
sprintf(buffer, "<div class=\"email-summary-seen\"><div class=\"email-id\">%d</div><div class=\"email-subject\"><a href=\"%semail/%d\">%s</a></div><div class=\"email-from\">%s</div><div class=\"email-date\">%.2d:%.2d %.2d-%.2d-%.2d</div><div class=\"email-delete\"><a href=\"%semail/delete/%d\"><img src=\"%sstatic/delete.png\" alt=\"delete\" /></a></div></div>\n", msgid + 1, conf.www_url, msgid + 1, subject, from, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, msg_date.tm_year - 100, conf.www_url, id, conf.www_url);
if (len + strlen(buffer) > max_len - 1) {
max_len += 4096;
page = (char *)realloc(page, max_len);

View File

@ -141,9 +141,9 @@ char *www_msgs_arealist(struct user_record *user) {
if (conf.mail_conferences[i]->mail_areas[j]->read_sec_level <= user->sec_level) {
if (new_messages(user, i, j) > 0) {
sprintf(buffer, "<div class=\"area-list-new\"><a href=\"/msgs/%d/%d/\">%s</a></div>\n", i, j, conf.mail_conferences[i]->mail_areas[j]->name);
sprintf(buffer, "<div class=\"area-list-new\"><a href=\"%smsgs/%d/%d/\">%s</a></div>\n", conf.www_url, i, j, conf.mail_conferences[i]->mail_areas[j]->name);
} else {
sprintf(buffer, "<div class=\"area-list-item\"><a href=\"/msgs/%d/%d/\">%s</a></div>\n", i, j, conf.mail_conferences[i]->mail_areas[j]->name);
sprintf(buffer, "<div class=\"area-list-item\"><a href=\"%smsgs/%d/%d/\">%s</a></div>\n", conf.www_url, i, j, conf.mail_conferences[i]->mail_areas[j]->name);
}
if (len + strlen(buffer) > max_len - 1) {
max_len += 4096;
@ -192,7 +192,7 @@ char *www_msgs_messagelist(struct user_record *user, int conference, int area, i
len += strlen(buffer);
if (conf.mail_conferences[conference]->mail_areas[area]->type != TYPE_NETMAIL_AREA) {
sprintf(buffer, "<div class=\"button\"><a href=\"/msgs/new/%d/%d\">New Message</a></div>\n", conference, area);
sprintf(buffer, "<div class=\"button\"><a href=\"%smsgs/new/%d/%d\">New Message</a></div>\n", conf.www_url, conference, area);
if (len + strlen(buffer) > max_len - 1) {
max_len += 4096;
page = (char *)realloc(page, max_len);
@ -246,15 +246,15 @@ char *www_msgs_messagelist(struct user_record *user, int conference, int area, i
subject = www_sanitize(mhrs->msgs[i]->subject);
if (mhrs->msgs[i]->msg_h->MsgNum > jlr.HighReadMsg) {
if (conf.date_style == 1) {
sprintf(buffer, "<div class=\"msg-summary\"><div class=\"msg-summary-id\">%d</div><div class=\"msg-summary-subject\"><a href=\"/msgs/%d/%d/%d\">%s</a></div><div class=\"msg-summary-from\">%s</div><div class=\"msg-summary-to\">%s</div><div class=\"msg-summary-date\">%.2d:%.2d %.2d-%.2d-%.2d</div></div>\n", mhrs->msgs[i]->msg_no + 1, conference, area, mhrs->msgs[i]->msg_h->MsgNum, subject, from, to, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mon + 1, msg_date.tm_mday, msg_date.tm_year - 100);
sprintf(buffer, "<div class=\"msg-summary\"><div class=\"msg-summary-id\">%d</div><div class=\"msg-summary-subject\"><a href=\"%smsgs/%d/%d/%d\">%s</a></div><div class=\"msg-summary-from\">%s</div><div class=\"msg-summary-to\">%s</div><div class=\"msg-summary-date\">%.2d:%.2d %.2d-%.2d-%.2d</div></div>\n", mhrs->msgs[i]->msg_no + 1, conf.www_url, conference, area, mhrs->msgs[i]->msg_h->MsgNum, subject, from, to, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mon + 1, msg_date.tm_mday, msg_date.tm_year - 100);
} else {
sprintf(buffer, "<div class=\"msg-summary\"><div class=\"msg-summary-id\">%d</div><div class=\"msg-summary-subject\"><a href=\"/msgs/%d/%d/%d\">%s</a></div><div class=\"msg-summary-from\">%s</div><div class=\"msg-summary-to\">%s</div><div class=\"msg-summary-date\">%.2d:%.2d %.2d-%.2d-%.2d</div></div>\n", mhrs->msgs[i]->msg_no + 1, conference, area, mhrs->msgs[i]->msg_h->MsgNum, subject, from, to, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, msg_date.tm_year - 100);
sprintf(buffer, "<div class=\"msg-summary\"><div class=\"msg-summary-id\">%d</div><div class=\"msg-summary-subject\"><a href=\"%smsgs/%d/%d/%d\">%s</a></div><div class=\"msg-summary-from\">%s</div><div class=\"msg-summary-to\">%s</div><div class=\"msg-summary-date\">%.2d:%.2d %.2d-%.2d-%.2d</div></div>\n", mhrs->msgs[i]->msg_no + 1, conf.www_url, conference, area, mhrs->msgs[i]->msg_h->MsgNum, subject, from, to, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, msg_date.tm_year - 100);
}
} else {
if (conf.date_style == 1) {
sprintf(buffer, "<div class=\"msg-summary-seen\"><div class=\"msg-summary-id\">%d</div><div class=\"msg-summary-subject\"><a href=\"/msgs/%d/%d/%d\">%s</a></div><div class=\"msg-summary-from\">%s</div><div class=\"msg-summary-to\">%s</div><div class=\"msg-summary-date\">%.2d:%.2d %.2d-%.2d-%.2d</div></div>\n", mhrs->msgs[i]->msg_no + 1, conference, area, mhrs->msgs[i]->msg_h->MsgNum, subject, from, to, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mon + 1, msg_date.tm_mday, msg_date.tm_year - 100);
sprintf(buffer, "<div class=\"msg-summary-seen\"><div class=\"msg-summary-id\">%d</div><div class=\"msg-summary-subject\"><a href=\"%smsgs/%d/%d/%d\">%s</a></div><div class=\"msg-summary-from\">%s</div><div class=\"msg-summary-to\">%s</div><div class=\"msg-summary-date\">%.2d:%.2d %.2d-%.2d-%.2d</div></div>\n", mhrs->msgs[i]->msg_no + 1, conf.www_url, conference, area, mhrs->msgs[i]->msg_h->MsgNum, subject, from, to, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mon + 1, msg_date.tm_mday, msg_date.tm_year - 100);
} else {
sprintf(buffer, "<div class=\"msg-summary-seen\"><div class=\"msg-summary-id\">%d</div><div class=\"msg-summary-subject\"><a href=\"/msgs/%d/%d/%d\">%s</a></div><div class=\"msg-summary-from\">%s</div><div class=\"msg-summary-to\">%s</div><div class=\"msg-summary-date\">%.2d:%.2d %.2d-%.2d-%.2d</div></div>\n", mhrs->msgs[i]->msg_no + 1, conference, area, mhrs->msgs[i]->msg_h->MsgNum, subject, from, to, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, msg_date.tm_year - 100);
sprintf(buffer, "<div class=\"msg-summary-seen\"><div class=\"msg-summary-id\">%d</div><div class=\"msg-summary-subject\"><a href=\"%smsgs/%d/%d/%d\">%s</a></div><div class=\"msg-summary-from\">%s</div><div class=\"msg-summary-to\">%s</div><div class=\"msg-summary-date\">%.2d:%.2d %.2d-%.2d-%.2d</div></div>\n", mhrs->msgs[i]->msg_no + 1, conf.www_url, conference, area, mhrs->msgs[i]->msg_h->MsgNum, subject, from, to, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, msg_date.tm_year - 100);
}
}
@ -279,9 +279,9 @@ char *www_msgs_messagelist(struct user_record *user, int conference, int area, i
if (skip > 0) {
if (skip - 50 < 0) {
sprintf(buffer, "<div class=\"msg-summary-prev\"><a href=\"/msgs/%d/%d/\">Prev</a></div>\n", conference, area);
sprintf(buffer, "<div class=\"msg-summary-prev\"><a href=\"%smsgs/%d/%d/\">Prev</a></div>\n", conf.www_url, conference, area);
} else {
sprintf(buffer, "<div class=\"msg-summary-prev\"><a href=\"/msgs/%d/%d/?skip=%d\">Prev</a></div>\n", conference, area, skip - 50);
sprintf(buffer, "<div class=\"msg-summary-prev\"><a href=\"%smsgs/%d/%d/?skip=%d\">Prev</a></div>\n", conf.www_url, conference, area, skip - 50);
}
if (len + strlen(buffer) > max_len - 1) {
max_len += 4096;
@ -292,7 +292,7 @@ char *www_msgs_messagelist(struct user_record *user, int conference, int area, i
}
if (skip + 50 <= mhrs->msg_count) {
sprintf(buffer, "<div class=\"msg-summary-next\"><a href=\"/msgs/%d/%d/?skip=%d\">Next</a></div>\n", conference, area, skip + 50);
sprintf(buffer, "<div class=\"msg-summary-next\"><a href=\"%smsgs/%d/%d/?skip=%d\">Next</a></div>\n", conf.www_url, conference, area, skip + 50);
if (len + strlen(buffer) > max_len - 1) {
max_len += 4096;
page = (char *)realloc(page, max_len);
@ -458,7 +458,7 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i
len = 0;
memset(page, 0, 4096);
sprintf(buffer, "<div class=\"content-header\"><a href=\"/msgs/%d/%d\"><h2>%s - %s</h2></a></div>\n", conference, area, conf.mail_conferences[conference]->name, conf.mail_conferences[conference]->mail_areas[area]->name);
sprintf(buffer, "<div class=\"content-header\"><a href=\"%smsgs/%d/%d\"><h2>%s - %s</h2></a></div>\n", conf.www_url, conference, area, conf.mail_conferences[conference]->name, conf.mail_conferences[conference]->mail_areas[area]->name);
if (len + strlen(buffer) > max_len - 1) {
max_len += 4096;
page = (char *)realloc(page, max_len);
@ -579,7 +579,7 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i
strcat(page, buffer);
len += strlen(buffer);
sprintf(buffer, "<form action=\"/msgs/\" method=\"POST\" enctype=\"application/x-www-form-urlencoded\">\n");
sprintf(buffer, "<form action=\"%smsgs/\" method=\"POST\" enctype=\"application/x-www-form-urlencoded\">\n", conf.www_url);
if (len + strlen(buffer) > max_len - 1) {
max_len += 4096;
page = (char *)realloc(page, max_len);
@ -757,6 +757,9 @@ int www_send_msg(struct user_record *user, char *to, char *subj, int conference,
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) {
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 (!jb) {
@ -933,7 +936,7 @@ char *www_new_msg(struct user_record *user, int conference, int area) {
strcat(page, buffer);
len += strlen(buffer);
sprintf(buffer, "<form action=\"/msgs/\" method=\"POST\" enctype=\"application/x-www-form-urlencoded\">\n");
sprintf(buffer, "<form action=\"%smsgs/\" method=\"POST\" enctype=\"application/x-www-form-urlencoded\">\n", conf.www_url);
if (len + strlen(buffer) > max_len - 1) {
max_len += 4096;
page = (char *)realloc(page, max_len);