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); | ||
|  | } |