libpurple/protocols/jabber/auth_cyrus.c

Wed, 14 Dec 2022 01:43:19 -0600

author
Gary Kramlich <grim@reaperworld.com>
date
Wed, 14 Dec 2022 01:43:19 -0600
changeset 41978
1771d4dda31a
parent 41967
025eee9e6f1d
permissions
-rw-r--r--

Update the jabber plugin to not use the deprecated account api

Testing Done:
Touched all the files and compiled and verified there were not deprecation warnings.

Reviewed at https://reviews.imfreedom.org/r/2140/

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 */
40439
e9838d634d5e Make sure that internal.h can only be included by libpurple and split out some pieces to purpleprivate.h
Gary Kramlich <grim@reaperworld.com>
parents: 40358
diff changeset
23
40441
f23c7e772667 Make sure we're not including the gettext macros in header files and deal with the repercussions of that.
Gary Kramlich <grim@reaperworld.com>
parents: 40439
diff changeset
24 #include <config.h>
40439
e9838d634d5e Make sure that internal.h can only be included by libpurple and split out some pieces to purpleprivate.h
Gary Kramlich <grim@reaperworld.com>
parents: 40358
diff changeset
25
e9838d634d5e Make sure that internal.h can only be included by libpurple and split out some pieces to purpleprivate.h
Gary Kramlich <grim@reaperworld.com>
parents: 40358
diff changeset
26 #include <glib/gi18n-lib.h>
e9838d634d5e Make sure that internal.h can only be included by libpurple and split out some pieces to purpleprivate.h
Gary Kramlich <grim@reaperworld.com>
parents: 40358
diff changeset
27
40358
e6fe6fc1f516 move all protocols, purple plugins, and purple tests to use purple.h instead of including files individually
Gary Kramlich <grim@reaperworld.com>
parents: 40103
diff changeset
28 #include <purple.h>
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
29
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
30 #include "auth.h"
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
31 #include "jabber.h"
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
32
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
33 static JabberSaslState jabber_auth_start_cyrus(JabberStream *js, PurpleXmlNode **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
34 char **error);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
35 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
36
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
37 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
38 {
32157
39ba2e2492ee Rename purple_connection_error_reason to purple_connection_error
Mark Doliner <markdoliner@pidgin.im>
parents: 31804
diff changeset
39 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
40 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
41 _("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
42 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
43
29089
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
44 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
45 {
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
46 char *error = NULL;
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
47 PurpleXmlNode *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
48 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
49
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
50 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
51 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
52 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
53 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
54 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
55 } 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
56 jabber_send(js, response);
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
57 purple_xmlnode_free(response);
29089
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 }
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
60
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
61
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
62 /* Callbacks for Cyrus SASL */
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
63
41967
025eee9e6f1d Bump C standard to C99 for XMPP and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41850
diff changeset
64 static int
025eee9e6f1d Bump C standard to C99 for XMPP and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41850
diff changeset
65 jabber_sasl_cb_realm(void *ctx, int id, G_GNUC_UNUSED const char **avail,
025eee9e6f1d Bump C standard to C99 for XMPP and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41850
diff changeset
66 const char **result)
28855
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 JabberStream *js = ctx;
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 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
71
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
72 *result = js->user->domain;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
73
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
74 return SASL_OK;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
75 }
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 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
78 {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
79 JabberStream *js = ctx;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
80
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
81 switch(id) {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
82 case SASL_CB_AUTHNAME:
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
83 *res = js->user->node;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
84 break;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
85 case SASL_CB_USER:
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
86 *res = "";
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
87 break;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
88 default:
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
89 return SASL_BADPARAM;
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 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
92 return SASL_OK;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
93 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
94
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
95 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
96 {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
97 JabberStream *js = ctx;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
98 size_t len;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
99
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
100 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
101 return SASL_BADPARAM;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
102
37646
8f99c1dff72e Fix jabber password dialog infinite loop with SASL
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36068
diff changeset
103 len = strlen(js->sasl_password);
30691
b254fed526a6 jabber: Document this not being an off-by-one...
Paul Aurich <darkrain42@pidgin.im>
parents: 30505
diff changeset
104 /* 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
105 /* 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
106 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
107 if (!js->sasl_secret)
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
108 return SASL_NOMEM;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
109
30723
96e248b07586 jabber: Fix a pernicious race condition in our cyrus auth code
Paul Aurich <darkrain42@pidgin.im>
parents: 30708
diff changeset
110 js->sasl_secret->len = len;
37646
8f99c1dff72e Fix jabber password dialog infinite loop with SASL
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36068
diff changeset
111 strcpy((char*)js->sasl_secret->data, js->sasl_password);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
112
30723
96e248b07586 jabber: Fix a pernicious race condition in our cyrus auth code
Paul Aurich <darkrain42@pidgin.im>
parents: 30708
diff changeset
113 *secret = js->sasl_secret;
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
114 return SASL_OK;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
115 }
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 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
118 {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
119 PurpleConnection *gc;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
120 JabberStream *js;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
121
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
122 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
123 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
124
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
125 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
126
29089
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
127 start_cyrus_wrapper(js);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
128 }
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 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
131 {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
132 PurpleAccount *account;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
133 JabberStream *js;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
134 const char *entry;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
135 gboolean remember;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
136
36068
e9b9320a985a Drop PURPLE_CONNECTION_IS_VALID in favor of (temporary) PURPLE_ASSERT_CONNECTION_IS_VALID
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35341
diff changeset
137 /* TODO: the password prompt dialog doesn't get disposed if the account disconnects */
e9b9320a985a Drop PURPLE_CONNECTION_IS_VALID in favor of (temporary) PURPLE_ASSERT_CONNECTION_IS_VALID
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35341
diff changeset
138 PURPLE_ASSERT_CONNECTION_IS_VALID(gc);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
139
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
140 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
141 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
142
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
143 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
144 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
145
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
146 if (!entry || !*entry)
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
147 {
34513
6f6de16b4044 Fix build with Cyrus SASL
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34440
diff changeset
148 purple_notify_error(account, NULL,
6f6de16b4044 Fix build with Cyrus SASL
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34440
diff changeset
149 _("Password is required to sign on."), NULL,
6f6de16b4044 Fix build with Cyrus SASL
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34440
diff changeset
150 purple_request_cpar_from_connection(gc));
28855
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
40680
f9ea6d5e8992 Use PurpleCredentialManager instead of the old keyring api.
Gary Kramlich <grim@reaperworld.com>
parents: 40474
diff changeset
154 if(remember) {
f9ea6d5e8992 Use PurpleCredentialManager instead of the old keyring api.
Gary Kramlich <grim@reaperworld.com>
parents: 40474
diff changeset
155 PurpleCredentialManager *manager = NULL;
f9ea6d5e8992 Use PurpleCredentialManager instead of the old keyring api.
Gary Kramlich <grim@reaperworld.com>
parents: 40474
diff changeset
156
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
157 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
158
40680
f9ea6d5e8992 Use PurpleCredentialManager instead of the old keyring api.
Gary Kramlich <grim@reaperworld.com>
parents: 40474
diff changeset
159 manager = purple_credential_manager_get_default();
f9ea6d5e8992 Use PurpleCredentialManager instead of the old keyring api.
Gary Kramlich <grim@reaperworld.com>
parents: 40474
diff changeset
160 purple_credential_manager_write_password_async(manager, account, entry,
f9ea6d5e8992 Use PurpleCredentialManager instead of the old keyring api.
Gary Kramlich <grim@reaperworld.com>
parents: 40474
diff changeset
161 NULL, NULL, NULL);
f9ea6d5e8992 Use PurpleCredentialManager instead of the old keyring api.
Gary Kramlich <grim@reaperworld.com>
parents: 40474
diff changeset
162 }
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
163
37646
8f99c1dff72e Fix jabber password dialog infinite loop with SASL
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36068
diff changeset
164 js->sasl_password = g_strdup(entry);
28855
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 /* 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
167 jabber_sasl_build_callbacks(js);
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
168
29089
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
169 /* 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
170 start_cyrus_wrapper(js);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
171 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
172
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
173 static void
41967
025eee9e6f1d Bump C standard to C99 for XMPP and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41850
diff changeset
174 auth_no_pass_cb(PurpleConnection *gc,
025eee9e6f1d Bump C standard to C99 for XMPP and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41850
diff changeset
175 G_GNUC_UNUSED PurpleRequestFields *fields)
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
176 {
28860
d2a057cdd7b6 jabber: A little more use of accessors.
Paul Aurich <darkrain42@pidgin.im>
parents: 28859
diff changeset
177 PurpleAccount *account;
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
178
36068
e9b9320a985a Drop PURPLE_CONNECTION_IS_VALID in favor of (temporary) PURPLE_ASSERT_CONNECTION_IS_VALID
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35341
diff changeset
179 /* TODO: the password prompt dialog doesn't get disposed if the account disconnects */
e9b9320a985a Drop PURPLE_CONNECTION_IS_VALID in favor of (temporary) PURPLE_ASSERT_CONNECTION_IS_VALID
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35341
diff changeset
180 PURPLE_ASSERT_CONNECTION_IS_VALID(gc);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
181
28860
d2a057cdd7b6 jabber: A little more use of accessors.
Paul Aurich <darkrain42@pidgin.im>
parents: 28859
diff changeset
182 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
183
30708
535bec1e66fb Standardize on "cancelled".
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 30691
diff changeset
184 /* Disable the account as the user has cancelled connecting */
41392
b5c84f55d5d2 Remove the ui parameter from purple_account_[gs]et_enabled
Gary Kramlich <grim@reaperworld.com>
parents: 40726
diff changeset
185 purple_account_set_enabled(account, FALSE);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
186 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
187
41850
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
188 static void
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
189 auth_pass_read_cb(GObject *source, GAsyncResult *result, gpointer data) {
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
190 JabberStream *js = data;
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
191 PurpleCredentialManager *manager = PURPLE_CREDENTIAL_MANAGER(source);
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
192 GError *error = NULL;
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
193 char *password = NULL;
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
194
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
195 password = purple_credential_manager_read_password_finish(manager, result,
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
196 &error);
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
197 if(password == NULL || error != NULL) {
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
198 PurpleAccount *account = NULL;
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
199 const char *message = "unknown error";
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
200
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
201 if(error != NULL) {
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
202 message = error->message;
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
203 }
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
204
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
205 purple_debug_warning("jabber", "failed to read password from the "
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
206 "credential manager : %s", message);
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
207
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
208 g_clear_error(&error);
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
209
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
210 account = purple_connection_get_account(js->gc);
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
211 purple_account_request_password(account, G_CALLBACK(auth_pass_cb),
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
212 G_CALLBACK(auth_no_pass_cb),
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
213 js->gc);
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
214
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
215 return;
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
216 }
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
217
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
218 js->sasl_password = password;
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
219
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
220 /* Rebuild our callbacks as we now have a password to offer */
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
221 jabber_sasl_build_callbacks(js);
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
222
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
223 /* Restart our negotiation */
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
224 start_cyrus_wrapper(js);
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
225 }
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
226
33805
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
227 static gboolean remove_current_mech(JabberStream *js) {
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
228 char *pos;
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
229 if ((pos = strstr(js->sasl_mechs->str, js->current_mech))) {
35341
f83a8282b45a Try to fix a signed/unsigned warning
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35053
diff changeset
230 size_t len = strlen(js->current_mech);
33805
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
231 /* Clean up space that separated this Mech from the one before or after it */
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
232 if (pos > js->sasl_mechs->str && *(pos - 1) == ' ') {
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
233 /* Handle removing space before when current_mech isn't the first mech in the list */
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
234 pos--;
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
235 len++;
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
236 } else if (strlen(pos) > len && *(pos + len) == ' ') {
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
237 /* Handle removing space after */
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
238 len++;
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
239 }
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
240 g_string_erase(js->sasl_mechs, pos - js->sasl_mechs->str, len);
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
241 return TRUE;
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
242 }
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
243 return FALSE;
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
244 }
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
245
29089
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
246 static JabberSaslState
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
247 jabber_auth_start_cyrus(JabberStream *js, PurpleXmlNode **reply, char **error)
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
248 {
28856
992b7074357d jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents: 28855
diff changeset
249 PurpleAccount *account;
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
250 const char *clientout = NULL;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
251 char *enc_out;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
252 unsigned coutlen = 0;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
253 sasl_security_properties_t secprops;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
254 gboolean again;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
255 gboolean plaintext = TRUE;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
256
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
257 /* 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
258 secprops.min_ssf = 0;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
259 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
260
28856
992b7074357d jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents: 28855
diff changeset
261 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
262
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
263 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
264 secprops.max_ssf = -1;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
265 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
266 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
267 if (!plaintext)
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
268 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
269 } else {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
270 secprops.max_ssf = 0;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
271 secprops.maxbufsize = 0;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
272 plaintext = TRUE;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
273 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
274 secprops.property_names = 0;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
275 secprops.property_values = 0;
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 do {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
278 again = FALSE;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
279
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
280 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
281 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
282 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
283 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
284 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
285 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
286 switch (js->sasl_state) {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
287 /* Success */
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
288 case SASL_OK:
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
289 case SASL_CONTINUE:
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
290 break;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
291 case SASL_NOMECH:
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
292 /* 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
293
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
294 /* 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
295 * to get one
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
296 */
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
297
37646
8f99c1dff72e Fix jabber password dialog infinite loop with SASL
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36068
diff changeset
298 if (!js->sasl_password) {
41850
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
299 PurpleCredentialManager *manager = NULL;
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
300
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
301 manager = purple_credential_manager_get_default();
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
302 purple_credential_manager_read_password_async(manager,
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
303 account,
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
304 NULL,
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
305 auth_pass_read_cb,
7d551859bd94 Fix an issue where XMPP accounts weren't reading passwords from the credential manager
Gary Kramlich <grim@reaperworld.com>
parents: 41392
diff changeset
306 js);
29089
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
307 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
308
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
309 /* 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
310 * 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
311 * plaintext auth
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
312 */
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
313 /* 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
314 } else if (!plaintext) {
41978
1771d4dda31a Update the jabber plugin to not use the deprecated account api
Gary Kramlich <grim@reaperworld.com>
parents: 41967
diff changeset
315 PurpleContactInfo *info = PURPLE_CONTACT_INFO(account);
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
316 char *msg = g_strdup_printf(_("%s may require plaintext authentication over an unencrypted connection. Allow this and continue authentication?"),
41978
1771d4dda31a Update the jabber plugin to not use the deprecated account api
Gary Kramlich <grim@reaperworld.com>
parents: 41967
diff changeset
317 purple_contact_info_get_username(info));
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
318 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
319 _("Plaintext Authentication"),
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
320 msg,
34440
83610e0823fb Win32: fix compilation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34111
diff changeset
321 1, purple_request_cpar_from_account(account), account,
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
322 allow_cyrus_plaintext_auth,
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
323 disallow_plaintext_auth);
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
324 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
325 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
326
30286
270c63ba1f8f applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents: 30173
diff changeset
327 } else
270c63ba1f8f applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents: 30173
diff changeset
328 js->auth_fail_count++;
270c63ba1f8f applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents: 30173
diff changeset
329
270c63ba1f8f applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents: 30173
diff changeset
330 if (js->auth_fail_count == 1 &&
38260
dcada91c0912 Remove redundant NULL checks
qarkai <qarkai@gmail.com>
parents: 38256
diff changeset
331 purple_strequal(js->sasl_mechs->str, "GSSAPI")) {
30286
270c63ba1f8f applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents: 30173
diff changeset
332 /* 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
333 * 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
334 *
270c63ba1f8f applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents: 30173
diff changeset
335 * 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
336 * 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
337 *
270c63ba1f8f applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents: 30173
diff changeset
338 * 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
339 * 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
340 * 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
341 * which would connect without issue otherwise. -evands
270c63ba1f8f applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents: 30173
diff changeset
342 */
270c63ba1f8f applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents: 30173
diff changeset
343 js->auth_mech = NULL;
270c63ba1f8f applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents: 30173
diff changeset
344 jabber_auth_start_old(js);
30307
6062f0491f3a jabber: trailing_whitespace--;
Paul Aurich <darkrain42@pidgin.im>
parents: 30301
diff changeset
345 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
346 }
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
347
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
348 break;
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 /* 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
351 case SASL_BADPARAM:
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
352 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
353 *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
354 break;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
355
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
356 /* 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
357 default:
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
358 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
359
30286
270c63ba1f8f applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents: 30173
diff changeset
360 js->auth_fail_count++;
270c63ba1f8f applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents: 30173
diff changeset
361
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
362 /*
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
363 * DAA: is this right?
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
364 * 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
365 * 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
366 * 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
367 */
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
368 /*
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
369 * 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
370 * 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
371 * 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
372 * 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
373 */
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
374 if (js->current_mech && *js->current_mech) {
33805
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
375 remove_current_mech(js);
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
376 /* Should we only try again if we've removed the mech? */
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
377 again = TRUE;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
378 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
379
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
380 sasl_dispose(&js->sasl);
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
381 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
382 } while (again);
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 if (js->sasl_state == SASL_CONTINUE || js->sasl_state == SASL_OK) {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
385 PurpleXmlNode *auth = purple_xmlnode_new("auth");
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
386 purple_xmlnode_set_namespace(auth, NS_XMPP_SASL);
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
387 purple_xmlnode_set_attrib(auth, "mechanism", js->current_mech);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
388
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
389 if (clientout) {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
390 if (coutlen == 0) {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
391 purple_xmlnode_insert_data(auth, "=", -1);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
392 } else {
38341
3da74e727e78 Remove purple_base64_encode/decode() wrappers
Mike Ruprecht <cmaiku@gmail.com>
parents: 37646
diff changeset
393 enc_out = g_base64_encode((unsigned char*)clientout, coutlen);
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
394 purple_xmlnode_insert_data(auth, enc_out, -1);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
395 g_free(enc_out);
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 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
398
29089
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
399 *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
400 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
401 } 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
402 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
403 }
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
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
406 static int
41967
025eee9e6f1d Bump C standard to C99 for XMPP and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41850
diff changeset
407 jabber_sasl_cb_log(G_GNUC_UNUSED void *context, int level, const char *message)
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
408 {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
409 if(level <= SASL_LOG_TRACE)
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
410 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
411
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
412 return SASL_OK;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
413 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
414
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
415 static void
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
416 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
417 {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
418 int id;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
419
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
420 /* Set up our callbacks structure */
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
421 if (js->sasl_cb == NULL)
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
422 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
423
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
424 id = 0;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
425 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
426 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
427 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
428 id++;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
429
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
430 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
431 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
432 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
433 id++;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
434
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
435 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
436 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
437 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
438 id++;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
439
37646
8f99c1dff72e Fix jabber password dialog infinite loop with SASL
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36068
diff changeset
440 if (js->sasl_password != NULL) {
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
441 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
442 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
443 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
444 id++;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
445 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
446
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
447 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
448 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
449 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
450 id++;
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 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
453 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
454
29089
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
455 static JabberSaslState
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
456 jabber_cyrus_start(JabberStream *js, PurpleXmlNode *mechanisms,
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
457 PurpleXmlNode **reply, char **error)
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
458 {
40103
0d8e52078bc7 Implement XEP-0233: XMPP Server Registration for use with Kerberos V5.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 38358
diff changeset
459 PurpleXmlNode *mechnode, *hostname;
30300
68e7a5c173ac jabber: Better error message when no concordant SASL mechs
Paul Aurich <darkrain42@pidgin.im>
parents: 30286
diff changeset
460 JabberSaslState ret;
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
461
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
462 js->sasl_mechs = g_string_new("");
37646
8f99c1dff72e Fix jabber password dialog infinite loop with SASL
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36068
diff changeset
463 js->sasl_password = g_strdup(purple_connection_get_password(js->gc));
40103
0d8e52078bc7 Implement XEP-0233: XMPP Server Registration for use with Kerberos V5.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 38358
diff changeset
464 /* XEP-0233 says we should grab the hostname for Kerberos v5, but there
0d8e52078bc7 Implement XEP-0233: XMPP Server Registration for use with Kerberos V5.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 38358
diff changeset
465 * is no claim about other SASL mechanisms. Fortunately, most don't
0d8e52078bc7 Implement XEP-0233: XMPP Server Registration for use with Kerberos V5.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 38358
diff changeset
466 * care what we use, so just use the domainpart. */
0d8e52078bc7 Implement XEP-0233: XMPP Server Registration for use with Kerberos V5.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 38358
diff changeset
467 hostname = purple_xmlnode_get_child_with_namespace(
0d8e52078bc7 Implement XEP-0233: XMPP Server Registration for use with Kerberos V5.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 38358
diff changeset
468 mechanisms, "hostname", NS_XMPP_SERVER_REGISTRATION);
0d8e52078bc7 Implement XEP-0233: XMPP Server Registration for use with Kerberos V5.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 38358
diff changeset
469 if (hostname) {
0d8e52078bc7 Implement XEP-0233: XMPP Server Registration for use with Kerberos V5.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 38358
diff changeset
470 js->serverFQDN = purple_xmlnode_get_data(hostname);
0d8e52078bc7 Implement XEP-0233: XMPP Server Registration for use with Kerberos V5.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 38358
diff changeset
471 }
0d8e52078bc7 Implement XEP-0233: XMPP Server Registration for use with Kerberos V5.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 38358
diff changeset
472 if (js->serverFQDN == NULL) {
0d8e52078bc7 Implement XEP-0233: XMPP Server Registration for use with Kerberos V5.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 38358
diff changeset
473 js->serverFQDN = g_strdup(js->user->domain);
0d8e52078bc7 Implement XEP-0233: XMPP Server Registration for use with Kerberos V5.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 38358
diff changeset
474 }
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
475
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
476 for(mechnode = purple_xmlnode_get_child(mechanisms, "mechanism"); mechnode;
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
477 mechnode = purple_xmlnode_get_next_twin(mechnode))
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
478 {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
479 char *mech_name = purple_xmlnode_get_data(mechnode);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
480
30432
dee4a4fe8cbc jabber: Document the other cyrus hack (ignoring EXTERNAL)
Paul Aurich <darkrain42@pidgin.im>
parents: 30431
diff changeset
481 /* 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
482 * 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
483 * 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
484 * 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
485 * 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
486 */
30308
81f840e2f9c7 jabber: Blacklist EXTERNAL when using Cyrus. Allows connecting when it's advertised.
Paul Aurich <darkrain42@pidgin.im>
parents: 30307
diff changeset
487 if (!mech_name || !*mech_name ||
38256
035f00c4fd87 Replace misused g_str_equal() with purple_strequal()
qarkai <qarkai@gmail.com>
parents: 33805
diff changeset
488 purple_strequal(mech_name, "EXTERNAL")) {
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
489 g_free(mech_name);
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
490 continue;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
491 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
492
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
493 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
494 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
495 g_free(mech_name);
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
496 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
497
30431
6969a68a6008 jabber: Make that more future-proof by never generating "GSSAPI "
Paul Aurich <darkrain42@pidgin.im>
parents: 30430
diff changeset
498 /* Strip off the trailing ' ' */
6969a68a6008 jabber: Make that more future-proof by never generating "GSSAPI "
Paul Aurich <darkrain42@pidgin.im>
parents: 30430
diff changeset
499 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
500 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
501
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
502 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
503 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
504
68e7a5c173ac jabber: Better error message when no concordant SASL mechs
Paul Aurich <darkrain42@pidgin.im>
parents: 30286
diff changeset
505 /*
68e7a5c173ac jabber: Better error message when no concordant SASL mechs
Paul Aurich <darkrain42@pidgin.im>
parents: 30286
diff changeset
506 * 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
507 * supported mechanisms.
68e7a5c173ac jabber: Better error message when no concordant SASL mechs
Paul Aurich <darkrain42@pidgin.im>
parents: 30286
diff changeset
508 */
68e7a5c173ac jabber: Better error message when no concordant SASL mechs
Paul Aurich <darkrain42@pidgin.im>
parents: 30286
diff changeset
509 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
510 *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
511
68e7a5c173ac jabber: Better error message when no concordant SASL mechs
Paul Aurich <darkrain42@pidgin.im>
parents: 30286
diff changeset
512 return ret;
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
513 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
514
29089
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
515 static JabberSaslState
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
516 jabber_cyrus_handle_challenge(JabberStream *js, PurpleXmlNode *packet,
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
517 PurpleXmlNode **reply, char **error)
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
518 {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
519 char *enc_in = purple_xmlnode_get_data(packet);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
520 unsigned char *dec_in;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
521 char *enc_out;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
522 const char *c_out;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
523 unsigned int clen;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
524 gsize declen;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
525
38341
3da74e727e78 Remove purple_base64_encode/decode() wrappers
Mike Ruprecht <cmaiku@gmail.com>
parents: 37646
diff changeset
526 dec_in = g_base64_decode(enc_in, &declen);
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 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
529 NULL, &c_out, &clen);
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
530 g_free(enc_in);
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
531 g_free(dec_in);
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
532 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
533 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
534 sasl_errdetail(js->sasl));
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
535 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
536 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
537 *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
538 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
539 } else {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
540 PurpleXmlNode *response = purple_xmlnode_new("response");
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
541 purple_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
542 if (clen > 0) {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
543 /* 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
544 * 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
545 * it will be executed.
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
546 *
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
547 * 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
548 * 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
549 * 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
550 */
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
551 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
552 strstr(c_out, ",charset="))
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
553 /* If we're not using DIGEST-MD5 or Cyrus SASL is fixed */
38341
3da74e727e78 Remove purple_base64_encode/decode() wrappers
Mike Ruprecht <cmaiku@gmail.com>
parents: 37646
diff changeset
554 enc_out = g_base64_encode((unsigned char*)c_out, clen);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
555 else {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
556 char *tmp = g_strdup_printf("%s,charset=utf-8", c_out);
38341
3da74e727e78 Remove purple_base64_encode/decode() wrappers
Mike Ruprecht <cmaiku@gmail.com>
parents: 37646
diff changeset
557 enc_out = g_base64_encode((unsigned char*)tmp, clen + 14);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
558 g_free(tmp);
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
559 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
560
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
561 purple_xmlnode_insert_data(response, enc_out, -1);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
562 g_free(enc_out);
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
563 }
29089
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
564
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
565 *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
566 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
567 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
568 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
569
29089
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
570 static JabberSaslState
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
571 jabber_cyrus_handle_success(JabberStream *js, PurpleXmlNode *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
572 char **error)
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
573 {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
574 const void *x;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
575
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
576 /* 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
577 * 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
578 */
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
579 if (js->sasl_state != SASL_OK) {
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
580 char *enc_in = purple_xmlnode_get_data(packet);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
581 unsigned char *dec_in = NULL;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
582 const char *c_out;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
583 unsigned int clen;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
584 gsize declen = 0;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
585
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
586 if(enc_in != NULL)
38341
3da74e727e78 Remove purple_base64_encode/decode() wrappers
Mike Ruprecht <cmaiku@gmail.com>
parents: 37646
diff changeset
587 dec_in = g_base64_decode(enc_in, &declen);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
588
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
589 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
590
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
591 g_free(enc_in);
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
592 g_free(dec_in);
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
593
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
594 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
595 /* 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
596 * 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
597 * 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
598 */
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
599 *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
600 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
601 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
602 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
603
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
604 /* 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
605 if (js->sasl) {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
606 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
607 if (*(int *)x > 0) {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
608 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
609 js->sasl_maxbuf = *(int *)x;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
610 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
611 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
612
29089
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
613 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
614 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
615
29089
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
616 static JabberSaslState
41967
025eee9e6f1d Bump C standard to C99 for XMPP and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41850
diff changeset
617 jabber_cyrus_handle_failure(JabberStream *js,
025eee9e6f1d Bump C standard to C99 for XMPP and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41850
diff changeset
618 G_GNUC_UNUSED PurpleXmlNode *packet,
34935
686fa55b0deb Replaced xmlnode with PurpleXmlNode, and xmlnode_* API with purple_xmlnode_* API
Ankit Vani <a@nevitus.org>
parents: 34111
diff changeset
619 PurpleXmlNode **reply, char **error)
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
620 {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
621 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
622 if (js->current_mech && *js->current_mech) {
33805
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
623 remove_current_mech(js);
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
624 }
33805
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
625
da201c4757d8 jabber: Correctly remove a failed SASL mech when it isn't the first in the list
Daniel Atallah <datallah@pidgin.im>
parents: 31804
diff changeset
626 /* Should we only try again if we've actually removed a mech? */
28855
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
627 if (*js->sasl_mechs->str) {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
628 /* 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
629 sasl_dispose(&js->sasl);
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
630
29089
c2fee5c11127 jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents: 29008
diff changeset
631 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
632
30308
81f840e2f9c7 jabber: Blacklist EXTERNAL when using Cyrus. Allows connecting when it's advertised.
Paul Aurich <darkrain42@pidgin.im>
parents: 30307
diff changeset
633 } else if ((js->auth_fail_count == 1) &&
38260
dcada91c0912 Remove redundant NULL checks
qarkai <qarkai@gmail.com>
parents: 38256
diff changeset
634 purple_strequal(js->current_mech, "GSSAPI")) {
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
635 /* 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
636 * 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
637 *
30286
270c63ba1f8f applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents: 30173
diff changeset
638 * 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
639 * 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
640 *
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
641 * 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
642 * 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
643 * 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
644 * 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
645 */
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
646 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
647 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
648 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
649 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
650 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
651 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
652 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
653
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
654 /* 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
655 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
656 }
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
657
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
658 static JabberSaslMech cyrus_mech = {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
659 100, /* priority */
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
660 "*", /* 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
661 * 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
662 jabber_cyrus_start,
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
663 jabber_cyrus_handle_challenge,
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
664 jabber_cyrus_handle_success,
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
665 jabber_cyrus_handle_failure,
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
666 NULL,
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
667 };
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
668
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
669 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
670 {
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
671 return &cyrus_mech;
c5bc85f9c00e jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff changeset
672 }

mercurial