| 30 #include "auth.h" |
30 #include "auth.h" |
| 31 #include "jabber.h" |
31 #include "jabber.h" |
| 32 |
32 |
| 33 static JabberSaslState |
33 static JabberSaslState |
| 34 digest_md5_start(JabberStream *js, xmlnode *packet, xmlnode **response, |
34 digest_md5_start(JabberStream *js, xmlnode *packet, xmlnode **response, |
| 35 const char **msg) |
35 char **error) |
| 36 { |
36 { |
| 37 xmlnode *auth = xmlnode_new("auth"); |
37 xmlnode *auth = xmlnode_new("auth"); |
| 38 xmlnode_set_namespace(auth, NS_XMPP_SASL); |
38 xmlnode_set_namespace(auth, NS_XMPP_SASL); |
| 39 xmlnode_set_attrib(auth, "mechanism", "DIGEST-MD5"); |
39 xmlnode_set_attrib(auth, "mechanism", "DIGEST-MD5"); |
| 40 |
40 |
| 164 return z; |
164 return z; |
| 165 } |
165 } |
| 166 |
166 |
| 167 static JabberSaslState |
167 static JabberSaslState |
| 168 digest_md5_handle_challenge(JabberStream *js, xmlnode *packet, |
168 digest_md5_handle_challenge(JabberStream *js, xmlnode *packet, |
| 169 xmlnode **response, const char **msg) |
169 xmlnode **response, char **msg) |
| 170 { |
170 { |
| 171 xmlnode *reply = NULL; |
171 xmlnode *reply = NULL; |
| 172 char *enc_in = xmlnode_get_data(packet); |
172 char *enc_in = xmlnode_get_data(packet); |
| 173 char *dec_in; |
173 char *dec_in; |
| 174 char *enc_out; |
174 char *enc_out; |
| 175 GHashTable *parts; |
175 GHashTable *parts; |
| 176 JabberSaslState state = JABBER_SASL_STATE_CONTINUE; |
176 JabberSaslState state = JABBER_SASL_STATE_CONTINUE; |
| 177 |
177 |
| 178 if (!enc_in) { |
178 if (!enc_in) { |
| 179 *msg = _("Invalid response from server"); |
179 *msg = g_strdup(_("Invalid response from server")); |
| 180 return JABBER_SASL_STATE_FAIL; |
180 return JABBER_SASL_STATE_FAIL; |
| 181 } |
181 } |
| 182 |
182 |
| 183 dec_in = (char *)purple_base64_decode(enc_in, NULL); |
183 dec_in = (char *)purple_base64_decode(enc_in, NULL); |
| 184 purple_debug_misc("jabber", "decoded challenge (%" |
184 purple_debug_misc("jabber", "decoded challenge (%" |
| 191 |
191 |
| 192 if (rspauth && purple_strequal(rspauth, js->expected_rspauth)) { |
192 if (rspauth && purple_strequal(rspauth, js->expected_rspauth)) { |
| 193 reply = xmlnode_new("response"); |
193 reply = xmlnode_new("response"); |
| 194 xmlnode_set_namespace(reply, NS_XMPP_SASL); |
194 xmlnode_set_namespace(reply, NS_XMPP_SASL); |
| 195 } else { |
195 } else { |
| 196 *msg = _("Invalid challenge from server"); |
196 *msg = g_strdup(_("Invalid challenge from server")); |
| 197 state = JABBER_SASL_STATE_FAIL; |
197 state = JABBER_SASL_STATE_FAIL; |
| 198 } |
198 } |
| 199 g_free(js->expected_rspauth); |
199 g_free(js->expected_rspauth); |
| 200 js->expected_rspauth = NULL; |
200 js->expected_rspauth = NULL; |
| 201 } else { |
201 } else { |
| 216 realm = g_hash_table_lookup(parts, "realm"); |
216 realm = g_hash_table_lookup(parts, "realm"); |
| 217 if(!realm) |
217 if(!realm) |
| 218 realm = js->user->domain; |
218 realm = js->user->domain; |
| 219 |
219 |
| 220 if (nonce == NULL || realm == NULL) { |
220 if (nonce == NULL || realm == NULL) { |
| 221 *msg = _("Invalid challenge from server"); |
221 *msg = g_strdup(_("Invalid challenge from server")); |
| 222 state = JABBER_SASL_STATE_FAIL; |
222 state = JABBER_SASL_STATE_FAIL; |
| 223 } else { |
223 } else { |
| 224 GString *response = g_string_new(""); |
224 GString *response = g_string_new(""); |
| 225 char *a2; |
225 char *a2; |
| 226 char *auth_resp; |
226 char *auth_resp; |