Think I may have fixed it!
This commit is contained in:
parent
aac4aaad00
commit
69897e7955
2
.gitignore
vendored
2
.gitignore
vendored
@ -76,3 +76,5 @@ menus/logoff.mnu
|
||||
menus/mail.mnu
|
||||
menus/main.mnu
|
||||
.vscode/settings.json
|
||||
core
|
||||
.vscode/launch.json
|
||||
|
@ -5,7 +5,7 @@ JAMLIB = ../deps/jamlib/jamlib.a
|
||||
ZMODEM = ../deps/Xmodem/libzmodem.a
|
||||
LUA = ../deps/lua/liblua.a
|
||||
B64 = ../deps/libb64-1.2/src/libb64.a
|
||||
MICROHTTPD=-lmicrohttpd
|
||||
MICROHTTPD=-lmicrohttpd
|
||||
ODOORS = ../deps/odoors/libs-`uname -s`/libODoors.a
|
||||
JSMN = ../deps/jsmn/libjsmn.a
|
||||
CDK = ../deps/cdk-5-20161210/libcdk.a
|
||||
|
148
src/bbs.c
148
src/bbs.c
@ -89,8 +89,8 @@ void broadcast(char *mess, ...) {
|
||||
}
|
||||
}
|
||||
|
||||
void dolog(char *fmt, ...) {
|
||||
char buffer[512];
|
||||
void dolog_www(char *ipaddr, char *fmt, ...) {
|
||||
char buffer[PATH_MAX];
|
||||
struct tm time_now;
|
||||
time_t timen;
|
||||
FILE *logfptr;
|
||||
@ -102,14 +102,42 @@ void dolog(char *fmt, ...) {
|
||||
|
||||
localtime_r(&timen, &time_now);
|
||||
|
||||
snprintf(buffer, 512, "%s/%04d%02d%02d.log", conf.log_path, time_now.tm_year + 1900, time_now.tm_mon + 1, time_now.tm_mday);
|
||||
snprintf(buffer, PATH_MAX, "%s/%04d%02d%02d.log", conf.log_path, time_now.tm_year + 1900, time_now.tm_mon + 1, time_now.tm_mday);
|
||||
logfptr = fopen(buffer, "a");
|
||||
if (!logfptr) {
|
||||
return;
|
||||
}
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(buffer, 512, fmt, ap);
|
||||
vsnprintf(buffer, PATH_MAX, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
fprintf(logfptr, "%02d:%02d:%02d [%d][%s] %s\n", time_now.tm_hour, time_now.tm_min, time_now.tm_sec, mypid, ipaddr, buffer);
|
||||
|
||||
fclose(logfptr);
|
||||
}
|
||||
|
||||
void dolog(char *fmt, ...) {
|
||||
char buffer[PATH_MAX];
|
||||
struct tm time_now;
|
||||
time_t timen;
|
||||
FILE *logfptr;
|
||||
int mypid = getpid();
|
||||
|
||||
if (conf.log_path == NULL) return;
|
||||
|
||||
timen = time(NULL);
|
||||
|
||||
localtime_r(&timen, &time_now);
|
||||
|
||||
snprintf(buffer, PATH_MAX, "%s/%04d%02d%02d.log", conf.log_path, time_now.tm_year + 1900, time_now.tm_mon + 1, time_now.tm_mday);
|
||||
logfptr = fopen(buffer, "a");
|
||||
if (!logfptr) {
|
||||
return;
|
||||
}
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(buffer, PATH_MAX, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
fprintf(logfptr, "%02d:%02d:%02d [%d][%s] %s\n", time_now.tm_hour, time_now.tm_min, time_now.tm_sec, mypid, ipaddress, buffer);
|
||||
@ -1076,48 +1104,80 @@ int copy_file(char *src, char *dest) {
|
||||
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
|
||||
char *str_replace(const char *str, const char *from, const char *to) {
|
||||
/* Adjust each of the below values to suit your needs. */
|
||||
|
||||
// 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);
|
||||
/* Increment positions cache size initially by this number. */
|
||||
size_t cache_sz_inc = 16;
|
||||
/* Thereafter, each time capacity needs to be increased,
|
||||
* multiply the increment by this factor. */
|
||||
const size_t cache_sz_inc_factor = 3;
|
||||
/* But never increment capacity by more than this number. */
|
||||
const size_t cache_sz_inc_max = 1048576;
|
||||
|
||||
// count the number of replacements needed
|
||||
ins = orig;
|
||||
for (count = 0; tmp = strstr(ins, rep); ++count) {
|
||||
ins = tmp + len_rep;
|
||||
}
|
||||
char *pret, *ret = NULL;
|
||||
const char *pstr2, *pstr = str;
|
||||
size_t i, count = 0;
|
||||
uintptr_t *pos_cache_tmp, *pos_cache = NULL;
|
||||
size_t cache_sz = 0;
|
||||
size_t cpylen, orglen, retlen, tolen, fromlen = strlen(from);
|
||||
|
||||
tmp = result = malloc(strlen(orig) + (len_with - len_rep) * count + 1);
|
||||
/* Find all matches and cache their positions. */
|
||||
while ((pstr2 = strstr(pstr, from)) != NULL) {
|
||||
count++;
|
||||
|
||||
if (!result)
|
||||
return NULL;
|
||||
/* Increase the cache size when necessary. */
|
||||
if (cache_sz < count) {
|
||||
cache_sz += cache_sz_inc;
|
||||
pos_cache_tmp = realloc(pos_cache, sizeof(*pos_cache) * cache_sz);
|
||||
if (pos_cache_tmp == NULL) {
|
||||
goto end_repl_str;
|
||||
} else pos_cache = pos_cache_tmp;
|
||||
cache_sz_inc *= cache_sz_inc_factor;
|
||||
if (cache_sz_inc > cache_sz_inc_max) {
|
||||
cache_sz_inc = cache_sz_inc_max;
|
||||
}
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
pos_cache[count-1] = pstr2 - str;
|
||||
pstr = pstr2 + fromlen;
|
||||
}
|
||||
|
||||
orglen = pstr - str + strlen(pstr);
|
||||
|
||||
/* Allocate memory for the post-replacement string. */
|
||||
if (count > 0) {
|
||||
tolen = strlen(to);
|
||||
retlen = orglen + (tolen - fromlen) * count;
|
||||
} else retlen = orglen;
|
||||
ret = malloc(retlen + 1);
|
||||
if (ret == NULL) {
|
||||
goto end_repl_str;
|
||||
}
|
||||
|
||||
if (count == 0) {
|
||||
/* If no matches, then just duplicate the string. */
|
||||
strcpy(ret, str);
|
||||
} else {
|
||||
/* Otherwise, duplicate the string whilst performing
|
||||
* the replacements using the position cache. */
|
||||
pret = ret;
|
||||
memcpy(pret, str, pos_cache[0]);
|
||||
pret += pos_cache[0];
|
||||
for (i = 0; i < count; i++) {
|
||||
memcpy(pret, to, tolen);
|
||||
pret += tolen;
|
||||
pstr = str + pos_cache[i] + fromlen;
|
||||
cpylen = (i == count-1 ? orglen : pos_cache[i+1]) - pos_cache[i] - fromlen;
|
||||
memcpy(pret, pstr, cpylen);
|
||||
pret += cpylen;
|
||||
}
|
||||
ret[retlen] = '\0';
|
||||
}
|
||||
|
||||
end_repl_str:
|
||||
/* Free the cache and return the post-replacement string,
|
||||
* which will be NULL in the event of an error. */
|
||||
free(pos_cache);
|
||||
return ret;
|
||||
}
|
@ -229,12 +229,13 @@ struct msg_headers {
|
||||
int msg_count;
|
||||
};
|
||||
|
||||
extern char *str_replace(char *orig, char *rep, char *with);
|
||||
extern char *str_replace(const char *orig, const char *rep, const 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);
|
||||
extern void automessage_display();
|
||||
extern void dolog(char *fmt, ...);
|
||||
extern void dolog_www(char *ipaddr, char *fmt, ...);
|
||||
extern void runbbs_ssh(char *ipaddress);
|
||||
extern void runbbs(int sock, char *ipaddress);
|
||||
extern struct fido_addr *parse_fido_addr(const char *str);
|
||||
|
71
src/www.c
71
src/www.c
@ -41,16 +41,17 @@ struct connection_info_s {
|
||||
|
||||
void *www_logger(void * cls, const char * uri, struct MHD_Connection *con) {
|
||||
struct sockaddr *so = (struct sockaddr *)MHD_get_connection_info(con, MHD_CONNECTION_INFO_CLIENT_ADDRESS)->client_addr;
|
||||
char *ipaddr;
|
||||
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);
|
||||
ipaddr = (char *)malloc(INET_ADDRSTRLEN + 1);
|
||||
inet_ntop(AF_INET, &((struct sockaddr_in *)so)->sin_addr, ipaddr, 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);
|
||||
ipaddr = (char *)malloc(INET6_ADDRSTRLEN + 1);
|
||||
inet_ntop(AF_INET6, &((struct sockaddr_in6 *)so)->sin6_addr, ipaddr, INET6_ADDRSTRLEN);
|
||||
}
|
||||
dolog("%s", uri);
|
||||
free(ipaddress);
|
||||
ipaddress = NULL;
|
||||
dolog_www(ipaddr, "%s", uri);
|
||||
free(ipaddr);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -133,18 +134,18 @@ static int iterate_post (void *coninfo_cls, enum MHD_ValueKind kind, const char
|
||||
|
||||
void www_init() {
|
||||
FILE *fptr;
|
||||
char buffer[4096];
|
||||
char buffer[PATH_MAX];
|
||||
int i;
|
||||
|
||||
mime_types_count = 0;
|
||||
|
||||
sprintf(buffer, "%s/mime.types", conf.www_path);
|
||||
snprintf(buffer, PATH_MAX, "%s/mime.types", conf.www_path);
|
||||
|
||||
fptr = fopen(buffer, "r");
|
||||
if (!fptr) {
|
||||
return;
|
||||
}
|
||||
fgets(buffer, 4096, fptr);
|
||||
fgets(buffer, 256, fptr);
|
||||
while (!feof(fptr)) {
|
||||
chomp(buffer);
|
||||
|
||||
@ -167,7 +168,7 @@ void www_init() {
|
||||
}
|
||||
}
|
||||
|
||||
fgets(buffer, 4096, fptr);
|
||||
fgets(buffer, 256, fptr);
|
||||
}
|
||||
|
||||
fclose(fptr);
|
||||
@ -177,7 +178,10 @@ char *www_get_mime_type(const char *extension) {
|
||||
int i;
|
||||
static char default_mime_type[] = "application/octet-stream";
|
||||
|
||||
|
||||
if (extension == NULL) {
|
||||
return default_mime_type;
|
||||
}
|
||||
|
||||
for (i=0;i<mime_types_count;i++) {
|
||||
if (strcasecmp(extension, mime_types[i]->ext) == 0) {
|
||||
return mime_types[i]->mime;
|
||||
@ -187,7 +191,7 @@ char *www_get_mime_type(const char *extension) {
|
||||
}
|
||||
|
||||
int www_401(char *header, char *footer, struct MHD_Connection * connection) {
|
||||
char buffer[4096];
|
||||
char buffer[PATH_MAX];
|
||||
char *page, *page_tmp;
|
||||
struct stat s;
|
||||
char *whole_page;
|
||||
@ -195,7 +199,7 @@ int www_401(char *header, char *footer, struct MHD_Connection * connection) {
|
||||
int ret;
|
||||
FILE *fptr;
|
||||
|
||||
snprintf(buffer, 4096, "%s/401.tpl", conf.www_path);
|
||||
snprintf(buffer, PATH_MAX, "%s/401.tpl", conf.www_path);
|
||||
|
||||
page_tmp = NULL;
|
||||
|
||||
@ -242,7 +246,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 buffer[PATH_MAX];
|
||||
char *page, *page_tmp;
|
||||
struct stat s;
|
||||
char *whole_page;
|
||||
@ -250,7 +254,7 @@ int www_404(char *header, char *footer, struct MHD_Connection * connection) {
|
||||
int ret;
|
||||
FILE *fptr;
|
||||
|
||||
snprintf(buffer, 4096, "%s/404.tpl", conf.www_path);
|
||||
snprintf(buffer, PATH_MAX, "%s/404.tpl", conf.www_path);
|
||||
|
||||
page_tmp = NULL;
|
||||
|
||||
@ -295,7 +299,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 buffer[PATH_MAX];
|
||||
char *page, *page_tmp;
|
||||
struct stat s;
|
||||
char *whole_page;
|
||||
@ -303,7 +307,7 @@ int www_403(char *header, char *footer, struct MHD_Connection * connection) {
|
||||
int ret;
|
||||
FILE *fptr;
|
||||
|
||||
snprintf(buffer, 4096, "%s/403.tpl", conf.www_path);
|
||||
snprintf(buffer, PATH_MAX, "%s/403.tpl", conf.www_path);
|
||||
|
||||
page_tmp = NULL;
|
||||
|
||||
@ -393,7 +397,7 @@ int www_handler(void * cls, struct MHD_Connection * connection, const char * url
|
||||
|
||||
int ret;
|
||||
char *page, *page_tmp;
|
||||
char buffer[4096];
|
||||
char buffer[PATH_MAX];
|
||||
struct stat s;
|
||||
char *header, *header_tmp;
|
||||
char *footer, *footer_tmp;
|
||||
@ -411,7 +415,8 @@ int www_handler(void * cls, struct MHD_Connection * connection, const char * url
|
||||
const char *val;
|
||||
int skip;
|
||||
char *replyid;
|
||||
|
||||
// char *static_buffer;
|
||||
|
||||
if (strcmp(method, "GET") == 0) {
|
||||
if (*ptr == NULL) {
|
||||
con_inf = (struct connection_info_s *)malloc(sizeof(struct connection_info_s));
|
||||
@ -446,7 +451,7 @@ int www_handler(void * cls, struct MHD_Connection * connection, const char * url
|
||||
|
||||
con_inf = *ptr;
|
||||
|
||||
snprintf(buffer, 4096, "%s/header.tpl", conf.www_path);
|
||||
snprintf(buffer, PATH_MAX, "%s/header.tpl", conf.www_path);
|
||||
|
||||
header_tmp = NULL;
|
||||
|
||||
@ -477,9 +482,9 @@ int www_handler(void * cls, struct MHD_Connection * connection, const char * url
|
||||
header = str_replace(header_tmp, "@@WWW_URL@@", conf.www_url);
|
||||
free(header_tmp);
|
||||
|
||||
snprintf(buffer, 4096, "%s/footer.tpl", conf.www_path);
|
||||
snprintf(buffer, PATH_MAX, "%s/footer.tpl", conf.www_path);
|
||||
|
||||
footer = NULL;
|
||||
footer_tmp = NULL;
|
||||
|
||||
if (stat(buffer, &s) == 0) {
|
||||
footer_tmp = (char *)malloc(s.st_size + 1);
|
||||
@ -513,7 +518,7 @@ int www_handler(void * cls, struct MHD_Connection * connection, const char * url
|
||||
if (strcmp(method, "GET") == 0) {
|
||||
if (strcasecmp(url, "/") == 0) {
|
||||
|
||||
snprintf(buffer, 4096, "%s/index.tpl", conf.www_path);
|
||||
snprintf(buffer, PATH_MAX, "%s/index.tpl", conf.www_path);
|
||||
|
||||
page_tmp = NULL;
|
||||
|
||||
@ -760,22 +765,40 @@ int www_handler(void * cls, struct MHD_Connection * connection, const char * url
|
||||
} else if (strncasecmp(url, "/static/", 8) == 0) {
|
||||
// sanatize path
|
||||
if (strstr(url, "/..") != NULL) {
|
||||
free(header);
|
||||
free(footer);
|
||||
return MHD_NO;
|
||||
}
|
||||
|
||||
mime = NULL;
|
||||
// get mimetype
|
||||
for (i=strlen(url);i>0;--i) {
|
||||
if (url[i] == '.') {
|
||||
mime = www_get_mime_type(&url[i+1]);
|
||||
break;
|
||||
}
|
||||
if (url[i] == '/') {
|
||||
mime = www_get_mime_type(NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (mime = NULL) {
|
||||
mime = www_get_mime_type(NULL);
|
||||
}
|
||||
|
||||
|
||||
// load file
|
||||
|
||||
sprintf(buffer, "%s%s", conf.www_path, url);
|
||||
if (stat(buffer, &s) == 0 && S_ISREG(s.st_mode)) {
|
||||
fno = open(buffer, O_RDONLY);
|
||||
if (fno != -1) {
|
||||
|
||||
//static_buffer = (char *)malloc(s.st_size + 1);
|
||||
//read(fno, static_buffer, s.st_size);
|
||||
response = MHD_create_response_from_fd(s.st_size, fno);
|
||||
//response = MHD_create_response_from_buffer (s.st_size, (void*) static_buffer, MHD_RESPMEM_MUST_FREE);
|
||||
MHD_add_response_header(response, MHD_HTTP_HEADER_CONTENT_TYPE, mime);
|
||||
ret = MHD_queue_response (connection, MHD_HTTP_OK, response);
|
||||
MHD_destroy_response (response);
|
||||
|
@ -566,7 +566,7 @@ char *www_email_summary(struct user_record *user) {
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<div class=\"button\"><a href=\"%semail/new\">New Email</a></div>\n", config.www_url);
|
||||
sprintf(buffer, "<div class=\"button\"><a href=\"%semail/new\">New Email</a></div>\n", conf.www_url);
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
|
Reference in New Issue
Block a user