X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=textclient%2Fmessages.c;h=31ca9011f6d6a6b39310df58402286eaf1eb33fc;hb=633eabfc5820a6cc3b3c45793243928d0fa9c099;hp=a6d5201728b674ba694828eb0c2d3ce5dfc19718;hpb=da6bb5e24252a0ff56d314a60081ae9ed31ab1a7;p=citadel.git diff --git a/textclient/messages.c b/textclient/messages.c index a6d520172..31ca9011f 100644 --- a/textclient/messages.c +++ b/textclient/messages.c @@ -1,16 +1,14 @@ -/* - * Text client functions for reading and writing of messages - * - * Copyright (c) 1987-2018 by the citadel.org team - * - * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ +// Text client functions for reading and writing of messages +// +// Copyright (c) 1987-2020 by the citadel.org team +// +// This program is open source software. Use, duplication, and/or +// disclosure are subject to the GNU General Purpose License version 3. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. #include "textclient.h" @@ -66,7 +64,6 @@ int has_images = 0; /* Current msg has images */ struct parts *last_message_parts = NULL; /* Parts from last msg */ - void ka_sigcatch(int signum) { alarm(S_KEEPALIVE); @@ -127,7 +124,6 @@ int ka_system(char *shc) } - /* * add a newline to the buffer... */ @@ -342,59 +338,71 @@ void free_parts(struct parts *p) /* * This is a mini RFC2047 decoder. * It only handles strings encoded from UTF-8 as Quoted-printable. + * We can do this "in place" because the converted string will always be smaller than the source string. */ void mini_2047_decode(char *s) { - if (!s) + if (!s) { // no null strings allowed! return; + } - char *qstart = strstr(s, "=?UTF-8?Q?"); - if (!qstart) + char *qstart = strstr(s, "=?UTF-8?Q?"); // Must start with this string + if (!qstart) { return; + } - char *qend = strstr(s, "?="); - if (!qend) + char *qend = strstr(qstart+10, "?="); // Must end with this string + if (!qend) { return; + } - if (qend <= qstart) + if (qend <= qstart) { // And there must be something in between them. return; + } - strcpy(qstart, &qstart[10]); - qend -= 10; + // The string has qualified for conversion. - char *p = qstart; - while (p < qend) { + strcpy(qend, ""); // Strip the trailer + strcpy(qstart, &qstart[10]); // Strip the header - if (p[0] == '=') { + char *r = qstart; // Pointer to where in the string we're reading + char *w = s; // Pointer to where in the string we're writing + while(*r) { // Loop through the source string + if (r[0] == '=') { // "=" means read a hex character char ch[3]; - ch[0] = p[1]; - ch[1] = p[2]; - ch[2] = p[3]; + ch[0] = r[1]; + ch[1] = r[2]; + ch[2] = r[3]; int c; sscanf(ch, "%02x", &c); - p[0] = c; - strcpy(&p[1], &p[3]); - qend -= 2; + w[0] = c; + r += 3; + ++w; } - - if (p[0] == '_') { - p[0] = ' '; + else if (r[0] == '_') { // "_" is a space + w[0] = ' '; + ++r; + ++w; + } + else { // anything else pass through literally + w[0] = r[0]; + ++r; + ++w; } - - ++p; } - - strcpy(qend, &qend[2]); + w[0] = 0; // null terminate } + /* * Read a message from the server */ -int read_message(CtdlIPC * ipc, long num, /* message number */ - int pagin, /* 0 = normal read, 1 = read with pagination, 2 = header */ - FILE * dest) -{ /* Destination file, NULL for screen */ +int read_message(CtdlIPC *ipc, + long num, /* message number */ + int pagin, /* 0 = normal read, 1 = read with pagination, 2 = header */ + FILE *dest /* Destination file, NULL for screen */ +) { char buf[SIZ]; char now[256]; int format_type = 0; @@ -410,7 +418,6 @@ int read_message(CtdlIPC * ipc, long num, /* message number */ char ch; int linelen; int final_line_is_blank = 0; - has_images = 0; sigcaught = 0; @@ -433,7 +440,8 @@ int read_message(CtdlIPC * ipc, long num, /* message number */ if (dest) { fprintf(dest, "\n "); - } else { + } + else { scr_printf("\n"); if (pagin != 2) { scr_printf(" "); @@ -453,8 +461,7 @@ int read_message(CtdlIPC * ipc, long num, /* message number */ if (!IsEmptyStr(message->email)) { scr_printf("rfca=%s\n", message->email); } - scr_printf("room=%s\ntime=%s", message->room, asctime(localtime(&message->time)) - ); + scr_printf("room=%s\ntime=%s", message->room, asctime(localtime(&message->time))); if (!IsEmptyStr(message->recipient)) { scr_printf("rcpt=%s\n", message->recipient); } @@ -489,26 +496,29 @@ int read_message(CtdlIPC * ipc, long num, /* message number */ if (nhdr == 1 && !is_room_aide) { if (dest) { fprintf(dest, " ****"); - } else { + } + else { scr_printf(" ****"); } - } else { + } + else { struct tm thetime; localtime_r(&message->time, &thetime); strftime(now, sizeof now, "%F %R", &thetime); if (dest) { fprintf(dest, "%s from %s ", now, message->author); - if (!IsEmptyStr(message->email)) { + if (!message->is_local) { fprintf(dest, "<%s> ", message->email); } - } else { + } + else { color(BRIGHT_CYAN); scr_printf("%s ", now); color(DIM_WHITE); scr_printf("from "); color(BRIGHT_CYAN); scr_printf("%s ", message->author); - if (!IsEmptyStr(message->email)) { + if (!message->is_local) { color(DIM_WHITE); scr_printf("<"); color(BRIGHT_BLUE); @@ -581,6 +591,7 @@ int read_message(CtdlIPC * ipc, long num, /* message number */ color(BRIGHT_CYAN); mini_2047_decode(message->subject); scr_printf("%s\n", message->subject); + } } } @@ -596,7 +607,7 @@ int read_message(CtdlIPC * ipc, long num, /* message number */ * of the client screen. */ if (!strcasecmp(message->content_type, "text/html")) { - converted_text = html_to_ascii(message->text, 0, screenwidth, 0); + converted_text = html_to_ascii(message->text, 0, screenwidth); if (converted_text != NULL) { free(message->text); message->text = converted_text; @@ -731,6 +742,7 @@ int read_message(CtdlIPC * ipc, long num, /* message number */ return (fr); } + /* * replace string function for the built-in editor */ @@ -796,6 +808,7 @@ void replace_string(char *filename, long int startpos) scr_printf("eplace made %d substitution(s).\n\n", substitutions); } + /* * Function to begin composing a new message */ @@ -1049,7 +1062,21 @@ int entmsg(CtdlIPC * ipc, int is_reply, /* nonzero if this was a eply command int r; /* IPC response code */ int subject_required = 0; - if (!entmsg_ok) { + if (entmsg_ok == ENTMSG_OK_YES) { + /* no problem, go right ahead */ + } + else if (entmsg_ok == ENTMSG_OK_BLOG) { + if (!is_reply) { + scr_printf("WARNING: this is a BLOG room.\n"); + scr_printf("The 'nter Message' command will create a BLOG POST.\n"); + scr_printf("If you want to leave a comment or reply to a comment, use the 'eply' command.\n"); + scr_printf("Do you really want to create a new blog post? "); + if (!yesno()) { + return(1); + } + } + } + else { scr_printf("You may not enter messages in this type of room.\n"); return (1); } @@ -1244,6 +1271,7 @@ int entmsg(CtdlIPC * ipc, int is_reply, /* nonzero if this was a eply command return (0); } + /* * Do editing on a quoted file */ @@ -1278,8 +1306,9 @@ void process_quote(void) } tfile = fopen(temp, "w"); while (fgets(buf, 128, qfile) != NULL) { - if ((++line >= qstart) && (line <= qend)) + if ((++line >= qstart) && (line <= qend)) { fprintf(tfile, " >%s", buf); + } } fprintf(tfile, " \n"); fclose(qfile); @@ -1288,9 +1317,8 @@ void process_quote(void) } - /* - * List the URL's which were embedded in the previous message + * List the URLs which were embedded in the previous message */ void list_urls(CtdlIPC * ipc) { @@ -1299,7 +1327,7 @@ void list_urls(CtdlIPC * ipc) int rv; if (num_urls == 0) { - scr_printf("There were no URL's in the previous message.\n\n"); + scr_printf("There were no URLs in the previous message.\n\n"); return; } @@ -1312,8 +1340,6 @@ void list_urls(CtdlIPC * ipc) snprintf(cmd, sizeof cmd, rc_url_cmd, urls[i - 1]); rv = system(cmd); - if (rv != 0) - scr_printf("failed to '%s' by %d\n", cmd, rv); scr_printf("\n"); } @@ -1480,9 +1506,10 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c, /* see listing in citadel_ipc.h for (num_msgs = 0; msg_arr[num_msgs]; num_msgs++); } - if (num_msgs == 0) { /* TODO look at this later */ - if (c == LastMessages) + if (num_msgs == 0) { + if (c == LastMessages) { return; + } scr_printf("*** There are no "); if (c == NewMessages) scr_printf("new "); @@ -1830,8 +1857,6 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c, /* see listing in citadel_ipc.h } /* end read routine */ - - /* * View and edit a system message */ @@ -1848,11 +1873,8 @@ void edit_system_message(CtdlIPC * ipc, char *which_message) } - - /* - * Loads the contents of a file into memory. Caller must free the allocated - * memory. + * Loads the contents of a file into memory. Caller must free the allocated memory. */ char *load_message_from_file(FILE * src) {