147 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			147 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
							 | 
						||
| 
								 | 
							
								** distribution information.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if	HAVE_CONFIG_H
							 | 
						||
| 
								 | 
							
								#include	"config.h"
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#include	"rfc2045.h"
							 | 
						||
| 
								 | 
							
								#include	<string.h>
							 | 
						||
| 
								 | 
							
								#if	HAVE_STRINGS_H
							 | 
						||
| 
								 | 
							
								#include	<strings.h>
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#include	<stdlib.h>
							 | 
						||
| 
								 | 
							
								#include	<stdio.h>
							 | 
						||
| 
								 | 
							
								#ifdef __WINDOWS__
							 | 
						||
| 
								 | 
							
								#define strcasecmp stricmp
							 | 
						||
| 
								 | 
							
								#define strncasecmp strnicmp
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* $Id$ */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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 (strcmp(c->content_transfer_encoding, "7bit") &&
							 | 
						||
| 
								 | 
							
												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)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										rfc2045_setattr(&p->content_type_attr, "charset",
							 | 
						||
| 
								 | 
							
											rfc2045_getdefaultcharset());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										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, "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);
							 | 
						||
| 
								 | 
							
								}
							 |