From 954e5749b5e0102f8598fcc19fc10267f31a6cda Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Sun, 10 Jul 2022 19:09:54 -0400 Subject: [PATCH] utf8ify_rfc822_string() is in libcitadel now --- citadel/server/internet_addressing.c | 208 ------------- citadel/server/modules/expire/serv_expire.c | 10 +- libcitadel/Makefile.in | 3 + libcitadel/lib/array.c | 15 +- libcitadel/lib/base64.c | 20 +- libcitadel/lib/decode.c | 226 ++++++++++++++ libcitadel/lib/hash.c | 15 +- libcitadel/lib/html_to_ascii.c | 15 +- libcitadel/lib/json.c | 15 +- libcitadel/lib/libcitadel.c | 15 +- libcitadel/lib/libcitadel.h | 12 +- libcitadel/lib/mime_parser.c | 15 +- libcitadel/lib/stringbuf.c | 15 +- libcitadel/lib/tools.c | 16 +- libcitadel/lib/urlhandling.c | 2 + libcitadel/lib/vcard.c | 15 +- libcitadel/lib/vnote.c | 15 +- webcit-ng/static/css/webcit.css | 17 ++ webcit-ng/static/index.html | 2 +- webcit-ng/static/js/view_mail.js | 7 +- webcit/Makefile.in | 4 +- webcit/decode.c | 319 -------------------- webcit/webcit.h | 2 +- 23 files changed, 289 insertions(+), 694 deletions(-) create mode 100644 libcitadel/lib/decode.c delete mode 100644 webcit/decode.c diff --git a/citadel/server/internet_addressing.c b/citadel/server/internet_addressing.c index fa550d75f..5acf8b781 100644 --- a/citadel/server/internet_addressing.c +++ b/citadel/server/internet_addressing.c @@ -34,215 +34,7 @@ #include "parsedate.h" #include "database.h" #include "ctdl_module.h" -#ifdef HAVE_ICONV -#include -// This is the non-define version in case it is needed for debugging -#if 0 -inline void FindNextEnd (char *bptr, char *end) -{ - /* Find the next ?Q? */ - end = strchr(bptr + 2, '?'); - if (end == NULL) return NULL; - if (((*(end + 1) == 'B') || (*(end + 1) == 'Q')) && - (*(end + 2) == '?')) { - /* skip on to the end of the cluster, the next ?= */ - end = strstr(end + 3, "?="); - } - else - /* sort of half valid encoding, try to find an end. */ - end = strstr(bptr, "?="); -} -#endif - -#define FindNextEnd(bptr, end) { \ - end = strchr(bptr + 2, '?'); \ - if (end != NULL) { \ - if (((*(end + 1) == 'B') || (*(end + 1) == 'Q')) && (*(end + 2) == '?')) { \ - end = strstr(end + 3, "?="); \ - } else end = strstr(bptr, "?="); \ - } \ -} - -// Handle subjects with RFC2047 encoding such as: -// =?koi8-r?B?78bP0s3Mxc7JxSDXz9rE1dvO2c3JINvB0sHNySDP?= -void utf8ify_rfc822_string(char *buf) { - char *start, *end, *next, *nextend, *ptr; - char newbuf[1024]; - char charset[128]; - char encoding[16]; - char istr[1024]; - iconv_t ic = (iconv_t)(-1) ; - char *ibuf; // Buffer of characters to be converted - char *obuf; // Buffer for converted characters - size_t ibuflen; // Length of input buffer - size_t obuflen; // Length of output buffer - char *isav; // Saved pointer to input buffer - char *osav; // Saved pointer to output buffer - int passes = 0; - int i, len, delta; - int illegal_non_rfc2047_encoding = 0; - - // Sometimes, badly formed messages contain strings which were simply - // written out directly in some foreign character set instead of - // using RFC2047 encoding. This is illegal but we will attempt to - // handle it anyway by converting from a user-specified default - // charset to UTF-8 if we see any nonprintable characters. - len = strlen(buf); - for (i=0; i 126)) { - illegal_non_rfc2047_encoding = 1; - i = len; // take a shortcut, it won't be more than one. - } - } - if (illegal_non_rfc2047_encoding) { - const char *default_header_charset = "iso-8859-1"; - if ( (strcasecmp(default_header_charset, "UTF-8")) && (strcasecmp(default_header_charset, "us-ascii")) ) { - ctdl_iconv_open("UTF-8", default_header_charset, &ic); - if (ic != (iconv_t)(-1) ) { - ibuf = malloc(1024); - isav = ibuf; - safestrncpy(ibuf, buf, 1024); - ibuflen = strlen(ibuf); - obuflen = 1024; - obuf = (char *) malloc(obuflen); - osav = obuf; - iconv(ic, &ibuf, &ibuflen, &obuf, &obuflen); - osav[1024-obuflen] = 0; - strcpy(buf, osav); - free(osav); - iconv_close(ic); - free(isav); - } - } - } - - // pre evaluate the first pair - nextend = end = NULL; - len = strlen(buf); - start = strstr(buf, "=?"); - if (start != NULL) - FindNextEnd (start, end); - - while ((start != NULL) && (end != NULL)) { - next = strstr(end, "=?"); - if (next != NULL) - FindNextEnd(next, nextend); - if (nextend == NULL) - next = NULL; - - // did we find two partitions - if ((next != NULL) && ((next - end) > 2)) { - ptr = end + 2; - while ((ptr < next) && - (isspace(*ptr) || - (*ptr == '\r') || - (*ptr == '\n') || - (*ptr == '\t'))) - ptr ++; - // did we find a gab just filled with blanks? - if (ptr == next) { - memmove(end + 2, next, len - (next - start)); - - // now terminate the gab at the end - delta = (next - end) - 2; - len -= delta; - buf[len] = '\0'; - - // move next to its new location. - next -= delta; - nextend -= delta; - } - } - // our next-pair is our new first pair now. - start = next; - end = nextend; - } - - // Now we handle foreign character sets properly encoded in RFC2047 format. - start = strstr(buf, "=?"); - FindNextEnd((start != NULL)? start : buf, end); - while (start != NULL && end != NULL && end > start) { - extract_token(charset, start, 1, '?', sizeof charset); - extract_token(encoding, start, 2, '?', sizeof encoding); - extract_token(istr, start, 3, '?', sizeof istr); - - ibuf = malloc(1024); - isav = ibuf; - if (!strcasecmp(encoding, "B")) { // base64 - ibuflen = CtdlDecodeBase64(ibuf, istr, strlen(istr)); - } - else if (!strcasecmp(encoding, "Q")) { // quoted-printable - size_t len; - unsigned long pos; - - len = strlen(istr); - pos = 0; - while (pos < len) { - if (istr[pos] == '_') istr[pos] = ' '; - pos++; - } - ibuflen = CtdlDecodeQuotedPrintable(ibuf, istr, len); - } - else { - strcpy(ibuf, istr); // unknown encoding - ibuflen = strlen(istr); - } - - ctdl_iconv_open("UTF-8", charset, &ic); - if (ic != (iconv_t)(-1) ) { - obuflen = 1024; - obuf = (char *) malloc(obuflen); - osav = obuf; - iconv(ic, &ibuf, &ibuflen, &obuf, &obuflen); - osav[1024-obuflen] = 0; - - end = start; - end++; - strcpy(start, ""); - remove_token(end, 0, '?'); - remove_token(end, 0, '?'); - remove_token(end, 0, '?'); - remove_token(end, 0, '?'); - strcpy(end, &end[1]); - - snprintf(newbuf, sizeof newbuf, "%s%s%s", buf, osav, end); - strcpy(buf, newbuf); - free(osav); - iconv_close(ic); - } - else { - end = start; - end++; - strcpy(start, ""); - remove_token(end, 0, '?'); - remove_token(end, 0, '?'); - remove_token(end, 0, '?'); - remove_token(end, 0, '?'); - strcpy(end, &end[1]); - - snprintf(newbuf, sizeof newbuf, "%s(unreadable)%s", buf, end); - strcpy(buf, newbuf); - } - - free(isav); - - // Since spammers will go to all sorts of absurd lengths to get their - // messages through, there are LOTS of corrupt headers out there. - // So, prevent a really badly formed RFC2047 header from throwing - // this function into an infinite loop. - ++passes; - if (passes > 20) return; - - start = strstr(buf, "=?"); - FindNextEnd((start != NULL)? start : buf, end); - } - -} -#else -inline void utf8ify_rfc822_string(char *a){}; - -#endif char *inetcfg = NULL; diff --git a/citadel/server/modules/expire/serv_expire.c b/citadel/server/modules/expire/serv_expire.c index ff1f94552..e25a18448 100644 --- a/citadel/server/modules/expire/serv_expire.c +++ b/citadel/server/modules/expire/serv_expire.c @@ -320,14 +320,13 @@ int PurgeRooms(void) { while (RoomPurgeList != NULL) { if (CtdlGetRoom(&qrbuf, RoomPurgeList->name) == 0) { transcript=realloc(transcript, strlen(transcript)+SIZ); - snprintf(&transcript[strlen(transcript)], SIZ, " %s\n", - qrbuf.QRname); + snprintf(&transcript[strlen(transcript)], SIZ, " %s\n", qrbuf.QRname); CtdlDeleteRoom(&qrbuf); + ++num_rooms_purged; } pptr = RoomPurgeList->next; free(RoomPurgeList); RoomPurgeList = pptr; - ++num_rooms_purged; } if (num_rooms_purged > 0) CtdlAideMessage(transcript, "Room Autopurger Message"); @@ -464,8 +463,7 @@ int PurgeUsers(void) { strcpy(transcript, "The following users have been auto-purged:\n"); while (UserPurgeList != NULL) { transcript=realloc(transcript, strlen(transcript)+SIZ); - snprintf(&transcript[strlen(transcript)], SIZ, " %s\n", - UserPurgeList->name); + snprintf(&transcript[strlen(transcript)], SIZ, " %s\n", UserPurgeList->name); purge_user(UserPurgeList->name); pptr = UserPurgeList->next; free(UserPurgeList); @@ -503,7 +501,7 @@ int PurgeUsers(void) { // traverse the visit file, checking each record against those two lists and // purging the ones that do not have a match on _both_ lists. (Remember, if // either the room or user being referred to is no longer on the system, the -// record is completely useless.) +// record is useless and should be removed.) // int PurgeVisits(void) { struct cdbdata *cdbvisit; diff --git a/libcitadel/Makefile.in b/libcitadel/Makefile.in index 286d5418c..6273e2c41 100755 --- a/libcitadel/Makefile.in +++ b/libcitadel/Makefile.in @@ -115,6 +115,7 @@ LINK_CXX_EXE = $(LIBTOOL) $(LTFLAGS) --mode=link $(CXXCOMPILE) $(LDFLAGS) -o $@ LIB_OBJS = lib/libcitadel.lo \ lib/mime_parser.lo \ lib/tools.lo \ + lib/decode.lo \ lib/base64.lo \ lib/vcard.lo \ lib/vnote.lo \ @@ -140,6 +141,7 @@ $(LIBRARY): $(LIB_OBJS) lib/libcitadel.lo: lib/libcitadel.c lib/libcitadel.h lib/mime_parser.lo: lib/mime_parser.c lib/libcitadel.h lib/tools.lo: lib/tools.c lib/libcitadel.h +lib/decode.lo: lib/decode.c lib/libcitadel.h lib/base64.lo: lib/base64.c lib/libcitadel.h lib/vcard.lo: lib/vcard.c lib/libcitadel.h lib/vnote.lo: lib/vnote.c lib/libcitadel.h @@ -156,6 +158,7 @@ lib/xdgmime/xdgmimeparent.lo: lib/xdgmime/xdgmimeparent.c lib/xdgmime/xdgmimecache.lo: lib/xdgmime/xdgmimecache.c lib/html_to_ascii.lo: lib/html_to_ascii.c lib/tools.lo: lib/tools.c +lib/decode.lo: lib/decode.c lib/base64.lo: lib/base64.c .SUFFIXES: .c .cpp .lo .o diff --git a/libcitadel/lib/array.c b/libcitadel/lib/array.c index 1adc1fde8..daed5a3aa 100644 --- a/libcitadel/lib/array.c +++ b/libcitadel/lib/array.c @@ -5,19 +5,8 @@ * * Copyright (c) 2021 by Art Cancro * - * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * This program is open source software. Use, duplication, or disclosure + * is subject to the terms of the GNU General Public License, version 3. */ diff --git a/libcitadel/lib/base64.c b/libcitadel/lib/base64.c index a7be64d9a..ef1e01e71 100644 --- a/libcitadel/lib/base64.c +++ b/libcitadel/lib/base64.c @@ -7,19 +7,9 @@ // // Copyright (c) 1987-2022 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 as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// 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. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. + #define _GNU_SOURCE #include "sysdep.h" @@ -101,7 +91,7 @@ size_t CtdlEncodeBase64(char *dest, const char *source, size_t sourcelen, int li // convert base64 alphabet characters to 6-bit decimal values -char unalphabet(char ch) { +char b64unalphabet(char ch) { if (isupper(ch)) { return(ch - 'A'); } @@ -139,7 +129,7 @@ size_t CtdlDecodeBase64(char *dest, const char *source, size_t source_len) { while (bytes_read < source_len) { - char ch = unalphabet(source[bytes_read++]); + char ch = b64unalphabet(source[bytes_read++]); if (ch < 65) { decodebuf[decodepos++] = ch; } diff --git a/libcitadel/lib/decode.c b/libcitadel/lib/decode.c new file mode 100644 index 000000000..10bde0ce0 --- /dev/null +++ b/libcitadel/lib/decode.c @@ -0,0 +1,226 @@ +// Copyright (c) 1996-2022 by the citadel.org team +// +// This program is open source software. Use, duplication, or disclosure +// are subject to the terms of the GNU General Public License v3. + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "libcitadel.h" + +#if TIME_WITH_SYS_TIME +# include +# include +#endif + + +// This is the non-define version in case it is needed for debugging +#if 0 +inline void FindNextEnd (char *bptr, char *end) { + /* Find the next ?Q? */ + end = strchr(bptr + 2, '?'); + if (end == NULL) return NULL; + if (((*(end + 1) == 'B') || (*(end + 1) == 'Q')) && + (*(end + 2) == '?')) { + /* skip on to the end of the cluster, the next ?= */ + end = strstr(end + 3, "?="); + } + else + /* sort of half valid encoding, try to find an end. */ + end = strstr(bptr, "?="); +} +#endif + +#define FindNextEnd(bptr, end) { \ + end = strchr(bptr + 2, '?'); \ + if (end != NULL) { \ + if (((*(end + 1) == 'B') || (*(end + 1) == 'Q')) && (*(end + 2) == '?')) { \ + end = strstr(end + 3, "?="); \ + } else end = strstr(bptr, "?="); \ + } \ +} + +// Handle subjects with RFC2047 encoding such as: +// =?koi8-r?B?78bP0s3Mxc7JxSDXz9rE1dvO2c3JINvB0sHNySDP?= +void utf8ify_rfc822_string(char *buf) { + char *start, *end, *next, *nextend, *ptr; + char newbuf[1024]; + char charset[128]; + char encoding[16]; + char istr[1024]; + iconv_t ic = (iconv_t)(-1) ; + char *ibuf; // Buffer of characters to be converted + char *obuf; // Buffer for converted characters + size_t ibuflen; // Length of input buffer + size_t obuflen; // Length of output buffer + char *isav; // Saved pointer to input buffer + char *osav; // Saved pointer to output buffer + int passes = 0; + int i, len, delta; + int illegal_non_rfc2047_encoding = 0; + + // Sometimes, badly formed messages contain strings which were simply + // written out directly in some foreign character set instead of + // using RFC2047 encoding. This is illegal but we will attempt to + // handle it anyway by converting from a user-specified default + // charset to UTF-8 if we see any nonprintable characters. + len = strlen(buf); + for (i=0; i 126)) { + illegal_non_rfc2047_encoding = 1; + i = len; // take a shortcut, it won't be more than one. + } + } + if (illegal_non_rfc2047_encoding) { + const char *default_header_charset = "iso-8859-1"; + if ( (strcasecmp(default_header_charset, "UTF-8")) && (strcasecmp(default_header_charset, "us-ascii")) ) { + ctdl_iconv_open("UTF-8", default_header_charset, &ic); + if (ic != (iconv_t)(-1) ) { + ibuf = malloc(1024); + isav = ibuf; + safestrncpy(ibuf, buf, 1024); + ibuflen = strlen(ibuf); + obuflen = 1024; + obuf = (char *) malloc(obuflen); + osav = obuf; + iconv(ic, &ibuf, &ibuflen, &obuf, &obuflen); + osav[1024-obuflen] = 0; + strcpy(buf, osav); + free(osav); + iconv_close(ic); + free(isav); + } + } + } + + // pre evaluate the first pair + nextend = end = NULL; + len = strlen(buf); + start = strstr(buf, "=?"); + if (start != NULL) + FindNextEnd (start, end); + + while ((start != NULL) && (end != NULL)) { + next = strstr(end, "=?"); + if (next != NULL) + FindNextEnd(next, nextend); + if (nextend == NULL) + next = NULL; + + // did we find two partitions + if ((next != NULL) && ((next - end) > 2)) { + ptr = end + 2; + while ((ptr < next) && + (isspace(*ptr) || + (*ptr == '\r') || + (*ptr == '\n') || + (*ptr == '\t'))) + ptr ++; + // did we find a gab just filled with blanks? + if (ptr == next) { + memmove(end + 2, next, len - (next - start)); + + // now terminate the gab at the end + delta = (next - end) - 2; + len -= delta; + buf[len] = '\0'; + + // move next to its new location. + next -= delta; + nextend -= delta; + } + } + // our next-pair is our new first pair now. + start = next; + end = nextend; + } + + // Now we handle foreign character sets properly encoded in RFC2047 format. + start = strstr(buf, "=?"); + FindNextEnd((start != NULL)? start : buf, end); + while (start != NULL && end != NULL && end > start) { + extract_token(charset, start, 1, '?', sizeof charset); + extract_token(encoding, start, 2, '?', sizeof encoding); + extract_token(istr, start, 3, '?', sizeof istr); + + ibuf = malloc(1024); + isav = ibuf; + if (!strcasecmp(encoding, "B")) { // base64 + ibuflen = CtdlDecodeBase64(ibuf, istr, strlen(istr)); + } + else if (!strcasecmp(encoding, "Q")) { // quoted-printable + size_t len; + unsigned long pos; + + len = strlen(istr); + pos = 0; + while (pos < len) { + if (istr[pos] == '_') istr[pos] = ' '; + pos++; + } + ibuflen = CtdlDecodeQuotedPrintable(ibuf, istr, len); + } + else { + strcpy(ibuf, istr); // unknown encoding + ibuflen = strlen(istr); + } + + ctdl_iconv_open("UTF-8", charset, &ic); + if (ic != (iconv_t)(-1) ) { + obuflen = 1024; + obuf = (char *) malloc(obuflen); + osav = obuf; + iconv(ic, &ibuf, &ibuflen, &obuf, &obuflen); + osav[1024-obuflen] = 0; + + end = start; + end++; + strcpy(start, ""); + remove_token(end, 0, '?'); + remove_token(end, 0, '?'); + remove_token(end, 0, '?'); + remove_token(end, 0, '?'); + strcpy(end, &end[1]); + + snprintf(newbuf, sizeof newbuf, "%s%s%s", buf, osav, end); + strcpy(buf, newbuf); + free(osav); + iconv_close(ic); + } + else { + end = start; + end++; + strcpy(start, ""); + remove_token(end, 0, '?'); + remove_token(end, 0, '?'); + remove_token(end, 0, '?'); + remove_token(end, 0, '?'); + strcpy(end, &end[1]); + + snprintf(newbuf, sizeof newbuf, "%s(unreadable)%s", buf, end); + strcpy(buf, newbuf); + } + + free(isav); + + // Since spammers will go to all sorts of absurd lengths to get their + // messages through, there are LOTS of corrupt headers out there. + // So, prevent a really badly formed RFC2047 header from throwing + // this function into an infinite loop. + ++passes; + if (passes > 20) return; + + start = strstr(buf, "=?"); + FindNextEnd((start != NULL)? start : buf, end); + } + +} diff --git a/libcitadel/lib/hash.c b/libcitadel/lib/hash.c index 665e39b30..996293147 100644 --- a/libcitadel/lib/hash.c +++ b/libcitadel/lib/hash.c @@ -1,19 +1,8 @@ /* * Copyright (c) 1987-2011 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 as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. */ #include diff --git a/libcitadel/lib/html_to_ascii.c b/libcitadel/lib/html_to_ascii.c index 45beb2cbb..d325e4a89 100644 --- a/libcitadel/lib/html_to_ascii.c +++ b/libcitadel/lib/html_to_ascii.c @@ -2,19 +2,8 @@ * Functions which handle translation between HTML and plain text * Copyright (c) 2000-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 as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. */ #include diff --git a/libcitadel/lib/json.c b/libcitadel/lib/json.c index 7f611818f..0b3a7d16f 100644 --- a/libcitadel/lib/json.c +++ b/libcitadel/lib/json.c @@ -3,19 +3,8 @@ * * 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 as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. */ #include "sysdep.h" diff --git a/libcitadel/lib/libcitadel.c b/libcitadel/lib/libcitadel.c index 2713887cc..bc88219ff 100644 --- a/libcitadel/lib/libcitadel.c +++ b/libcitadel/lib/libcitadel.c @@ -3,19 +3,8 @@ * * Copyright (c) 1987-2013 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 as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. */ #include diff --git a/libcitadel/lib/libcitadel.h b/libcitadel/lib/libcitadel.h index 362e69e4c..b6e9cb1f8 100644 --- a/libcitadel/lib/libcitadel.h +++ b/libcitadel/lib/libcitadel.h @@ -1,15 +1,10 @@ /* * Header file for libcitadel * - * Copyright (c) 1987-2021 by the citadel.org team + * Copyright (c) 1987-2022 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. +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. */ /* protect against double includes */ @@ -440,6 +435,7 @@ int pattern2(char *search, char *patn); void stripltlen(char *, int *); char *html_to_ascii(const char *inputmsg, int msglen, int screenwidth); void LoadEntityList(char *FileName); +void utf8ify_rfc822_string(char *buf); typedef struct { diff --git a/libcitadel/lib/mime_parser.c b/libcitadel/lib/mime_parser.c index 105d29a39..318c23fde 100644 --- a/libcitadel/lib/mime_parser.c +++ b/libcitadel/lib/mime_parser.c @@ -2,19 +2,8 @@ // // Copyright (c) 1998-2022 by the citadel.org development team. // -// This program is open source software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// 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. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. #include #include diff --git a/libcitadel/lib/stringbuf.c b/libcitadel/lib/stringbuf.c index 3d8b3010d..8023ab7c7 100644 --- a/libcitadel/lib/stringbuf.c +++ b/libcitadel/lib/stringbuf.c @@ -1,18 +1,7 @@ // Copyright (c) 1987-2022 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 as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// 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. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. #define _GNU_SOURCE #include "sysdep.h" diff --git a/libcitadel/lib/tools.c b/libcitadel/lib/tools.c index 20dd1e926..53151fb95 100644 --- a/libcitadel/lib/tools.c +++ b/libcitadel/lib/tools.c @@ -3,20 +3,8 @@ // // Copyright (c) 1987-2022 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 as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// 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. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. #include #include diff --git a/libcitadel/lib/urlhandling.c b/libcitadel/lib/urlhandling.c index 8896770ee..7d53f9bdb 100644 --- a/libcitadel/lib/urlhandling.c +++ b/libcitadel/lib/urlhandling.c @@ -1,3 +1,5 @@ +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. #include "sysdep.h" #include #include diff --git a/libcitadel/lib/vcard.c b/libcitadel/lib/vcard.c index f12a4efb5..f52bb29c4 100644 --- a/libcitadel/lib/vcard.c +++ b/libcitadel/lib/vcard.c @@ -3,19 +3,8 @@ * * Copyright (C) 1999-2008 by the citadel.org development team. * - * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. */ diff --git a/libcitadel/lib/vnote.c b/libcitadel/lib/vnote.c index feeee9289..7f5002677 100644 --- a/libcitadel/lib/vnote.c +++ b/libcitadel/lib/vnote.c @@ -3,19 +3,8 @@ * * Copyright (C) 1999-2007 by the citadel.org development team. * - * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. */ diff --git a/webcit-ng/static/css/webcit.css b/webcit-ng/static/css/webcit.css index 3b3abd753..5c1b15b33 100644 --- a/webcit-ng/static/css/webcit.css +++ b/webcit-ng/static/css/webcit.css @@ -191,8 +191,25 @@ blockquote pre { .ctdl-roomlist-mtime { } +.ctdl-mailbox-heading { + position: sticky; + top: 0; + z-index: 6; +} + .ctdl-mailbox-pane { /* list of messages when in mailbox view */ + position: absolute; + height: 25%; + width: inherit; + overflow-x: hidden; + overflow-y: scroll; } .ctdl-reading-pane { /* message reading/composing pane when in mailbox view */ + position: absolute; + top: 31%; + height: 70%; + left: inherit; + right: inherit; + overflow: scroll; } diff --git a/webcit-ng/static/index.html b/webcit-ng/static/index.html index 78acd2865..9582c46db 100644 --- a/webcit-ng/static/index.html +++ b/webcit-ng/static/index.html @@ -17,7 +17,7 @@ -