annotate libpurple/protocols/jabber/auth_cyrus.c @ 31558:ce968e115c95

propagate from branch 'im.pidgin.cpw.masca.p2p' (head 33ca865dacb9e5bcf763d06f6a42cbaca337cc64) to branch 'im.pidgin.pidgin' (head 92f47f4e8b0cbb107fd97e1ab814d1cedbf109ad)
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Fri, 06 May 2011 06:25:14 +0000
parents 84e9eb0ae4d5
children b1a6535f99d9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
1 /*
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
2 * purple - Jabber Protocol Plugin
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
3 *
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
4 * Purple is the legal property of its developers, whose names are too numerous
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
5 * to list here. Please refer to the COPYRIGHT file distributed with this
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
6 * source distribution.
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
7 *
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
11 * (at your option) any later version.
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
12 *
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
16 * GNU General Public License for more details.
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
17 *
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
21 *
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
22 */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
23 #include "internal.h"
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
24 #include "core.h"
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
25 #include "debug.h"
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
26 #include "request.h"
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
27
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
28 #include "auth.h"
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
29 #include "jabber.h"
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
30
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
31 static JabberSaslState jabber_auth_start_cyrus(JabberStream *js, xmlnode **reply,
28754
b94fd073187c jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <paul@darkrain42.org>
parents: 28753
diff changeset
32 char **error);
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
33 static void jabber_sasl_build_callbacks(JabberStream *);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
34
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
35 static void disallow_plaintext_auth(PurpleAccount *account)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
36 {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
37 purple_connection_error_reason(purple_account_get_connection(account),
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
38 PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR,
30252
c8cf189bf6db jabber: This is more accurate, I think (e.g. Cyrus doesn't know what SCRAM-SHA-1 is)
Paul Aurich <paul@darkrain42.org>
parents: 30179
diff changeset
39 _("Server may require plaintext authentication over an unencrypted stream"));
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
40 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
41
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
42 static void start_cyrus_wrapper(JabberStream *js)
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
43 {
28754
b94fd073187c jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <paul@darkrain42.org>
parents: 28753
diff changeset
44 char *error = NULL;
b94fd073187c jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <paul@darkrain42.org>
parents: 28753
diff changeset
45 xmlnode *response = NULL;
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
46 JabberSaslState state = jabber_auth_start_cyrus(js, &response, &error);
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
47
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
48 if (state == JABBER_SASL_STATE_FAIL) {
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
49 purple_connection_error_reason(js->gc,
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
50 PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE,
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
51 error);
28754
b94fd073187c jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <paul@darkrain42.org>
parents: 28753
diff changeset
52 g_free(error);
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
53 } else if (response) {
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
54 jabber_send(js, response);
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
55 xmlnode_free(response);
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
56 }
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
57 }
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
58
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
59
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
60 /* Callbacks for Cyrus SASL */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
61
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
62 static int jabber_sasl_cb_realm(void *ctx, int id, const char **avail, const char **result)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
63 {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
64 JabberStream *js = ctx;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
65
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
66 if (id != SASL_CB_GETREALM || !result) return SASL_BADPARAM;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
67
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
68 *result = js->user->domain;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
69
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
70 return SASL_OK;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
71 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
72
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
73 static int jabber_sasl_cb_simple(void *ctx, int id, const char **res, unsigned *len)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
74 {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
75 JabberStream *js = ctx;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
76
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
77 switch(id) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
78 case SASL_CB_AUTHNAME:
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
79 *res = js->user->node;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
80 break;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
81 case SASL_CB_USER:
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
82 *res = "";
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
83 break;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
84 default:
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
85 return SASL_BADPARAM;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
86 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
87 if (len) *len = strlen((char *)*res);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
88 return SASL_OK;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
89 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
90
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
91 static int jabber_sasl_cb_secret(sasl_conn_t *conn, void *ctx, int id, sasl_secret_t **secret)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
92 {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
93 JabberStream *js = ctx;
28697
de8565bc63fe jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <paul@darkrain42.org>
parents: 28696
diff changeset
94 PurpleAccount *account;
de8565bc63fe jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <paul@darkrain42.org>
parents: 28696
diff changeset
95 const char *pw;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
96 size_t len;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
97
28700
8ed52586826b More oops.
Paul Aurich <paul@darkrain42.org>
parents: 28697
diff changeset
98 account = purple_connection_get_account(js->gc);
28697
de8565bc63fe jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <paul@darkrain42.org>
parents: 28696
diff changeset
99 pw = purple_account_get_password(account);
de8565bc63fe jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <paul@darkrain42.org>
parents: 28696
diff changeset
100
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
101 if (!conn || !secret || id != SASL_CB_PASS)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
102 return SASL_BADPARAM;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
103
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
104 len = strlen(pw);
30419
9789e8e7d834 jabber: Document this not being an off-by-one...
Paul Aurich <paul@darkrain42.org>
parents: 30252
diff changeset
105 /* Not an off-by-one because sasl_secret_t defines char data[1] */
30448
a5131a257967 jabber: Fix a pernicious race condition in our cyrus auth code
Paul Aurich <paul@darkrain42.org>
parents: 30432
diff changeset
106 /* TODO: This can probably be moved to glib's allocator */
a5131a257967 jabber: Fix a pernicious race condition in our cyrus auth code
Paul Aurich <paul@darkrain42.org>
parents: 30432
diff changeset
107 js->sasl_secret = malloc(sizeof(sasl_secret_t) + len);
a5131a257967 jabber: Fix a pernicious race condition in our cyrus auth code
Paul Aurich <paul@darkrain42.org>
parents: 30432
diff changeset
108 if (!js->sasl_secret)
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
109 return SASL_NOMEM;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
110
30448
a5131a257967 jabber: Fix a pernicious race condition in our cyrus auth code
Paul Aurich <paul@darkrain42.org>
parents: 30432
diff changeset
111 js->sasl_secret->len = len;
a5131a257967 jabber: Fix a pernicious race condition in our cyrus auth code
Paul Aurich <paul@darkrain42.org>
parents: 30432
diff changeset
112 strcpy((char*)js->sasl_secret->data, pw);
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
113
30448
a5131a257967 jabber: Fix a pernicious race condition in our cyrus auth code
Paul Aurich <paul@darkrain42.org>
parents: 30432
diff changeset
114 *secret = js->sasl_secret;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
115 return SASL_OK;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
116 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
117
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
118 static void allow_cyrus_plaintext_auth(PurpleAccount *account)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
119 {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
120 PurpleConnection *gc;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
121 JabberStream *js;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
122
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
123 gc = purple_account_get_connection(account);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
124 js = purple_connection_get_protocol_data(gc);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
125
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
126 purple_account_set_bool(account, "auth_plain_in_clear", TRUE);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
127
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
128 start_cyrus_wrapper(js);
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
129 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
130
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
131 static void auth_pass_cb(PurpleConnection *gc, PurpleRequestFields *fields)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
132 {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
133 PurpleAccount *account;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
134 JabberStream *js;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
135 const char *entry;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
136 gboolean remember;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
137
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
138 /* The password prompt dialog doesn't get disposed if the account disconnects */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
139 if (!PURPLE_CONNECTION_IS_VALID(gc))
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
140 return;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
141
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
142 account = purple_connection_get_account(gc);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
143 js = purple_connection_get_protocol_data(gc);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
144
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
145 entry = purple_request_fields_get_string(fields, "password");
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
146 remember = purple_request_fields_get_bool(fields, "remember");
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
147
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
148 if (!entry || !*entry)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
149 {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
150 purple_notify_error(account, NULL, _("Password is required to sign on."), NULL);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
151 return;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
152 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
153
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
154 if (remember)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
155 purple_account_set_remember_password(account, TRUE);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
156
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
157 purple_account_set_password(account, entry);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
158
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
159 /* Rebuild our callbacks as we now have a password to offer */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
160 jabber_sasl_build_callbacks(js);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
161
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
162 /* Restart our negotiation */
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
163 start_cyrus_wrapper(js);
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
164 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
165
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
166 static void
28701
da2ce5d8d4b4 jabber: A little more use of accessors.
Paul Aurich <paul@darkrain42.org>
parents: 28700
diff changeset
167 auth_no_pass_cb(PurpleConnection *gc, PurpleRequestFields *fields)
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
168 {
28701
da2ce5d8d4b4 jabber: A little more use of accessors.
Paul Aurich <paul@darkrain42.org>
parents: 28700
diff changeset
169 PurpleAccount *account;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
170 JabberStream *js;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
171
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
172 /* The password prompt dialog doesn't get disposed if the account disconnects */
28701
da2ce5d8d4b4 jabber: A little more use of accessors.
Paul Aurich <paul@darkrain42.org>
parents: 28700
diff changeset
173 if (!PURPLE_CONNECTION_IS_VALID(gc))
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
174 return;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
175
28701
da2ce5d8d4b4 jabber: A little more use of accessors.
Paul Aurich <paul@darkrain42.org>
parents: 28700
diff changeset
176 account = purple_connection_get_account(gc);
da2ce5d8d4b4 jabber: A little more use of accessors.
Paul Aurich <paul@darkrain42.org>
parents: 28700
diff changeset
177 js = purple_connection_get_protocol_data(gc);
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
178
30432
1cdae196aac8 Standardize on "cancelled".
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 30419
diff changeset
179 /* Disable the account as the user has cancelled connecting */
28701
da2ce5d8d4b4 jabber: A little more use of accessors.
Paul Aurich <paul@darkrain42.org>
parents: 28700
diff changeset
180 purple_account_set_enabled(account, purple_core_get_ui(), FALSE);
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
181 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
182
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
183 static JabberSaslState
28754
b94fd073187c jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <paul@darkrain42.org>
parents: 28753
diff changeset
184 jabber_auth_start_cyrus(JabberStream *js, xmlnode **reply, char **error)
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
185 {
28697
de8565bc63fe jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <paul@darkrain42.org>
parents: 28696
diff changeset
186 PurpleAccount *account;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
187 const char *clientout = NULL;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
188 char *enc_out;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
189 unsigned coutlen = 0;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
190 sasl_security_properties_t secprops;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
191 gboolean again;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
192 gboolean plaintext = TRUE;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
193
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
194 /* Set up security properties and options */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
195 secprops.min_ssf = 0;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
196 secprops.security_flags = SASL_SEC_NOANONYMOUS;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
197
28697
de8565bc63fe jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <paul@darkrain42.org>
parents: 28696
diff changeset
198 account = purple_connection_get_account(js->gc);
de8565bc63fe jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <paul@darkrain42.org>
parents: 28696
diff changeset
199
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
200 if (!jabber_stream_is_ssl(js)) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
201 secprops.max_ssf = -1;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
202 secprops.maxbufsize = 4096;
28697
de8565bc63fe jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <paul@darkrain42.org>
parents: 28696
diff changeset
203 plaintext = purple_account_get_bool(account, "auth_plain_in_clear", FALSE);
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
204 if (!plaintext)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
205 secprops.security_flags |= SASL_SEC_NOPLAINTEXT;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
206 } else {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
207 secprops.max_ssf = 0;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
208 secprops.maxbufsize = 0;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
209 plaintext = TRUE;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
210 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
211 secprops.property_names = 0;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
212 secprops.property_values = 0;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
213
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
214 do {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
215 again = FALSE;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
216
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
217 js->sasl_state = sasl_client_new("xmpp", js->serverFQDN, NULL, NULL, js->sasl_cb, 0, &js->sasl);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
218 if (js->sasl_state==SASL_OK) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
219 sasl_setprop(js->sasl, SASL_SEC_PROPS, &secprops);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
220 purple_debug_info("sasl", "Mechs found: %s\n", js->sasl_mechs->str);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
221 js->sasl_state = sasl_client_start(js->sasl, js->sasl_mechs->str, NULL, &clientout, &coutlen, &js->current_mech);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
222 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
223 switch (js->sasl_state) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
224 /* Success */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
225 case SASL_OK:
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
226 case SASL_CONTINUE:
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
227 break;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
228 case SASL_NOMECH:
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
229 /* No mechanisms have offered to help */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
230
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
231 /* Firstly, if we don't have a password try
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
232 * to get one
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
233 */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
234
28697
de8565bc63fe jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <paul@darkrain42.org>
parents: 28696
diff changeset
235 if (!purple_account_get_password(account)) {
de8565bc63fe jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <paul@darkrain42.org>
parents: 28696
diff changeset
236 purple_account_request_password(account, G_CALLBACK(auth_pass_cb), G_CALLBACK(auth_no_pass_cb), js->gc);
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
237 return JABBER_SASL_STATE_CONTINUE;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
238
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
239 /* If we've got a password, but aren't sending
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
240 * it in plaintext, see if we can turn on
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
241 * plaintext auth
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
242 */
30252
c8cf189bf6db jabber: This is more accurate, I think (e.g. Cyrus doesn't know what SCRAM-SHA-1 is)
Paul Aurich <paul@darkrain42.org>
parents: 30179
diff changeset
243 /* XXX Should we just check for PLAIN/LOGIN being offered mechanisms? */
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
244 } else if (!plaintext) {
30252
c8cf189bf6db jabber: This is more accurate, I think (e.g. Cyrus doesn't know what SCRAM-SHA-1 is)
Paul Aurich <paul@darkrain42.org>
parents: 30179
diff changeset
245 char *msg = g_strdup_printf(_("%s may require plaintext authentication over an unencrypted connection. Allow this and continue authentication?"),
28697
de8565bc63fe jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <paul@darkrain42.org>
parents: 28696
diff changeset
246 purple_account_get_username(account));
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
247 purple_request_yes_no(js->gc, _("Plaintext Authentication"),
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
248 _("Plaintext Authentication"),
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
249 msg,
28697
de8565bc63fe jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <paul@darkrain42.org>
parents: 28696
diff changeset
250 1, account, NULL, NULL, account,
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
251 allow_cyrus_plaintext_auth,
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
252 disallow_plaintext_auth);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
253 g_free(msg);
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
254 return JABBER_SASL_STATE_CONTINUE;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
255
29965
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
256 } else
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
257 js->auth_fail_count++;
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
258
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
259 if (js->auth_fail_count == 1 &&
30178
e9d540664ea3 jabber: Make that more future-proof by never generating "GSSAPI "
Paul Aurich <paul@darkrain42.org>
parents: 30177
diff changeset
260 (js->sasl_mechs->str && g_str_equal(js->sasl_mechs->str, "GSSAPI"))) {
29965
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
261 /* If we tried GSSAPI first, it failed, and it was the only method we had to try, try jabber:iq:auth
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
262 * for compatibility with iChat 10.5 Server and other jabberd based servers.
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
263 *
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
264 * iChat Server 10.5 and certain other corporate servers offer SASL GSSAPI by default, which is often
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
265 * not configured on the client side, and expects a fallback to jabber:iq:auth when it (predictably) fails.
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
266 *
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
267 * Note: xep-0078 points out that using jabber:iq:auth after a sasl failure is wrong. However,
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
268 * I believe this refers to actual authentication failure, not a simple lack of concordant mechanisms.
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
269 * Doing otherwise means that simply compiling with SASL support renders the client unable to connect to servers
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
270 * which would connect without issue otherwise. -evands
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
271 */
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
272 js->auth_mech = NULL;
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
273 jabber_auth_start_old(js);
30009
1b1fee952341 jabber: trailing_whitespace--;
Paul Aurich <paul@darkrain42.org>
parents: 29991
diff changeset
274 return JABBER_SASL_STATE_CONTINUE;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
275 }
29872
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
276
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
277 break;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
278
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
279 /* Fatal errors. Give up and go home */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
280 case SASL_BADPARAM:
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
281 case SASL_NOMEM:
29873
a81d44a11d99 If SASL authentication fails, we generally shouldn't be setting an error
Evan Schoenberg <evan.s@dreskin.net>
parents: 29872
diff changeset
282 *error = g_strdup(_("SASL authentication failed"));
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
283 break;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
284
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
285 /* For everything else, fail the mechanism and try again */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
286 default:
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
287 purple_debug_info("sasl", "sasl_state is %d, failing the mech and trying again\n", js->sasl_state);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
288
29965
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
289 js->auth_fail_count++;
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
290
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
291 /*
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
292 * DAA: is this right?
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
293 * The manpage says that "mech" will contain the chosen mechanism on success.
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
294 * Presumably, if we get here that isn't the case and we shouldn't try again?
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
295 * I suspect that this never happens.
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
296 */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
297 /*
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
298 * SXW: Yes, this is right. What this handles is the situation where a
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
299 * mechanism, say GSSAPI, is tried. If that mechanism fails, it may be
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
300 * due to mechanism specific issues, so we want to try one of the other
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
301 * supported mechanisms. This code handles that case
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
302 */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
303 if (js->current_mech && *js->current_mech) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
304 char *pos;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
305 if ((pos = strstr(js->sasl_mechs->str, js->current_mech))) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
306 g_string_erase(js->sasl_mechs, pos-js->sasl_mechs->str, strlen(js->current_mech));
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
307 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
308 /* Remove space which separated this mech from the next */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
309 if ((js->sasl_mechs->str)[0] == ' ') {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
310 g_string_erase(js->sasl_mechs, 0, 1);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
311 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
312 again = TRUE;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
313 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
314
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
315 sasl_dispose(&js->sasl);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
316 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
317 } while (again);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
318
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
319 if (js->sasl_state == SASL_CONTINUE || js->sasl_state == SASL_OK) {
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
320 xmlnode *auth = xmlnode_new("auth");
28715
cea22db36ffc jabber: Use NS_XMPP_SASL
Paul Aurich <paul@darkrain42.org>
parents: 28702
diff changeset
321 xmlnode_set_namespace(auth, NS_XMPP_SASL);
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
322 xmlnode_set_attrib(auth, "mechanism", js->current_mech);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
323
30564
3f5ff1ea4802 jabber: Partial revert (everything but ChangeLog) of 945ef5abc5
Paul Aurich <paul@darkrain42.org>
parents: 30448
diff changeset
324 xmlnode_set_attrib(auth, "xmlns:ga", "http://www.google.com/talk/protocol/auth");
3f5ff1ea4802 jabber: Partial revert (everything but ChangeLog) of 945ef5abc5
Paul Aurich <paul@darkrain42.org>
parents: 30448
diff changeset
325 xmlnode_set_attrib(auth, "ga:client-uses-full-bind-result", "true");
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
326
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
327 if (clientout) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
328 if (coutlen == 0) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
329 xmlnode_insert_data(auth, "=", -1);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
330 } else {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
331 enc_out = purple_base64_encode((unsigned char*)clientout, coutlen);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
332 xmlnode_insert_data(auth, enc_out, -1);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
333 g_free(enc_out);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
334 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
335 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
336
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
337 *reply = auth;
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
338 return JABBER_SASL_STATE_CONTINUE;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
339 } else {
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
340 return JABBER_SASL_STATE_FAIL;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
341 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
342 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
343
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
344 static int
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
345 jabber_sasl_cb_log(void *context, int level, const char *message)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
346 {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
347 if(level <= SASL_LOG_TRACE)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
348 purple_debug_info("sasl", "%s\n", message);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
349
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
350 return SASL_OK;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
351 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
352
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
353 static void
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
354 jabber_sasl_build_callbacks(JabberStream *js)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
355 {
28697
de8565bc63fe jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <paul@darkrain42.org>
parents: 28696
diff changeset
356 PurpleAccount *account;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
357 int id;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
358
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
359 /* Set up our callbacks structure */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
360 if (js->sasl_cb == NULL)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
361 js->sasl_cb = g_new0(sasl_callback_t,6);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
362
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
363 id = 0;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
364 js->sasl_cb[id].id = SASL_CB_GETREALM;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
365 js->sasl_cb[id].proc = jabber_sasl_cb_realm;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
366 js->sasl_cb[id].context = (void *)js;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
367 id++;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
368
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
369 js->sasl_cb[id].id = SASL_CB_AUTHNAME;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
370 js->sasl_cb[id].proc = jabber_sasl_cb_simple;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
371 js->sasl_cb[id].context = (void *)js;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
372 id++;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
373
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
374 js->sasl_cb[id].id = SASL_CB_USER;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
375 js->sasl_cb[id].proc = jabber_sasl_cb_simple;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
376 js->sasl_cb[id].context = (void *)js;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
377 id++;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
378
28697
de8565bc63fe jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <paul@darkrain42.org>
parents: 28696
diff changeset
379 account = purple_connection_get_account(js->gc);
de8565bc63fe jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <paul@darkrain42.org>
parents: 28696
diff changeset
380 if (purple_account_get_password(account) != NULL ) {
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
381 js->sasl_cb[id].id = SASL_CB_PASS;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
382 js->sasl_cb[id].proc = jabber_sasl_cb_secret;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
383 js->sasl_cb[id].context = (void *)js;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
384 id++;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
385 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
386
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
387 js->sasl_cb[id].id = SASL_CB_LOG;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
388 js->sasl_cb[id].proc = jabber_sasl_cb_log;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
389 js->sasl_cb[id].context = (void*)js;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
390 id++;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
391
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
392 js->sasl_cb[id].id = SASL_CB_LIST_END;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
393 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
394
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
395 static JabberSaslState
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
396 jabber_cyrus_start(JabberStream *js, xmlnode *mechanisms,
28754
b94fd073187c jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <paul@darkrain42.org>
parents: 28753
diff changeset
397 xmlnode **reply, char **error)
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
398 {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
399 xmlnode *mechnode;
29990
1e959e5cb237 jabber: Better error message when no concordant SASL mechs
Paul Aurich <paul@darkrain42.org>
parents: 29965
diff changeset
400 JabberSaslState ret;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
401
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
402 js->sasl_mechs = g_string_new("");
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
403
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
404 for(mechnode = xmlnode_get_child(mechanisms, "mechanism"); mechnode;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
405 mechnode = xmlnode_get_next_twin(mechnode))
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
406 {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
407 char *mech_name = xmlnode_get_data(mechnode);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
408
30179
40a8aae4b276 jabber: Document the other cyrus hack (ignoring EXTERNAL)
Paul Aurich <paul@darkrain42.org>
parents: 30178
diff changeset
409 /* Ignore blank mechanisms and EXTERNAL. External isn't
40a8aae4b276 jabber: Document the other cyrus hack (ignoring EXTERNAL)
Paul Aurich <paul@darkrain42.org>
parents: 30178
diff changeset
410 * supported, and Cyrus SASL's mechanism returns
40a8aae4b276 jabber: Document the other cyrus hack (ignoring EXTERNAL)
Paul Aurich <paul@darkrain42.org>
parents: 30178
diff changeset
411 * SASL_NOMECH when the caller (us) doesn't configure it.
40a8aae4b276 jabber: Document the other cyrus hack (ignoring EXTERNAL)
Paul Aurich <paul@darkrain42.org>
parents: 30178
diff changeset
412 * Except SASL_NOMECH is supposed to mean "no concordant
40a8aae4b276 jabber: Document the other cyrus hack (ignoring EXTERNAL)
Paul Aurich <paul@darkrain42.org>
parents: 30178
diff changeset
413 * mechanisms"... Easiest just to blacklist it (for now).
40a8aae4b276 jabber: Document the other cyrus hack (ignoring EXTERNAL)
Paul Aurich <paul@darkrain42.org>
parents: 30178
diff changeset
414 */
30010
1518b6b70556 jabber: Blacklist EXTERNAL when using Cyrus. Allows connecting when it's advertised.
Paul Aurich <paul@darkrain42.org>
parents: 30009
diff changeset
415 if (!mech_name || !*mech_name ||
1518b6b70556 jabber: Blacklist EXTERNAL when using Cyrus. Allows connecting when it's advertised.
Paul Aurich <paul@darkrain42.org>
parents: 30009
diff changeset
416 g_str_equal(mech_name, "EXTERNAL")) {
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
417 g_free(mech_name);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
418 continue;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
419 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
420
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
421 g_string_append(js->sasl_mechs, mech_name);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
422 g_string_append_c(js->sasl_mechs, ' ');
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
423 g_free(mech_name);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
424 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
425
30178
e9d540664ea3 jabber: Make that more future-proof by never generating "GSSAPI "
Paul Aurich <paul@darkrain42.org>
parents: 30177
diff changeset
426 /* Strip off the trailing ' ' */
e9d540664ea3 jabber: Make that more future-proof by never generating "GSSAPI "
Paul Aurich <paul@darkrain42.org>
parents: 30177
diff changeset
427 if (js->sasl_mechs->len > 1)
e9d540664ea3 jabber: Make that more future-proof by never generating "GSSAPI "
Paul Aurich <paul@darkrain42.org>
parents: 30177
diff changeset
428 g_string_truncate(js->sasl_mechs, js->sasl_mechs->len - 1);
e9d540664ea3 jabber: Make that more future-proof by never generating "GSSAPI "
Paul Aurich <paul@darkrain42.org>
parents: 30177
diff changeset
429
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
430 jabber_sasl_build_callbacks(js);
29990
1e959e5cb237 jabber: Better error message when no concordant SASL mechs
Paul Aurich <paul@darkrain42.org>
parents: 29965
diff changeset
431 ret = jabber_auth_start_cyrus(js, reply, error);
1e959e5cb237 jabber: Better error message when no concordant SASL mechs
Paul Aurich <paul@darkrain42.org>
parents: 29965
diff changeset
432
1e959e5cb237 jabber: Better error message when no concordant SASL mechs
Paul Aurich <paul@darkrain42.org>
parents: 29965
diff changeset
433 /*
1e959e5cb237 jabber: Better error message when no concordant SASL mechs
Paul Aurich <paul@darkrain42.org>
parents: 29965
diff changeset
434 * Triggered if no overlap between server and client
1e959e5cb237 jabber: Better error message when no concordant SASL mechs
Paul Aurich <paul@darkrain42.org>
parents: 29965
diff changeset
435 * supported mechanisms.
1e959e5cb237 jabber: Better error message when no concordant SASL mechs
Paul Aurich <paul@darkrain42.org>
parents: 29965
diff changeset
436 */
1e959e5cb237 jabber: Better error message when no concordant SASL mechs
Paul Aurich <paul@darkrain42.org>
parents: 29965
diff changeset
437 if (ret == JABBER_SASL_STATE_FAIL && *error == NULL)
29991
b78b5e7ffe82 jabber: Found a better string in auth.c
Paul Aurich <paul@darkrain42.org>
parents: 29990
diff changeset
438 *error = g_strdup(_("Server does not use any supported authentication method"));
29990
1e959e5cb237 jabber: Better error message when no concordant SASL mechs
Paul Aurich <paul@darkrain42.org>
parents: 29965
diff changeset
439
1e959e5cb237 jabber: Better error message when no concordant SASL mechs
Paul Aurich <paul@darkrain42.org>
parents: 29965
diff changeset
440 return ret;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
441 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
442
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
443 static JabberSaslState
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
444 jabber_cyrus_handle_challenge(JabberStream *js, xmlnode *packet,
28754
b94fd073187c jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <paul@darkrain42.org>
parents: 28753
diff changeset
445 xmlnode **reply, char **error)
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
446 {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
447 char *enc_in = xmlnode_get_data(packet);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
448 unsigned char *dec_in;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
449 char *enc_out;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
450 const char *c_out;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
451 unsigned int clen;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
452 gsize declen;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
453
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
454 dec_in = purple_base64_decode(enc_in, &declen);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
455
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
456 js->sasl_state = sasl_client_step(js->sasl, (char*)dec_in, declen,
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
457 NULL, &c_out, &clen);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
458 g_free(enc_in);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
459 g_free(dec_in);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
460 if (js->sasl_state != SASL_CONTINUE && js->sasl_state != SASL_OK) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
461 gchar *tmp = g_strdup_printf(_("SASL error: %s"),
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
462 sasl_errdetail(js->sasl));
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
463 purple_debug_error("jabber", "Error is %d : %s\n",
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
464 js->sasl_state, sasl_errdetail(js->sasl));
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
465 *error = tmp;
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
466 return JABBER_SASL_STATE_FAIL;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
467 } else {
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
468 xmlnode *response = xmlnode_new("response");
28715
cea22db36ffc jabber: Use NS_XMPP_SASL
Paul Aurich <paul@darkrain42.org>
parents: 28702
diff changeset
469 xmlnode_set_namespace(response, NS_XMPP_SASL);
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
470 if (clen > 0) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
471 /* Cyrus SASL 2.1.22 appears to contain code to add the charset
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
472 * to the response for DIGEST-MD5 but there is no possibility
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
473 * it will be executed.
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
474 *
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
475 * My reading of the digestmd5 plugin indicates the username and
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
476 * realm are always encoded in UTF-8 (they seem to be the values
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
477 * we pass in), so we need to ensure charset=utf-8 is set.
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
478 */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
479 if (!purple_strequal(js->current_mech, "DIGEST-MD5") ||
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
480 strstr(c_out, ",charset="))
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
481 /* If we're not using DIGEST-MD5 or Cyrus SASL is fixed */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
482 enc_out = purple_base64_encode((unsigned char*)c_out, clen);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
483 else {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
484 char *tmp = g_strdup_printf("%s,charset=utf-8", c_out);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
485 enc_out = purple_base64_encode((unsigned char*)tmp, clen + 14);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
486 g_free(tmp);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
487 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
488
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
489 xmlnode_insert_data(response, enc_out, -1);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
490 g_free(enc_out);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
491 }
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
492
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
493 *reply = response;
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
494 return JABBER_SASL_STATE_CONTINUE;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
495 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
496 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
497
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
498 static JabberSaslState
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
499 jabber_cyrus_handle_success(JabberStream *js, xmlnode *packet,
28754
b94fd073187c jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <paul@darkrain42.org>
parents: 28753
diff changeset
500 char **error)
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
501 {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
502 const void *x;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
503
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
504 /* The SASL docs say that if the client hasn't returned OK yet, we
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
505 * should try one more round against it
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
506 */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
507 if (js->sasl_state != SASL_OK) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
508 char *enc_in = xmlnode_get_data(packet);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
509 unsigned char *dec_in = NULL;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
510 const char *c_out;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
511 unsigned int clen;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
512 gsize declen = 0;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
513
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
514 if(enc_in != NULL)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
515 dec_in = purple_base64_decode(enc_in, &declen);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
516
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
517 js->sasl_state = sasl_client_step(js->sasl, (char*)dec_in, declen, NULL, &c_out, &clen);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
518
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
519 g_free(enc_in);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
520 g_free(dec_in);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
521
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
522 if (js->sasl_state != SASL_OK) {
31148
84e9eb0ae4d5 jabber: Un-assert-ify one failure case in the Cyrus code.
Paul Aurich <paul@darkrain42.org>
parents: 30564
diff changeset
523 /* This happens when the server sends back jibberish
84e9eb0ae4d5 jabber: Un-assert-ify one failure case in the Cyrus code.
Paul Aurich <paul@darkrain42.org>
parents: 30564
diff changeset
524 * in the "additional data with success" case.
84e9eb0ae4d5 jabber: Un-assert-ify one failure case in the Cyrus code.
Paul Aurich <paul@darkrain42.org>
parents: 30564
diff changeset
525 * Seen with Wildfire 3.0.1.
84e9eb0ae4d5 jabber: Un-assert-ify one failure case in the Cyrus code.
Paul Aurich <paul@darkrain42.org>
parents: 30564
diff changeset
526 */
28754
b94fd073187c jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <paul@darkrain42.org>
parents: 28753
diff changeset
527 *error = g_strdup(_("Invalid response from server"));
31148
84e9eb0ae4d5 jabber: Un-assert-ify one failure case in the Cyrus code.
Paul Aurich <paul@darkrain42.org>
parents: 30564
diff changeset
528 return JABBER_SASL_STATE_FAIL;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
529 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
530 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
531
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
532 /* If we've negotiated a security layer, we need to enable it */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
533 if (js->sasl) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
534 sasl_getprop(js->sasl, SASL_SSF, &x);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
535 if (*(int *)x > 0) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
536 sasl_getprop(js->sasl, SASL_MAXOUTBUF, &x);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
537 js->sasl_maxbuf = *(int *)x;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
538 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
539 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
540
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
541 return JABBER_SASL_STATE_OK;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
542 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
543
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
544 static JabberSaslState
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
545 jabber_cyrus_handle_failure(JabberStream *js, xmlnode *packet,
28754
b94fd073187c jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <paul@darkrain42.org>
parents: 28753
diff changeset
546 xmlnode **reply, char **error)
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
547 {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
548 if (js->auth_fail_count++ < 5) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
549 if (js->current_mech && *js->current_mech) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
550 char *pos;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
551 if ((pos = strstr(js->sasl_mechs->str, js->current_mech))) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
552 g_string_erase(js->sasl_mechs, pos-js->sasl_mechs->str, strlen(js->current_mech));
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
553 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
554 /* Remove space which separated this mech from the next */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
555 if ((js->sasl_mechs->str)[0] == ' ') {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
556 g_string_erase(js->sasl_mechs, 0, 1);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
557 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
558 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
559 if (*js->sasl_mechs->str) {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
560 /* If we have remaining mechs to try, do so */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
561 sasl_dispose(&js->sasl);
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
562
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
563 return jabber_auth_start_cyrus(js, reply, error);
29872
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
564
30010
1518b6b70556 jabber: Blacklist EXTERNAL when using Cyrus. Allows connecting when it's advertised.
Paul Aurich <paul@darkrain42.org>
parents: 30009
diff changeset
565 } else if ((js->auth_fail_count == 1) &&
29872
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
566 (js->current_mech && g_str_equal(js->current_mech, "GSSAPI"))) {
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
567 /* If we tried GSSAPI first, it failed, and it was the only method we had to try, try jabber:iq:auth
29965
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
568 * for compatibility with iChat 10.5 Server and other jabberd based servers.
29872
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
569 *
29965
6c148063fdfd applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evan.s@dreskin.net>
parents: 29877
diff changeset
570 * iChat Server 10.5 and certain other corporate servers offer SASL GSSAPI by default, which is often
29872
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
571 * not configured on the client side, and expects a fallback to jabber:iq:auth when it (predictably) fails.
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
572 *
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
573 * Note: xep-0078 points out that using jabber:iq:auth after a sasl failure is wrong. However,
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
574 * I believe this refers to actual authentication failure, not a simple lack of concordant mechanisms.
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
575 * Doing otherwise means that simply compiling with SASL support renders the client unable to connect to servers
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
576 * which would connect without issue otherwise. -evands
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
577 */
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
578 sasl_dispose(&js->sasl);
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
579 js->sasl = NULL;
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
580 js->auth_mech = NULL;
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
581 jabber_auth_start_old(js);
a044ddee7878 Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evan.s@dreskin.net>
parents: 29856
diff changeset
582 return JABBER_SASL_STATE_CONTINUE;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
583 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
584 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
585
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
586 /* Nothing to send */
28753
8a5252630857 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <paul@darkrain42.org>
parents: 28715
diff changeset
587 return JABBER_SASL_STATE_FAIL;
28696
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
588 }
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
589
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
590 static JabberSaslMech cyrus_mech = {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
591 100, /* priority */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
592 "*", /* name; Cyrus provides a bunch of mechanisms, so use an invalid
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
593 * mechanism name (per rfc4422 3.1). */
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
594 jabber_cyrus_start,
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
595 jabber_cyrus_handle_challenge,
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
596 jabber_cyrus_handle_success,
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
597 jabber_cyrus_handle_failure,
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
598 NULL,
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
599 };
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
600
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
601 JabberSaslMech *jabber_auth_get_cyrus_mech(void)
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
602 {
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
603 return &cyrus_mech;
8ada06fb65ed jabber: Factor the SASL auth methods into their own files.
Paul Aurich <paul@darkrain42.org>
parents:
diff changeset
604 }