summaryrefslogtreecommitdiffstats
path: root/rfc2045/rfc2045acchk.c
diff options
context:
space:
mode:
Diffstat (limited to 'rfc2045/rfc2045acchk.c')
-rw-r--r--rfc2045/rfc2045acchk.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/rfc2045/rfc2045acchk.c b/rfc2045/rfc2045acchk.c
new file mode 100644
index 0000000..9632d07
--- /dev/null
+++ b/rfc2045/rfc2045acchk.c
@@ -0,0 +1,145 @@
+/*
+** Copyright 1998 - 2001 Double Precision, Inc. See COPYING for
+** distribution information.
+*/
+
+#if HAVE_CONFIG_H
+#include "rfc2045_config.h"
+#endif
+#include "rfc2045.h"
+#include <string.h>
+#if HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#include <stdlib.h>
+#include <stdio.h>
+
+
+extern void rfc2045_enomem();
+
+int rfc2045_ac_check(struct rfc2045 *p, int rwmode)
+{
+int flag=0; /* Flag - rewriting suggested */
+struct rfc2045 *c;
+int hasnon7bit=p->has8bitchars;
+ /* hasnon7bit: 8bit chars in this section or subsections */
+const char *te;
+int is8bitte;
+
+ for (c=p->firstpart; c; c=c->next)
+ if (!c->isdummy)
+ {
+ if (rfc2045_ac_check(c, rwmode)) flag=1;
+ if (c->content_transfer_encoding &&
+ strcmp(c->content_transfer_encoding, "7bit") &&
+ strcmp(c->content_transfer_encoding, "uuencode") &&
+ strcmp(c->content_transfer_encoding, "quoted-printable"))
+ hasnon7bit=1;
+ if (c->has8bitchars)
+ p->has8bitchars=1;
+ }
+
+ if (RFC2045_ISMIME1DEF(p->mime_version) && !p->content_type)
+ {
+ if ((p->content_type=strdup("text/plain")) == 0)
+ rfc2045_enomem();
+ if (p->mime_version)
+ {
+ flag=1;
+ }
+ }
+
+ if (RFC2045_ISMIME1DEF(p->mime_version)
+ && !rfc2045_getattr(p->content_type_attr, "charset")
+ && strncasecmp(p->content_type, "text/", 5) == 0)
+ {
+ if (rfc2045_attrset(&p->content_type_attr, "charset",
+ rfc2045_getdefaultcharset()) < 0)
+ rfc2045_enomem();
+
+ if (p->mime_version
+
+ && p->firstpart == 0 /* sam - don't trigger rewrites on changes to multipart headers */
+
+ )
+ {
+ flag=1;
+ }
+ }
+
+ if (RFC2045_ISMIME1DEF(p->mime_version)
+ && !p->content_transfer_encoding)
+ {
+ if ((p->content_transfer_encoding=strdup(
+ hasnon7bit ? "8bit":"7bit")) == 0)
+ rfc2045_enomem();
+ if (p->mime_version
+
+ && p->firstpart == 0 /* sam - don't trigger rewrites on changes to multipart headers */
+ )
+ {
+ flag=1;
+ }
+ }
+
+#if 0
+ if (RFC2045_ISMIME1DEF(p->mime_version)
+ && strncmp(p->content_type, "text/", 5) == 0 && !hasnon7bit
+ && strcmp(p->content_transfer_encoding, "7bit"))
+ {
+ if (p->mime_version)
+ {
+ flag=1;
+ }
+ }
+#endif
+
+ if (RFC2045_ISMIME1DEF(p->mime_version))
+ {
+ /* Check for conversions */
+
+ te=p->content_transfer_encoding;
+ is8bitte=strcasecmp(te, "base64") &&
+ strcasecmp(te, "quoted-printable") &&
+ strcasecmp(te, "uuencode") &&
+ strcasecmp(te, "7bit"); /* 8 bit contents */
+
+ if (is8bitte && !p->has8bitchars && !p->haslongline)
+ {
+ if (p->rw_transfer_encoding)
+ free(p->rw_transfer_encoding);
+ if ((p->rw_transfer_encoding=strdup("7bit")) == 0)
+ rfc2045_enomem();
+ flag=1;
+ is8bitte=0;
+ }
+
+ if (rwmode == RFC2045_RW_7BIT && (is8bitte || p->haslongline))
+ {
+ if (p->rw_transfer_encoding)
+ free(p->rw_transfer_encoding);
+ if ((p->rw_transfer_encoding=strdup("quoted-printable"))
+ == 0)
+ rfc2045_enomem();
+ flag=1;
+ }
+ else if (rwmode == RFC2045_RW_8BIT &&
+ strcasecmp(te, "quoted-printable") == 0 &&
+ !p->haslongline)
+ {
+ if (p->rw_transfer_encoding)
+ free(p->rw_transfer_encoding);
+ if ((p->rw_transfer_encoding=strdup(hasnon7bit
+ ? "8bit":"7bit")) == 0)
+ rfc2045_enomem();
+ flag=1;
+ }
+ }
+
+ if (!p->mime_version)
+ {
+ if ((p->mime_version=strdup("1.0")) == 0)
+ rfc2045_enomem();
+ }
+ return (flag);
+}