aboutsummaryrefslogblamecommitdiffstats
path: root/camel/camel-pgp-mime.c
blob: f9d0ea80a9b99f234e354ec6726bfb896f7393f9 (plain) (tree)
1
2
3
4
5
6
7
8
9





                                                                           


                                                                   
  



                                                                    
  



                                                               







                    
                  


                   

                               
 
 









                                                                      






                                                           


                                   





                                                                  
        
                              
                                                                                             







                                                                        
                                    























                                                                             










                                                                    






                                                              


                              





                                                                     
        
                              



                                                                                             
                                    






















                                                                             
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
 *  Authors: Jeffrey Stedfast <fejj@ximian.com>
 *
 *  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 <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#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 || g_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 || g_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;
}