annotate src/protocols/jabber/auth.c @ 12508:5cfc53ead482

[gaim-migrate @ 14820] patch from Simon Wilkinson to add Cyrus SASL support for jabber Give him credit if it works flawlessly. Blame me if it doesn't, as the patch was against 1.3.1 (yeah, I've been sitting on it for that long), and I had to merge it to HEAD, and clean up a bunch of warnings committer: Tailor Script <tailor@pidgin.im>
author Nathan Walp <nwalp@pidgin.im>
date Sat, 17 Dec 2005 02:24:05 +0000
parents 8dca96cbcd64
children d85c2bfb2ea2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
1 /*
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
2 * gaim - Jabber Protocol Plugin
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
3 *
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
4 * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
5 *
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
9 * (at your option) any later version.
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
10 *
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful,
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
14 * GNU General Public License for more details.
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
15 *
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
17 * along with this program; if not, write to the Free Software
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
19 *
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
20 */
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
21 #include "internal.h"
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
22
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
23 #include "jutil.h"
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
24 #include "auth.h"
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
25 #include "xmlnode.h"
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
26 #include "jabber.h"
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
27 #include "iq.h"
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
28
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
29 #include "debug.h"
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
30 #include "util.h"
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10496
diff changeset
31 #include "cipher.h"
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
32 #include "sslconn.h"
8397
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
33 #include "request.h"
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
34
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
35 static void auth_old_result_cb(JabberStream *js, xmlnode *packet,
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
36 gpointer data);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
37
8296
dd6fe7d965aa [gaim-migrate @ 9020]
Nathan Walp <nwalp@pidgin.im>
parents: 8223
diff changeset
38 gboolean
dd6fe7d965aa [gaim-migrate @ 9020]
Nathan Walp <nwalp@pidgin.im>
parents: 8223
diff changeset
39 jabber_process_starttls(JabberStream *js, xmlnode *packet)
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
40 {
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
41 xmlnode *starttls;
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
42
7157
fae7cfe975fd [gaim-migrate @ 7724]
Nathan Walp <nwalp@pidgin.im>
parents: 7147
diff changeset
43 if((starttls = xmlnode_get_child(packet, "starttls"))) {
7630
2df4d470c12a [gaim-migrate @ 8254]
Nathan Walp <nwalp@pidgin.im>
parents: 7515
diff changeset
44 if(gaim_account_get_bool(js->gc->account, "use_tls", TRUE) &&
2df4d470c12a [gaim-migrate @ 8254]
Nathan Walp <nwalp@pidgin.im>
parents: 7515
diff changeset
45 gaim_ssl_is_supported()) {
7157
fae7cfe975fd [gaim-migrate @ 7724]
Nathan Walp <nwalp@pidgin.im>
parents: 7147
diff changeset
46 jabber_send_raw(js,
7642
9008b5be4275 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7630
diff changeset
47 "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>", -1);
8296
dd6fe7d965aa [gaim-migrate @ 9020]
Nathan Walp <nwalp@pidgin.im>
parents: 8223
diff changeset
48 return TRUE;
7157
fae7cfe975fd [gaim-migrate @ 7724]
Nathan Walp <nwalp@pidgin.im>
parents: 7147
diff changeset
49 } else if(xmlnode_get_child(starttls, "required")) {
10441
e0a4b8586cbe [gaim-migrate @ 11701]
Nathan Walp <nwalp@pidgin.im>
parents: 10136
diff changeset
50 if(gaim_ssl_is_supported()) {
10496
dc33b3b475c2 [gaim-migrate @ 11788]
Nathan Walp <nwalp@pidgin.im>
parents: 10441
diff changeset
51 gaim_connection_error(js->gc, _("Server requires TLS/SSL for login. Select \"Use TLS if available\" in account properties"));
10441
e0a4b8586cbe [gaim-migrate @ 11701]
Nathan Walp <nwalp@pidgin.im>
parents: 10136
diff changeset
52 } else {
e0a4b8586cbe [gaim-migrate @ 11701]
Nathan Walp <nwalp@pidgin.im>
parents: 10136
diff changeset
53 gaim_connection_error(js->gc, _("Server requires TLS/SSL for login. No TLS/SSL support found."));
e0a4b8586cbe [gaim-migrate @ 11701]
Nathan Walp <nwalp@pidgin.im>
parents: 10136
diff changeset
54 }
8296
dd6fe7d965aa [gaim-migrate @ 9020]
Nathan Walp <nwalp@pidgin.im>
parents: 8223
diff changeset
55 return TRUE;
7157
fae7cfe975fd [gaim-migrate @ 7724]
Nathan Walp <nwalp@pidgin.im>
parents: 7147
diff changeset
56 }
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
57 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
58
8296
dd6fe7d965aa [gaim-migrate @ 9020]
Nathan Walp <nwalp@pidgin.im>
parents: 8223
diff changeset
59 return FALSE;
dd6fe7d965aa [gaim-migrate @ 9020]
Nathan Walp <nwalp@pidgin.im>
parents: 8223
diff changeset
60 }
dd6fe7d965aa [gaim-migrate @ 9020]
Nathan Walp <nwalp@pidgin.im>
parents: 8223
diff changeset
61
8397
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
62 static void finish_plaintext_authentication(JabberStream *js)
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
63 {
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
64 if(js->auth_type == JABBER_AUTH_PLAIN) {
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
65 xmlnode *auth;
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
66 GString *response;
11127
719779387f96 [gaim-migrate @ 13183]
Mark Doliner <mark@kingant.net>
parents: 10740
diff changeset
67 gchar *enc_out;
8397
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
68
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
69 auth = xmlnode_new("auth");
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
70 xmlnode_set_attrib(auth, "xmlns", "urn:ietf:params:xml:ns:xmpp-sasl");
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
71
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
72 response = g_string_new("");
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
73 response = g_string_append_len(response, "\0", 1);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
74 response = g_string_append(response, js->user->node);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
75 response = g_string_append_len(response, "\0", 1);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
76 response = g_string_append(response,
10740
94cc67130789 [gaim-migrate @ 12342]
Mark Doliner <mark@kingant.net>
parents: 10687
diff changeset
77 gaim_connection_get_password(js->gc));
8397
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
78
11137
096020ae09a9 [gaim-migrate @ 13201]
Mark Doliner <mark@kingant.net>
parents: 11127
diff changeset
79 enc_out = gaim_base64_encode((guchar *)response->str, response->len);
8397
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
80
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
81 xmlnode_set_attrib(auth, "mechanism", "PLAIN");
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
82 xmlnode_insert_data(auth, enc_out, -1);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
83 g_free(enc_out);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
84 g_string_free(response, TRUE);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
85
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
86 jabber_send(js, auth);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
87 xmlnode_free(auth);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
88 } else if(js->auth_type == JABBER_AUTH_IQ_AUTH) {
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
89 JabberIq *iq;
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
90 xmlnode *query, *x;
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
91
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
92 iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:auth");
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
93 query = xmlnode_get_child(iq->node, "query");
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
94 x = xmlnode_new_child(query, "username");
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
95 xmlnode_insert_data(x, js->user->node, -1);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
96 x = xmlnode_new_child(query, "resource");
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
97 xmlnode_insert_data(x, js->user->resource, -1);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
98 x = xmlnode_new_child(query, "password");
10740
94cc67130789 [gaim-migrate @ 12342]
Mark Doliner <mark@kingant.net>
parents: 10687
diff changeset
99 xmlnode_insert_data(x, gaim_connection_get_password(js->gc), -1);
8397
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
100 jabber_iq_set_callback(iq, auth_old_result_cb, NULL);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
101 jabber_iq_send(iq);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
102 }
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
103 }
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
104
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
105 static void allow_plaintext_auth(GaimAccount *account)
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
106 {
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
107 gaim_account_set_bool(account, "auth_plain_in_clear", TRUE);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
108
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
109 finish_plaintext_authentication(account->gc->proto_data);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
110 }
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
111
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
112 static void disallow_plaintext_auth(GaimAccount *account)
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
113 {
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
114 gaim_connection_error(account->gc, _("Server requires plaintext authentication over an unencrypted stream"));
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
115 }
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
116
12508
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
117 #ifdef HAVE_CYRUS_SASL
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
118
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
119 static void jabber_auth_start_cyrus(JabberStream *);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
120
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
121 /* Callbacks for Cyrus SASL */
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
122
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
123 static int jabber_sasl_cb_realm(void *ctx, int id, const char **avail, const char **result)
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
124 {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
125 JabberStream *js = (JabberStream *)ctx;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
126
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
127 if (id != SASL_CB_GETREALM || !result) return SASL_BADPARAM;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
128
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
129 *result = js->user->domain;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
130
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
131 return SASL_OK;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
132 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
133
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
134 static int jabber_sasl_cb_simple(void *ctx, int id, const char **res, unsigned *len)
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
135 {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
136 JabberStream *js = (JabberStream *)ctx;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
137
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
138 switch(id) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
139 case SASL_CB_AUTHNAME:
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
140 *res = js->user->node;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
141 break;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
142 case SASL_CB_USER:
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
143 *res = js->user->node;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
144 break;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
145 default:
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
146 return SASL_BADPARAM;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
147 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
148 if (len) *len = strlen((char *)*res);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
149 return SASL_OK;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
150 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
151
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
152 static int jabber_sasl_cb_secret(sasl_conn_t *conn, void *ctx, int id, sasl_secret_t **secret)
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
153 {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
154 JabberStream *js = (JabberStream *)ctx;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
155 const char *pw = gaim_account_get_password(js->gc->account);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
156 size_t len;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
157 static sasl_secret_t *x = NULL;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
158
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
159 if (!conn || !secret || id != SASL_CB_PASS)
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
160 return SASL_BADPARAM;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
161
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
162 len = strlen(pw);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
163 x = (sasl_secret_t *) realloc(x, sizeof(sasl_secret_t) + len);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
164
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
165 if (!x)
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
166 return SASL_NOMEM;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
167
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
168 x->len = len;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
169 strcpy((char*)x->data, pw);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
170
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
171 *secret = x;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
172 return SASL_OK;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
173 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
174
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
175 static void allow_cyrus_plaintext_auth(GaimAccount *account)
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
176 {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
177 gaim_account_set_bool(account, "auth_plain_in_clear", TRUE);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
178
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
179 jabber_auth_start_cyrus(account->gc->proto_data);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
180 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
181
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
182 static void jabber_auth_start_cyrus(JabberStream *js)
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
183 {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
184 const char *clientout, *mech;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
185 char *enc_out;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
186 unsigned coutlen;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
187 xmlnode *auth;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
188 sasl_security_properties_t secprops;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
189 gboolean again;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
190 gboolean plaintext = TRUE;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
191
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
192 /* Set up security properties and options */
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
193 secprops.min_ssf = 0;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
194 secprops.security_flags = SASL_SEC_NOANONYMOUS;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
195
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
196 if (!js->gsc) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
197 plaintext = gaim_account_get_bool(js->gc->account, "auth_plain_in_clear", FALSE);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
198 if (!plaintext)
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
199 secprops.security_flags |= SASL_SEC_NOPLAINTEXT;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
200 secprops.max_ssf = -1;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
201 secprops.maxbufsize = 4096;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
202 } else {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
203 plaintext = FALSE;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
204 secprops.max_ssf = 0;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
205 secprops.maxbufsize = 0;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
206 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
207 secprops.property_names = 0;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
208 secprops.property_values = 0;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
209
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
210 do {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
211 again = FALSE;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
212 /* Use the user's domain for compatibility with the old
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
213 * DIGESTMD5 code. Note that this may cause problems where
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
214 * the user's domain doesn't match the FQDN of the jabber
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
215 * service
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
216 */
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
217
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
218 js->sasl_state = sasl_client_new("xmpp", js->user->domain, NULL, NULL, js->sasl_cb, 0, &js->sasl);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
219 if (js->sasl_state==SASL_OK) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
220 sasl_setprop(js->sasl, SASL_SEC_PROPS, &secprops);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
221 js->sasl_state = sasl_client_start(js->sasl, js->sasl_mechs->str, NULL, &clientout, &coutlen, &mech);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
222 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
223 switch (js->sasl_state) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
224 /* Success */
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
225 case SASL_CONTINUE:
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
226 break;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
227 case SASL_NOMECH:
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
228 /* No mechanisms do what we want. See if we can add
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
229 * plaintext ones to the list. */
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
230
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
231 if (!gaim_account_get_password(js->gc->account)) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
232 gaim_connection_error(js->gc, _("Server couldn't authenticate you without a password"));
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
233 return;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
234 } else if (!plaintext) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
235 gaim_request_yes_no(js->gc, _("Plaintext Authentication"),
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
236 _("Plaintext Authentication"),
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
237 _("This server requires plaintext authentication over an unencrypted connection. Allow this and continue authentication?"),
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
238 2, js->gc->account,
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
239 allow_cyrus_plaintext_auth,
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
240 disallow_plaintext_auth);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
241 return;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
242 } else {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
243 gaim_connection_error(js->gc, _("Server does not use any supported authentication method"));
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
244 return;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
245 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
246 /* not reached */
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
247 break;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
248
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
249 /* Fatal errors. Give up and go home */
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
250 case SASL_BADPARAM:
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
251 case SASL_NOMEM:
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
252 break;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
253
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
254 /* For everything else, fail the mechanism and try again */
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
255 default:
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
256 if (strlen(mech)>0) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
257 char *pos;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
258 pos = strstr(js->sasl_mechs->str,mech);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
259 g_assert(pos!=NULL);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
260 g_string_erase(js->sasl_mechs, pos-js->sasl_mechs->str,strlen(mech));
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
261 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
262 sasl_dispose(&js->sasl);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
263 again=TRUE;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
264 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
265 } while (again);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
266
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
267 if (js->sasl_state == SASL_CONTINUE) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
268 auth = xmlnode_new("auth");
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
269 xmlnode_set_attrib(auth, "xmlns", "urn:ietf:params:xml:ns:xmpp-sasl");
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
270 xmlnode_set_attrib(auth,"mechanism", mech);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
271 if (clientout) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
272 if (coutlen == 0) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
273 xmlnode_insert_data(auth, "=", -1);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
274 } else {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
275 enc_out = gaim_base64_encode((unsigned char*)clientout, coutlen);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
276 xmlnode_insert_data(auth, enc_out, -1);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
277 g_free(enc_out);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
278 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
279 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
280 jabber_send(js, auth);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
281 xmlnode_free(auth);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
282 } else {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
283 gaim_connection_error(js->gc, "SASL authentication failed\n");
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
284 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
285 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
286
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
287 #endif
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
288
8296
dd6fe7d965aa [gaim-migrate @ 9020]
Nathan Walp <nwalp@pidgin.im>
parents: 8223
diff changeset
289 void
dd6fe7d965aa [gaim-migrate @ 9020]
Nathan Walp <nwalp@pidgin.im>
parents: 8223
diff changeset
290 jabber_auth_start(JabberStream *js, xmlnode *packet)
dd6fe7d965aa [gaim-migrate @ 9020]
Nathan Walp <nwalp@pidgin.im>
parents: 8223
diff changeset
291 {
12508
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
292 #ifdef HAVE_CYRUS_SASL
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
293 int id;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
294 #else
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
295 gboolean digest_md5 = FALSE, plain=FALSE;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
296 #endif
8296
dd6fe7d965aa [gaim-migrate @ 9020]
Nathan Walp <nwalp@pidgin.im>
parents: 8223
diff changeset
297
12508
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
298 xmlnode *mechs, *mechnode;
8296
dd6fe7d965aa [gaim-migrate @ 9020]
Nathan Walp <nwalp@pidgin.im>
parents: 8223
diff changeset
299
dd6fe7d965aa [gaim-migrate @ 9020]
Nathan Walp <nwalp@pidgin.im>
parents: 8223
diff changeset
300
8016
7bae464195c4 [gaim-migrate @ 8696]
Nathan Walp <nwalp@pidgin.im>
parents: 7981
diff changeset
301 if(js->registration) {
7bae464195c4 [gaim-migrate @ 8696]
Nathan Walp <nwalp@pidgin.im>
parents: 7981
diff changeset
302 jabber_register_start(js);
7bae464195c4 [gaim-migrate @ 8696]
Nathan Walp <nwalp@pidgin.im>
parents: 7981
diff changeset
303 return;
7bae464195c4 [gaim-migrate @ 8696]
Nathan Walp <nwalp@pidgin.im>
parents: 7981
diff changeset
304 }
7bae464195c4 [gaim-migrate @ 8696]
Nathan Walp <nwalp@pidgin.im>
parents: 7981
diff changeset
305
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
306 mechs = xmlnode_get_child(packet, "mechanisms");
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
307
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
308 if(!mechs) {
7981
ad5c8f01882b [gaim-migrate @ 8658]
Luke Schierer <lschiere@pidgin.im>
parents: 7813
diff changeset
309 gaim_connection_error(js->gc, _("Invalid response from server."));
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
310 return;
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
311 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
312
12508
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
313 #ifdef HAVE_CYRUS_SASL
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
314 js->sasl_mechs = g_string_new("");
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
315 #endif
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
316
8135
8f4ce853e685 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8110
diff changeset
317 for(mechnode = xmlnode_get_child(mechs, "mechanism"); mechnode;
8f4ce853e685 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8110
diff changeset
318 mechnode = xmlnode_get_next_twin(mechnode))
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
319 {
8135
8f4ce853e685 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8110
diff changeset
320 char *mech_name = xmlnode_get_data(mechnode);
12508
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
321 #ifdef HAVE_CYRUS_SASL
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
322 g_string_append(js->sasl_mechs, mech_name);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
323 g_string_append_c(js->sasl_mechs,' ');
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
324 #else
8135
8f4ce853e685 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8110
diff changeset
325 if(mech_name && !strcmp(mech_name, "DIGEST-MD5"))
8f4ce853e685 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8110
diff changeset
326 digest_md5 = TRUE;
8f4ce853e685 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8110
diff changeset
327 else if(mech_name && !strcmp(mech_name, "PLAIN"))
8f4ce853e685 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8110
diff changeset
328 plain = TRUE;
12508
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
329 #endif
8135
8f4ce853e685 [gaim-migrate @ 8840]
Nathan Walp <nwalp@pidgin.im>
parents: 8110
diff changeset
330 g_free(mech_name);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
331 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
332
12508
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
333 #ifdef HAVE_CYRUS_SASL
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
334 js->auth_type = JABBER_AUTH_CYRUS;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
335
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
336 /* Set up our callbacks structure */
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
337 js->sasl_cb = g_new0(sasl_callback_t,5);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
338
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
339 id = 0;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
340 js->sasl_cb[id].id = SASL_CB_GETREALM;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
341 js->sasl_cb[id].proc = jabber_sasl_cb_realm;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
342 js->sasl_cb[id].context = (void *)js;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
343 id++;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
344
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
345 js->sasl_cb[id].id = SASL_CB_AUTHNAME;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
346 js->sasl_cb[id].proc = jabber_sasl_cb_simple;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
347 js->sasl_cb[id].context = (void *)js;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
348 id++;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
349
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
350 js->sasl_cb[id].id = SASL_CB_USER;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
351 js->sasl_cb[id].proc = jabber_sasl_cb_simple;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
352 js->sasl_cb[id].context = (void *)js;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
353 id++;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
354
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
355 if (gaim_account_get_password(js->gc->account)) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
356 js->sasl_cb[id].id = SASL_CB_PASS;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
357 js->sasl_cb[id].proc = jabber_sasl_cb_secret;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
358 js->sasl_cb[id].context = (void *)js;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
359 id++;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
360 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
361
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
362 js->sasl_cb[id].id = SASL_CB_LIST_END;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
363
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
364 jabber_auth_start_cyrus(js);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
365 #else
7703
e0e73a26f130 [gaim-migrate @ 8348]
Nathan Walp <nwalp@pidgin.im>
parents: 7645
diff changeset
366
7645
28100686bde9 [gaim-migrate @ 8288]
Nathan Walp <nwalp@pidgin.im>
parents: 7644
diff changeset
367 if(digest_md5) {
8397
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
368 xmlnode *auth;
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
369
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
370 js->auth_type = JABBER_AUTH_DIGEST_MD5;
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
371 auth = xmlnode_new("auth");
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
372 xmlnode_set_attrib(auth, "xmlns", "urn:ietf:params:xml:ns:xmpp-sasl");
7291
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
373 xmlnode_set_attrib(auth, "mechanism", "DIGEST-MD5");
8397
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
374
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
375 jabber_send(js, auth);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
376 xmlnode_free(auth);
8086
55431e80a783 [gaim-migrate @ 8785]
Nathan Walp <nwalp@pidgin.im>
parents: 8084
diff changeset
377 } else if(plain) {
8397
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
378 js->auth_type = JABBER_AUTH_PLAIN;
7703
e0e73a26f130 [gaim-migrate @ 8348]
Nathan Walp <nwalp@pidgin.im>
parents: 7645
diff changeset
379
8086
55431e80a783 [gaim-migrate @ 8785]
Nathan Walp <nwalp@pidgin.im>
parents: 8084
diff changeset
380 if(js->gsc == NULL && !gaim_account_get_bool(js->gc->account, "auth_plain_in_clear", FALSE)) {
8397
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
381 gaim_request_yes_no(js->gc, _("Plaintext Authentication"),
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
382 _("Plaintext Authentication"),
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
383 _("This server requires plaintext authentication over an unencrypted connection. Allow this and continue authentication?"),
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
384 2, js->gc->account, allow_plaintext_auth,
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
385 disallow_plaintext_auth);
8086
55431e80a783 [gaim-migrate @ 8785]
Nathan Walp <nwalp@pidgin.im>
parents: 8084
diff changeset
386 return;
55431e80a783 [gaim-migrate @ 8785]
Nathan Walp <nwalp@pidgin.im>
parents: 8084
diff changeset
387 }
8397
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
388 finish_plaintext_authentication(js);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
389 } else {
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
390 gaim_connection_error(js->gc,
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
391 _("Server does not use any supported authentication method"));
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
392 }
12508
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
393 #endif
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
394 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
395
7395
b250288fa948 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7291
diff changeset
396 static void auth_old_result_cb(JabberStream *js, xmlnode *packet, gpointer data)
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
397 {
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
398 const char *type = xmlnode_get_attrib(packet, "type");
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
399
7730
01eb54bb41dc [gaim-migrate @ 8375]
Nathan Walp <nwalp@pidgin.im>
parents: 7704
diff changeset
400 if(type && !strcmp(type, "result")) {
01eb54bb41dc [gaim-migrate @ 8375]
Nathan Walp <nwalp@pidgin.im>
parents: 7704
diff changeset
401 jabber_stream_set_state(js, JABBER_STREAM_CONNECTED);
01eb54bb41dc [gaim-migrate @ 8375]
Nathan Walp <nwalp@pidgin.im>
parents: 7704
diff changeset
402 } else {
8401
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
403 char *msg = jabber_parse_error(js, packet);
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
404 xmlnode *error;
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
405 const char *err_code;
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
406
8401
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
407 if((error = xmlnode_get_child(packet, "error")) &&
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
408 (err_code = xmlnode_get_attrib(error, "code")) &&
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
409 !strcmp(err_code, "401")) {
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
410 js->gc->wants_to_die = TRUE;
7730
01eb54bb41dc [gaim-migrate @ 8375]
Nathan Walp <nwalp@pidgin.im>
parents: 7704
diff changeset
411 }
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
412
8401
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
413 gaim_connection_error(js->gc, msg);
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
414 g_free(msg);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
415 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
416 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
417
7395
b250288fa948 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7291
diff changeset
418 static void auth_old_cb(JabberStream *js, xmlnode *packet, gpointer data)
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
419 {
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
420 JabberIq *iq;
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
421 xmlnode *query, *x;
7514
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
422 const char *type = xmlnode_get_attrib(packet, "type");
10740
94cc67130789 [gaim-migrate @ 12342]
Mark Doliner <mark@kingant.net>
parents: 10687
diff changeset
423 const char *pw = gaim_connection_get_password(js->gc);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
424
7514
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
425 if(!type) {
7981
ad5c8f01882b [gaim-migrate @ 8658]
Luke Schierer <lschiere@pidgin.im>
parents: 7813
diff changeset
426 gaim_connection_error(js->gc, _("Invalid response from server."));
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
427 return;
7515
6cd392e0d6ea [gaim-migrate @ 8128]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
428 } else if(!strcmp(type, "error")) {
8401
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
429 char *msg = jabber_parse_error(js, packet);
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
430 gaim_connection_error(js->gc, msg);
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
431 g_free(msg);
7515
6cd392e0d6ea [gaim-migrate @ 8128]
Nathan Walp <nwalp@pidgin.im>
parents: 7514
diff changeset
432 } else if(!strcmp(type, "result")) {
7514
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
433 query = xmlnode_get_child(packet, "query");
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
434 if(js->stream_id && xmlnode_get_child(query, "digest")) {
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
435 unsigned char hashval[20];
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
436 char *s, h[41], *p;
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
437 int i;
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
438
8397
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
439 iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:auth");
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
440 query = xmlnode_get_child(iq->node, "query");
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
441 x = xmlnode_new_child(query, "username");
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
442 xmlnode_insert_data(x, js->user->node, -1);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
443 x = xmlnode_new_child(query, "resource");
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
444 xmlnode_insert_data(x, js->user->resource, -1);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
445
7514
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
446 x = xmlnode_new_child(query, "digest");
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
447 s = g_strdup_printf("%s%s", js->stream_id, pw);
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10496
diff changeset
448
11183
8dca96cbcd64 [gaim-migrate @ 13295]
Mark Doliner <mark@kingant.net>
parents: 11163
diff changeset
449 gaim_cipher_digest_region("sha1", (guchar *)s, strlen(s),
10687
b256ce6b85b8 [gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents: 10684
diff changeset
450 sizeof(hashval), hashval, NULL);
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10496
diff changeset
451
7514
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
452 p = h;
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
453 for(i=0; i<20; i++, p+=2)
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
454 snprintf(p, 3, "%02x", hashval[i]);
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
455 xmlnode_insert_data(x, h, -1);
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
456 g_free(s);
8397
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
457 jabber_iq_set_callback(iq, auth_old_result_cb, NULL);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
458 jabber_iq_send(iq);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
459
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
460 } else if(xmlnode_get_child(query, "password")) {
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
461 if(js->gsc == NULL && !gaim_account_get_bool(js->gc->account,
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
462 "auth_plain_in_clear", FALSE)) {
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
463 gaim_request_yes_no(js->gc, _("Plaintext Authentication"),
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
464 _("Plaintext Authentication"),
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
465 _("This server requires plaintext authentication over an unencrypted connection. Allow this and continue authentication?"),
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
466 2, js->gc->account, allow_plaintext_auth,
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
467 disallow_plaintext_auth);
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
468 return;
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
469 }
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
470 finish_plaintext_authentication(js);
7514
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
471 } else {
8397
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
472 gaim_connection_error(js->gc,
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
473 _("Server does not use any supported authentication method"));
b63debdf5a92 [gaim-migrate @ 9126]
Nathan Walp <nwalp@pidgin.im>
parents: 8296
diff changeset
474 return;
7514
43a214a385d1 [gaim-migrate @ 8127]
Nathan Walp <nwalp@pidgin.im>
parents: 7425
diff changeset
475 }
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
476 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
477 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
478
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
479 void jabber_auth_start_old(JabberStream *js)
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
480 {
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
481 JabberIq *iq;
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
482 xmlnode *query, *username;
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
483
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
484 iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:auth");
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
485
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
486 query = xmlnode_get_child(iq->node, "query");
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
487 username = xmlnode_new_child(query, "username");
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
488 xmlnode_insert_data(username, js->user->node, -1);
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
489
7395
b250288fa948 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7291
diff changeset
490 jabber_iq_set_callback(iq, auth_old_cb, NULL);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
491
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
492 jabber_iq_send(iq);
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
493 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
494
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
495 static GHashTable* parse_challenge(const char *challenge)
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
496 {
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
497 GHashTable *ret = g_hash_table_new_full(g_str_hash, g_str_equal,
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
498 g_free, g_free);
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
499 char **pairs;
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
500 int i;
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
501
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
502 pairs = g_strsplit(challenge, ",", -1);
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
503
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
504 for(i=0; pairs[i]; i++) {
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
505 char **keyval = g_strsplit(pairs[i], "=", 2);
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
506 if(keyval[0] && keyval[1]) {
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
507 if(keyval[1][0] == '"' && keyval[1][strlen(keyval[1])-1] == '"')
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
508 g_hash_table_replace(ret, g_strdup(keyval[0]), g_strndup(keyval[1]+1, strlen(keyval[1])-2));
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
509 else
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
510 g_hash_table_replace(ret, g_strdup(keyval[0]), g_strdup(keyval[1]));
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
511 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
512 g_strfreev(keyval);
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
513 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
514
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
515 g_strfreev(pairs);
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
516
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
517 return ret;
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
518 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
519
11163
4cf257598691 [gaim-migrate @ 13264]
Mark Doliner <mark@kingant.net>
parents: 11137
diff changeset
520 static char *
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
521 generate_response_value(JabberID *jid, const char *passwd, const char *nonce,
7267
109817b028a6 [gaim-migrate @ 7844]
Nathan Walp <nwalp@pidgin.im>
parents: 7255
diff changeset
522 const char *cnonce, const char *a2, const char *realm)
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
523 {
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10496
diff changeset
524 GaimCipher *cipher;
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10496
diff changeset
525 GaimCipherContext *context;
11137
096020ae09a9 [gaim-migrate @ 13201]
Mark Doliner <mark@kingant.net>
parents: 11127
diff changeset
526 guchar result[16];
10136
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
527 size_t a1len;
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
528
11163
4cf257598691 [gaim-migrate @ 13264]
Mark Doliner <mark@kingant.net>
parents: 11137
diff changeset
529 gchar *a1, *convnode, *convpasswd, *ha1, *ha2, *kd, *x, *z;
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
530
10136
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
531 if((convnode = g_convert(jid->node, strlen(jid->node), "iso-8859-1", "utf-8",
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
532 NULL, NULL, NULL)) == NULL) {
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
533 convnode = g_strdup(jid->node);
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
534 }
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
535 if((convpasswd = g_convert(passwd, strlen(passwd), "iso-8859-1", "utf-8",
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
536 NULL, NULL, NULL)) == NULL) {
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
537 convpasswd = g_strdup(passwd);
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
538 }
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
539
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10496
diff changeset
540 cipher = gaim_ciphers_find_cipher("md5");
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10496
diff changeset
541 context = gaim_cipher_context_new(cipher, NULL);
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10496
diff changeset
542
10136
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
543 x = g_strdup_printf("%s:%s:%s", convnode, realm, convpasswd);
11183
8dca96cbcd64 [gaim-migrate @ 13295]
Mark Doliner <mark@kingant.net>
parents: 11163
diff changeset
544 gaim_cipher_context_append(context, (const guchar *)x, strlen(x));
10687
b256ce6b85b8 [gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents: 10684
diff changeset
545 gaim_cipher_context_digest(context, sizeof(result), result, NULL);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
546
10136
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
547 a1 = g_strdup_printf("xxxxxxxxxxxxxxxx:%s:%s", nonce, cnonce);
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
548 a1len = strlen(a1);
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
549 g_memmove(a1, result, 16);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
550
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10496
diff changeset
551 gaim_cipher_context_reset(context, NULL);
11183
8dca96cbcd64 [gaim-migrate @ 13295]
Mark Doliner <mark@kingant.net>
parents: 11163
diff changeset
552 gaim_cipher_context_append(context, (const guchar *)a1, a1len);
10687
b256ce6b85b8 [gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents: 10684
diff changeset
553 gaim_cipher_context_digest(context, sizeof(result), result, NULL);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
554
7106
db6bd3e794d8 [gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents: 7014
diff changeset
555 ha1 = gaim_base16_encode(result, 16);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
556
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10496
diff changeset
557 gaim_cipher_context_reset(context, NULL);
11183
8dca96cbcd64 [gaim-migrate @ 13295]
Mark Doliner <mark@kingant.net>
parents: 11163
diff changeset
558 gaim_cipher_context_append(context, (const guchar *)a2, strlen(a2));
10687
b256ce6b85b8 [gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents: 10684
diff changeset
559 gaim_cipher_context_digest(context, sizeof(result), result, NULL);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
560
7106
db6bd3e794d8 [gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents: 7014
diff changeset
561 ha2 = gaim_base16_encode(result, 16);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
562
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
563 kd = g_strdup_printf("%s:%s:00000001:%s:auth:%s", ha1, nonce, cnonce, ha2);
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
564
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10496
diff changeset
565 gaim_cipher_context_reset(context, NULL);
11183
8dca96cbcd64 [gaim-migrate @ 13295]
Mark Doliner <mark@kingant.net>
parents: 11163
diff changeset
566 gaim_cipher_context_append(context, (const guchar *)kd, strlen(kd));
10687
b256ce6b85b8 [gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents: 10684
diff changeset
567 gaim_cipher_context_digest(context, sizeof(result), result, NULL);
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10496
diff changeset
568 gaim_cipher_context_destroy(context);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
569
7106
db6bd3e794d8 [gaim-migrate @ 7671]
Christian Hammond <chipx86@chipx86.com>
parents: 7014
diff changeset
570 z = gaim_base16_encode(result, 16);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
571
10136
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
572 g_free(convnode);
a5bd6d78717d [gaim-migrate @ 11204]
Nathan Walp <nwalp@pidgin.im>
parents: 8401
diff changeset
573 g_free(convpasswd);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
574 g_free(x);
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
575 g_free(a1);
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
576 g_free(ha1);
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
577 g_free(ha2);
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
578 g_free(kd);
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
579
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
580 return z;
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
581 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
582
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
583 void
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
584 jabber_auth_handle_challenge(JabberStream *js, xmlnode *packet)
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
585 {
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
586
7703
e0e73a26f130 [gaim-migrate @ 8348]
Nathan Walp <nwalp@pidgin.im>
parents: 7645
diff changeset
587 if(js->auth_type == JABBER_AUTH_DIGEST_MD5) {
7291
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
588 char *enc_in = xmlnode_get_data(packet);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
589 char *dec_in;
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
590 char *enc_out;
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
591 GHashTable *parts;
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
592
7395
b250288fa948 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7291
diff changeset
593 if(!enc_in) {
7981
ad5c8f01882b [gaim-migrate @ 8658]
Luke Schierer <lschiere@pidgin.im>
parents: 7813
diff changeset
594 gaim_connection_error(js->gc, _("Invalid response from server."));
7395
b250288fa948 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7291
diff changeset
595 return;
b250288fa948 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7291
diff changeset
596 }
b250288fa948 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7291
diff changeset
597
11127
719779387f96 [gaim-migrate @ 13183]
Mark Doliner <mark@kingant.net>
parents: 10740
diff changeset
598 dec_in = (char *)gaim_base64_decode(enc_in, NULL);
7395
b250288fa948 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7291
diff changeset
599 gaim_debug(GAIM_DEBUG_MISC, "jabber", "decoded challenge (%d): %s\n",
b250288fa948 [gaim-migrate @ 7990]
Nathan Walp <nwalp@pidgin.im>
parents: 7291
diff changeset
600 strlen(dec_in), dec_in);
7291
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
601
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
602 parts = parse_challenge(dec_in);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
603
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
604
7291
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
605 if (g_hash_table_lookup(parts, "rspauth")) {
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
606 char *rspauth = g_hash_table_lookup(parts, "rspauth");
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
607
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
608
7291
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
609 if(rspauth && js->expected_rspauth &&
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
610 !strcmp(rspauth, js->expected_rspauth)) {
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
611 jabber_send_raw(js,
7642
9008b5be4275 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7630
diff changeset
612 "<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl' />",
9008b5be4275 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7630
diff changeset
613 -1);
7291
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
614 } else {
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
615 gaim_connection_error(js->gc, _("Invalid challenge from server"));
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
616 }
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
617 g_free(js->expected_rspauth);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
618 } else {
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
619 /* assemble a response, and send it */
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
620 /* see RFC 2831 */
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
621 GString *response = g_string_new("");
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
622 char *a2;
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
623 char *auth_resp;
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
624 char *buf;
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
625 char *cnonce;
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
626 char *realm;
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
627 char *nonce;
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
628
7291
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
629 /* we're actually supposed to prompt the user for a realm if
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
630 * the server doesn't send one, but that really complicates things,
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
631 * so i'm not gonna worry about it until is poses a problem to
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
632 * someone, or I get really bored */
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
633 realm = g_hash_table_lookup(parts, "realm");
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
634 if(!realm)
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
635 realm = js->user->domain;
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
636
7291
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
637 cnonce = g_strdup_printf("%x%u%x", g_random_int(), (int)time(NULL),
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
638 g_random_int());
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
639 nonce = g_hash_table_lookup(parts, "nonce");
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
640
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
641
7291
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
642 a2 = g_strdup_printf("AUTHENTICATE:xmpp/%s", realm);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
643 auth_resp = generate_response_value(js->user,
10740
94cc67130789 [gaim-migrate @ 12342]
Mark Doliner <mark@kingant.net>
parents: 10687
diff changeset
644 gaim_connection_get_password(js->gc), nonce, cnonce, a2, realm);
7291
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
645 g_free(a2);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
646
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
647 a2 = g_strdup_printf(":xmpp/%s", realm);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
648 js->expected_rspauth = generate_response_value(js->user,
10740
94cc67130789 [gaim-migrate @ 12342]
Mark Doliner <mark@kingant.net>
parents: 10687
diff changeset
649 gaim_connection_get_password(js->gc), nonce, cnonce, a2, realm);
7291
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
650 g_free(a2);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
651
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
652
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
653 g_string_append_printf(response, "username=\"%s\"", js->user->node);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
654 g_string_append_printf(response, ",realm=\"%s\"", realm);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
655 g_string_append_printf(response, ",nonce=\"%s\"", nonce);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
656 g_string_append_printf(response, ",cnonce=\"%s\"", cnonce);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
657 g_string_append_printf(response, ",nc=00000001");
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
658 g_string_append_printf(response, ",qop=auth");
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
659 g_string_append_printf(response, ",digest-uri=\"xmpp/%s\"", realm);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
660 g_string_append_printf(response, ",response=%s", auth_resp);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
661 g_string_append_printf(response, ",charset=utf-8");
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
662
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
663 g_free(auth_resp);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
664 g_free(cnonce);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
665
11137
096020ae09a9 [gaim-migrate @ 13201]
Mark Doliner <mark@kingant.net>
parents: 11127
diff changeset
666 enc_out = gaim_base64_encode((guchar *)response->str, response->len);
7291
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
667
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
668 gaim_debug(GAIM_DEBUG_MISC, "jabber", "decoded response (%d): %s\n", response->len, response->str);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
669
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
670 buf = g_strdup_printf("<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>%s</response>", enc_out);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
671
7642
9008b5be4275 [gaim-migrate @ 8285]
Nathan Walp <nwalp@pidgin.im>
parents: 7630
diff changeset
672 jabber_send_raw(js, buf, -1);
7291
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
673
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
674 g_free(buf);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
675
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
676 g_free(enc_out);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
677
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
678 g_string_free(response, TRUE);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
679 }
7291
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
680
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
681 g_free(enc_in);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
682 g_free(dec_in);
632cee95cc5c [gaim-migrate @ 7872]
Nathan Walp <nwalp@pidgin.im>
parents: 7267
diff changeset
683 g_hash_table_destroy(parts);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
684 }
12508
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
685 #ifdef HAVE_CYRUS_SASL
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
686 else if (js->auth_type == JABBER_AUTH_CYRUS) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
687 char *enc_in = xmlnode_get_data(packet);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
688 unsigned char *dec_in;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
689 char *enc_out;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
690 const char *c_out;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
691 unsigned int clen,declen;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
692 xmlnode *response;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
693
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
694 dec_in = gaim_base64_decode(enc_in, &declen);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
695
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
696 js->sasl_state = sasl_client_step(js->sasl, (char*)dec_in, declen,
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
697 NULL, &c_out, &clen);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
698 g_free(dec_in);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
699 if (js->sasl_state != SASL_CONTINUE && js->sasl_state != SASL_OK) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
700 gaim_debug_error("jabber", "Error is %d : %s\n",js->sasl_state,sasl_errdetail(js->sasl));
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
701 gaim_connection_error(js->gc, _("SASL error"));
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
702 return;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
703 } else {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
704 response = xmlnode_new("response");
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
705 xmlnode_set_attrib(response, "xmlns", "urn:ietf:params:xml:ns:xmpp-sasl");
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
706 if (c_out) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
707 enc_out = gaim_base64_encode((unsigned char*)c_out, clen);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
708 xmlnode_insert_data(response, enc_out, -1);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
709 g_free(enc_out);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
710 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
711 jabber_send(js, response);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
712 xmlnode_free(response);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
713 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
714 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
715 #endif
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
716 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
717
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
718 void jabber_auth_handle_success(JabberStream *js, xmlnode *packet)
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
719 {
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
720 const char *ns = xmlnode_get_attrib(packet, "xmlns");
12508
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
721 #ifdef HAVE_CYRUS_SASL
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
722 int *x;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
723 #endif
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
724
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
725 if(!ns || strcmp(ns, "urn:ietf:params:xml:ns:xmpp-sasl")) {
7981
ad5c8f01882b [gaim-migrate @ 8658]
Luke Schierer <lschiere@pidgin.im>
parents: 7813
diff changeset
726 gaim_connection_error(js->gc, _("Invalid response from server."));
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
727 return;
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
728 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
729
12508
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
730 #if HAVE_CYRUS_SASL
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
731 /* The SASL docs say that if the client hasn't returned OK yet, we
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
732 * should try one more round against it
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
733 */
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
734 if (js->sasl_state != SASL_OK) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
735 js->sasl_state = sasl_client_step(js->sasl, NULL, 0, NULL, NULL, NULL);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
736 if (js->sasl_state != SASL_OK) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
737 /* This should never happen! */
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
738 gaim_connection_error(js->gc, _("Invalid response from server."));
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
739 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
740 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
741 /* If we've negotiated a security layer, we need to enable it */
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
742 sasl_getprop(js->sasl, SASL_SSF, (const void **)&x);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
743 if (*x>0) {
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
744 sasl_getprop(js->sasl, SASL_MAXOUTBUF, (const void **)&x);
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
745 js->sasl_maxbuf = *x;
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
746 }
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
747 #endif
5cfc53ead482 [gaim-migrate @ 14820]
Nathan Walp <nwalp@pidgin.im>
parents: 11183
diff changeset
748
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
749 jabber_stream_set_state(js, JABBER_STREAM_REINITIALIZING);
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
750 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
751
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
752 void jabber_auth_handle_failure(JabberStream *js, xmlnode *packet)
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
753 {
8401
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
754 char *msg = jabber_parse_error(js, packet);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
755
8401
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
756 if(!msg) {
7981
ad5c8f01882b [gaim-migrate @ 8658]
Luke Schierer <lschiere@pidgin.im>
parents: 7813
diff changeset
757 gaim_connection_error(js->gc, _("Invalid response from server."));
8401
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
758 } else {
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
759 gaim_connection_error(js->gc, msg);
c13a4913a071 [gaim-migrate @ 9130]
Nathan Walp <nwalp@pidgin.im>
parents: 8397
diff changeset
760 g_free(msg);
7014
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
761 }
67c4e9d39242 [gaim-migrate @ 7577]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
762 }