CVS: plugins/smime/src smime.c,1.1.2.2,1.1.2.3

Colin Leroy <[email protected]>
Newsgroups gmane.mail.sylpheed.claws.cvs
Message-ID <[email protected]>
Update of /cvsroot/sylpheed-claws/plugins/smime/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22051/src

Modified Files:
      Tag: gtk2
	smime.c 
Log Message:
better handling of signed-data sigs

Index: smime.c
===================================================================
RCS file: /cvsroot/sylpheed-claws/plugins/smime/src/Attic/smime.c,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- smime.c	5 Apr 2006 18:23:12 -0000	1.1.2.2
+++ smime.c	26 Apr 2006 17:03:27 -0000	1.1.2.3
@@ -82,7 +82,7 @@
 {
 	MimeInfo *parent;
 	MimeInfo *signature;
-	const gchar *protocol;
+	const gchar *protocol, *tmpstr;
 	PrivacyDataPGP *data = NULL;
 	
 	g_return_val_if_fail(mimeinfo != NULL, FALSE);
@@ -92,10 +92,18 @@
 			return data->is_signed;
 	}
 	
+	if (!g_ascii_strcasecmp(mimeinfo->subtype, "pkcs7-mime")) {
+		tmpstr = procmime_mimeinfo_get_parameter(mimeinfo, "smime-type");
+		if (tmpstr && !g_ascii_strcasecmp(tmpstr, "signed-data")) {
+			goto is_signed;
+		}
+	}
+
 	/* check parent */
 	parent = procmime_mimeinfo_parent(mimeinfo);
 	if (parent == NULL)
 		return FALSE;
+	
 	if ((parent->type != MIMETYPE_MULTIPART) ||
 	    g_ascii_strcasecmp(parent->subtype, "signed"))
 		return FALSE;
@@ -109,6 +117,7 @@
 	if (parent->node->children->data != mimeinfo)
 		return FALSE;
 
+
 	/* check signature */
 	signature = parent->node->children->next != NULL ? 
 	    (MimeInfo *) parent->node->children->next->data : NULL;
@@ -119,6 +128,7 @@
 	     g_ascii_strcasecmp(signature->subtype, "x-pkcs7-signature")))
 		return FALSE;
 
+is_signed:
 	if (data == NULL) {
 		data = smime_new_privacydata();
 		mimeinfo->privacy = (PrivacyData *) data;
@@ -170,12 +180,14 @@
 	FILE *fp;
 	gchar *boundary;
 	gchar *textstr;
+	const gchar *tmpstr;
 	gpgme_data_t sigdata = NULL, textdata = NULL;
 	gpgme_error_t err;
 	g_return_val_if_fail(mimeinfo != NULL, -1);
 	g_return_val_if_fail(mimeinfo->privacy != NULL, -1);
 	data = (PrivacyDataPGP *) mimeinfo->privacy;
 	gpgme_new(&data->ctx);
+	EncodingType oldenc = ENC_BINARY;
 	
 	debug_print("Checking S/MIME signature\n");
 
@@ -191,16 +203,81 @@
 	g_return_val_if_fail(fp != NULL, SIGNATURE_INVALID);
 	
 	boundary = g_hash_table_lookup(parent->typeparameters, "boundary");
-	if (!boundary)
-		return 0;
-
-	textstr = get_canonical_content(fp, boundary);
-
+	if (!boundary) {
+		gchar *tmpfile = get_tmp_file();
+		debug_print("no boundary\n");
+		if (tmpfile) {
+			if (mimeinfo->encoding_type != ENC_BASE64) {
+				procmime_encode_content(mimeinfo, ENC_BASE64);
+			}
+			oldenc = mimeinfo->encoding_type;
+			if (mimeinfo->encoding_type == ENC_BASE64)
+				mimeinfo->encoding_type = ENC_BINARY;
+			if (procmime_get_part(tmpfile, mimeinfo) == 0) {
+				textstr = file_read_to_str(tmpfile);
+			} else {
+				textstr = NULL;
+			}
+			if (mimeinfo->encoding_type != oldenc)
+				mimeinfo->encoding_type = oldenc;
+		}
+	} else {
+		textstr = get_canonical_content(fp, boundary);
+	}
 	err = gpgme_data_new_from_mem(&textdata, textstr, strlen(textstr), 0);
+	
 	if (err) {
 		debug_print ("gpgme_data_new_from_mem failed: %s\n",
                    gpgme_strerror (err));
 	}
+
+	if (!g_ascii_strcasecmp(mimeinfo->subtype, "pkcs7-mime")) {
+		tmpstr = procmime_mimeinfo_get_parameter(mimeinfo, "smime-type");
+		if (tmpstr && !g_ascii_strcasecmp(tmpstr, "signed-data")) {
+			gpgme_data_t cipher, plain;
+			int len;
+			if (oldenc == ENC_BASE64)
+				gpgme_data_set_encoding (textdata, GPGME_DATA_ENCODING_BASE64);
+			gpgme_data_new(&cipher);
+			data->sigstatus =
+				sgpgme_verify_signature	(data->ctx, textdata, NULL, cipher);
+			gpgme_data_release(textdata);
+			g_free(textstr);
+			gpgme_data_rewind(cipher);
+			textstr = gpgme_data_release_and_get_mem(cipher, &len);
+			fclose(fp);
+			if (textstr && len) {
+				gchar *tmp_file = get_tmp_file();
+				MimeInfo *newinfo = NULL, *decinfo = NULL, *parentinfo = NULL;
+				gint childnumber = 0;
+				str_write_to_file(textstr, tmp_file);
+				newinfo = procmime_scan_file(tmp_file);
+				decinfo = g_node_first_child(newinfo->node) != NULL ?
+					g_node_first_child(newinfo->node)->data : NULL;
+				g_node_unlink(decinfo->node);
+				procmime_mimeinfo_free_all(newinfo);
+				decinfo->tmp = TRUE;
+				parentinfo = procmime_mimeinfo_parent(mimeinfo);
+				childnumber = g_node_child_index(parentinfo->node, mimeinfo);
+				if (parentinfo->type == MIMETYPE_MESSAGE && 
+				    !strcmp(parentinfo->subtype, "rfc822")) {
+					procmime_decode_content(parentinfo);
+					procmime_encode_content(parentinfo, ENC_8BIT);
+					if (parentinfo->content == MIMECONTENT_MEM) {
+						gint newlen = 
+							(gint)(strstr(parentinfo->data.mem, "\n\n") - parentinfo->data.mem);
+						if (newlen > 0)
+							parentinfo->length = newlen;
+					}
+				}
+				g_node_prepend(parentinfo->node, decinfo->node);
+				return 0;
+			} else {
+				return -1;
+			}
+		}
+	}
+
 	signature = (MimeInfo *) mimeinfo->node->next->data;
 	sigdata = sgpgme_data_from_mimeinfo(signature);
 
@@ -274,6 +351,10 @@
 	if (g_ascii_strcasecmp(mimeinfo->subtype, "pkcs7-mime"))
 		return FALSE;
 	
+	tmpstr = procmime_mimeinfo_get_parameter(mimeinfo, "smime-type");
+	if (!tmpstr || g_ascii_strcasecmp(tmpstr, "enveloped-data"))
+		return FALSE;
+
 	return TRUE;
 }
 



-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.