diff options
-rw-r--r-- | camel/ChangeLog | 11 | ||||
-rw-r--r-- | camel/Makefile.am | 2 | ||||
-rw-r--r-- | camel/camel-sasl-anonymous.c | 165 | ||||
-rw-r--r-- | camel/camel-sasl-anonymous.h | 69 | ||||
-rw-r--r-- | camel/camel-sasl-cram-md5.c | 5 | ||||
-rw-r--r-- | camel/camel-sasl-plain.c | 6 |
6 files changed, 256 insertions, 2 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index 82cf3b7d6d..91ce80080b 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,5 +1,16 @@ 2001-02-28 Jeffrey Stedfast <fejj@ximian.com> + * 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. + +2001-02-28 Jeffrey Stedfast <fejj@ximian.com> + * camel-mime-utils.c (header_decode_date): A fix for broken mailers that send 2-digit years (ie "Wed, 28 Feb 01 04:59:41"). Fixes bug #1633. diff --git a/camel/Makefile.am b/camel/Makefile.am index 82e48e58d5..2d0e8a029a 100644 --- a/camel/Makefile.am +++ b/camel/Makefile.am @@ -50,6 +50,7 @@ libcamel_la_SOURCES = \ camel-provider.c \ camel-remote-store.c \ camel-sasl.c \ + camel-sasl-anonymous.c \ camel-sasl-cram-md5.c \ camel-sasl-kerberos4.c \ camel-sasl-plain.c \ @@ -113,6 +114,7 @@ libcamelinclude_HEADERS = \ camel-provider.h \ camel-remote-store.h \ camel-sasl.h \ + camel-sasl-anonymous.h \ camel-sasl-cram-md5.h \ camel-sasl-kerberos4.h \ camel-sasl-plain.h \ 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 <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 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 <config.h> +#include "camel-sasl-anonymous.h" +#include "camel-internet-address.h" +#include "camel-mime-utils.h" +#include <string.h> + +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; +} diff --git a/camel/camel-sasl-anonymous.h b/camel/camel-sasl-anonymous.h new file mode 100644 index 0000000000..ba2845d68a --- /dev/null +++ b/camel/camel-sasl-anonymous.h @@ -0,0 +1,69 @@ +/* -*- 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 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. + * + */ + +#ifndef CAMEL_SASL_ANONYMOUS_H +#define CAMEL_SASL_ANONYMOUS_H + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus }*/ + +#include <camel/camel-sasl.h> + +#define CAMEL_SASL_ANONYMOUS_TYPE (camel_sasl_anonymous_get_type ()) +#define CAMEL_SASL_ANONYMOUS(obj) (CAMEL_CHECK_CAST((obj), CAMEL_SASL_ANONYMOUS_TYPE, CamelSaslAnonymous)) +#define CAMEL_SASL_ANONYMOUS_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_SASL_ANONYMOUS_TYPE, CamelSaslAnonymousClass)) +#define CAMEL_IS_SASL_ANONYMOUS(o) (CAMEL_CHECK_TYPE((o), CAMEL_SASL_ANONYMOUS_TYPE)) + +typedef enum { + CAMEL_SASL_ANON_TRACE_EMAIL, + CAMEL_SASL_ANON_TRACE_OPAQUE, + CAMEL_SASL_ANON_TRACE_EMPTY +} CamelSaslAnonTraceType; + +typedef struct _CamelSaslAnonymous { + CamelSasl parent_object; + struct _CamelSaslAnonymousPrivate *priv; + + char *trace_info; + CamelSaslAnonTraceType type; +} CamelSaslAnonymous; + + +typedef struct _CamelSaslAnonymousClass { + CamelSaslClass parent_class; + +} CamelSaslAnonymousClass; + + +/* Standard Camel function */ +CamelType camel_sasl_anonymous_get_type (void); + +/* public methods */ +CamelSasl * camel_sasl_anonymous_new (CamelSaslAnonTraceType type, const char *trace_info); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* CAMEL_SASL_ANONYMOUS_H */ diff --git a/camel/camel-sasl-cram-md5.c b/camel/camel-sasl-cram-md5.c index 0ad32aae04..66d42aca92 100644 --- a/camel/camel-sasl-cram-md5.c +++ b/camel/camel-sasl-cram-md5.c @@ -35,7 +35,8 @@ static CamelSaslClass *parent_class = NULL; static GByteArray *cram_md5_challenge (CamelSasl *sasl, const char *token, CamelException *ex); enum { - STATE_AUTH + STATE_AUTH, + STATE_FINAL }; struct _CamelSaslCramMd5Private { @@ -170,6 +171,8 @@ cram_md5_challenge (CamelSasl *sasl, const char *token, CamelException *ex) g_free (enc); break; + case STATE_FINAL: + sasl->authenticated = TRUE; default: break; } diff --git a/camel/camel-sasl-plain.c b/camel/camel-sasl-plain.c index 5d986350c9..6b7a4de2bc 100644 --- a/camel/camel-sasl-plain.c +++ b/camel/camel-sasl-plain.c @@ -32,7 +32,8 @@ static CamelSaslClass *parent_class = NULL; static GByteArray *plain_challenge (CamelSasl *sasl, const char *token, CamelException *ex); enum { - STATE_LOGIN + STATE_LOGIN, + STATE_FINAL }; struct _CamelSaslPlainPrivate { @@ -123,6 +124,9 @@ plain_challenge (CamelSasl *sasl, const char *token, CamelException *ex) g_byte_array_append (buf, "", 1); g_byte_array_append (buf, sasl_plain->passwd, strlen (sasl_plain->passwd)); break; + case STATE_FINAL: + sasl->authenticated = TRUE; + break; default: break; } |