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++);