loudmouth/lm-sasl.c
author Mikael Hallendal <micke@imendio.com>
Sun, 30 Nov 2008 09:27:21 +0100
changeset 572 0a4fa0952ef6
parent 332 6b6ad42cd508
child 574 f84be3f7c7e0
permissions -rw-r--r--
Don't free connection internals before it's closed. [#34] When the connection freed up internal states (in this case the handler lists) before closing itself it segfaulted when trying to unregister the SASL handlers. Reported by Julien Puydt.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
     1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
     2
/*
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
     3
 * Copyright (C) 2007 Collabora Ltd.
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
     4
 *
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
     6
 * modify it under the terms of the GNU Lesser General Public License as
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
     7
 * published by the Free Software Foundation; either version 2 of the
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
     8
 * License, or (at your option) any later version.
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
     9
 *
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    10
 * This program is distributed in the hope that it will be useful,
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    13
 * Lesser General Public License for more details.
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    14
 *
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    15
 * You should have received a copy of the GNU Lesser General Public
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    16
 * License along with this program; if not, write to the
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    17
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    18
 * Boston, MA 02111-1307, USA.
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    19
 */
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    20
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    21
#include <stdio.h>
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    22
#include <string.h>
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    23
#include <glib.h>
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    24
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    25
#include "lm-sock.h"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    26
#include "lm-debug.h"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    27
#include "lm-error.h"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    28
#include "lm-internals.h"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    29
#include "lm-message-queue.h"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    30
#include "lm-misc.h"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    31
#include "lm-ssl-internals.h"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    32
#include "lm-parser.h"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    33
#include "lm-sha.h"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    34
#include "lm-connection.h"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    35
#include "lm-utils.h"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    36
#include "lm-socket.h"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    37
#include "lm-sasl.h"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    38
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    39
#include "md5.h"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    40
#include "base64.h"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    41
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    42
typedef enum {
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    43
	AUTH_TYPE_PLAIN  = 1,
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    44
	AUTH_TYPE_DIGEST = 2
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    45
} AuthType;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    46
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    47
typedef enum {
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    48
	SASL_AUTH_STATE_NO_MECH,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    49
	SASL_AUTH_STATE_PLAIN_STARTED,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    50
	SASL_AUTH_STATE_DIGEST_MD5_STARTED,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    51
	SASL_AUTH_STATE_DIGEST_MD5_SENT_AUTH_RESPONSE,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    52
	SASL_AUTH_STATE_DIGEST_MD5_SENT_FINAL_RESPONSE,
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    53
} SaslAuthState;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    54
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    55
struct _LmSASL {
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    56
	LmConnection        *connection;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    57
	AuthType             auth_type;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    58
	SaslAuthState        state;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    59
	gchar               *username;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    60
	gchar               *password;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    61
	gchar               *server;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    62
	gchar               *digest_md5_rspauth;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    63
	LmMessageHandler    *features_cb;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    64
	LmMessageHandler    *challenge_cb;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    65
	LmMessageHandler    *success_cb;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    66
	LmMessageHandler    *failure_cb;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    67
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
    68
	gboolean             features_received;
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
    69
	gboolean             start_auth;
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
    70
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    71
	LmSASLResultHandler  handler;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    72
};
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    73
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    74
#define XMPP_NS_SASL_AUTH "urn:ietf:params:xml:ns:xmpp-sasl"
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    75
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    76
static LmHandlerResult     sasl_features_cb  (LmMessageHandler *handler,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    77
					      LmConnection     *connection,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    78
					      LmMessage        *message,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    79
					      gpointer          user_data);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    80
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    81
static LmHandlerResult     sasl_challenge_cb (LmMessageHandler *handler,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    82
					      LmConnection     *connection,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    83
					      LmMessage        *message,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    84
					      gpointer          user_data);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    85
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    86
static LmHandlerResult     sasl_success_cb   (LmMessageHandler *handler,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    87
					      LmConnection     *connection,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    88
					      LmMessage        *message,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    89
					      gpointer          user_data);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    90
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    91
static LmHandlerResult     sasl_failure_cb   (LmMessageHandler *handler,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    92
					      LmConnection     *connection,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    93
					      LmMessage        *message,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
    94
					      gpointer          user_data);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    95
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    96
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    97
/* DIGEST-MD5 mechanism code from libgibber */
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    98
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
    99
static gchar *
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   100
sasl_strndup_unescaped (const gchar *str, gsize len) 
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   101
{
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   102
	const gchar *s;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   103
	gchar       *d;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   104
	gchar       *ret;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   105
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   106
	ret = g_malloc0 (len + 1);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   107
	for (s = str, d = ret ; s < (str + len) ; s++, d++) {
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   108
		if (*s == '\\') s++;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   109
		*d = *s;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   110
	}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   111
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   112
	return ret;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   113
}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   114
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   115
static GHashTable *
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   116
sasl_digest_md5_challenge_to_hash (const gchar * challenge)
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   117
{
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   118
	const gchar *keystart, *keyend, *valstart;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   119
	const gchar *c = challenge;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   120
	gchar       *key, *val;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   121
	GHashTable  *result;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   122
	
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   123
	result = g_hash_table_new_full (g_str_hash, g_str_equal, 
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   124
					g_free, g_free);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   125
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   126
	do { 
270
7247db75f528 Skip whitespace before SASL MD5 digest. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 255
diff changeset
   127
		while (g_ascii_isspace(*c)) c++;
7247db75f528 Skip whitespace before SASL MD5 digest. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 255
diff changeset
   128
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   129
		keystart = c;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   130
		for (; *c != '\0' && *c != '='; c++);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   131
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   132
		if (*c == '\0' || c == keystart) goto error;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   133
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   134
		keyend = c; 
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   135
		c++;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   136
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   137
		if (*c == '"') {
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   138
			c++;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   139
			valstart = c;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   140
			for (; *c != '\0' && *c != '"'; c++);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   141
			if (*c == '\0' || c == valstart) goto error;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   142
			val = sasl_strndup_unescaped (valstart, c - valstart);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   143
			c++;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   144
		} else {
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   145
			valstart = c;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   146
			for (; *c !=  '\0' && *c != ','; c++);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   147
			if (c == valstart) goto error;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   148
			val = g_strndup (valstart, c - valstart);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   149
		}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   150
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   151
		key = g_strndup (keystart, keyend - keystart);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   152
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   153
		g_hash_table_insert (result, key, val);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   154
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   155
		if (*c == ',') c++;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   156
	} while (*c != '\0');
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   157
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   158
	return result;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   159
error:
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   160
	g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, 
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   161
	       "Failed to parse challenge: %s", challenge);
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   162
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   163
	g_hash_table_destroy (result);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   164
	return NULL;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   165
}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   166
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   167
static gchar *
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   168
sasl_md5_hex_hash (gchar *value, gsize len) 
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   169
{
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   170
	md5_byte_t   digest_md5[16];
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   171
	md5_state_t  md5_calc;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   172
	GString     *str;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   173
	int          i;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   174
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   175
	str = g_string_sized_new (32);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   176
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   177
	md5_init (&md5_calc);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   178
	md5_append (&md5_calc, (const md5_byte_t *)value, len);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   179
	md5_finish (&md5_calc, digest_md5);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   180
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   181
	for (i = 0 ; i < 16 ; i++) {
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   182
		g_string_append_printf (str, "%02x", digest_md5[i]);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   183
	}
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   184
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   185
	return g_string_free (str, FALSE);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   186
}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   187
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   188
static gchar *
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   189
sasl_digest_md5_generate_cnonce(void)
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   190
{
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   191
	/* RFC 2831 recommends the the nonce to be either hexadecimal or base64 with
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   192
	 * at least 64 bits of entropy */
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   193
#define NR 8
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   194
	guint32 n[NR]; 
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   195
	int i;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   196
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   197
	for (i = 0; i < NR; i++) {
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   198
		n[i] = g_random_int();
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   199
	}
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   200
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   201
	return base64_encode ((gchar *)n, sizeof(n));
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   202
}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   203
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   204
static gchar *
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   205
sasl_md5_prepare_response (LmSASL *sasl, GHashTable *challenge)
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   206
{
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   207
	GString     *response;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   208
	const gchar *realm, *nonce;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   209
	gchar       *a1, *a1h, *a2, *a2h, *kd, *kdh;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   210
	gchar       *cnonce = NULL;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   211
	gchar       *tmp;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   212
	md5_byte_t   digest_md5[16];
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   213
	md5_state_t  md5_calc;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   214
	gsize        len;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   215
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   216
	response = g_string_new ("");
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   217
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   218
	if (sasl->username == NULL || sasl->password == NULL) {
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   219
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   220
		       "%s: no username or password provided", G_STRFUNC);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   221
		if (sasl->handler) {
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   222
			sasl->handler (sasl, sasl->connection, 
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   223
				       FALSE, "no username/password provided");
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   224
		}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   225
		goto error;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   226
	}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   227
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   228
	nonce = g_hash_table_lookup (challenge, "nonce");
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   229
	if (nonce == NULL || nonce == '\0') {
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   230
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   231
		       "%s: server didn't provide a nonce in the challenge", 
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   232
		       G_STRFUNC);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   233
		if (sasl->handler) {
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   234
			sasl->handler (sasl, sasl->connection,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   235
				       FALSE, "server error");
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   236
		}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   237
		goto error;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   238
	}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   239
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   240
	cnonce = sasl_digest_md5_generate_cnonce ();
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   241
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   242
	/* FIXME challenge can contain multiple realms */
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   243
	realm = g_hash_table_lookup (challenge, "realm");
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   244
	if (realm == NULL) {
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   245
		realm = sasl->server;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   246
	}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   247
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   248
	/* FIXME properly escape values */
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   249
	g_string_append_printf (response, "username=\"%s\"", sasl->username);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   250
	g_string_append_printf (response, ",realm=\"%s\"", realm);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   251
	g_string_append_printf (response, ",digest-uri=\"xmpp/%s\"", realm);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   252
	g_string_append_printf (response, ",nonce=\"%s\",nc=00000001", nonce);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   253
	g_string_append_printf (response, ",cnonce=\"%s\"", cnonce);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   254
	/* FIXME should check if auth is in the cop challenge val */
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   255
	g_string_append_printf (response, ",qop=auth,charset=utf-8");
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   256
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   257
	tmp = g_strdup_printf ("%s:%s:%s", 
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   258
			       sasl->username, realm, sasl->password);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   259
	md5_init (&md5_calc);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   260
	md5_append (&md5_calc, (const md5_byte_t *)tmp, strlen(tmp));
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   261
	md5_finish (&md5_calc, digest_md5);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   262
	g_free (tmp);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   263
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   264
	a1 = g_strdup_printf ("0123456789012345:%s:%s", nonce, cnonce);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   265
	len = strlen (a1);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   266
	memcpy (a1, digest_md5, 16);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   267
	a1h = sasl_md5_hex_hash (a1, len);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   268
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   269
	a2 = g_strdup_printf ("AUTHENTICATE:xmpp/%s", realm);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   270
	a2h = sasl_md5_hex_hash (a2, strlen(a2));
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   271
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   272
	kd = g_strdup_printf ("%s:%s:00000001:%s:auth:%s",
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   273
			      a1h, nonce, cnonce, a2h);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   274
	kdh = sasl_md5_hex_hash (kd, strlen(kd));
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   275
	g_string_append_printf (response, ",response=%s", kdh);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   276
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   277
	g_free (kd);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   278
	g_free (kdh);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   279
	g_free (a2);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   280
	g_free (a2h);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   281
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   282
	/* Calculate the response we expect from the server */
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   283
	a2 = g_strdup_printf (":xmpp/%s", realm);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   284
	a2h = sasl_md5_hex_hash (a2, strlen(a2));
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   285
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   286
	kd = g_strdup_printf ("%s:%s:00000001:%s:auth:%s", a1h, nonce, cnonce, a2h);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   287
	g_free (sasl->digest_md5_rspauth);
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   288
	sasl->digest_md5_rspauth = sasl_md5_hex_hash (kd, strlen(kd));
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   289
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   290
	g_free (a1);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   291
	g_free (a1h);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   292
	g_free (a2);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   293
	g_free (a2h);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   294
	g_free (kd);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   295
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   296
out:
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   297
	g_free (cnonce);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   298
	if (response) {
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   299
		return g_string_free (response, FALSE);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   300
	} else {
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   301
		return NULL;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   302
	}
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   303
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   304
error:
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   305
	g_string_free (response, TRUE);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   306
	response = NULL;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   307
	goto out;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   308
}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   309
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   310
static gboolean
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   311
sasl_digest_md5_send_initial_response (LmSASL *sasl, GHashTable *challenge)
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   312
{
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   313
	LmMessage *msg;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   314
	gchar     *response;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   315
	gchar     *response64;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   316
	int        result;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   317
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   318
	response = sasl_md5_prepare_response(sasl, challenge);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   319
	if (response == NULL) {
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   320
		return FALSE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   321
	}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   322
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   323
	response64 = base64_encode ((gchar *)response, strlen(response));
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   324
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   325
	msg = lm_message_new (NULL, LM_MESSAGE_TYPE_RESPONSE);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   326
	lm_message_node_set_attributes (msg->node,
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   327
					"xmlns", XMPP_NS_SASL_AUTH,
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   328
					NULL);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   329
	lm_message_node_set_value (msg->node, response64);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   330
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   331
	result = lm_connection_send (sasl->connection, msg, NULL);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   332
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   333
	g_free (response);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   334
	g_free (response64);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   335
	lm_message_unref (msg);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   336
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   337
	if (!result) {
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   338
		return FALSE;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   339
	}
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   340
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   341
	sasl->state = SASL_AUTH_STATE_DIGEST_MD5_SENT_AUTH_RESPONSE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   342
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   343
	return TRUE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   344
}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   345
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   346
static gboolean
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   347
sasl_digest_md5_check_server_response(LmSASL *sasl, GHashTable *challenge)
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   348
{
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   349
	LmMessage   *msg;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   350
	const gchar *rspauth;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   351
	int          result;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   352
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   353
	rspauth = g_hash_table_lookup (challenge, "rspauth");
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   354
	if (rspauth == NULL) {
224
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   355
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SSL,
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   356
		       "%s: server sent an invalid reply (no rspauth)\n",
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   357
		       G_STRFUNC);
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   358
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   359
		if (sasl->handler) {
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   360
			sasl->handler (sasl, sasl->connection, 
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   361
				       TRUE, "server error");
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   362
		}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   363
		return FALSE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   364
	}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   365
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   366
	if (strcmp (sasl->digest_md5_rspauth, rspauth) != 0) {
224
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   367
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SSL,
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   368
		       "%s: server sent an invalid reply (rspauth not matching)\n", 
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   369
		       G_STRFUNC);
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   370
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   371
		if (sasl->handler) {
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   372
			sasl->handler (sasl, sasl->connection,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   373
				       TRUE, "server error");
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   374
		}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   375
		return FALSE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   376
	}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   377
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   378
	msg = lm_message_new (NULL, LM_MESSAGE_TYPE_RESPONSE);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   379
	lm_message_node_set_attributes (msg->node,
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   380
					"xmlns", XMPP_NS_SASL_AUTH,
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   381
					NULL);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   382
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   383
	result = lm_connection_send (sasl->connection, msg, NULL);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   384
	lm_message_unref (msg);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   385
224
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   386
	if (!result) {
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   387
		g_warning ("Failed to send SASL response\n");
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   388
		return FALSE;
224
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   389
	}
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   390
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   391
	sasl->state = SASL_AUTH_STATE_DIGEST_MD5_SENT_FINAL_RESPONSE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   392
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   393
	return TRUE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   394
}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   395
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   396
static gboolean
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   397
sasl_digest_md5_handle_challenge (LmSASL *sasl, LmMessageNode *node)
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   398
{
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   399
	const gchar *encoded;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   400
	gchar       *challenge;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   401
	gsize        len;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   402
	GHashTable  *h;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   403
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   404
	encoded = lm_message_node_get_value (node);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   405
	if (!encoded) {
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   406
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   407
		       "%s: got empty challenge!", G_STRFUNC);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   408
		return FALSE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   409
	}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   410
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   411
	challenge = (gchar *) base64_decode (encoded, &len);
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   412
	h = sasl_digest_md5_challenge_to_hash (challenge);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   413
	g_free(challenge);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   414
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   415
	if (!h) {
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   416
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   417
		       "%s: server sent an invalid challenge", G_STRFUNC);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   418
		if (sasl->handler) {
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   419
			sasl->handler (sasl, sasl->connection, 
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   420
				       FALSE, "server error");
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   421
		}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   422
		return FALSE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   423
	}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   424
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   425
	switch (sasl->state) {
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   426
	case SASL_AUTH_STATE_DIGEST_MD5_STARTED:
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   427
		sasl_digest_md5_send_initial_response (sasl, h); 
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   428
		break;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   429
	case SASL_AUTH_STATE_DIGEST_MD5_SENT_AUTH_RESPONSE:
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   430
		sasl_digest_md5_check_server_response (sasl, h); 
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   431
		break;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   432
	default:
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   433
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   434
		       "%s: server sent a challenge at the wrong time", 
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   435
		       G_STRFUNC);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   436
		if (sasl->handler) {
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   437
			sasl->handler (sasl, sasl->connection,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   438
				       FALSE, "server error");
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   439
		}
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   440
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   441
		return FALSE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   442
	} 
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   443
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   444
	g_hash_table_destroy(h);
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   445
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   446
	return TRUE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   447
}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   448
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   449
static LmHandlerResult
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   450
sasl_challenge_cb (LmMessageHandler *handler,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   451
		   LmConnection     *connection,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   452
		   LmMessage        *message,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   453
		   gpointer          user_data)
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   454
{
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   455
	LmSASL      *sasl;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   456
	const gchar *ns;
224
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   457
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   458
	ns = lm_message_node_get_attribute (message->node, "xmlns");
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   459
	if (!ns || strcmp (ns, XMPP_NS_SASL_AUTH) != 0) {
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   460
		return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   461
	}
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   462
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   463
	sasl = (LmSASL *) user_data;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   464
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   465
	switch (sasl->auth_type) {
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   466
	case AUTH_TYPE_PLAIN:
224
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   467
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SSL,
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   468
		       "%s: server sent challenge for PLAIN mechanism",
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   469
		       G_STRFUNC);
447f16217278 Use g_log instead of g_debug
Mikael Hallendal <micke@imendio.com>
parents: 216
diff changeset
   470
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   471
		if (sasl->handler) {
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   472
			sasl->handler (sasl, sasl->connection, 
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   473
				       FALSE, "server error");
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   474
		}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   475
		break;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   476
	case AUTH_TYPE_DIGEST:
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   477
		sasl_digest_md5_handle_challenge (sasl, message->node);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   478
		break;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   479
	default:
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   480
		g_warning ("Wrong auth type");
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   481
		break;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   482
	}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   483
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   484
	return LM_HANDLER_RESULT_REMOVE_MESSAGE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   485
}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   486
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   487
static LmHandlerResult
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   488
sasl_success_cb (LmMessageHandler *handler,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   489
		 LmConnection     *connection,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   490
		 LmMessage        *message,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   491
		 gpointer          user_data)
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   492
{
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   493
	LmSASL      *sasl;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   494
	const gchar *ns;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   495
	
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   496
	ns = lm_message_node_get_attribute (message->node, "xmlns");
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   497
	if (!ns || strcmp (ns, XMPP_NS_SASL_AUTH) != 0) {
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   498
		return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   499
	}
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   500
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   501
	sasl = (LmSASL *) user_data;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   502
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   503
	switch (sasl->auth_type) {
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   504
	case AUTH_TYPE_PLAIN:
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   505
		if (sasl->state != SASL_AUTH_STATE_PLAIN_STARTED) {
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   506
			g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   507
			       "%s: server sent success before finishing auth", 
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   508
			       G_STRFUNC);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   509
			if (sasl->handler) {
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   510
				sasl->handler (sasl, sasl->connection, 
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   511
					       FALSE, "server error");
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   512
			}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   513
		}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   514
		break;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   515
	case AUTH_TYPE_DIGEST:
225
bf60cd9af13f Fixed a problem in the sasl state machine
Mikael Hallendal <micke@imendio.com>
parents: 224
diff changeset
   516
		if (sasl->state != SASL_AUTH_STATE_DIGEST_MD5_SENT_AUTH_RESPONSE &&
bf60cd9af13f Fixed a problem in the sasl state machine
Mikael Hallendal <micke@imendio.com>
parents: 224
diff changeset
   517
		    sasl->state != SASL_AUTH_STATE_DIGEST_MD5_SENT_FINAL_RESPONSE) {
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   518
			g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   519
			       "%s: server sent success before finishing auth", 
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   520
			       G_STRFUNC);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   521
			if (sasl->handler) {
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   522
				sasl->handler (sasl, sasl->connection, 
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   523
					       FALSE, "server error");
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   524
			}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   525
		}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   526
		break;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   527
	default:
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   528
		g_warning ("Wrong auth type");
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   529
		break;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   530
	}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   531
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   532
	g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   533
	       "%s: SASL authentication successful", G_STRFUNC);
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   534
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   535
	if (sasl->handler) {
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   536
		sasl->handler (sasl, sasl->connection, TRUE, NULL);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   537
	}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   538
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   539
	return LM_HANDLER_RESULT_REMOVE_MESSAGE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   540
	
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   541
}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   542
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   543
static LmHandlerResult
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   544
sasl_failure_cb (LmMessageHandler *handler,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   545
		 LmConnection     *connection,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   546
		 LmMessage        *message,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   547
		 gpointer          user_data)
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   548
{
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   549
	LmSASL      *sasl;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   550
	const gchar *ns;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   551
	const gchar *reason = "unknown reason";
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   552
	
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   553
	ns = lm_message_node_get_attribute (message->node, "xmlns");
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   554
	if (!ns || strcmp (ns, XMPP_NS_SASL_AUTH) != 0) {
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   555
		return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   556
	}
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   557
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   558
	sasl = (LmSASL *) user_data;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   559
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   560
	if (message->node->children) {
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   561
		const gchar *r;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   562
		
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   563
		r = lm_message_node_get_value (message->node->children);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   564
		if (r) {
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   565
			reason = r;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   566
		}
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   567
	}
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   568
	
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   569
	g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   570
	       "%s: SASL authentication failed: %s", G_STRFUNC, reason);
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   571
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   572
	if (sasl->handler) {
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   573
		sasl->handler (sasl, sasl->connection, FALSE, reason);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   574
	}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   575
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   576
	return LM_HANDLER_RESULT_REMOVE_MESSAGE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   577
}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   578
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   579
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   580
static gboolean
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   581
sasl_start (LmSASL *sasl)
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   582
{
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   583
	LmMessage  *auth_msg;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   584
	gboolean    result;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   585
	const char *mech = NULL;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   586
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   587
	auth_msg = lm_message_new (NULL, LM_MESSAGE_TYPE_AUTH);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   588
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   589
	if (sasl->auth_type == AUTH_TYPE_PLAIN) {
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   590
      		GString *str;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   591
		gchar   *cstr;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   592
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   593
		str = g_string_new ("");
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   594
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   595
		mech = "PLAIN";
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   596
		sasl->state = SASL_AUTH_STATE_PLAIN_STARTED;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   597
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   598
		if (sasl->username == NULL || sasl->password == NULL) {
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   599
			g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   600
			       "%s: no username or password provided", 
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   601
			       G_STRFUNC);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   602
			if (sasl->handler) {
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   603
				sasl->handler (sasl, sasl->connection, FALSE, "no username/password provided");
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   604
			}
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   605
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   606
			return FALSE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   607
		}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   608
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   609
		g_string_append_c (str, '\0');
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   610
		g_string_append (str, sasl->username);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   611
		g_string_append_c (str, '\0');
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   612
		g_string_append (str, sasl->password);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   613
		cstr = base64_encode ((gchar *)str->str, str->len);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   614
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   615
		lm_message_node_set_value (auth_msg->node, cstr);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   616
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   617
		g_string_free (str, TRUE);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   618
		g_free (cstr);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   619
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   620
		/* Here we say the Google magic word. Bad Google. */
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   621
		lm_message_node_set_attributes (auth_msg->node,
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   622
						"xmlns:ga", "http://www.google.com/talk/protocol/auth",
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   623
						"ga:client-uses-full-bind-result", "true",
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   624
						NULL);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   625
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   626
	} 
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   627
	else if (sasl->auth_type == AUTH_TYPE_DIGEST) {
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   628
		mech = "DIGEST-MD5";
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   629
		sasl->state = SASL_AUTH_STATE_DIGEST_MD5_STARTED;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   630
	}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   631
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   632
	lm_message_node_set_attributes (auth_msg->node,
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   633
					"xmlns", XMPP_NS_SASL_AUTH,
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   634
					"mechanism", mech,
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   635
					NULL);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   636
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   637
	result = lm_connection_send (sasl->connection, auth_msg, NULL);
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   638
	lm_message_unref (auth_msg);
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   639
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   640
	if (!result) {
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   641
		return FALSE;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   642
	}
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   643
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   644
	return TRUE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   645
}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   646
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   647
static gboolean
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   648
sasl_set_auth_type (LmSASL *sasl, LmMessageNode *mechanisms)
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   649
{
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   650
	LmMessageNode *m;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   651
	const gchar   *ns;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   652
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   653
	sasl->auth_type = 0;
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   654
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   655
	ns = lm_message_node_get_attribute (mechanisms, "xmlns");
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   656
	if (!ns || strcmp (ns, XMPP_NS_SASL_AUTH) != 0) {
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   657
		return FALSE;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   658
	}
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   659
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   660
	for (m = mechanisms->children; m; m = m->next) {
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   661
		const gchar *name;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   662
		
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   663
		name = lm_message_node_get_value (m);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   664
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   665
		if (!name) {
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   666
			continue;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   667
		}
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   668
		if (strcmp (name, "PLAIN") == 0) {
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   669
			sasl->auth_type |= AUTH_TYPE_PLAIN;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   670
			continue;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   671
		}
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   672
		if (strcmp (name, "DIGEST-MD5") == 0) {
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   673
			sasl->auth_type |= AUTH_TYPE_DIGEST;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   674
			continue;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   675
		}
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   676
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   677
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   678
		       "%s: unknown SASL auth mechanism: %s", G_STRFUNC, name);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   679
	}
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   680
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   681
	return TRUE;
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   682
}
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   683
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   684
static gboolean
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   685
sasl_authenticate (LmSASL *sasl)
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   686
{
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   687
	if (sasl->auth_type == 0) {
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   688
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   689
		      "%s: no supported SASL auth mechanisms found",
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   690
		      G_STRFUNC);
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   691
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   692
		return FALSE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   693
	}
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   694
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   695
	/* Prefer DIGEST */
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   696
	if (sasl->auth_type & AUTH_TYPE_DIGEST) {
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   697
		sasl->auth_type = AUTH_TYPE_DIGEST;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   698
		return sasl_start (sasl);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   699
	}
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   700
	else if (sasl->auth_type & AUTH_TYPE_PLAIN) {
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   701
		sasl->auth_type = AUTH_TYPE_PLAIN;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   702
		return sasl_start (sasl);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   703
	} 
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   704
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   705
	return FALSE;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   706
}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   707
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   708
static LmHandlerResult
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   709
sasl_features_cb (LmMessageHandler *handler,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   710
		  LmConnection     *connection,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   711
		  LmMessage        *message,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   712
		  gpointer          user_data)
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   713
{
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   714
    	LmMessageNode *mechanisms;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   715
	LmSASL        *sasl;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   716
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   717
	g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, "Stream features received\n");
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   718
	mechanisms = lm_message_node_find_child (message->node, "mechanisms");
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   719
	if (!mechanisms) {
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   720
		return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   721
	}
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   722
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   723
	sasl = (LmSASL *) user_data;
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   724
	sasl->features_received = TRUE;
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   725
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   726
	sasl_set_auth_type (sasl, mechanisms);
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   727
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   728
	if (sasl->start_auth) {
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   729
		sasl_authenticate (sasl);
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   730
	}
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   731
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   732
	return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   733
}
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   734
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   735
LmSASL *
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   736
lm_sasl_new (LmConnection *connection)
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   737
{
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   738
	LmSASL *sasl;
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   739
	
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   740
	sasl = g_new0 (LmSASL, 1);
216
fab18da0956b Added lm-sasl.[ch] from Senko
Mikael Hallendal <micke@imendio.com>
parents:
diff changeset
   741
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   742
	sasl->connection = connection;
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   743
	sasl->features_received = FALSE;
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   744
	sasl->start_auth = FALSE;
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   745
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   746
	sasl->features_cb = lm_message_handler_new (sasl_features_cb,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   747
						    sasl,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   748
						    NULL);
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   749
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   750
	lm_connection_register_message_handler (connection,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   751
						sasl->features_cb,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   752
						LM_MESSAGE_TYPE_STREAM_FEATURES,
321
d9dc997db56b Ensure that SASL features handler is called after all the others, ensuring
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 270
diff changeset
   753
						LM_HANDLER_PRIORITY_LAST);
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   754
	return sasl;
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   755
}
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   756
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   757
void
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   758
lm_sasl_authenticate (LmSASL              *sasl,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   759
		      const gchar         *username,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   760
		      const gchar         *password,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   761
		      const gchar         *server,
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   762
		      LmSASLResultHandler  handler)
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   763
{
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   764
	sasl->username   = g_strdup (username);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   765
	sasl->password   = g_strdup (password);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   766
	sasl->server     = g_strdup (server);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   767
	sasl->handler    = handler;
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   768
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   769
	sasl->challenge_cb = lm_message_handler_new (sasl_challenge_cb,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   770
						     sasl,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   771
						     NULL);
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   772
	lm_connection_register_message_handler (sasl->connection,
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   773
						sasl->challenge_cb,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   774
						LM_MESSAGE_TYPE_CHALLENGE,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   775
						LM_HANDLER_PRIORITY_FIRST);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   776
	
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   777
	sasl->success_cb = lm_message_handler_new (sasl_success_cb,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   778
						   sasl,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   779
						   NULL);
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   780
	lm_connection_register_message_handler (sasl->connection,
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   781
						sasl->success_cb,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   782
						LM_MESSAGE_TYPE_SUCCESS,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   783
						LM_HANDLER_PRIORITY_FIRST);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   784
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   785
	sasl->failure_cb = lm_message_handler_new (sasl_failure_cb,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   786
						   sasl,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   787
						   NULL);
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   788
	lm_connection_register_message_handler (sasl->connection,
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   789
						sasl->failure_cb,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   790
						LM_MESSAGE_TYPE_FAILURE,
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   791
						LM_HANDLER_PRIORITY_FIRST);
255
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   792
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   793
	if (sasl->features_received) {
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   794
		sasl_authenticate (sasl);
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   795
	} else {
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   796
		sasl->start_auth = TRUE;
704881ac7788 Fixed potential problem if auth was not called from the open callback.
Mikael Hallendal <micke@imendio.com>
parents: 227
diff changeset
   797
	}
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   798
}
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   799
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   800
void
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   801
lm_sasl_free (LmSASL *sasl)
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   802
{
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   803
	g_return_if_fail (sasl != NULL);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   804
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   805
	g_free (sasl->username);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   806
	g_free (sasl->password);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   807
	g_free (sasl->server);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   808
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   809
	if (sasl->features_cb) {
572
0a4fa0952ef6 Don't free connection internals before it's closed. [#34]
Mikael Hallendal <micke@imendio.com>
parents: 332
diff changeset
   810
        lm_connection_unregister_message_handler (sasl->connection,
0a4fa0952ef6 Don't free connection internals before it's closed. [#34]
Mikael Hallendal <micke@imendio.com>
parents: 332
diff changeset
   811
                                                  sasl->features_cb, 
0a4fa0952ef6 Don't free connection internals before it's closed. [#34]
Mikael Hallendal <micke@imendio.com>
parents: 332
diff changeset
   812
                                                  LM_MESSAGE_TYPE_STREAM_FEATURES);
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   813
	}
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   814
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   815
	if (sasl->challenge_cb) {
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   816
		lm_connection_unregister_message_handler (sasl->connection,
572
0a4fa0952ef6 Don't free connection internals before it's closed. [#34]
Mikael Hallendal <micke@imendio.com>
parents: 332
diff changeset
   817
                                                  sasl->challenge_cb,
0a4fa0952ef6 Don't free connection internals before it's closed. [#34]
Mikael Hallendal <micke@imendio.com>
parents: 332
diff changeset
   818
                                                  LM_MESSAGE_TYPE_CHALLENGE);
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   819
	}
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   820
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   821
	if (sasl->success_cb) {
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   822
		lm_connection_unregister_message_handler (sasl->connection,
572
0a4fa0952ef6 Don't free connection internals before it's closed. [#34]
Mikael Hallendal <micke@imendio.com>
parents: 332
diff changeset
   823
                                                  sasl->success_cb,
0a4fa0952ef6 Don't free connection internals before it's closed. [#34]
Mikael Hallendal <micke@imendio.com>
parents: 332
diff changeset
   824
                                                  LM_MESSAGE_TYPE_SUCCESS);
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   825
	}
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   826
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   827
	if (sasl->failure_cb) {
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   828
		lm_connection_unregister_message_handler (sasl->connection,
572
0a4fa0952ef6 Don't free connection internals before it's closed. [#34]
Mikael Hallendal <micke@imendio.com>
parents: 332
diff changeset
   829
                                                  sasl->failure_cb,
0a4fa0952ef6 Don't free connection internals before it's closed. [#34]
Mikael Hallendal <micke@imendio.com>
parents: 332
diff changeset
   830
                                                  LM_MESSAGE_TYPE_FAILURE);
227
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   831
	}
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   832
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   833
	g_free (sasl);
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   834
}
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   835
b8fa5635fb30 Conform with Loudmouth coding style
Mikael Hallendal <micke@imendio.com>
parents: 225
diff changeset
   836
332
6b6ad42cd508 Support obsolete XEP-0078 (old-style jabber auth for XMPP1.0).
Senko Rasic <senko@phyrexia.lan>
parents: 321
diff changeset
   837
void
6b6ad42cd508 Support obsolete XEP-0078 (old-style jabber auth for XMPP1.0).
Senko Rasic <senko@phyrexia.lan>
parents: 321
diff changeset
   838
lm_sasl_get_auth_params (LmSASL *sasl, const gchar **username,
6b6ad42cd508 Support obsolete XEP-0078 (old-style jabber auth for XMPP1.0).
Senko Rasic <senko@phyrexia.lan>
parents: 321
diff changeset
   839
	const gchar **password)
6b6ad42cd508 Support obsolete XEP-0078 (old-style jabber auth for XMPP1.0).
Senko Rasic <senko@phyrexia.lan>
parents: 321
diff changeset
   840
{
6b6ad42cd508 Support obsolete XEP-0078 (old-style jabber auth for XMPP1.0).
Senko Rasic <senko@phyrexia.lan>
parents: 321
diff changeset
   841
	*username = sasl->username;
6b6ad42cd508 Support obsolete XEP-0078 (old-style jabber auth for XMPP1.0).
Senko Rasic <senko@phyrexia.lan>
parents: 321
diff changeset
   842
	*password = sasl->password;
6b6ad42cd508 Support obsolete XEP-0078 (old-style jabber auth for XMPP1.0).
Senko Rasic <senko@phyrexia.lan>
parents: 321
diff changeset
   843
}
6b6ad42cd508 Support obsolete XEP-0078 (old-style jabber auth for XMPP1.0).
Senko Rasic <senko@phyrexia.lan>
parents: 321
diff changeset
   844