Rewrote email to use sqlite3
This commit is contained in:
parent
212f46a820
commit
88566cfd51
2
Makefile
2
Makefile
@ -3,7 +3,7 @@ CFLAGS=-I/usr/local/include
|
|||||||
DEPS = bbs.h
|
DEPS = bbs.h
|
||||||
JAMLIB = jamlib/jamlib.a
|
JAMLIB = jamlib/jamlib.a
|
||||||
|
|
||||||
OBJ = inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o doors.o bbs_list.o chat_system.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
|
||||||
%.o: %.c $(DEPS)
|
%.o: %.c $(DEPS)
|
||||||
$(CC) -c -o $@ $< $(CFLAGS)
|
$(CC) -c -o $@ $< $(CFLAGS)
|
||||||
|
|
||||||
|
7
bbs.c
7
bbs.c
@ -307,8 +307,6 @@ static int handler(void* user, const char* section, const char* name,
|
|||||||
conf->ansi_path = strdup(value);
|
conf->ansi_path = strdup(value);
|
||||||
} else if (strcasecmp(name, "bbs path") == 0) {
|
} else if (strcasecmp(name, "bbs path") == 0) {
|
||||||
conf->bbs_path = strdup(value);
|
conf->bbs_path = strdup(value);
|
||||||
} else if (strcasecmp(name, "email path") == 0) {
|
|
||||||
conf->email_path = strdup(value);
|
|
||||||
}
|
}
|
||||||
} else if (strcasecmp(section, "mail conferences") == 0) {
|
} else if (strcasecmp(section, "mail conferences") == 0) {
|
||||||
if (conf->mail_conference_count == 0) {
|
if (conf->mail_conference_count == 0) {
|
||||||
@ -558,10 +556,7 @@ void display_last10_callers(int socket, struct user_record *user, int record) {
|
|||||||
void display_info(int socket) {
|
void display_info(int socket) {
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
struct utsname name;
|
struct utsname name;
|
||||||
int mailwaiting;
|
|
||||||
|
|
||||||
mailwaiting = mail_getemailcount(gUser);
|
|
||||||
|
|
||||||
uname(&name);
|
uname(&name);
|
||||||
|
|
||||||
sprintf(buffer, "\r\n\r\n\e[1;37mSystem Information\r\n");
|
sprintf(buffer, "\r\n\r\n\e[1;37mSystem Information\r\n");
|
||||||
|
7
bbs.h
7
bbs.h
@ -82,7 +82,6 @@ struct bbs_config {
|
|||||||
|
|
||||||
char *ansi_path;
|
char *ansi_path;
|
||||||
char *bbs_path;
|
char *bbs_path;
|
||||||
char *email_path;
|
|
||||||
char *default_tagline;
|
char *default_tagline;
|
||||||
|
|
||||||
char *irc_server;
|
char *irc_server;
|
||||||
@ -147,12 +146,16 @@ extern void list_users(int socket, struct user_record *user);
|
|||||||
extern void main_menu(int socket, struct user_record *user);
|
extern void main_menu(int socket, struct user_record *user);
|
||||||
|
|
||||||
extern void mail_scan(int socket, struct user_record *user);
|
extern void mail_scan(int socket, struct user_record *user);
|
||||||
extern int mail_getemailcount(struct user_record *user);
|
|
||||||
extern int mail_menu(int socket, struct user_record *user);
|
extern int mail_menu(int socket, struct user_record *user);
|
||||||
|
extern char *editor(int socket, struct user_record *user, char *quote, char *from);
|
||||||
|
|
||||||
extern int door_menu(int socket, struct user_record *user);
|
extern int door_menu(int socket, struct user_record *user);
|
||||||
|
|
||||||
extern void bbs_list(int socket, struct user_record *user);
|
extern void bbs_list(int socket, struct user_record *user);
|
||||||
|
|
||||||
extern void chat_system(int sock, struct user_record *user);
|
extern void chat_system(int sock, struct user_record *user);
|
||||||
|
|
||||||
|
extern int mail_getemailcount(struct user_record *user);
|
||||||
|
extern void send_email(int socket, struct user_record *user);
|
||||||
|
extern void list_emails(int socket, struct user_record *user);
|
||||||
#endif
|
#endif
|
||||||
|
@ -11,7 +11,6 @@ Default Tagline = Brought to you by Another Magicka BBS!
|
|||||||
[paths]
|
[paths]
|
||||||
ANSI Path = /home/andrew/MagickaBBS/ansis
|
ANSI Path = /home/andrew/MagickaBBS/ansis
|
||||||
BBS Path = /home/andrew/MagickaBBS
|
BBS Path = /home/andrew/MagickaBBS
|
||||||
Email Path = /home/andrew/MagickaBBS/msgs/email
|
|
||||||
|
|
||||||
[mail conferences]
|
[mail conferences]
|
||||||
Local Mail = config/localmail.ini
|
Local Mail = config/localmail.ini
|
||||||
|
381
email.c
Normal file
381
email.c
Normal file
@ -0,0 +1,381 @@
|
|||||||
|
#include <sqlite3.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include "bbs.h"
|
||||||
|
|
||||||
|
extern struct bbs_config conf;
|
||||||
|
|
||||||
|
void send_email(int socket, struct user_record *user) {
|
||||||
|
char buffer[256];
|
||||||
|
sqlite3 *db;
|
||||||
|
sqlite3_stmt *res;
|
||||||
|
int rc;
|
||||||
|
char *recipient;
|
||||||
|
char *subject;
|
||||||
|
char *msg;
|
||||||
|
char *csql = "CREATE TABLE IF NOT EXISTS email ("
|
||||||
|
"id INTEGER PRIMARY KEY,"
|
||||||
|
"sender TEXT COLLATE NOCASE,"
|
||||||
|
"recipient TEXT COLLATE NOCASE,"
|
||||||
|
"subject TEXT,"
|
||||||
|
"body TEXT,"
|
||||||
|
"date INTEGER,"
|
||||||
|
"seen INTEGER);";
|
||||||
|
char *isql = "INSERT INTO email (sender, recipient, subject, body, date, seen) VALUES(?, ?, ?, ?, ?, 0)";
|
||||||
|
char *err_msg = 0;
|
||||||
|
|
||||||
|
s_putstring(socket, "\r\nTO: ");
|
||||||
|
s_readstring(socket, buffer, 16);
|
||||||
|
|
||||||
|
if (strlen(buffer) == 0) {
|
||||||
|
s_putstring(socket, "\r\nAborted\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (check_user(buffer)) {
|
||||||
|
s_putstring(socket, "\r\n\r\nInvalid Username\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
recipient = strdup(buffer);
|
||||||
|
s_putstring(socket, "\r\nSUBJECT: ");
|
||||||
|
s_readstring(socket, buffer, 25);
|
||||||
|
if (strlen(buffer) == 0) {
|
||||||
|
free(recipient);
|
||||||
|
s_putstring(socket, "\r\nAborted\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
subject = strdup(buffer);
|
||||||
|
|
||||||
|
// post a message
|
||||||
|
msg = editor(socket, user, NULL, NULL);
|
||||||
|
|
||||||
|
if (msg != NULL) {
|
||||||
|
sprintf(buffer, "%s/email.sq3", conf.bbs_path);
|
||||||
|
|
||||||
|
rc = sqlite3_open(buffer, &db);
|
||||||
|
if (rc != SQLITE_OK) {
|
||||||
|
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
|
||||||
|
sqlite3_close(db);
|
||||||
|
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rc = sqlite3_exec(db, csql, 0, 0, &err_msg);
|
||||||
|
if (rc != SQLITE_OK ) {
|
||||||
|
|
||||||
|
fprintf(stderr, "SQL error: %s\n", err_msg);
|
||||||
|
|
||||||
|
sqlite3_free(err_msg);
|
||||||
|
sqlite3_close(db);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = sqlite3_prepare_v2(db, isql, -1, &res, 0);
|
||||||
|
|
||||||
|
if (rc == SQLITE_OK) {
|
||||||
|
sqlite3_bind_text(res, 1, user->loginname, -1, 0);
|
||||||
|
sqlite3_bind_text(res, 2, recipient, -1, 0);
|
||||||
|
sqlite3_bind_text(res, 3, subject, -1, 0);
|
||||||
|
sqlite3_bind_text(res, 4, msg, -1, 0);
|
||||||
|
sqlite3_bind_int(res, 5, time(NULL));
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db));
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
s_putstring(socket, "\r\nNo such email\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sqlite3_step(res);
|
||||||
|
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
free(msg);
|
||||||
|
}
|
||||||
|
free(subject);
|
||||||
|
free(recipient);
|
||||||
|
}
|
||||||
|
|
||||||
|
void show_email(int socket, struct user_record *user, int msgno) {
|
||||||
|
char buffer[256];
|
||||||
|
sqlite3 *db;
|
||||||
|
sqlite3_stmt *res;
|
||||||
|
int rc;
|
||||||
|
char *sql = "SELECT id,sender,subject,body,date FROM email WHERE recipient LIKE ? LIMIT ?, 1";
|
||||||
|
char *dsql = "DELETE FROM email WHERE id=?";
|
||||||
|
char *isql = "INSERT INTO email (sender, recipient, subject, body, date, seen) VALUES(?, ?, ?, ?, ?, 0)";
|
||||||
|
int id;
|
||||||
|
char *sender;
|
||||||
|
char *subject;
|
||||||
|
char *body;
|
||||||
|
time_t date;
|
||||||
|
struct tm msg_date;
|
||||||
|
int z;
|
||||||
|
int lines;
|
||||||
|
char c;
|
||||||
|
char *replybody;
|
||||||
|
|
||||||
|
sprintf(buffer, "%s/email.sq3", conf.bbs_path);
|
||||||
|
|
||||||
|
rc = sqlite3_open(buffer, &db);
|
||||||
|
if (rc != SQLITE_OK) {
|
||||||
|
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
|
||||||
|
sqlite3_close(db);
|
||||||
|
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
rc = sqlite3_prepare_v2(db, sql, -1, &res, 0);
|
||||||
|
|
||||||
|
if (rc == SQLITE_OK) {
|
||||||
|
sqlite3_bind_text(res, 1, user->loginname, -1, 0);
|
||||||
|
sqlite3_bind_int(res, 2, msgno);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db));
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
s_putstring(socket, "\r\nNo such email\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (sqlite3_step(res) == SQLITE_ROW) {
|
||||||
|
id = sqlite3_column_int(res, 0);
|
||||||
|
sender = strdup((char *)sqlite3_column_text(res, 1));
|
||||||
|
subject = strdup((char *)sqlite3_column_text(res, 2));
|
||||||
|
body = strdup((char *)sqlite3_column_text(res, 3));
|
||||||
|
date = (time_t)sqlite3_column_int(res, 4);
|
||||||
|
|
||||||
|
|
||||||
|
sprintf(buffer, "\e[2J\e[1;32mFrom : \e[1;37m%s\r\n", sender);
|
||||||
|
s_putstring(socket, buffer);
|
||||||
|
sprintf(buffer, "\e[1;32mSubject : \e[1;37m%s\r\n", subject);
|
||||||
|
s_putstring(socket, buffer);
|
||||||
|
localtime_r(&date, &msg_date);
|
||||||
|
sprintf(buffer, "\e[1;32mDate : \e[1;37m%s", asctime(&msg_date));
|
||||||
|
buffer[strlen(buffer) - 1] = '\0';
|
||||||
|
strcat(buffer, "\r\n");
|
||||||
|
s_putstring(socket, buffer);
|
||||||
|
s_putstring(socket, "\e[1;30m-------------------------------------------------------------------------------\e[0m\r\n");
|
||||||
|
|
||||||
|
lines = 0;
|
||||||
|
|
||||||
|
for (z=0;z<strlen(body);z++) {
|
||||||
|
if (body[z] == '\r') {
|
||||||
|
s_putstring(socket, "\r\n");
|
||||||
|
lines++;
|
||||||
|
if (lines == 18) {
|
||||||
|
s_putstring(socket, "Press a key to continue...\r\n");
|
||||||
|
s_getc(socket);
|
||||||
|
lines = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
s_putchar(socket, body[z]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
s_putstring(socket, "Press R to reply, D to delete Enter to quit...\r\n");
|
||||||
|
c = s_getc(socket);
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
if (tolower(c) == 'r') {
|
||||||
|
if (subject != NULL) {
|
||||||
|
sprintf(buffer, "RE: %s", subject);
|
||||||
|
free(subject);
|
||||||
|
}
|
||||||
|
subject = (char *)malloc(strlen(buffer) + 1);
|
||||||
|
strcpy(subject, buffer);
|
||||||
|
|
||||||
|
replybody = editor(socket, user, body, sender);
|
||||||
|
|
||||||
|
if (replybody != NULL) {
|
||||||
|
rc = sqlite3_prepare_v2(db, isql, -1, &res, 0);
|
||||||
|
|
||||||
|
if (rc == SQLITE_OK) {
|
||||||
|
sqlite3_bind_text(res, 1, user->loginname, -1, 0);
|
||||||
|
sqlite3_bind_text(res, 2, sender, -1, 0);
|
||||||
|
sqlite3_bind_text(res, 3, subject, -1, 0);
|
||||||
|
sqlite3_bind_text(res, 4, replybody, -1, 0);
|
||||||
|
sqlite3_bind_int(res, 5, time(NULL));
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db));
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
s_putstring(socket, "\r\nNo such email\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sqlite3_step(res);
|
||||||
|
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
free(replybody);
|
||||||
|
}
|
||||||
|
free(sender);
|
||||||
|
free(subject);
|
||||||
|
free(body);
|
||||||
|
sqlite3_close(db);
|
||||||
|
} else if (tolower(c) == 'd') {
|
||||||
|
free(sender);
|
||||||
|
free(subject);
|
||||||
|
free(body);
|
||||||
|
|
||||||
|
rc = sqlite3_prepare_v2(db, dsql, -1, &res, 0);
|
||||||
|
|
||||||
|
if (rc == SQLITE_OK) {
|
||||||
|
sqlite3_bind_int(res, 1, id);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db));
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
s_putstring(socket, "\r\nNo such email\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sqlite3_step(res);
|
||||||
|
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
printf("Failed\n");
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void list_emails(int socket, struct user_record *user) {
|
||||||
|
char buffer[256];
|
||||||
|
sqlite3 *db;
|
||||||
|
sqlite3_stmt *res;
|
||||||
|
int rc;
|
||||||
|
char *sql = "SELECT sender,subject,seen,date FROM email WHERE recipient LIKE ?";
|
||||||
|
char *subject;
|
||||||
|
char *from;
|
||||||
|
char *to;
|
||||||
|
char *body;
|
||||||
|
time_t date;
|
||||||
|
int seen;
|
||||||
|
int msgid;
|
||||||
|
int msgtoread;
|
||||||
|
struct tm msg_date;
|
||||||
|
|
||||||
|
sprintf(buffer, "%s/email.sq3", conf.bbs_path);
|
||||||
|
|
||||||
|
rc = sqlite3_open(buffer, &db);
|
||||||
|
if (rc != SQLITE_OK) {
|
||||||
|
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
|
||||||
|
sqlite3_close(db);
|
||||||
|
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
rc = sqlite3_prepare_v2(db, sql, -1, &res, 0);
|
||||||
|
|
||||||
|
if (rc == SQLITE_OK) {
|
||||||
|
sqlite3_bind_text(res, 1, user->loginname, -1, 0);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db));
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
s_putstring(socket, "\r\nYou have no email\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
msgid = 0;
|
||||||
|
|
||||||
|
while (sqlite3_step(res) == SQLITE_ROW) {
|
||||||
|
from = strdup((char *)sqlite3_column_text(res, 0));
|
||||||
|
subject = strdup((char *)sqlite3_column_text(res, 1));
|
||||||
|
seen = sqlite3_column_int(res, 2);
|
||||||
|
date = (time_t)sqlite3_column_int(res, 3);
|
||||||
|
localtime_r(&date, &msg_date);
|
||||||
|
if (seen == 0) {
|
||||||
|
sprintf(buffer, "\e[1;30m[\e[1;34m%4d\e[1;30m]\e[1;32m*\e[1;37m%-39.39s \e[1;32m%-16.16s \e[1;35m%02d:%02d %02d-%02d-%02d\e[0m\r\n", msgid, subject, from, 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, "\e[1;30m[\e[1;34m%4d\e[1;30m] \e[1;37m%-39.39s \e[1;32m%-16.16s \e[1;35m%02d:%02d %02d-%02d-%02d\e[0m\r\n", msgid, subject, from, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, msg_date.tm_year - 100);
|
||||||
|
}
|
||||||
|
s_putstring(socket, buffer);
|
||||||
|
|
||||||
|
free(from);
|
||||||
|
free(subject);
|
||||||
|
|
||||||
|
if (msgid % 22 && msgid != 0) {
|
||||||
|
s_putstring(socket, "Enter # to read, Q to quit or Enter to continue\r\n");
|
||||||
|
|
||||||
|
s_readstring(socket, buffer, 5);
|
||||||
|
if (strlen(buffer) > 0) {
|
||||||
|
if (tolower(buffer[0]) == 'q') {
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
msgtoread = atoi(buffer);
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
show_email(socket, user, msgtoread);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
msgid++;
|
||||||
|
}
|
||||||
|
if (msgid == 0) {
|
||||||
|
s_putstring(socket, "\r\nYou have no email\r\n");
|
||||||
|
} else {
|
||||||
|
s_putstring(socket, "Enter # to read, or Enter to quit\r\n");
|
||||||
|
s_readstring(socket, buffer, 5);
|
||||||
|
if (strlen(buffer) > 0) {
|
||||||
|
msgtoread = atoi(buffer);
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
show_email(socket, user, msgtoread);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int mail_getemailcount(struct user_record *user) {
|
||||||
|
char *sql = "SELECT COUNT(*) FROM email WHERE recipient LIKE ?";
|
||||||
|
int count;
|
||||||
|
char buffer[256];
|
||||||
|
sqlite3 *db;
|
||||||
|
sqlite3_stmt *res;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
sprintf(buffer, "%s/email.sq3", conf.bbs_path);
|
||||||
|
|
||||||
|
rc = sqlite3_open(buffer, &db);
|
||||||
|
if (rc != SQLITE_OK) {
|
||||||
|
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
|
||||||
|
sqlite3_close(db);
|
||||||
|
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
rc = sqlite3_prepare_v2(db, sql, -1, &res, 0);
|
||||||
|
|
||||||
|
if (rc == SQLITE_OK) {
|
||||||
|
sqlite3_bind_text(res, 1, user->loginname, -1, 0);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db));
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
|
||||||
|
if (sqlite3_step(res) == SQLITE_ROW) {
|
||||||
|
count = sqlite3_column_int(res, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
408
mail_menu.c
408
mail_menu.c
@ -1293,380 +1293,14 @@ int mail_menu(int socket, struct user_record *user) {
|
|||||||
break;
|
break;
|
||||||
case 'e':
|
case 'e':
|
||||||
{
|
{
|
||||||
s_putstring(socket, "\r\nTO: ");
|
send_email(socket, user);
|
||||||
s_readstring(socket, buffer, 16);
|
|
||||||
|
|
||||||
if (strlen(buffer) == 0) {
|
|
||||||
s_putstring(socket, "\r\nAborted\r\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (check_user(buffer)) {
|
|
||||||
s_putstring(socket, "\r\n\r\nInvalid Username\r\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
to = strdup(buffer);
|
|
||||||
s_putstring(socket, "\r\nSUBJECT: ");
|
|
||||||
s_readstring(socket, buffer, 25);
|
|
||||||
if (strlen(buffer) == 0) {
|
|
||||||
free(to);
|
|
||||||
s_putstring(socket, "\r\nAborted\r\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
subject = strdup(buffer);
|
|
||||||
|
|
||||||
// post a message
|
|
||||||
msg = editor(socket, user, NULL, NULL);
|
|
||||||
|
|
||||||
if (msg != NULL) {
|
|
||||||
jb = open_jam_base(conf.email_path);
|
|
||||||
if (!jb) {
|
|
||||||
printf("Error opening JAM base.. %s\n", conf.email_path);
|
|
||||||
free(msg);
|
|
||||||
free(to);
|
|
||||||
free(subject);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
JAM_ClearMsgHeader( &jmh );
|
|
||||||
jmh.DateWritten = (uint32_t)time(NULL);
|
|
||||||
jmh.Attribute |= MSG_PRIVATE;
|
|
||||||
|
|
||||||
strcpy(buffer, user->loginname);
|
|
||||||
|
|
||||||
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(subject);
|
|
||||||
jsf.Buffer = (char *)subject;
|
|
||||||
JAM_PutSubfield(jsp, &jsf);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
z = JAM_LockMB(jb, 100);
|
|
||||||
if (z == 0) {
|
|
||||||
break;
|
|
||||||
} else if (z == JAM_LOCK_FAILED) {
|
|
||||||
sleep(1);
|
|
||||||
} else {
|
|
||||||
free(msg);
|
|
||||||
free(to);
|
|
||||||
free(subject);
|
|
||||||
printf("Failed to lock msg base!\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (z != 0) {
|
|
||||||
JAM_CloseMB(jb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (JAM_AddMessage(jb, &jmh, jsp, (char *)msg, strlen(msg))) {
|
|
||||||
printf("Failed to add message\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
JAM_UnlockMB(jb);
|
|
||||||
|
|
||||||
JAM_DelSubPacket(jsp);
|
|
||||||
free(msg);
|
|
||||||
JAM_CloseMB(jb);
|
|
||||||
}
|
|
||||||
free(to);
|
|
||||||
free(subject);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
{
|
{
|
||||||
// Read your email...
|
// Read your email...
|
||||||
s_putstring(socket, "\r\n");
|
s_putstring(socket, "\r\n");
|
||||||
// list mail in message base
|
list_emails(socket, user);
|
||||||
jb = open_jam_base(conf.email_path);
|
|
||||||
if (!jb) {
|
|
||||||
printf("Error opening JAM base.. %s\n", conf.mail_conferences[user->cur_mail_conf]->mail_areas[user->cur_mail_area]->path);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
jam_crc = JAM_Crc32((char *)user->loginname, strlen(user->loginname));
|
|
||||||
lastmsg = 0;
|
|
||||||
while (JAM_FindUser(jb, jam_crc, lastmsg, &currmsg) == 0) {
|
|
||||||
if (JAM_ReadMsgHeader(jb, currmsg, &jmh, &jsp) != 0) {
|
|
||||||
lastmsg = currmsg + 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (jmh.Attribute & MSG_DELETED) {
|
|
||||||
JAM_DelSubPacket(jsp);
|
|
||||||
lastmsg = currmsg + 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (jmh.Attribute & MSG_NODISP) {
|
|
||||||
JAM_DelSubPacket(jsp);
|
|
||||||
lastmsg = currmsg + 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
subject = NULL;
|
|
||||||
from = 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sprintf(buffer, "[%3d]. %s From %s\r\n", currmsg, subject, from);
|
|
||||||
if (subject != NULL) {
|
|
||||||
free(subject);
|
|
||||||
}
|
|
||||||
if (from != NULL) {
|
|
||||||
free(from);
|
|
||||||
}
|
|
||||||
s_putstring(socket, buffer);
|
|
||||||
JAM_DelSubPacket(jsp);
|
|
||||||
lastmsg = currmsg + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lastmsg == 0) {
|
|
||||||
s_putstring(socket, "\r\nYou have no mail...\r\n");
|
|
||||||
JAM_CloseMB(jb);
|
|
||||||
} else {
|
|
||||||
s_putstring(socket, "(#) View Message\r\n");
|
|
||||||
s_readstring(socket, buffer, 5);
|
|
||||||
currmsg = atoi(buffer);
|
|
||||||
|
|
||||||
if (JAM_ReadMsgHeader(jb, currmsg, &jmh, &jsp) != 0) {
|
|
||||||
JAM_CloseMB(jb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (jmh.Attribute & MSG_DELETED) {
|
|
||||||
JAM_DelSubPacket(jsp);
|
|
||||||
JAM_CloseMB(jb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (jmh.Attribute & MSG_NODISP) {
|
|
||||||
JAM_DelSubPacket(jsp);
|
|
||||||
JAM_CloseMB(jb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
subject = NULL;
|
|
||||||
from = NULL;
|
|
||||||
to = 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 (strcasecmp(from, user->loginname) == 0) {
|
|
||||||
sprintf(buffer, "\e[2J\e[1;32mFrom : \e[1;37m%s\r\n", from);
|
|
||||||
s_putstring(socket, buffer);
|
|
||||||
sprintf(buffer, "\e[1;32mTo : \e[1;37m%s\r\n", to);
|
|
||||||
s_putstring(socket, buffer);
|
|
||||||
sprintf(buffer, "\e[1;32mSubject : \e[1;37m%s\r\n", subject);
|
|
||||||
s_putstring(socket, buffer);
|
|
||||||
localtime_r((time_t *)&jmh.DateWritten, &msg_date);
|
|
||||||
sprintf(buffer, "\e[1;32mDate : \e[1;37m%s", asctime(&msg_date));
|
|
||||||
buffer[strlen(buffer) - 1] = '\0';
|
|
||||||
strcat(buffer, "\r\n");
|
|
||||||
s_putstring(socket, buffer);
|
|
||||||
s_putstring(socket, "\e[1;30m-------------------------------------------------------------------------------\e[0m\r\n");
|
|
||||||
body = (char *)malloc(jmh.TxtLen);
|
|
||||||
|
|
||||||
JAM_ReadMsgText(jb, jmh.TxtOffset, jmh.TxtLen, (char *)body);
|
|
||||||
|
|
||||||
JAM_CloseMB(jb);
|
|
||||||
|
|
||||||
lines = 0;
|
|
||||||
|
|
||||||
for (z=0;z<jmh.TxtLen;z++) {
|
|
||||||
if (body[z] == '\r') {
|
|
||||||
s_putstring(socket, "\r\n");
|
|
||||||
lines++;
|
|
||||||
if (lines == 18) {
|
|
||||||
s_putstring(socket, "Press a key to continue...\r\n");
|
|
||||||
s_getc(socket);
|
|
||||||
lines = 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
s_putchar(socket, body[z]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
s_putstring(socket, "Press R to reply, D to delete or any other key to quit...\r\n");
|
|
||||||
|
|
||||||
c = s_getc(socket);
|
|
||||||
|
|
||||||
if (tolower(c) == 'r') {
|
|
||||||
if (subject != NULL) {
|
|
||||||
sprintf(buffer, "RE: %s", subject);
|
|
||||||
free(subject);
|
|
||||||
}
|
|
||||||
subject = (char *)malloc(strlen(buffer) + 1);
|
|
||||||
strcpy(subject, buffer);
|
|
||||||
if (from != NULL) {
|
|
||||||
strcpy(buffer, from);
|
|
||||||
free(from);
|
|
||||||
}
|
|
||||||
|
|
||||||
from = (char *)malloc(strlen(user->loginname) + 1);
|
|
||||||
strcpy(from, user->loginname);
|
|
||||||
|
|
||||||
if (to != NULL) {
|
|
||||||
free(to);
|
|
||||||
}
|
|
||||||
to = (char *)malloc(strlen(buffer) + 1);
|
|
||||||
strcpy(to, buffer);
|
|
||||||
|
|
||||||
replybody = editor(socket, user, body, to);
|
|
||||||
|
|
||||||
if (replybody != NULL) {
|
|
||||||
jb = open_jam_base(conf.email_path);
|
|
||||||
if (!jb) {
|
|
||||||
printf("Error opening JAM base.. %s\n", conf.email_path);
|
|
||||||
free(replybody);
|
|
||||||
free(body);
|
|
||||||
free(subject);
|
|
||||||
free(to);
|
|
||||||
free(from);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
JAM_ClearMsgHeader( &jmh );
|
|
||||||
jmh.DateWritten = (uint32_t)time(NULL);
|
|
||||||
jmh.Attribute |= MSG_PRIVATE;
|
|
||||||
|
|
||||||
jsp = JAM_NewSubPacket();
|
|
||||||
jsf.LoID = JAMSFLD_SENDERNAME;
|
|
||||||
jsf.HiID = 0;
|
|
||||||
jsf.DatLen = strlen(from);
|
|
||||||
jsf.Buffer = (char *)from;
|
|
||||||
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(subject);
|
|
||||||
jsf.Buffer = (char *)subject;
|
|
||||||
JAM_PutSubfield(jsp, &jsf);
|
|
||||||
|
|
||||||
free(body);
|
|
||||||
free(subject);
|
|
||||||
free(to);
|
|
||||||
free(from);
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
z = JAM_LockMB(jb, 100);
|
|
||||||
if (z == 0) {
|
|
||||||
break;
|
|
||||||
} else if (z == JAM_LOCK_FAILED) {
|
|
||||||
sleep(1);
|
|
||||||
} else {
|
|
||||||
free(replybody);
|
|
||||||
printf("Failed to lock msg base!\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (z != 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (JAM_AddMessage(jb, &jmh, jsp, (char *)replybody, strlen(replybody))) {
|
|
||||||
printf("Failed to add message\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
JAM_UnlockMB(jb);
|
|
||||||
|
|
||||||
JAM_DelSubPacket(jsp);
|
|
||||||
free(replybody);
|
|
||||||
JAM_CloseMB(jb);
|
|
||||||
}
|
|
||||||
} else if (tolower(c) == 'd') {
|
|
||||||
jb = open_jam_base(conf.email_path);
|
|
||||||
if (!jb) {
|
|
||||||
printf("Error opening JAM base.. %s\n", conf.email_path);
|
|
||||||
free(body);
|
|
||||||
free(subject);
|
|
||||||
free(to);
|
|
||||||
free(from);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
z = JAM_LockMB(jb, 100);
|
|
||||||
if (z == 0) {
|
|
||||||
break;
|
|
||||||
} else if (z == JAM_LOCK_FAILED) {
|
|
||||||
sleep(1);
|
|
||||||
} else {
|
|
||||||
free(body);
|
|
||||||
free(subject);
|
|
||||||
free(to);
|
|
||||||
free(from);
|
|
||||||
printf("Failed to lock msg base!\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (z != 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
JAM_DeleteMessage(jb, currmsg);
|
|
||||||
JAM_UnlockMB(jb);
|
|
||||||
JAM_CloseMB(jb);
|
|
||||||
free(body);
|
|
||||||
free(subject);
|
|
||||||
free(to);
|
|
||||||
free(from);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
s_putstring(socket, "\r\nInvalid E-Mail\r\n");
|
|
||||||
JAM_CloseMB(jb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '}':
|
case '}':
|
||||||
@ -1787,42 +1421,4 @@ void mail_scan(int socket, struct user_record *user) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int mail_getemailcount(struct user_record *user) {
|
|
||||||
s_JamBase *jb;
|
|
||||||
s_JamBaseHeader jbh;
|
|
||||||
s_JamMsgHeader jmh;
|
|
||||||
s_JamSubPacket* jsp;
|
|
||||||
s_JamSubfield jsf;
|
|
||||||
uint32_t jam_crc;
|
|
||||||
uint32_t lastmsg, currmsg;
|
|
||||||
|
|
||||||
int msg_count = 0;
|
|
||||||
|
|
||||||
jb = open_jam_base(conf.email_path);
|
|
||||||
if (!jb) {
|
|
||||||
printf("Error opening JAM base.. %s\n", conf.mail_conferences[user->cur_mail_conf]->mail_areas[user->cur_mail_area]->path);
|
|
||||||
} else {
|
|
||||||
jam_crc = JAM_Crc32((char *)user->loginname, strlen(user->loginname));
|
|
||||||
lastmsg = 0;
|
|
||||||
while (JAM_FindUser(jb, jam_crc, lastmsg, &currmsg) == 0) {
|
|
||||||
if (JAM_ReadMsgHeader(jb, currmsg, &jmh, &jsp) != 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (jmh.Attribute & MSG_DELETED) {
|
|
||||||
JAM_DelSubPacket(jsp);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (jmh.Attribute & MSG_NODISP) {
|
|
||||||
JAM_DelSubPacket(jsp);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
JAM_DelSubPacket(jsp);
|
|
||||||
msg_count++;
|
|
||||||
lastmsg = currmsg + 1;
|
|
||||||
}
|
|
||||||
JAM_CloseMB(jb);
|
|
||||||
}
|
|
||||||
return msg_count;
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user