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