/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Authors: Jeffrey Stedfast * * Copyright 2001 Ximian, Inc. (www.ximian.com) * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public * License as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "camel-pgp-mime.h" #include "camel-mime-message.h" /** * camel_pgp_mime_is_rfc2015_signed: * @mime_part: MIME part * * Checks that this part is a multipart/signed part following the * rfc2015 and/or rfc3156 PGP/MIME specifications. * * Returns %TRUE if this looks to be a valid PGP/MIME multipart/signed * part or %FALSE otherwise. **/ gboolean camel_pgp_mime_is_rfc2015_signed (CamelMimePart *mime_part) { CamelDataWrapper *wrapper; CamelMultipart *mp; CamelMimePart *part; CamelContentType *type; #ifdef ENABLE_PEDANTIC_PGPMIME const char *param, *micalg; #endif int nparts; /* check that we have a multipart/signed */ type = camel_mime_part_get_content_type (mime_part); if (!header_content_type_is (type, "multipart", "signed")) return FALSE; #ifdef ENABLE_PEDANTIC_PGPMIME /* check that we have a protocol param with the value: "application/pgp-signature" */ param = header_content_type_param (type, "protocol"); if (!param || strcasecmp (param, "application/pgp-signature")) return FALSE; /* check that we have a micalg parameter */ micalg = header_content_type_param (type, "micalg"); if (!micalg) return FALSE; #endif /* ENABLE_PEDANTIC_PGPMIME */ /* check that we have exactly 2 subparts */ wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part)); mp = CAMEL_MULTIPART (wrapper); nparts = camel_multipart_get_number (mp); if (nparts != 2) return FALSE; /* The first part may be of any type except for * application/pgp-signature - check it. */ part = camel_multipart_get_part (mp, 0); type = camel_mime_part_get_content_type (part); if (header_content_type_is (type, "application", "pgp-signature")) return FALSE; /* The second part should be application/pgp-signature. */ part = camel_multipart_get_part (mp, 1); type = camel_mime_part_get_content_type (part); if (!header_content_type_is (type, "application", "pgp-signature")) return FALSE; return TRUE; } /** * camel_pgp_mime_is_rfc2015_encrypted: * @mime_part: MIME part * * Checks that this part is a multipart/encrypted part following the * rfc2015 and/or rfc3156 PGP/MIME specifications. * * Returns %TRUE if this looks to be a valid PGP/MIME * multipart/encrypted part or %FALSE otherwise. **/ gboolean camel_pgp_mime_is_rfc2015_encrypted (CamelMimePart *mime_part) { CamelDataWrapper *wrapper; CamelMultipart *mp; CamelMimePart *part; CamelContentType *type; #ifdef ENABLE_PEDANTIC_PGPMIME const char *param; #endif int nparts; /* check that we have a multipart/encrypted */ type = camel_mime_part_get_content_type (mime_part); if (!header_content_type_is (type, "multipart", "encrypted")) return FALSE; #ifdef ENABLE_PEDANTIC_PGPMIME /* check that we have a protocol param with the value: "application/pgp-encrypted" */ param = header_content_type_param (type, "protocol"); if (!param || strcasecmp (param, "application/pgp-encrypted")) return FALSE; #endif /* ENABLE_PEDANTIC_PGPMIME */ /* check that we have at least 2 subparts */ wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part)); mp = CAMEL_MULTIPART (wrapper); nparts = camel_multipart_get_number (mp); if (nparts < 2) return FALSE; /* The first part should be application/pgp-encrypted */ part = camel_multipart_get_part (mp, 0); type = camel_mime_part_get_content_type (part); if (!header_content_type_is (type, "application", "pgp-encrypted")) return FALSE; /* The second part should be application/octet-stream - this is the one we care most about */ part = camel_multipart_get_part (mp, 1); type = camel_mime_part_get_content_type (part); if (!header_content_type_is (type, "application", "octet-stream")) return FALSE; return TRUE; }