From eb3167206c76ea6014be8bb73a63ee512f35aa7f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 28 Feb 2001 23:24:15 +0000 Subject: Added camel-sasl-anonymous.[c,h] to the build. 2001-02-28 Jeffrey Stedfast * Makefile.am: Added camel-sasl-anonymous.[c,h] to the build. * camel-sasl-anonymous.[c,h]: new SASL class for ANONYMOUS * camel-sasl-plain.c (plain_challenge): Oops, have a state for setting sasl->authenticated = TRUE; * camel-sasl-cram-md5.c (cram_md5_challenge): Same here. svn path=/trunk/; revision=8433 --- camel/camel-sasl-anonymous.c | 165 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 camel/camel-sasl-anonymous.c (limited to 'camel/camel-sasl-anonymous.c') diff --git a/camel/camel-sasl-anonymous.c b/camel/camel-sasl-anonymous.c new file mode 100644 index 0000000000..576d730157 --- /dev/null +++ b/camel/camel-sasl-anonymous.c @@ -0,0 +1,165 @@ +/* -*- 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 the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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 Street #330, Boston, MA 02111-1307, USA. + * + */ + +#include +#include "camel-sasl-anonymous.h" +#include "camel-internet-address.h" +#include "camel-mime-utils.h" +#include + +static CamelSaslClass *parent_class = NULL; + +/* Returns the class for a CamelSaslAnonymous */ +#define CSA_CLASS(so) CAMEL_SASL_ANONYMOUS_CLASS (CAMEL_OBJECT_GET_CLASS (so)) + +static GByteArray *anon_challenge (CamelSasl *sasl, const char *token, CamelException *ex); + +enum { + STATE_AUTH, + STATE_FINAL +}; + +struct _CamelSaslAnonymousPrivate { + int state; +}; + +static void +camel_sasl_anonymous_class_init (CamelSaslAnonymousClass *camel_sasl_anonymous_class) +{ + CamelSaslClass *camel_sasl_class = CAMEL_SASL_CLASS (camel_sasl_anonymous_class); + + parent_class = CAMEL_SASL_CLASS (camel_type_get_global_classfuncs (camel_sasl_get_type ())); + + /* virtual method overload */ + camel_sasl_class->challenge = anon_challenge; +} + +static void +camel_sasl_anonymous_init (gpointer object, gpointer klass) +{ + CamelSaslAnonymous *sasl_anon = CAMEL_SASL_ANONYMOUS (object); + + sasl_anon->priv = g_new0 (struct _CamelSaslAnonymousPrivate, 1); +} + +static void +camel_sasl_anonymous_finalize (CamelObject *object) +{ + CamelSaslAnonymous *sasl = CAMEL_SASL_ANONYMOUS (object); + + g_free (sasl->trace_info); + g_free (sasl->priv); +} + + +CamelType +camel_sasl_anonymous_get_type (void) +{ + static CamelType type = CAMEL_INVALID_TYPE; + + if (type == CAMEL_INVALID_TYPE) { + type = camel_type_register (camel_sasl_get_type (), + "CamelSaslAnonymous", + sizeof (CamelSaslAnonymous), + sizeof (CamelSaslAnonymousClass), + (CamelObjectClassInitFunc) camel_sasl_anonymous_class_init, + NULL, + (CamelObjectInitFunc) camel_sasl_anonymous_init, + (CamelObjectFinalizeFunc) camel_sasl_anonymous_finalize); + } + + return type; +} + +CamelSasl * +camel_sasl_anonymous_new (CamelSaslAnonTraceType type, const char *trace_info) +{ + CamelSaslAnonymous *sasl_anon; + + if (!trace_info && type != CAMEL_SASL_ANON_TRACE_EMPTY) return NULL; + + sasl_anon = CAMEL_SASL_ANONYMOUS (camel_object_new (camel_sasl_anonymous_get_type ())); + sasl_anon->trace_info = g_strdup (trace_info); + sasl_anon->type = type; + + return CAMEL_SASL (sasl_anon); +} + +static GByteArray * +anon_challenge (CamelSasl *sasl, const char *token, CamelException *ex) +{ + CamelSaslAnonymous *sasl_anon = CAMEL_SASL_ANONYMOUS (sasl); + struct _CamelSaslAnonymousPrivate *priv = sasl_anon->priv; + CamelInternetAddress *cia; + GByteArray *ret = NULL; + char *buf = NULL; + + switch (priv->state) { + case STATE_AUTH: + switch (sasl_anon->type) { + case CAMEL_SASL_ANON_TRACE_EMAIL: + cia = camel_internet_address_new (); + if (camel_internet_address_add (cia, NULL, sasl_anon->trace_info) != 1) { + camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, + _("Invalid email address trace information:\n%s"), + sasl_anon->trace_info); + camel_object_unref (CAMEL_OBJECT (cia)); + return NULL; + } + camel_object_unref (CAMEL_OBJECT (cia)); + buf = base64_encode_simple (sasl_anon->trace_info, strlen (sasl_anon->trace_info)); + break; + case CAMEL_SASL_ANON_TRACE_OPAQUE: + if (strchr (sasl_anon->trace_info, '@')) { + camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, + _("Invalid opaque trace information:\n%s"), + sasl_anon->trace_info); + return NULL; + } + buf = base64_encode_simple (sasl_anon->trace_info, strlen (sasl_anon->trace_info)); + break; + case CAMEL_SASL_ANON_TRACE_EMPTY: + buf = g_strdup (""); + break; + default: + camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, + _("Invalid trace information:\n%s"), + sasl_anon->trace_info); + return NULL; + } + break; + case STATE_FINAL: + sasl->authenticated = TRUE; + default: + break; + } + + priv->state++; + + if (buf) { + ret = g_byte_array_new (); + g_byte_array_append (ret, buf, strlen (buf)); + g_free (buf); + } + + return ret; +} -- cgit