Fri, 21 May 2010 05:35:33 +0000
jabber: Blacklist EXTERNAL when using Cyrus. Allows connecting when it's advertised.
This fixes what I think is a bug/quirk in Cyrus SASL. The EXTERNAL mech
returns SASL_NOMECH to indicate the client hasn't set the necessary data,
except SASL_NOMECH is supposed to mean (AFAICT) "None of the mechs given
are supported/meet the current security requirements". No other mech
does that!
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
1 | /* |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
2 | * purple - Jabber Protocol Plugin |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
3 | * |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
4 | * Purple is the legal property of its developers, whose names are too numerous |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
5 | * to list here. Please refer to the COPYRIGHT file distributed with this |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
6 | * source distribution. |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
7 | * |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
8 | * This program is free software; you can redistribute it and/or modify |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
9 | * it under the terms of the GNU General Public License as published by |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
10 | * the Free Software Foundation; either version 2 of the License, or |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
11 | * (at your option) any later version. |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
12 | * |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
13 | * This program is distributed in the hope that it will be useful, |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
16 | * GNU General Public License for more details. |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
17 | * |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
18 | * You should have received a copy of the GNU General Public License |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
19 | * along with this program; if not, write to the Free Software |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
21 | * |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
22 | */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
23 | #include "internal.h" |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
24 | #include "core.h" |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
25 | #include "debug.h" |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
26 | #include "request.h" |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
27 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
28 | #include "auth.h" |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
29 | #include "jabber.h" |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
30 | |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
31 | static JabberSaslState jabber_auth_start_cyrus(JabberStream *js, xmlnode **reply, |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29089
diff
changeset
|
32 | char **error); |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
33 | static void jabber_sasl_build_callbacks(JabberStream *); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
34 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
35 | static void disallow_plaintext_auth(PurpleAccount *account) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
36 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
37 | purple_connection_error_reason(purple_account_get_connection(account), |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
38 | PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
39 | _("Server requires plaintext authentication over an unencrypted stream")); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
40 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
41 | |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
42 | static void start_cyrus_wrapper(JabberStream *js) |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
43 | { |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29089
diff
changeset
|
44 | char *error = NULL; |
|
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29089
diff
changeset
|
45 | xmlnode *response = NULL; |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
46 | JabberSaslState state = jabber_auth_start_cyrus(js, &response, &error); |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
47 | |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
48 | if (state == JABBER_SASL_STATE_FAIL) { |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
49 | purple_connection_error_reason(js->gc, |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
50 | PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
51 | error); |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29089
diff
changeset
|
52 | g_free(error); |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
53 | } else if (response) { |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
54 | jabber_send(js, response); |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
55 | xmlnode_free(response); |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
56 | } |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
57 | } |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
58 | |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
59 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
60 | /* Callbacks for Cyrus SASL */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
61 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
62 | static int jabber_sasl_cb_realm(void *ctx, int id, const char **avail, const char **result) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
63 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
64 | JabberStream *js = ctx; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
65 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
66 | if (id != SASL_CB_GETREALM || !result) return SASL_BADPARAM; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
67 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
68 | *result = js->user->domain; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
69 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
70 | return SASL_OK; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
71 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
72 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
73 | static int jabber_sasl_cb_simple(void *ctx, int id, const char **res, unsigned *len) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
74 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
75 | JabberStream *js = ctx; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
76 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
77 | switch(id) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
78 | case SASL_CB_AUTHNAME: |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
79 | *res = js->user->node; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
80 | break; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
81 | case SASL_CB_USER: |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
82 | *res = ""; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
83 | break; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
84 | default: |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
85 | return SASL_BADPARAM; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
86 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
87 | if (len) *len = strlen((char *)*res); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
88 | return SASL_OK; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
89 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
90 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
91 | static int jabber_sasl_cb_secret(sasl_conn_t *conn, void *ctx, int id, sasl_secret_t **secret) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
92 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
93 | JabberStream *js = ctx; |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
94 | PurpleAccount *account; |
|
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
95 | const char *pw; |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
96 | size_t len; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
97 | static sasl_secret_t *x = NULL; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
98 | |
| 28859 | 99 | account = purple_connection_get_account(js->gc); |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
100 | pw = purple_account_get_password(account); |
|
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
101 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
102 | 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
|
103 | return SASL_BADPARAM; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
104 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
105 | len = strlen(pw); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
106 | x = (sasl_secret_t *) realloc(x, sizeof(sasl_secret_t) + len); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
107 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
108 | if (!x) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
109 | return SASL_NOMEM; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
110 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
111 | x->len = len; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
112 | strcpy((char*)x->data, pw); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
113 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
114 | *secret = x; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
115 | return SASL_OK; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
116 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
117 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
118 | static void allow_cyrus_plaintext_auth(PurpleAccount *account) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
119 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
120 | PurpleConnection *gc; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
121 | JabberStream *js; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
122 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
123 | gc = purple_account_get_connection(account); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
124 | js = purple_connection_get_protocol_data(gc); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
125 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
126 | purple_account_set_bool(account, "auth_plain_in_clear", TRUE); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
127 | |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
128 | start_cyrus_wrapper(js); |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
129 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
130 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
131 | static void auth_pass_cb(PurpleConnection *gc, PurpleRequestFields *fields) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
132 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
133 | PurpleAccount *account; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
134 | JabberStream *js; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
135 | const char *entry; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
136 | gboolean remember; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
137 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
138 | /* The password prompt dialog doesn't get disposed if the account disconnects */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
139 | if (!PURPLE_CONNECTION_IS_VALID(gc)) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
140 | return; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
141 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
142 | account = purple_connection_get_account(gc); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
143 | js = purple_connection_get_protocol_data(gc); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
144 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
145 | entry = purple_request_fields_get_string(fields, "password"); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
146 | remember = purple_request_fields_get_bool(fields, "remember"); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
147 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
148 | if (!entry || !*entry) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
149 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
150 | purple_notify_error(account, NULL, _("Password is required to sign on."), NULL); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
151 | return; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
152 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
153 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
154 | if (remember) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
155 | purple_account_set_remember_password(account, TRUE); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
156 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
157 | purple_account_set_password(account, entry); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
158 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
159 | /* Rebuild our callbacks as we now have a password to offer */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
160 | jabber_sasl_build_callbacks(js); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
161 | |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
162 | /* Restart our negotiation */ |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
163 | start_cyrus_wrapper(js); |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
164 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
165 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
166 | static void |
|
28860
d2a057cdd7b6
jabber: A little more use of accessors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28859
diff
changeset
|
167 | auth_no_pass_cb(PurpleConnection *gc, PurpleRequestFields *fields) |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
168 | { |
|
28860
d2a057cdd7b6
jabber: A little more use of accessors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28859
diff
changeset
|
169 | PurpleAccount *account; |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
170 | JabberStream *js; |
|
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 | /* The password prompt dialog doesn't get disposed if the account disconnects */ |
|
28860
d2a057cdd7b6
jabber: A little more use of accessors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28859
diff
changeset
|
173 | if (!PURPLE_CONNECTION_IS_VALID(gc)) |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
174 | return; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
175 | |
|
28860
d2a057cdd7b6
jabber: A little more use of accessors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28859
diff
changeset
|
176 | account = purple_connection_get_account(gc); |
|
d2a057cdd7b6
jabber: A little more use of accessors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28859
diff
changeset
|
177 | js = purple_connection_get_protocol_data(gc); |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
178 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
179 | /* Disable the account as the user has canceled connecting */ |
|
28860
d2a057cdd7b6
jabber: A little more use of accessors.
Paul Aurich <darkrain42@pidgin.im>
parents:
28859
diff
changeset
|
180 | purple_account_set_enabled(account, purple_core_get_ui(), FALSE); |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
181 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
182 | |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
183 | static JabberSaslState |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29089
diff
changeset
|
184 | jabber_auth_start_cyrus(JabberStream *js, xmlnode **reply, char **error) |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
185 | { |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
186 | PurpleAccount *account; |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
187 | const char *clientout = NULL; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
188 | char *enc_out; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
189 | unsigned coutlen = 0; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
190 | sasl_security_properties_t secprops; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
191 | gboolean again; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
192 | gboolean plaintext = TRUE; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
193 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
194 | /* 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
|
195 | secprops.min_ssf = 0; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
196 | 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
|
197 | |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
198 | 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
|
199 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
200 | 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
|
201 | secprops.max_ssf = -1; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
202 | 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
|
203 | 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
|
204 | if (!plaintext) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
205 | 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
|
206 | } else { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
207 | secprops.max_ssf = 0; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
208 | secprops.maxbufsize = 0; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
209 | plaintext = TRUE; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
210 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
211 | secprops.property_names = 0; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
212 | secprops.property_values = 0; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
213 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
214 | do { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
215 | again = FALSE; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
216 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
217 | 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
|
218 | 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
|
219 | 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
|
220 | 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
|
221 | 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
|
222 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
223 | switch (js->sasl_state) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
224 | /* Success */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
225 | case SASL_OK: |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
226 | case SASL_CONTINUE: |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
227 | break; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
228 | case SASL_NOMECH: |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
229 | /* 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
|
230 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
231 | /* 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
|
232 | * to get one |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
233 | */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
234 | |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
235 | if (!purple_account_get_password(account)) { |
|
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
236 | purple_account_request_password(account, G_CALLBACK(auth_pass_cb), G_CALLBACK(auth_no_pass_cb), js->gc); |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
237 | 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
|
238 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
239 | /* 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
|
240 | * 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
|
241 | * plaintext auth |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
242 | */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
243 | } else if (!plaintext) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
244 | char *msg = g_strdup_printf(_("%s requires plaintext authentication over an unencrypted connection. Allow this and continue authentication?"), |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
245 | purple_account_get_username(account)); |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
246 | 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
|
247 | _("Plaintext Authentication"), |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
248 | msg, |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
249 | 1, account, NULL, NULL, account, |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
250 | allow_cyrus_plaintext_auth, |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
251 | disallow_plaintext_auth); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
252 | 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
|
253 | 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
|
254 | |
|
30286
270c63ba1f8f
applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents:
30173
diff
changeset
|
255 | } else |
|
270c63ba1f8f
applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents:
30173
diff
changeset
|
256 | js->auth_fail_count++; |
|
270c63ba1f8f
applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents:
30173
diff
changeset
|
257 | |
|
270c63ba1f8f
applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents:
30173
diff
changeset
|
258 | if (js->auth_fail_count == 1 && |
|
270c63ba1f8f
applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents:
30173
diff
changeset
|
259 | (js->sasl_mechs->str && g_str_equal(js->sasl_mechs->str, "GSSAPI"))) { |
|
270c63ba1f8f
applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents:
30173
diff
changeset
|
260 | /* 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
|
261 | * 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
|
262 | * |
|
270c63ba1f8f
applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents:
30173
diff
changeset
|
263 | * 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
|
264 | * 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
|
265 | * |
|
270c63ba1f8f
applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents:
30173
diff
changeset
|
266 | * 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
|
267 | * 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
|
268 | * 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
|
269 | * which would connect without issue otherwise. -evands |
|
270c63ba1f8f
applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents:
30173
diff
changeset
|
270 | */ |
|
270c63ba1f8f
applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents:
30173
diff
changeset
|
271 | js->auth_mech = NULL; |
|
270c63ba1f8f
applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents:
30173
diff
changeset
|
272 | jabber_auth_start_old(js); |
|
30307
6062f0491f3a
jabber: trailing_whitespace--;
Paul Aurich <darkrain42@pidgin.im>
parents:
30301
diff
changeset
|
273 | 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
|
274 | } |
|
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
|
275 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
276 | break; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
277 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
278 | /* 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
|
279 | case SASL_BADPARAM: |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
280 | 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
|
281 | *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
|
282 | break; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
283 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
284 | /* 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
|
285 | default: |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
286 | 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
|
287 | |
|
30286
270c63ba1f8f
applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents:
30173
diff
changeset
|
288 | js->auth_fail_count++; |
|
270c63ba1f8f
applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents:
30173
diff
changeset
|
289 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
290 | /* |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
291 | * DAA: is this right? |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
292 | * 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
|
293 | * 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
|
294 | * 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
|
295 | */ |
|
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 | * 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
|
298 | * 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
|
299 | * 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
|
300 | * 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
|
301 | */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
302 | if (js->current_mech && *js->current_mech) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
303 | char *pos; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
304 | if ((pos = strstr(js->sasl_mechs->str, js->current_mech))) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
305 | g_string_erase(js->sasl_mechs, pos-js->sasl_mechs->str, strlen(js->current_mech)); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
306 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
307 | /* Remove space which separated this mech from the next */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
308 | if ((js->sasl_mechs->str)[0] == ' ') { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
309 | g_string_erase(js->sasl_mechs, 0, 1); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
310 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
311 | again = TRUE; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
312 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
313 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
314 | sasl_dispose(&js->sasl); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
315 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
316 | } while (again); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
317 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
318 | if (js->sasl_state == SASL_CONTINUE || js->sasl_state == SASL_OK) { |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
319 | xmlnode *auth = xmlnode_new("auth"); |
|
29008
1f288722b5cd
jabber: Use NS_XMPP_SASL
Paul Aurich <darkrain42@pidgin.im>
parents:
28861
diff
changeset
|
320 | xmlnode_set_namespace(auth, NS_XMPP_SASL); |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
321 | xmlnode_set_attrib(auth, "mechanism", js->current_mech); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
322 | |
|
30151
d1dc53f03781
jabber: Only add the ga:client-uses-full-bind-result to gmail/googlemail domains
Paul Aurich <darkrain42@pidgin.im>
parents:
29956
diff
changeset
|
323 | if (g_str_equal(js->user->domain, "gmail.com") || |
|
d1dc53f03781
jabber: Only add the ga:client-uses-full-bind-result to gmail/googlemail domains
Paul Aurich <darkrain42@pidgin.im>
parents:
29956
diff
changeset
|
324 | g_str_equal(js->user->domain, "googlemail.com")) { |
|
d1dc53f03781
jabber: Only add the ga:client-uses-full-bind-result to gmail/googlemail domains
Paul Aurich <darkrain42@pidgin.im>
parents:
29956
diff
changeset
|
325 | xmlnode_set_attrib(auth, "xmlns:ga", "http://www.google.com/talk/protocol/auth"); |
|
d1dc53f03781
jabber: Only add the ga:client-uses-full-bind-result to gmail/googlemail domains
Paul Aurich <darkrain42@pidgin.im>
parents:
29956
diff
changeset
|
326 | xmlnode_set_attrib(auth, "ga:client-uses-full-bind-result", "true"); |
|
d1dc53f03781
jabber: Only add the ga:client-uses-full-bind-result to gmail/googlemail domains
Paul Aurich <darkrain42@pidgin.im>
parents:
29956
diff
changeset
|
327 | } |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
328 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
329 | if (clientout) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
330 | if (coutlen == 0) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
331 | xmlnode_insert_data(auth, "=", -1); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
332 | } else { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
333 | enc_out = purple_base64_encode((unsigned char*)clientout, coutlen); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
334 | xmlnode_insert_data(auth, enc_out, -1); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
335 | g_free(enc_out); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
336 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
337 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
338 | |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
339 | *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
|
340 | 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
|
341 | } 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
|
342 | 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
|
343 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
344 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
345 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
346 | static int |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
347 | jabber_sasl_cb_log(void *context, int level, const char *message) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
348 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
349 | if(level <= SASL_LOG_TRACE) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
350 | 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
|
351 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
352 | return SASL_OK; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
353 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
354 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
355 | static void |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
356 | 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
|
357 | { |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
358 | PurpleAccount *account; |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
359 | int id; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
360 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
361 | /* Set up our callbacks structure */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
362 | if (js->sasl_cb == NULL) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
363 | 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
|
364 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
365 | id = 0; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
366 | js->sasl_cb[id].id = SASL_CB_GETREALM; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
367 | js->sasl_cb[id].proc = jabber_sasl_cb_realm; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
368 | 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
|
369 | id++; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
370 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
371 | js->sasl_cb[id].id = SASL_CB_AUTHNAME; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
372 | js->sasl_cb[id].proc = jabber_sasl_cb_simple; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
373 | 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
|
374 | id++; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
375 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
376 | js->sasl_cb[id].id = SASL_CB_USER; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
377 | js->sasl_cb[id].proc = jabber_sasl_cb_simple; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
378 | 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
|
379 | id++; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
380 | |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
381 | 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
|
382 | if (purple_account_get_password(account) != NULL ) { |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
383 | js->sasl_cb[id].id = SASL_CB_PASS; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
384 | js->sasl_cb[id].proc = jabber_sasl_cb_secret; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
385 | 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
|
386 | id++; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
387 | } |
|
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 | js->sasl_cb[id].id = SASL_CB_LOG; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
390 | js->sasl_cb[id].proc = jabber_sasl_cb_log; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
391 | 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
|
392 | id++; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
393 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
394 | 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
|
395 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
396 | |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
397 | static JabberSaslState |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
398 | jabber_cyrus_start(JabberStream *js, xmlnode *mechanisms, |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29089
diff
changeset
|
399 | xmlnode **reply, char **error) |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
400 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
401 | xmlnode *mechnode; |
|
30300
68e7a5c173ac
jabber: Better error message when no concordant SASL mechs
Paul Aurich <darkrain42@pidgin.im>
parents:
30286
diff
changeset
|
402 | JabberSaslState ret; |
|
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 | js->sasl_mechs = g_string_new(""); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
405 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
406 | for(mechnode = xmlnode_get_child(mechanisms, "mechanism"); mechnode; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
407 | mechnode = xmlnode_get_next_twin(mechnode)) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
408 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
409 | char *mech_name = xmlnode_get_data(mechnode); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
410 | |
|
30308
81f840e2f9c7
jabber: Blacklist EXTERNAL when using Cyrus. Allows connecting when it's advertised.
Paul Aurich <darkrain42@pidgin.im>
parents:
30307
diff
changeset
|
411 | if (!mech_name || !*mech_name || |
|
81f840e2f9c7
jabber: Blacklist EXTERNAL when using Cyrus. Allows connecting when it's advertised.
Paul Aurich <darkrain42@pidgin.im>
parents:
30307
diff
changeset
|
412 | g_str_equal(mech_name, "EXTERNAL")) { |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
413 | g_free(mech_name); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
414 | continue; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
415 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
416 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
417 | 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
|
418 | 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
|
419 | g_free(mech_name); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
420 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
421 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
422 | 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
|
423 | 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
|
424 | |
|
68e7a5c173ac
jabber: Better error message when no concordant SASL mechs
Paul Aurich <darkrain42@pidgin.im>
parents:
30286
diff
changeset
|
425 | /* |
|
68e7a5c173ac
jabber: Better error message when no concordant SASL mechs
Paul Aurich <darkrain42@pidgin.im>
parents:
30286
diff
changeset
|
426 | * 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
|
427 | * supported mechanisms. |
|
68e7a5c173ac
jabber: Better error message when no concordant SASL mechs
Paul Aurich <darkrain42@pidgin.im>
parents:
30286
diff
changeset
|
428 | */ |
|
68e7a5c173ac
jabber: Better error message when no concordant SASL mechs
Paul Aurich <darkrain42@pidgin.im>
parents:
30286
diff
changeset
|
429 | 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
|
430 | *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
|
431 | |
|
68e7a5c173ac
jabber: Better error message when no concordant SASL mechs
Paul Aurich <darkrain42@pidgin.im>
parents:
30286
diff
changeset
|
432 | return ret; |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
433 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
434 | |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
435 | static JabberSaslState |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
436 | jabber_cyrus_handle_challenge(JabberStream *js, xmlnode *packet, |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29089
diff
changeset
|
437 | xmlnode **reply, char **error) |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
438 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
439 | char *enc_in = xmlnode_get_data(packet); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
440 | unsigned char *dec_in; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
441 | char *enc_out; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
442 | const char *c_out; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
443 | unsigned int clen; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
444 | gsize declen; |
|
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 | dec_in = purple_base64_decode(enc_in, &declen); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
447 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
448 | 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
|
449 | NULL, &c_out, &clen); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
450 | g_free(enc_in); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
451 | g_free(dec_in); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
452 | 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
|
453 | 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
|
454 | sasl_errdetail(js->sasl)); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
455 | 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
|
456 | 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
|
457 | *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
|
458 | 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
|
459 | } 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
|
460 | xmlnode *response = xmlnode_new("response"); |
|
29008
1f288722b5cd
jabber: Use NS_XMPP_SASL
Paul Aurich <darkrain42@pidgin.im>
parents:
28861
diff
changeset
|
461 | 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
|
462 | if (clen > 0) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
463 | /* 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
|
464 | * 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
|
465 | * it will be executed. |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
466 | * |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
467 | * 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
|
468 | * 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
|
469 | * 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
|
470 | */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
471 | 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
|
472 | strstr(c_out, ",charset=")) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
473 | /* If we're not using DIGEST-MD5 or Cyrus SASL is fixed */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
474 | enc_out = purple_base64_encode((unsigned char*)c_out, clen); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
475 | else { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
476 | char *tmp = g_strdup_printf("%s,charset=utf-8", c_out); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
477 | enc_out = purple_base64_encode((unsigned char*)tmp, clen + 14); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
478 | g_free(tmp); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
479 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
480 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
481 | xmlnode_insert_data(response, enc_out, -1); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
482 | g_free(enc_out); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
483 | } |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
484 | |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
485 | *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
|
486 | 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
|
487 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
488 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
489 | |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
490 | static JabberSaslState |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
491 | jabber_cyrus_handle_success(JabberStream *js, xmlnode *packet, |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29089
diff
changeset
|
492 | char **error) |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
493 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
494 | const void *x; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
495 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
496 | /* 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
|
497 | * 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
|
498 | */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
499 | 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
|
500 | char *enc_in = xmlnode_get_data(packet); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
501 | unsigned char *dec_in = NULL; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
502 | const char *c_out; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
503 | unsigned int clen; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
504 | gsize declen = 0; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
505 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
506 | if(enc_in != NULL) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
507 | dec_in = purple_base64_decode(enc_in, &declen); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
508 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
509 | 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
|
510 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
511 | g_free(enc_in); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
512 | g_free(dec_in); |
|
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 | 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
|
515 | /* This should never happen! */ |
|
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
|
516 | *error = g_strdup(_("Invalid response from server")); |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
517 | g_return_val_if_reached(JABBER_SASL_STATE_FAIL); |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
518 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
519 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
520 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
521 | /* 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
|
522 | if (js->sasl) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
523 | 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
|
524 | if (*(int *)x > 0) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
525 | 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
|
526 | js->sasl_maxbuf = *(int *)x; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
527 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
528 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
529 | |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
530 | 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
|
531 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
532 | |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
533 | static JabberSaslState |
|
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
534 | jabber_cyrus_handle_failure(JabberStream *js, xmlnode *packet, |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29089
diff
changeset
|
535 | xmlnode **reply, char **error) |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
536 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
537 | 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
|
538 | if (js->current_mech && *js->current_mech) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
539 | char *pos; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
540 | if ((pos = strstr(js->sasl_mechs->str, js->current_mech))) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
541 | g_string_erase(js->sasl_mechs, pos-js->sasl_mechs->str, strlen(js->current_mech)); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
542 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
543 | /* Remove space which separated this mech from the next */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
544 | if ((js->sasl_mechs->str)[0] == ' ') { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
545 | g_string_erase(js->sasl_mechs, 0, 1); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
546 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
547 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
548 | if (*js->sasl_mechs->str) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
549 | /* 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
|
550 | sasl_dispose(&js->sasl); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
551 | |
|
29089
c2fee5c11127
jabber: Fix up the cyrus auth code (although there's a leak currently)
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
552 | 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
|
553 | |
|
30308
81f840e2f9c7
jabber: Blacklist EXTERNAL when using Cyrus. Allows connecting when it's advertised.
Paul Aurich <darkrain42@pidgin.im>
parents:
30307
diff
changeset
|
554 | } else if ((js->auth_fail_count == 1) && |
|
30168
ff3cae005cb5
Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evands@pidgin.im>
parents:
30151
diff
changeset
|
555 | (js->current_mech && g_str_equal(js->current_mech, "GSSAPI"))) { |
|
ff3cae005cb5
Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evands@pidgin.im>
parents:
30151
diff
changeset
|
556 | /* 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
|
557 | * 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
|
558 | * |
|
30286
270c63ba1f8f
applied changes from bf4b720f9231b395fb51bf1e27440328d46bceb5
Evan Schoenberg <evands@pidgin.im>
parents:
30173
diff
changeset
|
559 | * 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
|
560 | * 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
|
561 | * |
|
ff3cae005cb5
Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evands@pidgin.im>
parents:
30151
diff
changeset
|
562 | * 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
|
563 | * 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
|
564 | * 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
|
565 | * 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
|
566 | */ |
|
ff3cae005cb5
Improve on a hack I commited in 12/2007 which allows connection via XMPP to iChat Server 10.5 when CYRUS-SASL is compiled with GSSAPI support but no GSSAPI credentials are valid to connect to the server. Instead of always trying jabber:iq:auth if all SASL mechs fail, we now only do so in the specific case of a single mech having been attempted and that mech being GSSAPI. In general, this means that we now gracefully fail authentication with SASL rather than getting ourselves booted from servers not expecting a jabber:iq:auth stanza.
Evan Schoenberg <evands@pidgin.im>
parents:
30151
diff
changeset
|
567 | 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
|
568 | 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
|
569 | 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
|
570 | 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
|
571 | 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
|
572 | } |
|
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 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
575 | /* 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
|
576 | 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
|
577 | } |
|
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 | static JabberSaslMech cyrus_mech = { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
580 | 100, /* priority */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
581 | "*", /* 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
|
582 | * 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
|
583 | jabber_cyrus_start, |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
584 | jabber_cyrus_handle_challenge, |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
585 | jabber_cyrus_handle_success, |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
586 | jabber_cyrus_handle_failure, |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
587 | NULL, |
|
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 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
590 | 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
|
591 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
592 | return &cyrus_mech; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
diff
changeset
|
593 | } |