Conference support to WWW
This commit is contained in:
parent
82cdc70739
commit
db48225539
@ -6,7 +6,7 @@ ZMODEM = Xmodem/libzmodem.a
|
||||
LUA = lua/liblua.a
|
||||
MICROHTTPD=-lmicrohttpd -lb64
|
||||
|
||||
OBJ = 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 lua_glue.o strings.o www.o www_email.o
|
||||
OBJ = 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 lua_glue.o strings.o www.o www_email.o www_msgs.o
|
||||
%.o: %.c $(DEPS)
|
||||
$(CC) -c -o $@ $< $(CFLAGS)
|
||||
|
||||
|
@ -6,7 +6,7 @@ ZMODEM = Xmodem/libzmodem.a
|
||||
LUA = lua/liblua.a
|
||||
MICROHTTPD=-lmicrohttpd -lb64
|
||||
|
||||
OBJ = 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 lua_glue.o strings.o www.o www_email.o
|
||||
OBJ = 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 lua_glue.o strings.o www.o www_email.o www_msgs.o
|
||||
%.o: %.c $(DEPS)
|
||||
$(CC) -c -o $@ $< $(CFLAGS)
|
||||
|
||||
|
28
bbs.h
28
bbs.h
@ -7,6 +7,7 @@
|
||||
#endif
|
||||
#include "lua/lua.h"
|
||||
#include "lua/lauxlib.h"
|
||||
#include "jamlib/jam.h"
|
||||
|
||||
#define VERSION_MAJOR 0
|
||||
#define VERSION_MINOR 3
|
||||
@ -147,6 +148,23 @@ struct user_record {
|
||||
int timeson;
|
||||
};
|
||||
|
||||
struct jam_msg {
|
||||
int msg_no;
|
||||
s_JamMsgHeader *msg_h;
|
||||
char *from;
|
||||
char *to;
|
||||
char *subject;
|
||||
char *oaddress;
|
||||
char *daddress;
|
||||
char *msgid;
|
||||
char *replyid;
|
||||
};
|
||||
|
||||
struct msg_headers {
|
||||
struct jam_msg **msgs;
|
||||
int msg_count;
|
||||
};
|
||||
|
||||
extern void automessage_write(struct user_record *user);
|
||||
extern void automessage_display();
|
||||
extern void dolog(char *fmt, ...);
|
||||
@ -176,10 +194,15 @@ extern void list_users(struct user_record *user);
|
||||
|
||||
extern void main_menu(struct user_record *user);
|
||||
|
||||
extern s_JamBase *open_jam_base(char *path);
|
||||
extern void free_message_headers(struct msg_headers *msghs);
|
||||
extern struct msg_headers *read_message_headers(int msgconf, int msgarea, struct user_record *user);
|
||||
extern void mail_scan(struct user_record *user);
|
||||
extern int mail_menu(struct user_record *user);
|
||||
extern char *editor(struct user_record *user, char *quote, char *from, int email);
|
||||
extern char *external_editor(struct user_record *user, char *to, char *from, char *quote, char *qfrom, char *subject, int email);
|
||||
extern int msg_is_to(struct user_record *user, char *addressed_to, char *address, int type, int rn, int msgconf);
|
||||
extern int msg_is_from(struct user_record *user, char *addressed_from, char *address, int type, int rn, int msgconf);
|
||||
|
||||
extern int door_menu(struct user_record *user);
|
||||
extern void rundoor(struct user_record *user, char *cmd, int stdio);
|
||||
@ -211,6 +234,11 @@ extern char *www_email_display(struct user_record *user, int email);
|
||||
extern int www_send_email(struct user_record *user, char *recipient, char *subject, char *body);
|
||||
extern char *www_new_email();
|
||||
extern int www_email_delete(struct user_record *user, int id);
|
||||
extern char *www_msgs_arealist(struct user_record *user);
|
||||
extern char *www_msgs_messagelist(struct user_record *user, int conference, int area, int skip);
|
||||
extern char *www_msgs_messageview(struct user_record *user, int conference, int area, int msg);
|
||||
extern int www_send_msg(struct user_record *user, char *to, char *subj, int conference, int area, char *replyid, char *body);
|
||||
extern char *www_new_msg(struct user_record *user, int conference, int area);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
36
mail_menu.c
36
mail_menu.c
@ -16,22 +16,6 @@
|
||||
extern struct bbs_config conf;
|
||||
extern struct user_record *gUser;
|
||||
extern int mynode;
|
||||
struct jam_msg {
|
||||
int msg_no;
|
||||
s_JamMsgHeader *msg_h;
|
||||
char *from;
|
||||
char *to;
|
||||
char *subject;
|
||||
char *oaddress;
|
||||
char *daddress;
|
||||
char *msgid;
|
||||
char *replyid;
|
||||
};
|
||||
|
||||
struct msg_headers {
|
||||
struct jam_msg **msgs;
|
||||
int msg_count;
|
||||
};
|
||||
|
||||
s_JamBase *open_jam_base(char *path) {
|
||||
int ret;
|
||||
@ -89,16 +73,16 @@ void free_message_headers(struct msg_headers *msghs) {
|
||||
free(msghs);
|
||||
}
|
||||
|
||||
int msg_is_to(char *addressed_to, char *address, int type, int rn, int msgconf) {
|
||||
int msg_is_to(struct user_record *user, char *addressed_to, char *address, int type, int rn, int msgconf) {
|
||||
char *myname;
|
||||
char *wwiv_addressee;
|
||||
struct fido_addr *dest;
|
||||
int j;
|
||||
if (rn) {
|
||||
myname = (char *)malloc(strlen(gUser->firstname) + strlen(gUser->lastname) + 2);
|
||||
sprintf(myname, "%s %s", gUser->firstname, gUser->lastname);
|
||||
myname = (char *)malloc(strlen(user->firstname) + strlen(user->lastname) + 2);
|
||||
sprintf(myname, "%s %s", user->firstname, user->lastname);
|
||||
} else {
|
||||
myname = strdup(gUser->loginname);
|
||||
myname = strdup(user->loginname);
|
||||
}
|
||||
if (type == NETWORK_WWIV) {
|
||||
wwiv_addressee = strdup(addressed_to);
|
||||
@ -145,15 +129,15 @@ int msg_is_to(char *addressed_to, char *address, int type, int rn, int msgconf)
|
||||
}
|
||||
}
|
||||
|
||||
int msg_is_from(char *addressed_from, char *address, int type, int rn, int msgconf) {
|
||||
int msg_is_from(struct user_record *user, char *addressed_from, char *address, int type, int rn, int msgconf) {
|
||||
char *myname;
|
||||
struct fido_addr *orig;
|
||||
int j;
|
||||
if (rn) {
|
||||
myname = (char *)malloc(strlen(gUser->firstname) + strlen(gUser->lastname) + 2);
|
||||
sprintf(myname, "%s %s", gUser->firstname, gUser->lastname);
|
||||
myname = (char *)malloc(strlen(user->firstname) + strlen(user->lastname) + 2);
|
||||
sprintf(myname, "%s %s", user->firstname, user->lastname);
|
||||
} else {
|
||||
myname = strdup(gUser->loginname);
|
||||
myname = strdup(user->loginname);
|
||||
}
|
||||
if (type == NETWORK_WWIV) {
|
||||
free(myname);
|
||||
@ -277,8 +261,8 @@ struct msg_headers *read_message_headers(int msgconf, int msgarea, struct user_r
|
||||
JAM_DelSubPacket(jsp);
|
||||
|
||||
if (jmh.Attribute & MSG_PRIVATE) {
|
||||
if (!msg_is_to(jamm->to, jamm->daddress, conf.mail_conferences[msgconf]->nettype, conf.mail_conferences[msgconf]->realnames, msgconf) &&
|
||||
!msg_is_from(jamm->from, jamm->oaddress, conf.mail_conferences[msgconf]->nettype, conf.mail_conferences[msgconf]->realnames, msgconf)) {
|
||||
if (!msg_is_to(gUser, jamm->to, jamm->daddress, conf.mail_conferences[msgconf]->nettype, conf.mail_conferences[msgconf]->realnames, msgconf) &&
|
||||
!msg_is_from(gUser, jamm->from, jamm->oaddress, conf.mail_conferences[msgconf]->nettype, conf.mail_conferences[msgconf]->realnames, msgconf)) {
|
||||
|
||||
if (jamm->subject != NULL) {
|
||||
free(jamm->subject);
|
||||
|
176
www.c
176
www.c
@ -98,7 +98,11 @@ static int iterate_post (void *coninfo_cls, enum MHD_ValueKind kind, const char
|
||||
return MHD_NO;
|
||||
}
|
||||
}
|
||||
|
||||
if (strcmp(con_info->url, "/msgs/") == 0 || strcmp(con_info->url, "/msgs") == 0) {
|
||||
if (con_info->count == 6) {
|
||||
return MHD_NO;
|
||||
}
|
||||
}
|
||||
return MHD_YES;
|
||||
} else {
|
||||
return MHD_NO;
|
||||
@ -369,7 +373,12 @@ int www_handler(void * cls, struct MHD_Connection * connection, const char * url
|
||||
const char *url_ = url;
|
||||
char *subj, *to, *body;
|
||||
struct connection_info_s *con_inf;
|
||||
|
||||
int conference, area, msg;
|
||||
char *url_copy;
|
||||
char *aptr;
|
||||
const char *val;
|
||||
int skip;
|
||||
char *replyid;
|
||||
|
||||
if (strcmp(method, "GET") == 0) {
|
||||
if (*ptr == NULL) {
|
||||
@ -585,7 +594,110 @@ int www_handler(void * cls, struct MHD_Connection * connection, const char * url
|
||||
}
|
||||
whole_page = (char *)malloc(strlen(header) + strlen(page) + strlen(footer) + 1);
|
||||
|
||||
sprintf(whole_page, "%s%s%s", header, page, footer);
|
||||
} else if (strcasecmp(url, "/msgs/") == 0 || strcasecmp(url, "/msgs") == 0) {
|
||||
con_inf->user = www_auth_ok(connection, url_);
|
||||
|
||||
if (con_inf->user == NULL) {
|
||||
www_401(header, footer, connection);
|
||||
free(header);
|
||||
free(footer);
|
||||
return MHD_YES;
|
||||
}
|
||||
page = www_msgs_arealist(con_inf->user);
|
||||
if (page == NULL) {
|
||||
free(header);
|
||||
free(footer);
|
||||
return MHD_NO;
|
||||
}
|
||||
whole_page = (char *)malloc(strlen(header) + strlen(page) + strlen(footer) + 1);
|
||||
|
||||
sprintf(whole_page, "%s%s%s", header, page, footer);
|
||||
} else if (strncasecmp(url, "/msgs/new/", 10) == 0) {
|
||||
con_inf->user = www_auth_ok(connection, url_);
|
||||
|
||||
if (con_inf->user == NULL) {
|
||||
www_401(header, footer, connection);
|
||||
free(header);
|
||||
free(footer);
|
||||
return MHD_YES;
|
||||
}
|
||||
conference = -1;
|
||||
area = -1;
|
||||
url_copy = strdup(&url[10]);
|
||||
|
||||
aptr = strtok(url_copy, "/");
|
||||
if (aptr != NULL) {
|
||||
conference = atoi(aptr);
|
||||
aptr = strtok(NULL, "/");
|
||||
if (aptr != NULL) {
|
||||
area = atoi(aptr);
|
||||
}
|
||||
}
|
||||
free(url_copy);
|
||||
|
||||
if (area != -1 && conference != -1) {
|
||||
page = www_new_msg(con_inf->user, conference, area);
|
||||
} else {
|
||||
free(header);
|
||||
free(footer);
|
||||
return MHD_NO;
|
||||
}
|
||||
whole_page = (char *)malloc(strlen(header) + strlen(page) + strlen(footer) + 1);
|
||||
|
||||
sprintf(whole_page, "%s%s%s", header, page, footer);
|
||||
} else if (strncasecmp(url, "/msgs/", 6) == 0) {
|
||||
con_inf->user = www_auth_ok(connection, url_);
|
||||
|
||||
if (con_inf->user == NULL) {
|
||||
www_401(header, footer, connection);
|
||||
free(header);
|
||||
free(footer);
|
||||
return MHD_YES;
|
||||
}
|
||||
conference = -1;
|
||||
area = -1;
|
||||
msg = -1;
|
||||
url_copy = strdup(&url[6]);
|
||||
|
||||
aptr = strtok(url_copy, "/");
|
||||
if (aptr != NULL) {
|
||||
conference = atoi(aptr);
|
||||
aptr = strtok(NULL, "/");
|
||||
if (aptr != NULL) {
|
||||
area = atoi(aptr);
|
||||
aptr = strtok(NULL, "/");
|
||||
if (aptr != NULL) {
|
||||
msg = atoi(aptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
free(url_copy);
|
||||
|
||||
val = MHD_lookup_connection_value (connection, MHD_GET_ARGUMENT_KIND, "skip");
|
||||
|
||||
if (val != NULL) {
|
||||
skip = atoi(val);
|
||||
} else {
|
||||
skip = 0;
|
||||
}
|
||||
|
||||
if (conference != -1 && area != -1 && msg == -1) {
|
||||
page = www_msgs_messagelist(con_inf->user, conference, area, skip);
|
||||
} else if (conference != -1 && area != -1 && msg != -1) {
|
||||
page = www_msgs_messageview(con_inf->user, conference, area, msg);
|
||||
//page = NULL;
|
||||
}
|
||||
|
||||
|
||||
if (page == NULL) {
|
||||
free(header);
|
||||
free(footer);
|
||||
return MHD_NO;
|
||||
}
|
||||
whole_page = (char *)malloc(strlen(header) + strlen(page) + strlen(footer) + 1);
|
||||
|
||||
sprintf(whole_page, "%s%s%s", header, page, footer);
|
||||
} else if (strncasecmp(url, "/static/", 8) == 0) {
|
||||
// sanatize path
|
||||
if (strstr(url, "/..") != NULL) {
|
||||
@ -694,6 +806,66 @@ int www_handler(void * cls, struct MHD_Connection * connection, const char * url
|
||||
|
||||
sprintf(whole_page, "%s%s%s", header, page, footer);
|
||||
|
||||
} else if (strcasecmp(url, "/msgs/") == 0 || strcasecmp(url, "/msgs") == 0) {
|
||||
con_inf->user = www_auth_ok(connection, url_);
|
||||
|
||||
if (con_inf->user == NULL) {
|
||||
www_401(header, footer, connection);
|
||||
free(header);
|
||||
free(footer);
|
||||
return MHD_YES;
|
||||
}
|
||||
|
||||
con_inf->pp = MHD_create_post_processor(connection, POSTBUFFERSIZE, iterate_post, (void*) con_inf);
|
||||
|
||||
if (*upload_data_size != 0) {
|
||||
MHD_post_process (con_inf->pp, upload_data, *upload_data_size);
|
||||
*upload_data_size = 0;
|
||||
|
||||
return MHD_YES;
|
||||
}
|
||||
subj = NULL;
|
||||
to = NULL;
|
||||
body = NULL;
|
||||
replyid = NULL;
|
||||
|
||||
|
||||
for (i=0;i<con_inf->count;i++) {
|
||||
if (strcmp(con_inf->keys[i], "recipient") == 0) {
|
||||
to = con_inf->values[i];
|
||||
} else if (strcmp(con_inf->keys[i], "subject") == 0) {
|
||||
subj = con_inf->values[i];
|
||||
} else if (strcmp(con_inf->keys[i], "body") == 0) {
|
||||
body = con_inf->values[i];
|
||||
} else if (strcmp(con_inf->keys[i], "conference") == 0) {
|
||||
conference = atoi(con_inf->values[i]);
|
||||
} else if (strcmp(con_inf->keys[i], "area") == 0) {
|
||||
area = atoi(con_inf->values[i]);
|
||||
} else if (strcmp(con_inf->keys[i], "replyid") == 0) {
|
||||
replyid = con_inf->values[i];
|
||||
}
|
||||
}
|
||||
if (!www_send_msg(con_inf->user, to, subj, conference, area, replyid, body)) {
|
||||
page = (char *)malloc(50);
|
||||
if (page == NULL) {
|
||||
free(header);
|
||||
free(footer);
|
||||
return MHD_NO;
|
||||
}
|
||||
sprintf(page, "<h1>Error Sending Message</h1>");
|
||||
} else {
|
||||
page = (char *)malloc(21);
|
||||
if (page == NULL) {
|
||||
free(header);
|
||||
free(footer);
|
||||
return MHD_NO;
|
||||
}
|
||||
sprintf(page, "<h1>Message Sent!</h1>");
|
||||
}
|
||||
whole_page = (char *)malloc(strlen(header) + strlen(page) + strlen(footer) + 1);
|
||||
|
||||
sprintf(whole_page, "%s%s%s", header, page, footer);
|
||||
|
||||
|
||||
} else {
|
||||
free(header);
|
||||
|
@ -11,6 +11,7 @@
|
||||
<ul>
|
||||
<li><a href="/">Home</a></li>
|
||||
<li><a href="/email/">Email</a></li>
|
||||
<li><a href="/msgs/">Conferences</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<hr />
|
||||
|
@ -73,6 +73,82 @@
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.conference-list-item {
|
||||
background-color: #333333;
|
||||
color: white;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.area-list-item {
|
||||
padding: 5px 0 5px 15px;
|
||||
}
|
||||
|
||||
.msg-summary-seen {
|
||||
display: table-row;
|
||||
width: auto;
|
||||
clear: both;
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
.msg-summary {
|
||||
display: table-row;
|
||||
width: auto;
|
||||
clear: both;
|
||||
background-color: #b2ffb0;
|
||||
}
|
||||
.msg-summary-id {
|
||||
float: left;
|
||||
display: table-column;
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
.msg-summary-subject {
|
||||
float: left;
|
||||
display: table-column;
|
||||
width: 400px;
|
||||
}
|
||||
|
||||
.msg-summary-from {
|
||||
float: left;
|
||||
display: table-column;
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
.msg-summary-to {
|
||||
float: left;
|
||||
display: table-column;
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
.msg-summary-date {
|
||||
float: left;
|
||||
display: table-column;
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
.msg-view-header {
|
||||
background-color: #eee;
|
||||
border: 1px solid #666666;
|
||||
padding: 5px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.msg-view-subject {
|
||||
font-size: xx-large;
|
||||
}
|
||||
|
||||
.msg-view-from {
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.msg-view-to {
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.msg-view-date {
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.menu ul {
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
|
10
www_email.c
10
www_email.c
@ -168,7 +168,7 @@ char *www_new_email() {
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<input type=\"text\" name=\"recipient\" /><br />\n");
|
||||
sprintf(buffer, "To : <input type=\"text\" name=\"recipient\" /><br />\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
@ -176,7 +176,7 @@ char *www_new_email() {
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<input type=\"text\" name=\"subject\" /><br />\n");
|
||||
sprintf(buffer, "Subject : <input type=\"text\" name=\"subject\" /><br />\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
@ -374,7 +374,11 @@ char *www_email_display(struct user_record *user, int email) {
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<input type=\"text\" name=\"subject\" value=\"RE: %s\" /><br />\n", subject);
|
||||
if (strncasecmp(subject, "re:", 3) == 0) {
|
||||
sprintf(buffer, "Subject : <input type=\"text\" name=\"subject\" value=\"%s\" /><br />\n", subject);
|
||||
} else {
|
||||
sprintf(buffer, "Subject : <input type=\"text\" name=\"subject\" value=\"RE: %s\" /><br />\n", subject);
|
||||
}
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
|
805
www_msgs.c
Normal file
805
www_msgs.c
Normal file
@ -0,0 +1,805 @@
|
||||
#if defined(ENABLE_WWW)
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/utsname.h>
|
||||
#include "bbs.h"
|
||||
#include "jamlib/jam.h"
|
||||
|
||||
extern struct bbs_config conf;
|
||||
|
||||
char *www_msgs_arealist(struct user_record *user) {
|
||||
char *page;
|
||||
int max_len;
|
||||
int len;
|
||||
char buffer[4096];
|
||||
int i, j;
|
||||
|
||||
page = (char *)malloc(4096);
|
||||
max_len = 4096;
|
||||
len = 0;
|
||||
memset(page, 0, 4096);
|
||||
|
||||
sprintf(buffer, "<div class=\"content-header\"><h2>Message Conferences</h2></div>\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
for (i=0;i<conf.mail_conference_count;i++) {
|
||||
if (conf.mail_conferences[i]->sec_level <= user->sec_level) {
|
||||
sprintf(buffer, "<div class=\"conference-list-item\">%s</div>\n", conf.mail_conferences[i]->name);
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
for (j=0;j<conf.mail_conferences[i]->mail_area_count; j++) {
|
||||
if (conf.mail_conferences[i]->mail_areas[j]->read_sec_level <= user->sec_level) {
|
||||
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);
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return page;
|
||||
}
|
||||
|
||||
char *www_msgs_messagelist(struct user_record *user, int conference, int area, int skip) {
|
||||
struct msg_headers *mhrs;
|
||||
char *page;
|
||||
int max_len;
|
||||
int len;
|
||||
char buffer[4096];
|
||||
int i;
|
||||
struct tm msg_date;
|
||||
time_t date;
|
||||
s_JamBase *jb;
|
||||
s_JamLastRead jlr;
|
||||
int skip_f;
|
||||
int skip_t;
|
||||
if (conference < 0 || conference >= conf.mail_conference_count || area < 0 || area >= conf.mail_conferences[conference]->mail_area_count) {
|
||||
return NULL;
|
||||
}
|
||||
page = (char *)malloc(4096);
|
||||
max_len = 4096;
|
||||
len = 0;
|
||||
memset(page, 0, 4096);
|
||||
|
||||
sprintf(buffer, "<div class=\"content-header\"><h2>%s - %s</h2></div>\n", 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);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
|
||||
sprintf(buffer, "<div class=\"button\"><a href=\"/msgs/new/%d/%d\">New Message</a></div>\n", conference, area);
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
mhrs = read_message_headers(conference, area, user);
|
||||
|
||||
if (mhrs == NULL) {
|
||||
sprintf(buffer, "<h3>No Messages</h3>\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
return page;
|
||||
}
|
||||
|
||||
sprintf(buffer, "<div class=\"div-table\">\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
jb = open_jam_base(conf.mail_conferences[conference]->mail_areas[area]->path);
|
||||
if (!jb) {
|
||||
free(page);
|
||||
return NULL;
|
||||
}
|
||||
if (JAM_ReadLastRead(jb, user->id, &jlr) == JAM_NO_USER) {
|
||||
jlr.LastReadMsg = 0;
|
||||
jlr.HighReadMsg = 0;
|
||||
}
|
||||
JAM_CloseMB(jb);
|
||||
|
||||
skip_f = mhrs->msg_count - skip;
|
||||
skip_t = mhrs->msg_count - skip - 50;
|
||||
if (skip_t < 0) {
|
||||
skip_t = 0;
|
||||
}
|
||||
|
||||
for (i=skip_f -1; i>=skip_t;i--) {
|
||||
date = (time_t)mhrs->msgs[i]->msg_h->DateWritten;
|
||||
localtime_r(&date, &msg_date);
|
||||
if (mhrs->msgs[i]->msg_h->MsgNum > jlr.HighReadMsg) {
|
||||
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, mhrs->msgs[i]->subject, mhrs->msgs[i]->from, mhrs->msgs[i]->to, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, 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, mhrs->msgs[i]->subject, mhrs->msgs[i]->from, mhrs->msgs[i]->to, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, msg_date.tm_year - 100);
|
||||
}
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
}
|
||||
sprintf(buffer, "</div>\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
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);
|
||||
} else {
|
||||
sprintf(buffer, "<div class=\"msg-summary-prev\"><a href=\"/msgs/%d/%d/?skip=%d\">Prev</a></div>\n", conference, area, skip - 50);
|
||||
}
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
free_message_headers(mhrs);
|
||||
return page;
|
||||
}
|
||||
|
||||
char *www_msgs_messageview(struct user_record *user, int conference, int area, int msg) {
|
||||
s_JamBase *jb;
|
||||
s_JamMsgHeader jmh;
|
||||
s_JamSubPacket* jsp;
|
||||
s_JamSubfield jsf;
|
||||
s_JamLastRead jlr;
|
||||
s_JamBaseHeader jbh;
|
||||
|
||||
char *subject = NULL;
|
||||
char *from = NULL;
|
||||
char *to = NULL;
|
||||
char *daddress = NULL;
|
||||
char *oaddress = NULL;
|
||||
char *msgid = NULL;
|
||||
char *replyid = NULL;
|
||||
char *body = NULL;
|
||||
int z;
|
||||
struct tm msg_date;
|
||||
time_t date;
|
||||
char *page;
|
||||
int max_len;
|
||||
int len;
|
||||
char buffer[4096];
|
||||
|
||||
if (conference < 0 || conference >= conf.mail_conference_count || area < 0 || area >= conf.mail_conferences[conference]->mail_area_count) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
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(conf.mail_conferences[conference]->mail_areas[area]->path);
|
||||
if (!jb) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
JAM_ReadMBHeader(jb, &jbh);
|
||||
|
||||
memset(&jmh, 0, sizeof(s_JamMsgHeader));
|
||||
z = JAM_ReadMsgHeader(jb, msg - 1, &jmh, &jsp);
|
||||
if (z != 0) {
|
||||
JAM_CloseMB(jb);
|
||||
return NULL;
|
||||
}
|
||||
if (jmh.Attribute & MSG_DELETED) {
|
||||
JAM_DelSubPacket(jsp);
|
||||
JAM_CloseMB(jb);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (z=0;z<jsp->NumFields;z++) {
|
||||
if (jsp->Fields[z]->LoID == JAMSFLD_SUBJECT) {
|
||||
subject = (char *)malloc(jsp->Fields[z]->DatLen + 1);
|
||||
memset(subject, 0, jsp->Fields[z]->DatLen + 1);
|
||||
memcpy(subject, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen);
|
||||
}
|
||||
if (jsp->Fields[z]->LoID == JAMSFLD_SENDERNAME) {
|
||||
from = (char *)malloc(jsp->Fields[z]->DatLen + 1);
|
||||
memset(from, 0, jsp->Fields[z]->DatLen + 1);
|
||||
memcpy(from, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen);
|
||||
}
|
||||
if (jsp->Fields[z]->LoID == JAMSFLD_RECVRNAME) {
|
||||
to = (char *)malloc(jsp->Fields[z]->DatLen + 1);
|
||||
memset(to, 0, jsp->Fields[z]->DatLen + 1);
|
||||
memcpy(to, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen);
|
||||
}
|
||||
if (jsp->Fields[z]->LoID == JAMSFLD_DADDRESS) {
|
||||
daddress = (char *)malloc(jsp->Fields[z]->DatLen + 1);
|
||||
memset(daddress, 0, jsp->Fields[z]->DatLen + 1);
|
||||
memcpy(daddress, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen);
|
||||
}
|
||||
if (jsp->Fields[z]->LoID == JAMSFLD_OADDRESS) {
|
||||
oaddress = (char *)malloc(jsp->Fields[z]->DatLen + 1);
|
||||
memset(oaddress, 0, jsp->Fields[z]->DatLen + 1);
|
||||
memcpy(oaddress, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen);
|
||||
}
|
||||
if (jsp->Fields[z]->LoID == JAMSFLD_MSGID) {
|
||||
msgid = (char *)malloc(jsp->Fields[z]->DatLen + 1);
|
||||
memset(msgid, 0, jsp->Fields[z]->DatLen + 1);
|
||||
memcpy(msgid, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen);
|
||||
}
|
||||
if (jsp->Fields[z]->LoID == JAMSFLD_REPLYID) {
|
||||
replyid = (char *)malloc(jsp->Fields[z]->DatLen + 1);
|
||||
memset(replyid, 0, jsp->Fields[z]->DatLen + 1);
|
||||
memcpy(replyid, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen);
|
||||
}
|
||||
}
|
||||
JAM_DelSubPacket(jsp);
|
||||
|
||||
if (jmh.Attribute & MSG_PRIVATE) {
|
||||
if (!msg_is_to(user, to, daddress, conf.mail_conferences[conference]->nettype, conf.mail_conferences[conference]->realnames, conference) &&
|
||||
!msg_is_from(user, from, oaddress, conf.mail_conferences[conference]->nettype, conf.mail_conferences[conference]->realnames, conference)) {
|
||||
|
||||
if (subject != NULL) {
|
||||
free(subject);
|
||||
}
|
||||
if (from != NULL) {
|
||||
free(from);
|
||||
}
|
||||
if (to != NULL) {
|
||||
free(to);
|
||||
}
|
||||
if (oaddress != NULL) {
|
||||
free(oaddress);
|
||||
}
|
||||
if (daddress != NULL) {
|
||||
free(daddress);
|
||||
}
|
||||
if (msgid != NULL) {
|
||||
free(msgid);
|
||||
}
|
||||
if (replyid != NULL) {
|
||||
free(replyid);
|
||||
}
|
||||
JAM_CloseMB(jb);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
body = (char *)malloc(jmh.TxtLen);
|
||||
|
||||
JAM_ReadMsgText(jb, jmh.TxtOffset,jmh.TxtLen, (char *)body);
|
||||
|
||||
if (JAM_ReadLastRead(jb, user->id, &jlr) == JAM_NO_USER) {
|
||||
jlr.UserCRC = JAM_Crc32(user->loginname, strlen(user->loginname));
|
||||
jlr.UserID = user->id;
|
||||
jlr.HighReadMsg = msg;
|
||||
}
|
||||
|
||||
jlr.LastReadMsg = msg;
|
||||
if (jlr.HighReadMsg < msg) {
|
||||
jlr.HighReadMsg = msg;
|
||||
}
|
||||
|
||||
JAM_WriteLastRead(jb, user->id, &jlr);
|
||||
JAM_CloseMB(jb);
|
||||
|
||||
page = (char *)malloc(4096);
|
||||
max_len = 4096;
|
||||
len = 0;
|
||||
memset(page, 0, 4096);
|
||||
|
||||
sprintf(buffer, "<div class=\"content-header\"><h2>%s - %s</h2></div>\n", 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);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
|
||||
sprintf(buffer, "<div class=\"msg-view-header\">\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<div class=\"msg-view-subject\">%s</div>\n", subject);
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
if (conf.mail_conferences[conference]->mail_areas[area]->type != TYPE_LOCAL_AREA) {
|
||||
sprintf(buffer, "<div class=\"msg-view-from\">From: %s (%s)</div>\n", from, oaddress);
|
||||
} else {
|
||||
sprintf(buffer, "<div class=\"msg-view-from\">From: %s</div>\n", from);
|
||||
}
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<div class=\"msg-view-to\">To: %s</div>\n", to);
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
date = (time_t)jmh.DateWritten;
|
||||
localtime_r(&date, &msg_date);
|
||||
|
||||
sprintf(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);
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "</div>\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
|
||||
for (z=0;z<jmh.TxtLen;z++) {
|
||||
if (body[z] == '\r') {
|
||||
sprintf(buffer, "<br />");
|
||||
} else {
|
||||
sprintf(buffer, "%c", body[z]);
|
||||
}
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
}
|
||||
free(body);
|
||||
|
||||
sprintf(buffer, "<div class=\"msg-reply-form\">\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
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) {
|
||||
sprintf(buffer, "<h3>Reply</h3>\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<form action=\"/msgs/\" method=\"POST\">\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<input type=\"hidden\" name=\"conference\" value=\"%d\" />\n", conference);
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
sprintf(buffer, "<input type=\"hidden\" name=\"area\" value=\"%d\" />\n", area);
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<input type=\"hidden\" name=\"replyid\" value=\"%s\" />\n", msgid);
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "To : <input type=\"text\" name=\"recipient\" value=\"%s\" /><br />\n", from);
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
if (strncasecmp(subject, "re:", 3) == 0) {
|
||||
sprintf(buffer, "Subject : <input type=\"text\" name=\"subject\" value=\"%s\" /><br />\n", subject);
|
||||
} else {
|
||||
sprintf(buffer, "Subject : <input type=\"text\" name=\"subject\" value=\"RE: %s\" /><br />\n", subject);
|
||||
}
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<textarea name=\"body\" rows=25 cols=80></textarea>\n<br />");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<input type=\"submit\" name=\"submit\" value=\"Reply\" />\n<br />");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
|
||||
sprintf(buffer, "</form>\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "</div>\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
}
|
||||
if (subject != NULL) {
|
||||
free(subject);
|
||||
}
|
||||
if (from != NULL) {
|
||||
free(from);
|
||||
}
|
||||
if (to != NULL) {
|
||||
free(to);
|
||||
}
|
||||
if (oaddress != NULL) {
|
||||
free(oaddress);
|
||||
}
|
||||
if (daddress != NULL) {
|
||||
free(daddress);
|
||||
}
|
||||
if (msgid != NULL) {
|
||||
free(msgid);
|
||||
}
|
||||
if (replyid != NULL) {
|
||||
free(replyid);
|
||||
}
|
||||
return page;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
int www_send_msg(struct user_record *user, char *to, char *subj, int conference, int area, char *replyid, char *body) {
|
||||
s_JamBase *jb;
|
||||
s_JamMsgHeader jmh;
|
||||
s_JamSubPacket* jsp;
|
||||
s_JamSubfield jsf;
|
||||
s_JamLastRead jlr;
|
||||
s_JamBaseHeader jbh;
|
||||
int z;
|
||||
int sem_fd;
|
||||
char *page;
|
||||
int max_len;
|
||||
int len;
|
||||
char buffer[256];
|
||||
char timestr[17];
|
||||
char *body2;
|
||||
char *tagline;
|
||||
struct utsname name;
|
||||
if (conference < 0 || conference >= conf.mail_conference_count || area < 0 || area >= conf.mail_conferences[conference]->mail_area_count) {
|
||||
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) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
JAM_ClearMsgHeader( &jmh );
|
||||
jmh.DateWritten = (uint32_t)time(NULL);
|
||||
jmh.Attribute |= MSG_LOCAL;
|
||||
|
||||
if (conf.mail_conferences[conference]->realnames == 0) {
|
||||
if (conf.mail_conferences[conference]->nettype == NETWORK_WWIV) {
|
||||
sprintf(buffer, "%s #%d @%d", user->loginname, user->id, conf.mail_conferences[conference]->wwivnode);
|
||||
} else {
|
||||
strcpy(buffer, user->loginname);
|
||||
}
|
||||
} else {
|
||||
if (conf.mail_conferences[conference]->nettype == NETWORK_WWIV) {
|
||||
sprintf(buffer, "%s #%d @%d (%s)", user->loginname, user->id, conf.mail_conferences[conference]->wwivnode, user->firstname);
|
||||
} else {
|
||||
sprintf(buffer, "%s %s", user->firstname, user->lastname);
|
||||
}
|
||||
}
|
||||
jsp = JAM_NewSubPacket();
|
||||
|
||||
jsf.LoID = JAMSFLD_SENDERNAME;
|
||||
jsf.HiID = 0;
|
||||
jsf.DatLen = strlen(buffer);
|
||||
jsf.Buffer = (char *)buffer;
|
||||
JAM_PutSubfield(jsp, &jsf);
|
||||
|
||||
jsf.LoID = JAMSFLD_RECVRNAME;
|
||||
jsf.HiID = 0;
|
||||
jsf.DatLen = strlen(to);
|
||||
jsf.Buffer = (char *)to;
|
||||
JAM_PutSubfield(jsp, &jsf);
|
||||
|
||||
jsf.LoID = JAMSFLD_SUBJECT;
|
||||
jsf.HiID = 0;
|
||||
jsf.DatLen = strlen(subj);
|
||||
jsf.Buffer = (char *)subj;
|
||||
JAM_PutSubfield(jsp, &jsf);
|
||||
|
||||
if (conf.mail_conferences[conference]->mail_areas[area]->type == TYPE_ECHOMAIL_AREA) {
|
||||
jmh.Attribute |= MSG_TYPEECHO;
|
||||
|
||||
if (conf.mail_conferences[conference]->nettype == NETWORK_FIDO) {
|
||||
if (conf.mail_conferences[conference]->fidoaddr->point) {
|
||||
sprintf(buffer, "%d:%d/%d.%d", conf.mail_conferences[conference]->fidoaddr->zone,
|
||||
conf.mail_conferences[conference]->fidoaddr->net,
|
||||
conf.mail_conferences[conference]->fidoaddr->node,
|
||||
conf.mail_conferences[conference]->fidoaddr->point);
|
||||
} else {
|
||||
sprintf(buffer, "%d:%d/%d", conf.mail_conferences[conference]->fidoaddr->zone,
|
||||
conf.mail_conferences[conference]->fidoaddr->net,
|
||||
conf.mail_conferences[conference]->fidoaddr->node);
|
||||
}
|
||||
jsf.LoID = JAMSFLD_OADDRESS;
|
||||
jsf.HiID = 0;
|
||||
jsf.DatLen = strlen(buffer);
|
||||
jsf.Buffer = (char *)buffer;
|
||||
JAM_PutSubfield(jsp, &jsf);
|
||||
|
||||
snprintf(timestr, 16, "%016lx", time(NULL));
|
||||
|
||||
sprintf(buffer, "%d:%d/%d.%d %s", conf.mail_conferences[conference]->fidoaddr->zone,
|
||||
conf.mail_conferences[conference]->fidoaddr->net,
|
||||
conf.mail_conferences[conference]->fidoaddr->node,
|
||||
conf.mail_conferences[conference]->fidoaddr->point,
|
||||
×tr[strlen(timestr) - 8]);
|
||||
|
||||
jsf.LoID = JAMSFLD_MSGID;
|
||||
jsf.HiID = 0;
|
||||
jsf.DatLen = strlen(buffer);
|
||||
jsf.Buffer = (char *)buffer;
|
||||
JAM_PutSubfield(jsp, &jsf);
|
||||
jmh.MsgIdCRC = JAM_Crc32(buffer, strlen(buffer));
|
||||
|
||||
if (strcasecmp(replyid, "NULL") != 0) {
|
||||
jsf.LoID = JAMSFLD_REPLYID;
|
||||
jsf.HiID = 0;
|
||||
jsf.DatLen = strlen(replyid);
|
||||
jsf.Buffer = (char *)replyid;
|
||||
JAM_PutSubfield(jsp, &jsf);
|
||||
jmh.ReplyCRC = JAM_Crc32(buffer, strlen(replyid));
|
||||
}
|
||||
}
|
||||
}
|
||||
while (1) {
|
||||
z = JAM_LockMB(jb, 100);
|
||||
if (z == 0) {
|
||||
break;
|
||||
} else if (z == JAM_LOCK_FAILED) {
|
||||
sleep(1);
|
||||
} else {
|
||||
JAM_CloseMB(jb);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (z != 0) {
|
||||
JAM_CloseMB(jb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (conf.mail_conferences[conference]->tagline != NULL) {
|
||||
tagline = conf.mail_conferences[conference]->tagline;
|
||||
} else {
|
||||
tagline = conf.default_tagline;
|
||||
}
|
||||
|
||||
uname(&name);
|
||||
|
||||
if (conf.mail_conferences[conference]->nettype == NETWORK_FIDO) {
|
||||
if (conf.mail_conferences[conference]->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[conference]->fidoaddr->zone,
|
||||
conf.mail_conferences[conference]->fidoaddr->net,
|
||||
conf.mail_conferences[conference]->fidoaddr->node);
|
||||
} 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[conference]->fidoaddr->zone,
|
||||
conf.mail_conferences[conference]->fidoaddr->net,
|
||||
conf.mail_conferences[conference]->fidoaddr->node,
|
||||
conf.mail_conferences[conference]->fidoaddr->point);
|
||||
}
|
||||
} 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);
|
||||
}
|
||||
body2 = (char *)malloc(strlen(body) + 2 + strlen(buffer));
|
||||
memset(body2, 0, strlen(body) + 2 + strlen(buffer));
|
||||
|
||||
for (z =0;z < strlen(body); z++) {
|
||||
if (body[z] == '\n') {
|
||||
body2[z] = '\r';
|
||||
} else {
|
||||
body2[z] = body[z];
|
||||
}
|
||||
}
|
||||
strcat(body2, buffer);
|
||||
|
||||
if (JAM_AddMessage(jb, &jmh, jsp, (char *)body2, strlen(body2))) {
|
||||
|
||||
} else {
|
||||
if (conf.mail_conferences[conference]->mail_areas[area]->type == TYPE_ECHOMAIL_AREA) {
|
||||
if (conf.echomail_sem != NULL) {
|
||||
sem_fd = open(conf.echomail_sem, O_RDWR | O_CREAT, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
|
||||
close(sem_fd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free(body2);
|
||||
|
||||
JAM_UnlockMB(jb);
|
||||
|
||||
JAM_DelSubPacket(jsp);
|
||||
JAM_CloseMB(jb);
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
char *www_new_msg(struct user_record *user, int conference, int area) {
|
||||
char *page;
|
||||
int max_len;
|
||||
int len;
|
||||
char buffer[4096];
|
||||
|
||||
page = (char *)malloc(4096);
|
||||
max_len = 4096;
|
||||
len = 0;
|
||||
memset(page, 0, 4096);
|
||||
|
||||
sprintf(buffer, "<div class=\"content-header\"><h2>New Message</h2></div>\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<form action=\"/msgs/\" method=\"POST\">\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<input type=\"hidden\" name=\"conference\" value=\"%d\" />\n", conference);
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
sprintf(buffer, "<input type=\"hidden\" name=\"area\" value=\"%d\" />\n", area);
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<input type=\"hidden\" name=\"replyid\" value=\"NULL\" />\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "To : <input type=\"text\" name=\"recipient\" value=\"All\" /><br />\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "Subject : <input type=\"text\" name=\"subject\" /><br />\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<textarea name=\"body\" rows=25 cols=80></textarea>\n<br />");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
sprintf(buffer, "<input type=\"submit\" name=\"submit\" value=\"Send\" />\n<br />");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
|
||||
sprintf(buffer, "</form>\n");
|
||||
if (len + strlen(buffer) > max_len - 1) {
|
||||
max_len += 4096;
|
||||
page = (char *)realloc(page, max_len);
|
||||
}
|
||||
strcat(page, buffer);
|
||||
len += strlen(buffer);
|
||||
|
||||
return page;
|
||||
}
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user