libpurple/protocols/jabber/auth_cyrus.c

Tue, 03 Jan 2012 06:32:26 +0000

author
Paul Aurich <darkrain42@pidgin.im>
date
Tue, 03 Jan 2012 06:32:26 +0000
changeset 32784
434afaa6059f
parent 32157
39ba2e2492ee
child 33811
5ab172aeeff2
child 34091
9a23c6eaec25
permissions
-rw-r--r--

jabber: Fix some compile warnings in auth_cyrus.c

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

mercurial