Mercurial > pidgin
comparison libpurple/protocols/jabber/jabber.c @ 21592:68b036c452f3
The Jabber registration process depends upon having a non-NULL cbdata->who,
which was set only from the 'from' attribute of the registration packet.
I can't find anything in XEP-0077 which discusses whether the 'from' attribute
is required, but I've run into at least one server (bgmn.net, which according to
gmn.ne/jabber is using OpenFire 3.2.4) which doesn't include it. This leads to
registration attempts crashing.
If we can't get a 'from' attribute, try to use the fully qualified domain name
instead. If that's NULL for some reason, fail the registration attempt rather
than continuing on and crashing.
author | Evan Schoenberg <evan.s@dreskin.net> |
---|---|
date | Mon, 19 Nov 2007 08:05:36 +0000 |
parents | 28824f9f8e47 |
children | a4b6854737d5 |
comparison
equal
deleted
inserted
replaced
21591:28824f9f8e47 | 21592:68b036c452f3 |
---|---|
747 JabberIq *iq; | 747 JabberIq *iq; |
748 char *username; | 748 char *username; |
749 | 749 |
750 iq = jabber_iq_new_query(cbdata->js, JABBER_IQ_SET, "jabber:iq:register"); | 750 iq = jabber_iq_new_query(cbdata->js, JABBER_IQ_SET, "jabber:iq:register"); |
751 query = xmlnode_get_child(iq->node, "query"); | 751 query = xmlnode_get_child(iq->node, "query"); |
752 xmlnode_set_attrib(iq->node,"to",cbdata->who); | 752 xmlnode_set_attrib(iq->node, "to", cbdata->who); |
753 | 753 |
754 for(groups = purple_request_fields_get_groups(fields); groups; | 754 for(groups = purple_request_fields_get_groups(fields); groups; |
755 groups = groups->next) { | 755 groups = groups->next) { |
756 for(flds = purple_request_field_group_get_fields(groups->data); | 756 for(flds = purple_request_field_group_get_fields(groups->data); |
757 flds; flds = flds->next) { | 757 flds; flds = flds->next) { |
822 | 822 |
823 if(cbdata->js->registration) { | 823 if(cbdata->js->registration) { |
824 username = g_strdup_printf("%s@%s/%s", cbdata->js->user->node, cbdata->js->user->domain, | 824 username = g_strdup_printf("%s@%s/%s", cbdata->js->user->node, cbdata->js->user->domain, |
825 cbdata->js->user->resource); | 825 cbdata->js->user->resource); |
826 purple_account_set_username(cbdata->js->gc->account, username); | 826 purple_account_set_username(cbdata->js->gc->account, username); |
827 g_free(username); | 827 g_free(username); |
828 } | 828 } |
829 | 829 |
830 jabber_iq_set_callback(iq, jabber_registration_result_cb, cbdata->who); | 830 jabber_iq_set_callback(iq, jabber_registration_result_cb, cbdata->who); |
831 | 831 |
832 jabber_iq_send(iq); | 832 jabber_iq_send(iq); |
864 | 864 |
865 void jabber_register_parse(JabberStream *js, xmlnode *packet) | 865 void jabber_register_parse(JabberStream *js, xmlnode *packet) |
866 { | 866 { |
867 PurpleAccount *account = purple_connection_get_account(js->gc); | 867 PurpleAccount *account = purple_connection_get_account(js->gc); |
868 const char *type; | 868 const char *type; |
869 const char *from = xmlnode_get_attrib(packet, "from"); | 869 const char *from; |
870 PurpleRequestFields *fields; | 870 PurpleRequestFields *fields; |
871 PurpleRequestFieldGroup *group; | 871 PurpleRequestFieldGroup *group; |
872 PurpleRequestField *field; | 872 PurpleRequestField *field; |
873 xmlnode *query, *x, *y; | 873 xmlnode *query, *x, *y; |
874 char *instructions; | 874 char *instructions; |
876 gboolean registered = FALSE; | 876 gboolean registered = FALSE; |
877 | 877 |
878 if(!(type = xmlnode_get_attrib(packet, "type")) || strcmp(type, "result")) | 878 if(!(type = xmlnode_get_attrib(packet, "type")) || strcmp(type, "result")) |
879 return; | 879 return; |
880 | 880 |
881 from = xmlnode_get_attrib(packet, "from"); | |
882 if (!from) | |
883 from = js->serverFQDN; | |
884 g_return_if_fail(from != NULL); | |
885 | |
881 if(js->registration) { | 886 if(js->registration) { |
882 /* get rid of the login thingy */ | 887 /* get rid of the login thingy */ |
883 purple_connection_set_state(js->gc, PURPLE_CONNECTED); | 888 purple_connection_set_state(js->gc, PURPLE_CONNECTED); |
884 } | 889 } |
885 | 890 |