Sun, 18 Apr 2010 20:12:32 +0000
jabber: --more leaks
| 7014 | 1 | /* |
| 15884 | 2 | * purple - Jabber Protocol Plugin |
| 7014 | 3 | * |
|
28322
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
27635
diff
changeset
|
4 | * Purple is the legal property of its developers, whose names are too numerous |
|
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
27635
diff
changeset
|
5 | * to list here. Please refer to the COPYRIGHT file distributed with this |
|
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
27635
diff
changeset
|
6 | * source distribution. |
| 7014 | 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | |
| 9 | * it under the terms of the GNU General Public License as published by | |
| 10 | * the Free Software Foundation; either version 2 of the License, or | |
| 11 | * (at your option) any later version. | |
| 12 | * | |
| 13 | * This program is distributed in the hope that it will be useful, | |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 | * GNU General Public License for more details. | |
| 17 | * | |
| 18 | * You should have received a copy of the GNU General Public License | |
| 19 | * along with this program; if not, write to the Free Software | |
|
19859
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
19852
diff
changeset
|
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
| 7014 | 21 | * |
| 22 | */ | |
| 23 | #include "internal.h" | |
| 24 | ||
|
15952
c087855dc551
Re-arrange #includes so 'make check' stands a chance of passing during
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
25 | #include "account.h" |
|
c087855dc551
Re-arrange #includes so 'make check' stands a chance of passing during
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
26 | #include "debug.h" |
|
c087855dc551
Re-arrange #includes so 'make check' stands a chance of passing during
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
27 | #include "cipher.h" |
|
20093
04f3c1dcd2cf
applied changes from 5fda75104115d0a95c1e214b6b3ca18c4dc86a0c
Richard Laager <rlaager@pidgin.im>
parents:
19993
diff
changeset
|
28 | #include "core.h" |
|
15952
c087855dc551
Re-arrange #includes so 'make check' stands a chance of passing during
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
29 | #include "conversation.h" |
|
c087855dc551
Re-arrange #includes so 'make check' stands a chance of passing during
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
30 | #include "request.h" |
|
c087855dc551
Re-arrange #includes so 'make check' stands a chance of passing during
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
31 | #include "sslconn.h" |
|
c087855dc551
Re-arrange #includes so 'make check' stands a chance of passing during
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
32 | #include "util.h" |
|
c087855dc551
Re-arrange #includes so 'make check' stands a chance of passing during
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
33 | #include "xmlnode.h" |
|
c087855dc551
Re-arrange #includes so 'make check' stands a chance of passing during
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
34 | |
|
26671
3970019332c8
Make the last one compile (add disco.h) and alphabetize.
Paul Aurich <darkrain42@pidgin.im>
parents:
26669
diff
changeset
|
35 | #include "auth.h" |
|
3970019332c8
Make the last one compile (add disco.h) and alphabetize.
Paul Aurich <darkrain42@pidgin.im>
parents:
26669
diff
changeset
|
36 | #include "disco.h" |
|
3970019332c8
Make the last one compile (add disco.h) and alphabetize.
Paul Aurich <darkrain42@pidgin.im>
parents:
26669
diff
changeset
|
37 | #include "jabber.h" |
| 7014 | 38 | #include "jutil.h" |
| 39 | #include "iq.h" | |
|
16180
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
40 | #include "notify.h" |
| 7014 | 41 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
42 | static GSList *auth_mechs = NULL; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
43 | |
|
26687
1e799151fabe
Convert all the XMPP IQ callbacks to a typedef similar to the IQ Handlers.
Paul Aurich <darkrain42@pidgin.im>
parents:
26042
diff
changeset
|
44 | static void auth_old_result_cb(JabberStream *js, const char *from, |
|
1e799151fabe
Convert all the XMPP IQ callbacks to a typedef similar to the IQ Handlers.
Paul Aurich <darkrain42@pidgin.im>
parents:
26042
diff
changeset
|
45 | JabberIqType type, const char *id, |
|
1e799151fabe
Convert all the XMPP IQ callbacks to a typedef similar to the IQ Handlers.
Paul Aurich <darkrain42@pidgin.im>
parents:
26042
diff
changeset
|
46 | xmlnode *packet, gpointer data); |
| 7014 | 47 | |
| 8296 | 48 | gboolean |
| 49 | jabber_process_starttls(JabberStream *js, xmlnode *packet) | |
| 7014 | 50 | { |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
51 | PurpleAccount *account; |
| 7014 | 52 | xmlnode *starttls; |
| 53 | ||
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
54 | account = purple_connection_get_account(js->gc); |
|
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
55 | |
| 7157 | 56 | if((starttls = xmlnode_get_child(packet, "starttls"))) { |
| 15884 | 57 | if(purple_ssl_is_supported()) { |
| 7157 | 58 | jabber_send_raw(js, |
| 7642 | 59 | "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>", -1); |
| 8296 | 60 | return TRUE; |
| 7157 | 61 | } else if(xmlnode_get_child(starttls, "required")) { |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27633
diff
changeset
|
62 | purple_connection_error_reason(js->gc, |
| 21279 | 63 | PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, |
|
27632
0da289638ff4
Change strings in libpurple/protocols/jabber/auth.c and util.c a little bit
Mark Doliner <markdoliner@pidgin.im>
parents:
27379
diff
changeset
|
64 | _("Server requires TLS/SSL, but no TLS/SSL support was found.")); |
| 8296 | 65 | return TRUE; |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
66 | } else if(purple_account_get_bool(account, "require_tls", JABBER_DEFAULT_REQUIRE_TLS)) { |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27633
diff
changeset
|
67 | purple_connection_error_reason(js->gc, |
|
22948
431888a82777
When an XMPP account is set to require TLS, but libpurple doesn't have SSL
Daniel Atallah <datallah@pidgin.im>
parents:
22815
diff
changeset
|
68 | PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, |
|
27632
0da289638ff4
Change strings in libpurple/protocols/jabber/auth.c and util.c a little bit
Mark Doliner <markdoliner@pidgin.im>
parents:
27379
diff
changeset
|
69 | _("You require encryption, but no TLS/SSL support was found.")); |
|
22948
431888a82777
When an XMPP account is set to require TLS, but libpurple doesn't have SSL
Daniel Atallah <datallah@pidgin.im>
parents:
22815
diff
changeset
|
70 | return TRUE; |
| 7157 | 71 | } |
| 7014 | 72 | } |
| 73 | ||
| 8296 | 74 | return FALSE; |
| 75 | } | |
| 76 | ||
| 8397 | 77 | static void finish_plaintext_authentication(JabberStream *js) |
| 78 | { | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
79 | JabberIq *iq; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
80 | xmlnode *query, *x; |
| 8397 | 81 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
82 | iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:auth"); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
83 | query = xmlnode_get_child(iq->node, "query"); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
84 | x = xmlnode_new_child(query, "username"); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
85 | xmlnode_insert_data(x, js->user->node, -1); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
86 | x = xmlnode_new_child(query, "resource"); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
87 | xmlnode_insert_data(x, js->user->resource, -1); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
88 | x = xmlnode_new_child(query, "password"); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
89 | xmlnode_insert_data(x, purple_connection_get_password(js->gc), -1); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
90 | jabber_iq_set_callback(iq, auth_old_result_cb, NULL); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
91 | jabber_iq_send(iq); |
| 8397 | 92 | } |
| 93 | ||
| 15884 | 94 | static void allow_plaintext_auth(PurpleAccount *account) |
| 8397 | 95 | { |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
96 | PurpleConnection *gc; |
|
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
97 | JabberStream *js; |
|
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
98 | |
| 15884 | 99 | purple_account_set_bool(account, "auth_plain_in_clear", TRUE); |
| 8397 | 100 | |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
101 | gc = purple_account_get_connection(account); |
|
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
102 | js = purple_connection_get_protocol_data(gc); |
|
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
103 | |
|
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
104 | finish_plaintext_authentication(js); |
| 8397 | 105 | } |
| 106 | ||
| 15884 | 107 | static void disallow_plaintext_auth(PurpleAccount *account) |
| 8397 | 108 | { |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
109 | purple_connection_error_reason(purple_account_get_connection(account), |
| 21279 | 110 | PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, |
|
20445
c900767c024b
Use PurpleDisconnectReasons in prpl-jabber.
Will Thompson <resiak@pidgin.im>
parents:
19993
diff
changeset
|
111 | _("Server requires plaintext authentication over an unencrypted stream")); |
| 8397 | 112 | } |
| 113 | ||
|
29008
1f288722b5cd
jabber: Use NS_XMPP_SASL
Paul Aurich <darkrain42@pidgin.im>
parents:
28866
diff
changeset
|
114 | #ifdef HAVE_CYRUS_SASL |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
115 | static void |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
116 | auth_old_pass_cb(PurpleConnection *gc, PurpleRequestFields *fields) |
| 12508 | 117 | { |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
118 | PurpleAccount *account; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
119 | JabberStream *js; |
|
16180
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
120 | const char *entry; |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
121 | gboolean remember; |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
122 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
123 | /* The password prompt dialog doesn't get disposed if the account disconnects */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
124 | if (!PURPLE_CONNECTION_IS_VALID(gc)) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
125 | return; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
126 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
127 | account = purple_connection_get_account(gc); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
128 | js = purple_connection_get_protocol_data(gc); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
129 | |
|
16180
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
130 | entry = purple_request_fields_get_string(fields, "password"); |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
131 | remember = purple_request_fields_get_bool(fields, "remember"); |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
132 | |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
133 | if (!entry || !*entry) |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
134 | { |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
135 | purple_notify_error(account, NULL, _("Password is required to sign on."), NULL); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
136 | return; |
|
16180
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
137 | } |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
138 | |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
139 | if (remember) |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
140 | purple_account_set_remember_password(account, TRUE); |
|
16180
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
141 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
142 | purple_account_set_password(account, entry); |
|
20093
04f3c1dcd2cf
applied changes from 5fda75104115d0a95c1e214b6b3ca18c4dc86a0c
Richard Laager <rlaager@pidgin.im>
parents:
19993
diff
changeset
|
143 | |
|
16180
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
144 | /* Restart our connection */ |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
145 | jabber_auth_start_old(js); |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
146 | } |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
147 | |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
148 | static void |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
149 | auth_no_pass_cb(PurpleConnection *gc, PurpleRequestFields *fields) |
|
16180
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
150 | { |
|
19852
4810415cdcfb
The cyrus SASL password prompt dialogs don't get disposed if the account disconnects. This fixes the callbacks not to assume that the connection is still valid.
Daniel Atallah <datallah@pidgin.im>
parents:
19337
diff
changeset
|
151 | /* The password prompt dialog doesn't get disposed if the account disconnects */ |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
152 | if (!PURPLE_CONNECTION_IS_VALID(gc)) |
|
19852
4810415cdcfb
The cyrus SASL password prompt dialogs don't get disposed if the account disconnects. This fixes the callbacks not to assume that the connection is still valid.
Daniel Atallah <datallah@pidgin.im>
parents:
19337
diff
changeset
|
153 | return; |
|
4810415cdcfb
The cyrus SASL password prompt dialogs don't get disposed if the account disconnects. This fixes the callbacks not to assume that the connection is still valid.
Daniel Atallah <datallah@pidgin.im>
parents:
19337
diff
changeset
|
154 | |
|
20093
04f3c1dcd2cf
applied changes from 5fda75104115d0a95c1e214b6b3ca18c4dc86a0c
Richard Laager <rlaager@pidgin.im>
parents:
19993
diff
changeset
|
155 | /* Disable the account as the user has canceled connecting */ |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
156 | purple_account_set_enabled(purple_connection_get_account(gc), purple_core_get_ui(), FALSE); |
|
16180
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
157 | } |
|
29008
1f288722b5cd
jabber: Use NS_XMPP_SASL
Paul Aurich <darkrain42@pidgin.im>
parents:
28866
diff
changeset
|
158 | #endif |
|
16180
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
159 | |
| 8296 | 160 | void |
| 161 | jabber_auth_start(JabberStream *js, xmlnode *packet) | |
| 162 | { | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
163 | GSList *mechanisms = NULL; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
164 | GSList *l; |
|
29084
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
165 | xmlnode *response = NULL; |
| 12508 | 166 | xmlnode *mechs, *mechnode; |
|
29084
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
167 | JabberSaslState state; |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29084
diff
changeset
|
168 | char *msg = NULL; |
| 8296 | 169 | |
| 8016 | 170 | if(js->registration) { |
| 171 | jabber_register_start(js); | |
| 172 | return; | |
| 173 | } | |
| 174 | ||
| 7014 | 175 | mechs = xmlnode_get_child(packet, "mechanisms"); |
| 176 | if(!mechs) { | |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27633
diff
changeset
|
177 | purple_connection_error_reason(js->gc, |
| 21279 | 178 | PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27633
diff
changeset
|
179 | _("Invalid response from server")); |
| 7014 | 180 | return; |
| 181 | } | |
| 182 | ||
| 8135 | 183 | for(mechnode = xmlnode_get_child(mechs, "mechanism"); mechnode; |
| 184 | mechnode = xmlnode_get_next_twin(mechnode)) | |
| 7014 | 185 | { |
| 8135 | 186 | char *mech_name = xmlnode_get_data(mechnode); |
|
23242
141db4dc5978
Skip the X-GOOGLE-TOKEN mech (given us by Google Talk when connecting with
Evan Schoenberg <evands@pidgin.im>
parents:
22967
diff
changeset
|
187 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
188 | if (mech_name && *mech_name) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
189 | mechanisms = g_slist_prepend(mechanisms, mech_name); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
190 | else if (mech_name) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
191 | g_free(mech_name); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
192 | |
| 7014 | 193 | } |
| 194 | ||
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
195 | for (l = auth_mechs; l; l = l->next) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
196 | JabberSaslMech *possible = l->data; |
| 7703 | 197 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
198 | /* Is this the Cyrus SASL mechanism? */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
199 | if (g_str_equal(possible->name, "*")) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
200 | js->auth_mech = possible; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
201 | break; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
202 | } |
| 8397 | 203 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
204 | /* Can we find this mechanism in the server's list? */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
205 | if (g_slist_find_custom(mechanisms, possible->name, (GCompareFunc)strcmp)) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
206 | js->auth_mech = possible; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
207 | break; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
208 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
209 | } |
| 7703 | 210 | |
| 30036 | 211 | while (mechanisms) { |
| 212 | g_free(mechanisms->data); | |
| 213 | mechanisms = g_slist_delete_link(mechanisms, mechanisms); | |
| 214 | } | |
| 215 | ||
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
216 | if (js->auth_mech == NULL) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
217 | /* Found no good mechanisms... */ |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27633
diff
changeset
|
218 | purple_connection_error_reason(js->gc, |
| 21279 | 219 | PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, |
| 7014 | 220 | _("Server does not use any supported authentication method")); |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
221 | return; |
| 7014 | 222 | } |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
223 | |
|
29084
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
224 | state = js->auth_mech->start(js, mechs, &response, &msg); |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
225 | if (state == JABBER_SASL_STATE_FAIL) { |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
226 | purple_connection_error_reason(js->gc, |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
227 | PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
228 | msg ? msg : _("Unknown Error")); |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
229 | } else if (response) { |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
230 | jabber_send(js, response); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
231 | xmlnode_free(response); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
232 | } |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29084
diff
changeset
|
233 | |
|
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29084
diff
changeset
|
234 | g_free(msg); |
| 7014 | 235 | } |
| 236 | ||
|
26687
1e799151fabe
Convert all the XMPP IQ callbacks to a typedef similar to the IQ Handlers.
Paul Aurich <darkrain42@pidgin.im>
parents:
26042
diff
changeset
|
237 | static void auth_old_result_cb(JabberStream *js, const char *from, |
|
1e799151fabe
Convert all the XMPP IQ callbacks to a typedef similar to the IQ Handlers.
Paul Aurich <darkrain42@pidgin.im>
parents:
26042
diff
changeset
|
238 | JabberIqType type, const char *id, |
|
1e799151fabe
Convert all the XMPP IQ callbacks to a typedef similar to the IQ Handlers.
Paul Aurich <darkrain42@pidgin.im>
parents:
26042
diff
changeset
|
239 | xmlnode *packet, gpointer data) |
| 7014 | 240 | { |
|
26687
1e799151fabe
Convert all the XMPP IQ callbacks to a typedef similar to the IQ Handlers.
Paul Aurich <darkrain42@pidgin.im>
parents:
26042
diff
changeset
|
241 | if (type == JABBER_IQ_RESULT) { |
|
28379
df144a809a92
jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
242 | jabber_stream_set_state(js, JABBER_STREAM_POST_AUTH); |
|
26669
eabe41a84e13
Fix login process for older servers using IQ-auth.
Paul Aurich <darkrain42@pidgin.im>
parents:
26533
diff
changeset
|
243 | jabber_disco_items_server(js); |
| 7730 | 244 | } else { |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
245 | PurpleAccount *account; |
| 21279 | 246 | PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; |
|
21150
bedd1215fb5e
Stop jabber setting wants_to_die itself. This involved plumbing disconnection
Will Thompson <resiak@pidgin.im>
parents:
20882
diff
changeset
|
247 | char *msg = jabber_parse_error(js, packet, &reason); |
| 8401 | 248 | xmlnode *error; |
| 249 | const char *err_code; | |
| 7014 | 250 | |
| 28858 | 251 | account = purple_connection_get_account(js->gc); |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
252 | |
|
21150
bedd1215fb5e
Stop jabber setting wants_to_die itself. This involved plumbing disconnection
Will Thompson <resiak@pidgin.im>
parents:
20882
diff
changeset
|
253 | /* FIXME: Why is this not in jabber_parse_error? */ |
| 8401 | 254 | if((error = xmlnode_get_child(packet, "error")) && |
| 255 | (err_code = xmlnode_get_attrib(error, "code")) && | |
|
28829
3f69866415b4
jabber: Use purple_strequal to simplify some auth code
Paul Aurich <darkrain42@pidgin.im>
parents:
28828
diff
changeset
|
256 | g_str_equal(err_code, "401")) { |
| 21279 | 257 | reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; |
|
19993
867bd1dfe680
Clear the password when we get an auth. error and we're not saving passwords so that you don't need to go into the account settings to reset it. Fix #3083.
Daniel Atallah <datallah@pidgin.im>
parents:
19859
diff
changeset
|
258 | /* Clear the pasword if it isn't being saved */ |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
259 | if (!purple_account_get_remember_password(account)) |
|
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
260 | purple_account_set_password(account, NULL); |
| 7730 | 261 | } |
| 7014 | 262 | |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27633
diff
changeset
|
263 | purple_connection_error_reason(js->gc, reason, msg); |
| 8401 | 264 | g_free(msg); |
| 7014 | 265 | } |
| 266 | } | |
| 267 | ||
|
26687
1e799151fabe
Convert all the XMPP IQ callbacks to a typedef similar to the IQ Handlers.
Paul Aurich <darkrain42@pidgin.im>
parents:
26042
diff
changeset
|
268 | static void auth_old_cb(JabberStream *js, const char *from, |
|
1e799151fabe
Convert all the XMPP IQ callbacks to a typedef similar to the IQ Handlers.
Paul Aurich <darkrain42@pidgin.im>
parents:
26042
diff
changeset
|
269 | JabberIqType type, const char *id, |
|
1e799151fabe
Convert all the XMPP IQ callbacks to a typedef similar to the IQ Handlers.
Paul Aurich <darkrain42@pidgin.im>
parents:
26042
diff
changeset
|
270 | xmlnode *packet, gpointer data) |
| 7014 | 271 | { |
| 272 | JabberIq *iq; | |
| 273 | xmlnode *query, *x; | |
| 15884 | 274 | const char *pw = purple_connection_get_password(js->gc); |
| 7014 | 275 | |
|
26687
1e799151fabe
Convert all the XMPP IQ callbacks to a typedef similar to the IQ Handlers.
Paul Aurich <darkrain42@pidgin.im>
parents:
26042
diff
changeset
|
276 | if (type == JABBER_IQ_ERROR) { |
| 21279 | 277 | PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; |
|
21150
bedd1215fb5e
Stop jabber setting wants_to_die itself. This involved plumbing disconnection
Will Thompson <resiak@pidgin.im>
parents:
20882
diff
changeset
|
278 | char *msg = jabber_parse_error(js, packet, &reason); |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27633
diff
changeset
|
279 | purple_connection_error_reason(js->gc, reason, msg); |
| 8401 | 280 | g_free(msg); |
|
26687
1e799151fabe
Convert all the XMPP IQ callbacks to a typedef similar to the IQ Handlers.
Paul Aurich <darkrain42@pidgin.im>
parents:
26042
diff
changeset
|
281 | } else if (type == JABBER_IQ_RESULT) { |
| 7514 | 282 | query = xmlnode_get_child(packet, "query"); |
| 283 | if(js->stream_id && xmlnode_get_child(query, "digest")) { | |
|
25110
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
24830
diff
changeset
|
284 | char *s, *hash; |
| 7014 | 285 | |
| 8397 | 286 | iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:auth"); |
| 287 | query = xmlnode_get_child(iq->node, "query"); | |
| 288 | x = xmlnode_new_child(query, "username"); | |
| 289 | xmlnode_insert_data(x, js->user->node, -1); | |
| 290 | x = xmlnode_new_child(query, "resource"); | |
| 291 | xmlnode_insert_data(x, js->user->resource, -1); | |
| 292 | ||
| 7514 | 293 | x = xmlnode_new_child(query, "digest"); |
| 294 | s = g_strdup_printf("%s%s", js->stream_id, pw); | |
|
29910
f1c6e586e5c1
jabber: Validate the hash on incoming BoB objects (in case the CID is on the
Marcus Lundblad <malu@pidgin.im>
parents:
29196
diff
changeset
|
295 | hash = jabber_calculate_data_hash(s, strlen(s), "sha1"); |
|
25110
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
24830
diff
changeset
|
296 | xmlnode_insert_data(x, hash, -1); |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
24830
diff
changeset
|
297 | g_free(hash); |
| 7514 | 298 | g_free(s); |
| 8397 | 299 | jabber_iq_set_callback(iq, auth_old_result_cb, NULL); |
| 300 | jabber_iq_send(iq); | |
| 301 | ||
|
23407
6f89ce4acd7a
A patch from QuLogic to eliminate duplicated HMAC-MD5 code in the Jabber
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
23399
diff
changeset
|
302 | } else if(js->stream_id && (x = xmlnode_get_child(query, "crammd5"))) { |
|
21967
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
303 | const char *challenge; |
|
23407
6f89ce4acd7a
A patch from QuLogic to eliminate duplicated HMAC-MD5 code in the Jabber
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
23399
diff
changeset
|
304 | gchar digest[33]; |
|
6f89ce4acd7a
A patch from QuLogic to eliminate duplicated HMAC-MD5 code in the Jabber
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
23399
diff
changeset
|
305 | PurpleCipherContext *hmac; |
|
21967
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
306 | |
|
23407
6f89ce4acd7a
A patch from QuLogic to eliminate duplicated HMAC-MD5 code in the Jabber
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
23399
diff
changeset
|
307 | /* Calculate the MHAC-MD5 digest */ |
|
6f89ce4acd7a
A patch from QuLogic to eliminate duplicated HMAC-MD5 code in the Jabber
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
23399
diff
changeset
|
308 | challenge = xmlnode_get_attrib(x, "challenge"); |
|
6f89ce4acd7a
A patch from QuLogic to eliminate duplicated HMAC-MD5 code in the Jabber
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
23399
diff
changeset
|
309 | hmac = purple_cipher_context_new_by_name("hmac", NULL); |
|
6f89ce4acd7a
A patch from QuLogic to eliminate duplicated HMAC-MD5 code in the Jabber
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
23399
diff
changeset
|
310 | purple_cipher_context_set_option(hmac, "hash", "md5"); |
|
6f89ce4acd7a
A patch from QuLogic to eliminate duplicated HMAC-MD5 code in the Jabber
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
23399
diff
changeset
|
311 | purple_cipher_context_set_key(hmac, (guchar *)pw); |
|
6f89ce4acd7a
A patch from QuLogic to eliminate duplicated HMAC-MD5 code in the Jabber
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
23399
diff
changeset
|
312 | purple_cipher_context_append(hmac, (guchar *)challenge, strlen(challenge)); |
|
6f89ce4acd7a
A patch from QuLogic to eliminate duplicated HMAC-MD5 code in the Jabber
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
23399
diff
changeset
|
313 | purple_cipher_context_digest_to_str(hmac, 33, digest, NULL); |
|
6f89ce4acd7a
A patch from QuLogic to eliminate duplicated HMAC-MD5 code in the Jabber
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
23399
diff
changeset
|
314 | purple_cipher_context_destroy(hmac); |
|
21969
9386fcc30b22
Last minute 'cleanup' actually resulted in breakage on my cram-md5 commit. Fixed it.
Evan Schoenberg <evands@pidgin.im>
parents:
21967
diff
changeset
|
315 | |
|
9386fcc30b22
Last minute 'cleanup' actually resulted in breakage on my cram-md5 commit. Fixed it.
Evan Schoenberg <evands@pidgin.im>
parents:
21967
diff
changeset
|
316 | /* Create the response query */ |
|
21967
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
317 | iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:auth"); |
|
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
318 | query = xmlnode_get_child(iq->node, "query"); |
|
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
319 | |
|
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
320 | x = xmlnode_new_child(query, "username"); |
|
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
321 | xmlnode_insert_data(x, js->user->node, -1); |
|
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
322 | x = xmlnode_new_child(query, "resource"); |
|
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
323 | xmlnode_insert_data(x, js->user->resource, -1); |
|
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
324 | |
|
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
325 | x = xmlnode_new_child(query, "crammd5"); |
|
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
326 | |
|
23407
6f89ce4acd7a
A patch from QuLogic to eliminate duplicated HMAC-MD5 code in the Jabber
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
23399
diff
changeset
|
327 | xmlnode_insert_data(x, digest, 32); |
|
21967
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
328 | |
|
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
329 | jabber_iq_set_callback(iq, auth_old_result_cb, NULL); |
|
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
330 | jabber_iq_send(iq); |
|
3f1c1518a7e1
Added support for authentication via CRAM-MD5 when using jabber:iq:auth.
Evan Schoenberg <evands@pidgin.im>
parents:
21966
diff
changeset
|
331 | |
| 8397 | 332 | } else if(xmlnode_get_child(query, "password")) { |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
333 | PurpleAccount *account = purple_connection_get_account(js->gc); |
|
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
334 | if(!jabber_stream_is_ssl(js) && !purple_account_get_bool(account, |
| 8397 | 335 | "auth_plain_in_clear", FALSE)) { |
|
22815
a352aba19309
The warning string for plaintext auth over an unencrypted connection is found
Evan Schoenberg <evands@pidgin.im>
parents:
22802
diff
changeset
|
336 | char *msg = g_strdup_printf(_("%s requires plaintext authentication over an unencrypted connection. Allow this and continue authentication?"), |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
337 | purple_account_get_username(account)); |
|
21175
c6d76b49c206
disapproval of revision '8ba833993a115415727bb1b70362e0bd1603c169'
Richard Laager <rlaager@pidgin.im>
parents:
21174
diff
changeset
|
338 | purple_request_yes_no(js->gc, _("Plaintext Authentication"), |
| 8397 | 339 | _("Plaintext Authentication"), |
|
22815
a352aba19309
The warning string for plaintext auth over an unencrypted connection is found
Evan Schoenberg <evands@pidgin.im>
parents:
22802
diff
changeset
|
340 | msg, |
|
22269
3fdf7b13f20a
A few more of those "default_action" fixes
Mark Doliner <markdoliner@pidgin.im>
parents:
22068
diff
changeset
|
341 | 1, |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
342 | account, NULL, NULL, |
|
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
343 | account, allow_plaintext_auth, |
|
21175
c6d76b49c206
disapproval of revision '8ba833993a115415727bb1b70362e0bd1603c169'
Richard Laager <rlaager@pidgin.im>
parents:
21174
diff
changeset
|
344 | disallow_plaintext_auth); |
|
22815
a352aba19309
The warning string for plaintext auth over an unencrypted connection is found
Evan Schoenberg <evands@pidgin.im>
parents:
22802
diff
changeset
|
345 | g_free(msg); |
| 8397 | 346 | return; |
| 347 | } | |
| 348 | finish_plaintext_authentication(js); | |
| 7514 | 349 | } else { |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27633
diff
changeset
|
350 | purple_connection_error_reason(js->gc, |
| 21279 | 351 | PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, |
|
20445
c900767c024b
Use PurpleDisconnectReasons in prpl-jabber.
Will Thompson <resiak@pidgin.im>
parents:
19993
diff
changeset
|
352 | _("Server does not use any supported authentication method")); |
| 8397 | 353 | return; |
| 7514 | 354 | } |
| 7014 | 355 | } |
| 356 | } | |
| 357 | ||
| 358 | void jabber_auth_start_old(JabberStream *js) | |
| 359 | { | |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
360 | PurpleAccount *account; |
| 7014 | 361 | JabberIq *iq; |
| 362 | xmlnode *query, *username; | |
| 363 | ||
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
364 | account = purple_connection_get_account(js->gc); |
|
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
365 | |
|
28583
03f8fee2908a
jabber: Always require a resource when starting Legacy IQ Auth.
Paul Aurich <darkrain42@pidgin.im>
parents:
28379
diff
changeset
|
366 | /* |
|
03f8fee2908a
jabber: Always require a resource when starting Legacy IQ Auth.
Paul Aurich <darkrain42@pidgin.im>
parents:
28379
diff
changeset
|
367 | * We can end up here without encryption if the server doesn't support |
|
27170
447ef31d038a
Require SSL when trying IQ-auth via parser.c (no stream:features). Fixes #8131.
Paul Aurich <darkrain42@pidgin.im>
parents:
26707
diff
changeset
|
368 | * <stream:features/> and we're not using old-style SSL. If the user |
|
447ef31d038a
Require SSL when trying IQ-auth via parser.c (no stream:features). Fixes #8131.
Paul Aurich <darkrain42@pidgin.im>
parents:
26707
diff
changeset
|
369 | * is requiring SSL/TLS, we need to enforce it. |
|
447ef31d038a
Require SSL when trying IQ-auth via parser.c (no stream:features). Fixes #8131.
Paul Aurich <darkrain42@pidgin.im>
parents:
26707
diff
changeset
|
370 | */ |
|
447ef31d038a
Require SSL when trying IQ-auth via parser.c (no stream:features). Fixes #8131.
Paul Aurich <darkrain42@pidgin.im>
parents:
26707
diff
changeset
|
371 | if (!jabber_stream_is_ssl(js) && |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
372 | purple_account_get_bool(account, "require_tls", JABBER_DEFAULT_REQUIRE_TLS)) { |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27633
diff
changeset
|
373 | purple_connection_error_reason(js->gc, |
|
27170
447ef31d038a
Require SSL when trying IQ-auth via parser.c (no stream:features). Fixes #8131.
Paul Aurich <darkrain42@pidgin.im>
parents:
26707
diff
changeset
|
374 | PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, |
|
447ef31d038a
Require SSL when trying IQ-auth via parser.c (no stream:features). Fixes #8131.
Paul Aurich <darkrain42@pidgin.im>
parents:
26707
diff
changeset
|
375 | _("You require encryption, but it is not available on this server.")); |
|
447ef31d038a
Require SSL when trying IQ-auth via parser.c (no stream:features). Fixes #8131.
Paul Aurich <darkrain42@pidgin.im>
parents:
26707
diff
changeset
|
376 | return; |
|
447ef31d038a
Require SSL when trying IQ-auth via parser.c (no stream:features). Fixes #8131.
Paul Aurich <darkrain42@pidgin.im>
parents:
26707
diff
changeset
|
377 | } |
|
447ef31d038a
Require SSL when trying IQ-auth via parser.c (no stream:features). Fixes #8131.
Paul Aurich <darkrain42@pidgin.im>
parents:
26707
diff
changeset
|
378 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
379 | if (js->registration) { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
380 | jabber_register_start(js); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
381 | return; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
382 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
383 | |
|
28583
03f8fee2908a
jabber: Always require a resource when starting Legacy IQ Auth.
Paul Aurich <darkrain42@pidgin.im>
parents:
28379
diff
changeset
|
384 | /* |
|
03f8fee2908a
jabber: Always require a resource when starting Legacy IQ Auth.
Paul Aurich <darkrain42@pidgin.im>
parents:
28379
diff
changeset
|
385 | * IQ Auth doesn't have support for resource binding, so we need to pick a |
|
03f8fee2908a
jabber: Always require a resource when starting Legacy IQ Auth.
Paul Aurich <darkrain42@pidgin.im>
parents:
28379
diff
changeset
|
386 | * default resource so it will work properly. jabberd14 throws an error and |
|
03f8fee2908a
jabber: Always require a resource when starting Legacy IQ Auth.
Paul Aurich <darkrain42@pidgin.im>
parents:
28379
diff
changeset
|
387 | * iChat server just fails silently. |
|
03f8fee2908a
jabber: Always require a resource when starting Legacy IQ Auth.
Paul Aurich <darkrain42@pidgin.im>
parents:
28379
diff
changeset
|
388 | */ |
|
03f8fee2908a
jabber: Always require a resource when starting Legacy IQ Auth.
Paul Aurich <darkrain42@pidgin.im>
parents:
28379
diff
changeset
|
389 | if (!js->user->resource || *js->user->resource == '\0') { |
|
03f8fee2908a
jabber: Always require a resource when starting Legacy IQ Auth.
Paul Aurich <darkrain42@pidgin.im>
parents:
28379
diff
changeset
|
390 | g_free(js->user->resource); |
|
03f8fee2908a
jabber: Always require a resource when starting Legacy IQ Auth.
Paul Aurich <darkrain42@pidgin.im>
parents:
28379
diff
changeset
|
391 | js->user->resource = g_strdup("Home"); |
|
03f8fee2908a
jabber: Always require a resource when starting Legacy IQ Auth.
Paul Aurich <darkrain42@pidgin.im>
parents:
28379
diff
changeset
|
392 | } |
|
03f8fee2908a
jabber: Always require a resource when starting Legacy IQ Auth.
Paul Aurich <darkrain42@pidgin.im>
parents:
28379
diff
changeset
|
393 | |
|
16180
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
394 | #ifdef HAVE_CYRUS_SASL |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
395 | /* If we have Cyrus SASL, then passwords will have been set |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
396 | * to OPTIONAL for this protocol. So, we need to do our own |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
397 | * password prompting here |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
398 | */ |
|
20093
04f3c1dcd2cf
applied changes from 5fda75104115d0a95c1e214b6b3ca18c4dc86a0c
Richard Laager <rlaager@pidgin.im>
parents:
19993
diff
changeset
|
399 | |
|
28856
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
400 | if (!purple_account_get_password(account)) { |
|
992b7074357d
jabber: Use accessors instead of directly accessing gc->account (and similar)
Paul Aurich <darkrain42@pidgin.im>
parents:
28855
diff
changeset
|
401 | purple_account_request_password(account, G_CALLBACK(auth_old_pass_cb), G_CALLBACK(auth_no_pass_cb), js->gc); |
|
16180
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
402 | return; |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
403 | } |
|
82761882c366
patch from Simon Wilkinson to support Jabber/XMPP w/o passwords
Nathan Walp <nwalp@pidgin.im>
parents:
15952
diff
changeset
|
404 | #endif |
| 7014 | 405 | iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:auth"); |
| 406 | ||
| 407 | query = xmlnode_get_child(iq->node, "query"); | |
| 408 | username = xmlnode_new_child(query, "username"); | |
| 409 | xmlnode_insert_data(username, js->user->node, -1); | |
| 410 | ||
| 7395 | 411 | jabber_iq_set_callback(iq, auth_old_cb, NULL); |
| 7014 | 412 | |
| 413 | jabber_iq_send(iq); | |
| 414 | } | |
| 415 | ||
| 416 | void | |
| 417 | jabber_auth_handle_challenge(JabberStream *js, xmlnode *packet) | |
| 418 | { | |
| 13808 | 419 | const char *ns = xmlnode_get_namespace(packet); |
| 7014 | 420 | |
|
29008
1f288722b5cd
jabber: Use NS_XMPP_SASL
Paul Aurich <darkrain42@pidgin.im>
parents:
28866
diff
changeset
|
421 | if (!purple_strequal(ns, NS_XMPP_SASL)) { |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27633
diff
changeset
|
422 | purple_connection_error_reason(js->gc, |
| 21279 | 423 | PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27633
diff
changeset
|
424 | _("Invalid response from server")); |
| 7014 | 425 | return; |
| 426 | } | |
| 427 | ||
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
428 | if (js->auth_mech && js->auth_mech->handle_challenge) { |
|
29084
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
429 | xmlnode *response = NULL; |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29084
diff
changeset
|
430 | char *msg = NULL; |
|
29084
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
431 | JabberSaslState state = js->auth_mech->handle_challenge(js, packet, &response, &msg); |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
432 | if (state == JABBER_SASL_STATE_FAIL) { |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
433 | purple_connection_error_reason(js->gc, |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
434 | PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
435 | msg ? msg : _("Invalid challenge from server")); |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
436 | } else if (response) { |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
437 | jabber_send(js, response); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
438 | xmlnode_free(response); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
439 | } |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29084
diff
changeset
|
440 | |
|
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29084
diff
changeset
|
441 | g_free(msg); |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
442 | } else |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
443 | purple_debug_warning("jabber", "Received unexpected (and unhandled) <challenge/>\n"); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
444 | } |
| 15170 | 445 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
446 | void jabber_auth_handle_success(JabberStream *js, xmlnode *packet) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
447 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
448 | const char *ns = xmlnode_get_namespace(packet); |
| 15170 | 449 | |
|
29008
1f288722b5cd
jabber: Use NS_XMPP_SASL
Paul Aurich <darkrain42@pidgin.im>
parents:
28866
diff
changeset
|
450 | if (!purple_strequal(ns, NS_XMPP_SASL)) { |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
451 | purple_connection_error_reason(js->gc, |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
452 | PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
453 | _("Invalid response from server")); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
454 | return; |
| 12508 | 455 | } |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
456 | |
|
29084
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
457 | if (js->auth_mech && js->auth_mech->handle_success) { |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29084
diff
changeset
|
458 | char *msg = NULL; |
|
29084
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
459 | JabberSaslState state = js->auth_mech->handle_success(js, packet, &msg); |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
460 | |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
461 | if (state == JABBER_SASL_STATE_FAIL) { |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
462 | purple_connection_error_reason(js->gc, |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
463 | PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
464 | msg ? msg : _("Invalid response from server")); |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
465 | return; |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
466 | } else if (state == JABBER_SASL_STATE_CONTINUE) { |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
467 | purple_connection_error_reason(js->gc, |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
468 | PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
469 | msg ? msg : _("Server thinks authentication is complete, but client does not")); |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
470 | return; |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
471 | } |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29084
diff
changeset
|
472 | |
|
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29084
diff
changeset
|
473 | g_free(msg); |
| 12508 | 474 | } |
| 475 | ||
|
28379
df144a809a92
jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
476 | /* |
|
df144a809a92
jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
477 | * The stream will be reinitialized later in jabber_recv_cb_ssl() or |
|
df144a809a92
jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
478 | * jabber_bosh_connection_send. |
|
df144a809a92
jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
479 | */ |
|
df144a809a92
jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
480 | js->reinit = TRUE; |
|
df144a809a92
jabber: Fix using BOSH and legacy auth together. Closes #9990.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
481 | jabber_stream_set_state(js, JABBER_STREAM_POST_AUTH); |
| 7014 | 482 | } |
| 483 | ||
| 484 | void jabber_auth_handle_failure(JabberStream *js, xmlnode *packet) | |
| 485 | { | |
| 21279 | 486 | PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29084
diff
changeset
|
487 | char *msg = NULL; |
| 7014 | 488 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
489 | if (js->auth_mech && js->auth_mech->handle_failure) { |
|
29084
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
490 | xmlnode *stanza = NULL; |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
491 | JabberSaslState state = js->auth_mech->handle_failure(js, packet, &stanza, &msg); |
|
3a821d391ac0
Let's try a more complex set of return states / values for auth mechs.
Paul Aurich <darkrain42@pidgin.im>
parents:
29008
diff
changeset
|
492 | |
|
29196
4bd9e71f7b09
Cyrus may not have anything (yet) if it's waiting for a callback or something.
Paul Aurich <darkrain42@pidgin.im>
parents:
29090
diff
changeset
|
493 | if (state != JABBER_SASL_STATE_FAIL) { |
|
4bd9e71f7b09
Cyrus may not have anything (yet) if it's waiting for a callback or something.
Paul Aurich <darkrain42@pidgin.im>
parents:
29090
diff
changeset
|
494 | if (stanza) { |
|
4bd9e71f7b09
Cyrus may not have anything (yet) if it's waiting for a callback or something.
Paul Aurich <darkrain42@pidgin.im>
parents:
29090
diff
changeset
|
495 | jabber_send(js, stanza); |
|
4bd9e71f7b09
Cyrus may not have anything (yet) if it's waiting for a callback or something.
Paul Aurich <darkrain42@pidgin.im>
parents:
29090
diff
changeset
|
496 | xmlnode_free(stanza); |
|
4bd9e71f7b09
Cyrus may not have anything (yet) if it's waiting for a callback or something.
Paul Aurich <darkrain42@pidgin.im>
parents:
29090
diff
changeset
|
497 | } |
|
4bd9e71f7b09
Cyrus may not have anything (yet) if it's waiting for a callback or something.
Paul Aurich <darkrain42@pidgin.im>
parents:
29090
diff
changeset
|
498 | |
|
22913
d0ecc309dc42
After trying the available SASL mechs, jabber_auth_handle_failure() now
Evan Schoenberg <evands@pidgin.im>
parents:
22815
diff
changeset
|
499 | return; |
|
d0ecc309dc42
After trying the available SASL mechs, jabber_auth_handle_failure() now
Evan Schoenberg <evands@pidgin.im>
parents:
22815
diff
changeset
|
500 | } |
|
22800
0288a22eb85a
The next version of RFC 3920, the draft of which can be found at http://www.xmpp.org/internet-drafts/draft-saintandre-rfc3920bis-04.html, and subsequent email clarifications with Peter Saint-Andre and Alexey Melnikov indicate that we should be trying the next mechanism in line after one mechanism fails. We should also be ensuring that the mech list is sorted in order of descending security, which we don't do yet; however, servers are supposed to send us a sorted list, as well, so this isn't a major issue.
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
22667
diff
changeset
|
501 | } |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
502 | |
|
29090
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29084
diff
changeset
|
503 | if (!msg) |
|
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29084
diff
changeset
|
504 | msg = jabber_parse_error(js, packet, &reason); |
|
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29084
diff
changeset
|
505 | |
|
b351fcdeede7
jabber: Fix that leak I mentioned (and fix a mistake where error/response weren't NULL-initialized)
Paul Aurich <darkrain42@pidgin.im>
parents:
29084
diff
changeset
|
506 | if (!msg) { |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27633
diff
changeset
|
507 | purple_connection_error_reason(js->gc, |
| 21279 | 508 | PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27633
diff
changeset
|
509 | _("Invalid response from server")); |
| 8401 | 510 | } else { |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27633
diff
changeset
|
511 | purple_connection_error_reason(js->gc, reason, msg); |
| 8401 | 512 | g_free(msg); |
| 7014 | 513 | } |
| 514 | } | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
515 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
516 | static gint compare_mech(gconstpointer a, gconstpointer b) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
517 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
518 | const JabberSaslMech *mech_a = a; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
519 | const JabberSaslMech *mech_b = b; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
520 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
521 | /* higher priority comes *before* lower priority in the list */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
522 | if (mech_a->priority > mech_b->priority) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
523 | return -1; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
524 | else if (mech_a->priority < mech_b->priority) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
525 | return 1; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
526 | /* This really shouldn't happen */ |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
527 | return 0; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
528 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
529 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
530 | void jabber_auth_init(void) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
531 | { |
|
28866
e3d867ce000b
jabber: Complete (though untested) SCRAM implementation.
Paul Aurich <darkrain42@pidgin.im>
parents:
28858
diff
changeset
|
532 | JabberSaslMech **tmp; |
|
e3d867ce000b
jabber: Complete (though untested) SCRAM implementation.
Paul Aurich <darkrain42@pidgin.im>
parents:
28858
diff
changeset
|
533 | gint count, i; |
|
e3d867ce000b
jabber: Complete (though untested) SCRAM implementation.
Paul Aurich <darkrain42@pidgin.im>
parents:
28858
diff
changeset
|
534 | |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
535 | auth_mechs = g_slist_insert_sorted(auth_mechs, jabber_auth_get_plain_mech(), compare_mech); |
|
28857
0e4cf1f4a02f
jabber: Oops, re-enable DIGEST-MD5 (I was testing PLAIN).
Paul Aurich <darkrain42@pidgin.im>
parents:
28856
diff
changeset
|
536 | auth_mechs = g_slist_insert_sorted(auth_mechs, jabber_auth_get_digest_md5_mech(), compare_mech); |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
537 | #ifdef HAVE_CYRUS_SASL |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
538 | auth_mechs = g_slist_insert_sorted(auth_mechs, jabber_auth_get_cyrus_mech(), compare_mech); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
539 | #endif |
|
28866
e3d867ce000b
jabber: Complete (though untested) SCRAM implementation.
Paul Aurich <darkrain42@pidgin.im>
parents:
28858
diff
changeset
|
540 | |
|
e3d867ce000b
jabber: Complete (though untested) SCRAM implementation.
Paul Aurich <darkrain42@pidgin.im>
parents:
28858
diff
changeset
|
541 | tmp = jabber_auth_get_scram_mechs(&count); |
|
e3d867ce000b
jabber: Complete (though untested) SCRAM implementation.
Paul Aurich <darkrain42@pidgin.im>
parents:
28858
diff
changeset
|
542 | for (i = 0; i < count; ++i) |
|
e3d867ce000b
jabber: Complete (though untested) SCRAM implementation.
Paul Aurich <darkrain42@pidgin.im>
parents:
28858
diff
changeset
|
543 | auth_mechs = g_slist_insert_sorted(auth_mechs, tmp[i], compare_mech); |
|
28855
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
544 | } |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
545 | |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
546 | void jabber_auth_uninit(void) |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
547 | { |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
548 | g_slist_free(auth_mechs); |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
549 | auth_mechs = NULL; |
|
c5bc85f9c00e
jabber: Factor the SASL auth methods into their own files.
Paul Aurich <darkrain42@pidgin.im>
parents:
28835
diff
changeset
|
550 | } |