Mercurial > pidgin.yaz
comparison libpurple/protocols/jabber/jabber.c @ 28726:291c89bfe040
merged with im.pidgin.pidgin
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Sun, 11 Oct 2009 00:51:47 +0900 |
parents | 4b3756ed1053 c7aaad89a2f8 |
children | bd8a1dad7f1c |
comparison
equal
deleted
inserted
replaced
28662:4b3756ed1053 | 28726:291c89bfe040 |
---|---|
66 #include "adhoccommands.h" | 66 #include "adhoccommands.h" |
67 | 67 |
68 #include "jingle/jingle.h" | 68 #include "jingle/jingle.h" |
69 #include "jingle/rtp.h" | 69 #include "jingle/rtp.h" |
70 | 70 |
71 #define JABBER_CONNECT_STEPS (js->gsc ? 9 : 5) | |
72 | |
73 PurplePlugin *jabber_plugin = NULL; | 71 PurplePlugin *jabber_plugin = NULL; |
74 GList *jabber_features = NULL; | 72 GList *jabber_features = NULL; |
75 GList *jabber_identities = NULL; | 73 GList *jabber_identities = NULL; |
76 GSList *jabber_cmds = NULL; | 74 GSList *jabber_cmds = NULL; |
77 | 75 |
196 } | 194 } |
197 | 195 |
198 void jabber_stream_features_parse(JabberStream *js, xmlnode *packet) | 196 void jabber_stream_features_parse(JabberStream *js, xmlnode *packet) |
199 { | 197 { |
200 if(xmlnode_get_child(packet, "starttls")) { | 198 if(xmlnode_get_child(packet, "starttls")) { |
201 if(jabber_process_starttls(js, packet)) | 199 if(jabber_process_starttls(js, packet)) { |
202 | 200 jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING_ENCRYPTION); |
203 return; | 201 return; |
202 } | |
204 } else if(purple_account_get_bool(js->gc->account, "require_tls", FALSE) && !jabber_stream_is_ssl(js)) { | 203 } else if(purple_account_get_bool(js->gc->account, "require_tls", FALSE) && !jabber_stream_is_ssl(js)) { |
205 purple_connection_error_reason(js->gc, | 204 purple_connection_error_reason(js->gc, |
206 PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, | 205 PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, |
207 _("You require encryption, but it is not available on this server.")); | 206 _("You require encryption, but it is not available on this server.")); |
208 return; | 207 return; |
209 } | 208 } |
210 | 209 |
211 if(js->registration) { | 210 if(js->registration) { |
212 jabber_register_start(js); | 211 jabber_register_start(js); |
213 } else if(xmlnode_get_child(packet, "mechanisms")) { | 212 } else if(xmlnode_get_child(packet, "mechanisms")) { |
213 jabber_stream_set_state(js, JABBER_STREAM_AUTHENTICATING); | |
214 jabber_auth_start(js, packet); | 214 jabber_auth_start(js, packet); |
215 } else if(xmlnode_get_child(packet, "bind")) { | 215 } else if(xmlnode_get_child(packet, "bind")) { |
216 xmlnode *bind, *resource; | 216 xmlnode *bind, *resource; |
217 char *requested_resource; | 217 char *requested_resource; |
218 JabberIq *iq = jabber_iq_new(js, JABBER_IQ_SET); | 218 JabberIq *iq = jabber_iq_new(js, JABBER_IQ_SET); |
287 jabber_auth_handle_success(js, *packet); | 287 jabber_auth_handle_success(js, *packet); |
288 } else if(!strcmp((*packet)->name, "failure")) { | 288 } else if(!strcmp((*packet)->name, "failure")) { |
289 if(js->state == JABBER_STREAM_AUTHENTICATING) | 289 if(js->state == JABBER_STREAM_AUTHENTICATING) |
290 jabber_auth_handle_failure(js, *packet); | 290 jabber_auth_handle_failure(js, *packet); |
291 } else if(!strcmp((*packet)->name, "proceed")) { | 291 } else if(!strcmp((*packet)->name, "proceed")) { |
292 if(js->state == JABBER_STREAM_AUTHENTICATING && !js->gsc) | 292 if (js->state == JABBER_STREAM_INITIALIZING_ENCRYPTION && !js->gsc) |
293 tls_init(js); | 293 tls_init(js); |
294 else | |
295 purple_debug_warning("jabber", "Ignoring spurious <proceed/>\n"); | |
294 } else { | 296 } else { |
295 purple_debug(PURPLE_DEBUG_WARNING, "jabber", "Unknown packet: %s\n", | 297 purple_debug(PURPLE_DEBUG_WARNING, "jabber", "Unknown packet: %s\n", |
296 (*packet)->name); | 298 (*packet)->name); |
297 } | 299 } |
298 } | 300 } |
1077 jabber_iq_send(iq); | 1079 jabber_iq_send(iq); |
1078 g_free(cbdata); | 1080 g_free(cbdata); |
1079 return; | 1081 return; |
1080 } | 1082 } |
1081 } else { | 1083 } else { |
1082 const char *value = purple_request_field_string_get_value(field); | 1084 const char *value = purple_request_field_string_get_value(field); |
1083 | 1085 |
1084 if(!strcmp(id, "username")) { | 1086 if(!strcmp(id, "username")) { |
1085 y = xmlnode_new_child(query, "username"); | 1087 y = xmlnode_new_child(query, "username"); |
1086 } else if(!strcmp(id, "password")) { | 1088 } else if(!strcmp(id, "password")) { |
1087 y = xmlnode_new_child(query, "password"); | 1089 y = xmlnode_new_child(query, "password"); |
1088 } else if(!strcmp(id, "name")) { | 1090 } else if(!strcmp(id, "name")) { |
1089 y = xmlnode_new_child(query, "name"); | 1091 y = xmlnode_new_child(query, "name"); |
1090 } else if(!strcmp(id, "email")) { | 1092 } else if(!strcmp(id, "email")) { |
1091 y = xmlnode_new_child(query, "email"); | 1093 y = xmlnode_new_child(query, "email"); |
1092 } else if(!strcmp(id, "nick")) { | 1094 } else if(!strcmp(id, "nick")) { |
1093 y = xmlnode_new_child(query, "nick"); | 1095 y = xmlnode_new_child(query, "nick"); |
1094 } else if(!strcmp(id, "first")) { | 1096 } else if(!strcmp(id, "first")) { |
1095 y = xmlnode_new_child(query, "first"); | 1097 y = xmlnode_new_child(query, "first"); |
1096 } else if(!strcmp(id, "last")) { | 1098 } else if(!strcmp(id, "last")) { |
1097 y = xmlnode_new_child(query, "last"); | 1099 y = xmlnode_new_child(query, "last"); |
1098 } else if(!strcmp(id, "address")) { | 1100 } else if(!strcmp(id, "address")) { |
1099 y = xmlnode_new_child(query, "address"); | 1101 y = xmlnode_new_child(query, "address"); |
1100 } else if(!strcmp(id, "city")) { | 1102 } else if(!strcmp(id, "city")) { |
1101 y = xmlnode_new_child(query, "city"); | 1103 y = xmlnode_new_child(query, "city"); |
1102 } else if(!strcmp(id, "state")) { | 1104 } else if(!strcmp(id, "state")) { |
1103 y = xmlnode_new_child(query, "state"); | 1105 y = xmlnode_new_child(query, "state"); |
1104 } else if(!strcmp(id, "zip")) { | 1106 } else if(!strcmp(id, "zip")) { |
1105 y = xmlnode_new_child(query, "zip"); | 1107 y = xmlnode_new_child(query, "zip"); |
1106 } else if(!strcmp(id, "phone")) { | 1108 } else if(!strcmp(id, "phone")) { |
1107 y = xmlnode_new_child(query, "phone"); | 1109 y = xmlnode_new_child(query, "phone"); |
1108 } else if(!strcmp(id, "url")) { | 1110 } else if(!strcmp(id, "url")) { |
1109 y = xmlnode_new_child(query, "url"); | 1111 y = xmlnode_new_child(query, "url"); |
1110 } else if(!strcmp(id, "date")) { | 1112 } else if(!strcmp(id, "date")) { |
1111 y = xmlnode_new_child(query, "date"); | 1113 y = xmlnode_new_child(query, "date"); |
1112 } else { | 1114 } else { |
1113 continue; | 1115 continue; |
1114 } | 1116 } |
1115 xmlnode_insert_data(y, value, -1); | 1117 xmlnode_insert_data(y, value, -1); |
1116 if(cbdata->js->registration && !strcmp(id, "username")) { | 1118 if(cbdata->js->registration && !strcmp(id, "username")) { |
1117 g_free(cbdata->js->user->node); | 1119 g_free(cbdata->js->user->node); |
1118 cbdata->js->user->node = g_strdup(value); | 1120 cbdata->js->user->node = g_strdup(value); |
1119 } | 1121 } |
1120 if(cbdata->js->registration && !strcmp(id, "password")) | 1122 if(cbdata->js->registration && !strcmp(id, "password")) |
1121 purple_account_set_password(cbdata->js->gc->account, value); | 1123 purple_account_set_password(cbdata->js->gc->account, value); |
1122 } | 1124 } |
1123 } | 1125 } |
1124 } | 1126 } |
1125 | 1127 |
1126 if(cbdata->js->registration) { | 1128 if(cbdata->js->registration) { |
1127 username = g_strdup_printf("%s@%s/%s", cbdata->js->user->node, cbdata->js->user->domain, | 1129 username = g_strdup_printf("%s@%s%s%s", cbdata->js->user->node, cbdata->js->user->domain, |
1128 cbdata->js->user->resource); | 1130 cbdata->js->user->resource ? "/" : "", cbdata->js->user->resource); |
1129 purple_account_set_username(cbdata->js->gc->account, username); | 1131 purple_account_set_username(cbdata->js->gc->account, username); |
1130 g_free(username); | 1132 g_free(username); |
1131 } | 1133 } |
1132 | 1134 |
1133 jabber_iq_set_callback(iq, jabber_registration_result_cb, cbdata->who); | 1135 jabber_iq_set_callback(iq, jabber_registration_result_cb, cbdata->who); |
1570 gc->proto_data = NULL; | 1572 gc->proto_data = NULL; |
1571 } | 1573 } |
1572 | 1574 |
1573 void jabber_stream_set_state(JabberStream *js, JabberStreamState state) | 1575 void jabber_stream_set_state(JabberStream *js, JabberStreamState state) |
1574 { | 1576 { |
1577 #define JABBER_CONNECT_STEPS ((js->gsc || js->state == JABBER_STREAM_INITIALIZING_ENCRYPTION) ? 9 : 5) | |
1578 | |
1575 js->state = state; | 1579 js->state = state; |
1576 switch(state) { | 1580 switch(state) { |
1577 case JABBER_STREAM_OFFLINE: | 1581 case JABBER_STREAM_OFFLINE: |
1578 break; | 1582 break; |
1579 case JABBER_STREAM_CONNECTING: | 1583 case JABBER_STREAM_CONNECTING: |
1607 /* Send initial presence */ | 1611 /* Send initial presence */ |
1608 jabber_presence_send(js, TRUE); | 1612 jabber_presence_send(js, TRUE); |
1609 purple_connection_set_state(js->gc, PURPLE_CONNECTED); | 1613 purple_connection_set_state(js->gc, PURPLE_CONNECTED); |
1610 break; | 1614 break; |
1611 } | 1615 } |
1616 | |
1617 #undef JABBER_CONNECT_STEPS | |
1612 } | 1618 } |
1613 | 1619 |
1614 char *jabber_get_next_id(JabberStream *js) | 1620 char *jabber_get_next_id(JabberStream *js) |
1615 { | 1621 { |
1616 return g_strdup_printf("purple%x", js->next_id++); | 1622 return g_strdup_printf("purple%x", js->next_id++); |