From f72749e91547f48623575ed3ba207c64d972eb3d Mon Sep 17 00:00:00 2001 From: Michiel Broek Date: Mon, 14 Feb 2005 19:57:19 +0000 Subject: [PATCH] Added more charset patches by Dmitry Komissaroff --- ChangeLog | 8 +++- mbnntp/Makefile | 2 +- mbnntp/commands.c | 9 ++++- mbnntp/commands.h | 2 + mbnntp/rfc2ftn.c | 97 ++++++++++++++++++++++++++++++++++++++++++----- 5 files changed, 106 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index ac4ce64c..76d212b7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -23,8 +23,14 @@ v0.71.2 16-Jan-2005 so that we later can decide to mark these messages auto deleted. mbnntp: - Does now send the right mime headers recognised by new clients. + Does now send the right mime headers recognised by news clients. Fixed compile problem with some compilers. + When sending the mime header with the charset used to the news + client, the original message charset is tried first, else the + area charset, else the users charset and if all failed, we send + the us-ascci charset as default. + More patches added from Dmitry Komissaroff to improve charset + support. Also improved msgid linking. html: Added batch file upload written by Russell Tiedt to the faq. diff --git a/mbnntp/Makefile b/mbnntp/Makefile index ade18136..e983ed4c 100644 --- a/mbnntp/Makefile +++ b/mbnntp/Makefile @@ -63,7 +63,7 @@ openport.o: ../config.h ../lib/mbselib.h ttyio.h openport.h ttyio.o: ../config.h ../lib/mbselib.h ttyio.h auth.o: ../config.h ../lib/mbselib.h ../lib/users.h mbnntp.h auth.h commands.o: ../config.h ../lib/mbselib.h ../lib/users.h ../lib/msg.h ../lib/msgtext.h ../lib/mbsedb.h ttyio.h mbnntp.h rfc2ftn.h commands.h -rfc2ftn.o: ../config.h ../lib/mbselib.h ../lib/users.h ../lib/mbinet.h ../lib/mbsedb.h ../lib/msg.h ../lib/msgtext.h mkftnhdr.h hash.h msgflags.h rfc2ftn.h +rfc2ftn.o: ../config.h ../lib/mbselib.h ../lib/users.h ../lib/mbinet.h ../lib/mbsedb.h ../lib/msg.h ../lib/msgtext.h mkftnhdr.h hash.h msgflags.h rfc2ftn.h commands.h hash.o: ../config.h ../lib/mbselib.h hash.h lhash.h lhash.o: ../config.h ../lib/mbselib.h lhash.h msgflags.o: ../config.h ../lib/mbselib.h msgflags.h diff --git a/mbnntp/commands.c b/mbnntp/commands.c index bc9e1ac5..0fbbcc3f 100644 --- a/mbnntp/commands.c +++ b/mbnntp/commands.c @@ -50,7 +50,6 @@ extern unsigned long rcvdbytes; extern char *ttystat[]; void send_xlat(char *); -char *make_msgid(char *); static CharsetAlias *charset_alias_list; static CharsetTable *charset_table_list; @@ -245,10 +244,18 @@ void command_abhs(char *buf) /* * Send RFC 2045 Multipurpose Internet Mail Extensions (MIME) header. + * Order is: 1. Charset defined in the FTN message + * 2. Charset of the message area + * 3. Charset of the user + * 4. Default us-ascii. */ send_nntp("MIME-Version: 1.0"); if (charset) { send_nntp("Content-Type: text/plain; charset=%s", charset_alias_rfc(charset)); + } else if (msgs.Charset != FTNC_NONE) { + send_nntp("Content-Type: text/plain; charset=%s", getrfcchrs(msgs.Charset)); + } else if (usercharset != FTNC_NONE) { + send_nntp("Content-Type: text/plain; charset=%s", getrfcchrs(usercharset)); } else { send_nntp("Content-Type: text/plain; charset=us-ascii; format=fixed"); } diff --git a/mbnntp/commands.h b/mbnntp/commands.h index 5919937b..0214f52c 100644 --- a/mbnntp/commands.h +++ b/mbnntp/commands.h @@ -5,6 +5,8 @@ #ifndef USE_NEWSGATE +char *getrfcchrs(int); +char *make_msgid(char *); void command_abhs(char *); /* ARTICLE/BODY/HEADER/STAT */ void command_group(char *); /* GROUP */ void command_list(char *); /* LIST */ diff --git a/mbnntp/rfc2ftn.c b/mbnntp/rfc2ftn.c index 1fcdb868..01576d3e 100644 --- a/mbnntp/rfc2ftn.c +++ b/mbnntp/rfc2ftn.c @@ -39,6 +39,7 @@ #include "hash.h" #include "msgflags.h" #include "rfc2ftn.h" +#include "commands.h" #ifndef USE_NEWSGATE @@ -66,7 +67,7 @@ static int removereturnto; extern char *replyaddr; extern int do_mailout; extern int grecno; - +extern char currentgroup[]; /* * Internal functions @@ -78,15 +79,22 @@ int needputrfc(rfcmsg *, int); int charwrite(char *, FILE *); int charwrite(char *s, FILE *fp) { - if ((strlen(s) >= 3) && (strncmp(s,"---",3) == 0) && (s[3] != '-')) { - putc('-',fp); - putc(' ',fp); + char *o; + + if ((strlen(s) >= 3) && (strncmp(s,"---",3) == 0) && (s[3] != '-')) { + putc('-',fp); + putc(' ',fp); + } + while (*s) { + o=s; + if (s[0] &0x080) { + o=charset_map_c(s[0],0); } - while (*s) { - putc(*s, fp); - s++; - } - return 0; +// putc(*s, fp); + putc (*o,fp); + s++; + } + return 0; } @@ -113,6 +121,49 @@ int kludgewrite(char *s, FILE *fp) } +int findorigmsg(char *msgid, char *o) +{ + unsigned long i, start, end; + char *gen2; + + if (msgid == NULL) { + return 0; + } + + if (!Msg_Open(msgs.Base)) { + return 0; + } + Msg_Number(); + Msg_Highest(); + Msg_Lowest(); + + if (MsgBase.Open == FALSE) { + Syslog('-', "Base closed"); + return 0; + } + + strcpy(currentgroup,msgs.Newsgroup); + start = MsgBase.Lowest; + end = MsgBase.Highest; + + gen2 = calloc(strlen(msgid)+1,sizeof(char)); + strcpy(gen2, strchr(msgid,'<')); + for (i = start; i <= end; i++) { + if (Msg_ReadHeader(i)) { + if (strncmp(gen2,make_msgid(Msg.Msgid),strlen(gen2)-1) == 0) { + Syslog('m',"Found msgid: %s",make_msgid(Msg.Msgid)); +// realloc(o,(strlen(Msg.Msgid)+1)* sizeof(char)); + strcpy(o,Msg.Msgid); + free(gen2); + return 1; + } + } + } + free(gen2); + return 0; +} + + /* * Input a RFC news message. @@ -131,8 +182,10 @@ int rfc2ftn(FILE *fp) int needsplit, hdrsize, datasize, splitpart, forbidsplit, rfcheaders; time_t Now; struct tm *l_date; + char *charset = NULL, *tq; temp = calloc(4097, sizeof(char)); + charset = calloc(50,sizeof(char)); Syslog('m', "Entering rfc2ftn"); rewind(fp); msg = parsrfc(fp); @@ -160,6 +213,16 @@ int rfc2ftn(FILE *fp) if ((p = hdr((char *)"References",msg))) { p = strrchr(p,' '); ftnmsgid(p,&fmsg->reply_a, &fmsg->reply_n,fmsg->area); + +//Griffin + fmsg->reply_s=calloc(256,sizeof(char)); + findorigmsg(p,fmsg->reply_s); + + fmsg->to->name=calloc(strlen(Msg.From)+1,sizeof(char)); + strcpy(fmsg->to->name,Msg.From); + Syslog('m', "fmsg to-name %s",fmsg->to->name); + Syslog('m', "reply_s %s",fmsg->reply_s); + if (!chkftnmsgid(p)) { hash_update_s(&fmsg->reply_n, fmsg->area); } @@ -170,6 +233,8 @@ int rfc2ftn(FILE *fp) } } + + chkftnmsgid(hdr((char *)"Message-ID",msg)); // ?? removemime = FALSE; removemsgid = FALSE; @@ -197,8 +262,21 @@ int rfc2ftn(FILE *fp) removemime = TRUE; /* no need in MIME headers */ Syslog('m', "removemime=%s", removemime ? "True":"False"); } + tq=calloc(100,sizeof(char)); + memset(tq,0,100*sizeof(char)); + strcpy(charset,"iso-8859-1"); + strcpy(tq,strstr(p,"charset=")+8); + Syslog('m', "tq: %s|", tq); + if (tq!=NULL) { + strcpy(charset,tq); + charset[strlen(charset)-1]='\0'; + } + Syslog('m', "charset: %s|", charset); + free(tq); } + charset_set_in_out(charset,getrfcchrs(msgs.Charset)); + if ((p = hdr((char *)"Message-ID",msg))) { if (!removemsgid) removemsgid = chkftnmsgid(p); @@ -706,6 +784,7 @@ int rfc2ftn(FILE *fp) fclose(ofp); } while (needsplit); free(temp); + free(charset); tidyrfc(msg); tidy_ftnmsg(fmsg); UpdateMsgs();