From 76e2fc999fc68cdba872568e667224d592083e72 Mon Sep 17 00:00:00 2001 From: Andrew Pamment Date: Wed, 23 Mar 2016 10:14:31 +1000 Subject: [PATCH] More work on Mail, and New System Info --- bbs.c | 52 +++++++- bbs.h | 2 + mail_menu.c | 347 +++++++++++++++++++++++++++++++++++----------------- 3 files changed, 289 insertions(+), 112 deletions(-) diff --git a/bbs.c b/bbs.c index 556dcda..e40113d 100644 --- a/bbs.c +++ b/bbs.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "inih/ini.h" #include "bbs.h" @@ -187,6 +188,14 @@ char s_getchar(int socket) { disconnect(socket); } } + + if (c == '\r' || c == '\n') { + len = read(socket, &c, 1); + if (len == 0) { + disconnect(socket); + } + } + usertimeout = 10; return (char)c; } @@ -202,6 +211,8 @@ void s_readstring(int socket, char *buffer, int max) { int i; char c; + memset(buffer, 0, max); + for (i=0;i 0) { @@ -212,7 +223,6 @@ void s_readstring(int socket, char *buffer, int max) { } if (c == '\n' || c == '\r') { - c = s_getchar(socket); return; } s_putchar(socket, c); @@ -236,7 +246,6 @@ void s_readpass(int socket, char *buffer, int max) { } if (c == '\n' || c == '\r') { - c = s_getchar(socket); return; } s_putchar(socket, '*'); @@ -256,6 +265,39 @@ void disconnect(int socket) { exit(0); } +void display_info(int socket) { + char buffer[256]; + struct utsname name; + int mailwaiting; + + mailwaiting = mail_getemailcount(gUser); + + uname(&name); + + sprintf(buffer, "\r\n\r\n\e[1;37mSystem Information\r\n"); + s_putstring(socket, buffer); + sprintf(buffer, "\e[1;30m----------------------------------------------\r\n"); + s_putstring(socket, buffer); + sprintf(buffer, "\e[1;32mBBS Name : \e[1;37m%s\r\n", conf.bbs_name); + s_putstring(socket, buffer); + sprintf(buffer, "\e[1;32mSysOp Name : \e[1;37m%s\r\n", conf.sysop_name); + s_putstring(socket, buffer); + sprintf(buffer, "\e[1;32mNode : \e[1;37m%d\r\n", mynode); + s_putstring(socket, buffer); + sprintf(buffer, "\e[1;32mBBS Version : \e[1;37mMagicka %d.%d (%s)\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_STR); + s_putstring(socket, buffer); + sprintf(buffer, "\e[1;32mSystem : \e[1;37m%s (%s)\r\n", name.sysname, name.machine); + s_putstring(socket, buffer); + sprintf(buffer, "\e[1;32mMail Waiting: \e[1;37m%d\r\n", mailwaiting); + s_putstring(socket, buffer); + sprintf(buffer, "\e[1;30m----------------------------------------------\e[0m\r\n"); + s_putstring(socket, buffer); + + sprintf(buffer, "Press any key to continue...\r\n"); + s_putstring(socket, buffer); + s_getc(socket); +} + void runbbs(int socket, char *config_path) { char buffer[256]; char password[17]; @@ -403,6 +445,12 @@ void runbbs(int socket, char *config_path) { } gUser = user; + // bulletins + + // external login cmd + + // display info + display_info(socket); // main menu main_menu(socket, user); diff --git a/bbs.h b/bbs.h index 0ab87f1..5b927ab 100644 --- a/bbs.h +++ b/bbs.h @@ -70,6 +70,7 @@ extern char s_getchar(int socket); extern void s_readstring(int socket, char *buffer, int max); extern char s_getc(int socket); extern void disconnect(int socket); +extern void display_info(int socket); extern int save_user(struct user_record *user); extern int check_user(char *loginname); @@ -79,5 +80,6 @@ extern struct user_record *check_user_pass(int socket, char *loginname, char *pa extern void main_menu(int socket, struct user_record *user); +extern int mail_getemailcount(struct user_record *user); extern int mail_menu(int socket, struct user_record *user); #endif diff --git a/mail_menu.c b/mail_menu.c index 10d889d..fc1f2e2 100644 --- a/mail_menu.c +++ b/mail_menu.c @@ -42,6 +42,7 @@ char *editor(int socket, char *quote, char *from) { char **quotecontent; int lineat=0; int qfrom,qto; + int z; if (quote != NULL) { for (i=0;i %s", from[0], linebuffer); quotelines++; lineat = 0; + linebuffer[0] = '\0'; } else { linebuffer[lineat++] = quote[i]; linebuffer[lineat] = '\0'; } } } - s_putstring(socket, "\r\nMagicka Internal Editor, Type /S to Save, /A to abort and /? for help\r\n"); - s_putstring(socket, "-------------------------------------------------------------------------------"); + s_putstring(socket, "\r\n\e[1;32mMagicka Internal Editor, Type \e[1;37m/S \e[1;32mto save, \e[1;37m/A \e[1;32mto abort and \e[1;37m/? \e[1;32mfor help\r\n"); + s_putstring(socket, "\e[1;30m-------------------------------------------------------------------------------\e[0m"); while(!doquit) { - sprintf(prompt, "\r\n[%3d]: ", lines); + sprintf(prompt, "\r\n\e[1;30m[\e[1;34m%3d\e[1;30m]: \e[0m", lines); s_putstring(socket, prompt); s_readstring(socket, linebuffer, 70); if (linebuffer[0] == '/') { @@ -113,7 +115,7 @@ char *editor(int socket, char *quote, char *from) { } else { s_putstring(socket, "\r\n"); for (i=0;i= lines) { + s_putstring(socket, "\r\nAborted...\r\n"); + } else { + for (i=z;i= lines) { + s_putstring(socket, "\r\nAborted...\r\n"); + } else { + sprintf(buffer, "\r\n\e[1;30m[\e[1;34m%3d\e[1;30m]: \e[0m%s", z, content[z]); + s_putstring(socket, buffer); + sprintf(buffer, "\r\n\e[1;30m[\e[1;34m%3d\e[1;30m]: \e[0m", z); + s_putstring(socket, buffer); + s_readstring(socket, linebuffer, 70); + free(content[z]); + content[z] = strdup(linebuffer); + } + } + } else if (toupper(linebuffer[1]) == 'I') { + s_putstring(socket, "\r\nInsert before which line? "); + s_readstring(socket, buffer, 6); + if (strlen(buffer) == 0) { + s_putstring(socket, "\r\nAborted...\r\n"); + } else { + z = atoi(buffer); + if (z < 0 || z >= lines) { + s_putstring(socket, "\r\nAborted...\r\n"); + } else { + sprintf(buffer, "\r\n\e[1;30m[\e[1;34m%3d\e[1;30m]: \e[0m", z); + s_putstring(socket, buffer); + s_readstring(socket, linebuffer, 70); + lines++; + content = (char **)realloc(content, sizeof(char *) * lines); + + for (i=lines;i>z;i--) { + content[i] = content[i-1]; + } + + content[z] = strdup(linebuffer); + } + } } } else { if (lines == 0) { @@ -196,6 +264,7 @@ void read_message(int socket, struct user_record *user, int mailno) { s_JamSubfield jsf; char buffer[256]; int z; + struct tm msg_date; char *subject = NULL; char *from = NULL; @@ -233,13 +302,21 @@ void read_message(int socket, struct user_record *user, int mailno) { memcpy(to, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen); } } - sprintf(buffer, "\e[2JFrom : %s\r\n", from); + + + + sprintf(buffer, "\e[2J\e[1;32mFrom : \e[1;37m%s\r\n", from); s_putstring(socket, buffer); - sprintf(buffer, "To : %s\r\n", to); + sprintf(buffer, "\e[1;32mTo : \e[1;37m%s\r\n", to); s_putstring(socket, buffer); - sprintf(buffer, "Subject : %s\r\n", subject); + sprintf(buffer, "\e[1;32mSubject : \e[1;37m%s\r\n", subject); s_putstring(socket, buffer); - s_putstring(socket, "-------------------------------------------------------------------------------\r\n"); + 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); @@ -523,102 +600,105 @@ int mail_menu(int socket, struct user_record *user) { break; } else { JAM_ReadMBHeader(jb, &jbh); - - sprintf(buffer, "Start at message [0-%d] ? ", jbh.ActiveMsgs - 1); - s_putstring(socket, buffer); - - s_readstring(socket, buffer, 6); - i = atoi(buffer); - closed = 0; - s_putstring(socket, "\r\n"); - for (j=i;jNumFields;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); - } - - } - - localtime_r((time_t *)&jmh.DateWritten, &msg_date); - - sprintf(buffer, "[%4d] %-25s %-15s %-15s %02d:%02d %02d-%02d-%02d\r\n", j, 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); + if (jbh.ActiveMsgs > 0) { + sprintf(buffer, "Start at message [0-%d] ? ", jbh.ActiveMsgs - 1); s_putstring(socket, buffer); - JAM_DelSubPacket(jsp); - if (subject != NULL) { - free(subject); - } - if (from != NULL) { - free(from); - } - if (to != NULL) { - free(to); - } - if ((j - i) != 0 && (j - i) % 22 == 0) { - sprintf(buffer, "(#) Read Message # (Q) Quit (ENTER) Continue\r\n"); - s_putstring(socket, buffer); - s_readstring(socket, buffer, 6); + s_readstring(socket, buffer, 6); + i = atoi(buffer); + closed = 0; + s_putstring(socket, "\e[2J\e[1;37;44m[MSG#] Subject From To Date \r\n\e[0m"); + for (j=i;j 0) { - z = atoi(buffer); - if (z >= 0 && z <= jbh.ActiveMsgs) { - JAM_CloseMB(jb); - closed = 1; - read_message(socket, user, z); + if (jmh.Attribute & MSG_DELETED) { + JAM_DelSubPacket(jsp); + continue; + } + + if (jmh.Attribute & MSG_NODISP) { + JAM_DelSubPacket(jsp); + continue; + } + subject = NULL; + from = NULL; + to = NULL; + + for (z=0;zNumFields;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); + } + + } + + localtime_r((time_t *)&jmh.DateWritten, &msg_date); + + sprintf(buffer, "\e[1;30m[\e[1;34m%4d\e[1;30m] \e[1;37m%-25s \e[1;32m%-15s \e[1;33m%-15s \e[1;35m%02d:%02d %02d-%02d-%02d\e[0m\r\n", j, 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); + s_putstring(socket, buffer); + JAM_DelSubPacket(jsp); + if (subject != NULL) { + free(subject); + } + if (from != NULL) { + free(from); + } + if (to != NULL) { + free(to); + } + + if ((j - i) != 0 && (j - i) % 22 == 0) { + sprintf(buffer, "(#) Read Message # (Q) Quit (ENTER) Continue\r\n"); + s_putstring(socket, buffer); + s_readstring(socket, buffer, 6); + + if (tolower(buffer[0]) == 'q') { break; + } else if (strlen(buffer) > 0) { + z = atoi(buffer); + if (z >= 0 && z <= jbh.ActiveMsgs) { + JAM_CloseMB(jb); + closed = 1; + read_message(socket, user, z); + break; + } } } - } - - } - sprintf(buffer, "(#) Read Message # (Q) Quit (ENTER) Continue\r\n"); - s_putstring(socket, buffer); - s_readstring(socket, buffer, 6); - if (tolower(buffer[0]) == 'q') { - break; - } else if (strlen(buffer) > 0) { - z = atoi(buffer); - if (z >= 0 && z <= jbh.ActiveMsgs) { - JAM_CloseMB(jb); - closed = 1; - read_message(socket, user, z); - break; } - } - } + sprintf(buffer, "(#) Read Message # (Q) Quit (ENTER) Continue\r\n"); + s_putstring(socket, buffer); + s_readstring(socket, buffer, 6); + + if (tolower(buffer[0]) == 'q') { + break; + } else if (strlen(buffer) > 0) { + z = atoi(buffer); + if (z >= 0 && z <= jbh.ActiveMsgs) { + JAM_CloseMB(jb); + closed = 1; + read_message(socket, user, z); + break; + } + } + } else { + s_putstring(socket, "\r\nThere is no mail in this area\r\n"); + } + } if (closed == 0) { JAM_CloseMB(jb); } @@ -798,16 +878,19 @@ int mail_menu(int socket, struct user_record *user) { 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; @@ -833,7 +916,7 @@ int mail_menu(int socket, struct user_record *user) { free(from); } s_putstring(socket, buffer); - + JAM_DelSubPacket(jsp); lastmsg = currmsg + 1; } @@ -884,14 +967,18 @@ int mail_menu(int socket, struct user_record *user) { } if (strcasecmp(from, user->loginname) == 0) { - sprintf(buffer, "\e[2JFrom : %s\r\n", from); + sprintf(buffer, "\e[2J\e[1;32mFrom : \e[1;37m%s\r\n", from); s_putstring(socket, buffer); - sprintf(buffer, "To : %s\r\n", to); + sprintf(buffer, "\e[1;32mTo : \e[1;37m%s\r\n", to); s_putstring(socket, buffer); - sprintf(buffer, "Subject : %s\r\n", subject); + sprintf(buffer, "\e[1;32mSubject : \e[1;37m%s\r\n", subject); s_putstring(socket, buffer); - s_putstring(socket, "-------------------------------------------------------------------------------\r\n"); - + 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, (uchar *)body); @@ -1060,3 +1147,43 @@ int mail_menu(int socket, struct user_record *user) { return doquit; } + +int mail_getemailcount(struct user_record *user) { + s_JamBase *jb; + s_JamBaseHeader jbh; + s_JamMsgHeader jmh; + s_JamSubPacket* jsp; + s_JamSubfield jsf; + ulong jam_crc; + ulong 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((uchar *)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; +}