1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
/*
** 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 (strcasecmp(te, "quoted-printable") == 0 &&
((rwmode == RFC2045_RW_8BIT &&
!p->haslongline)
||
(rwmode == RFC2045_RW_8BIT_ALWAYS)))
{
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);
}
|