diff options
Diffstat (limited to 'rfc2045/rfc2045acchk.c')
| -rw-r--r-- | rfc2045/rfc2045acchk.c | 145 |
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); +} |
