Mercurial > pidgin.yaz
comparison src/protocols/jabber/jabber.c @ 2814:f4f9e5a01890
[gaim-migrate @ 2827]
jabber can do digest authentication now. isn't that spectacular.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Thu, 29 Nov 2001 10:42:12 +0000 |
parents | 0ad63a625eec |
children | b917845dad3c |
comparison
equal
deleted
inserted
replaced
2813:bda5b89ba2f9 | 2814:f4f9e5a01890 |
---|---|
282 | 282 |
283 gjab_send(j, x); | 283 gjab_send(j, x); |
284 xmlnode_free(x); | 284 xmlnode_free(x); |
285 } | 285 } |
286 | 286 |
287 static void gjab_reqauth(gjconn j) | |
288 { | |
289 xmlnode x, y, z; | |
290 char *user; | |
291 | |
292 if (!j) | |
293 return; | |
294 | |
295 x = jutil_iqnew(JPACKET__GET, NS_AUTH); | |
296 xmlnode_put_attrib(x, "id", IQID_AUTH); | |
297 y = xmlnode_get_tag(x, "query"); | |
298 | |
299 user = j->user->user; | |
300 | |
301 if (user) { | |
302 z = xmlnode_insert_tag(y, "username"); | |
303 xmlnode_insert_cdata(z, user, -1); | |
304 } | |
305 | |
306 gjab_send(j, x); | |
307 xmlnode_free(x); | |
308 } | |
309 | |
287 static void gjab_auth(gjconn j) | 310 static void gjab_auth(gjconn j) |
288 { | 311 { |
289 xmlnode x, y, z; | 312 xmlnode x, y, z; |
290 char *hash, *user; | 313 char *hash, *user; |
291 | 314 |
305 | 328 |
306 z = xmlnode_insert_tag(y, "resource"); | 329 z = xmlnode_insert_tag(y, "resource"); |
307 xmlnode_insert_cdata(z, j->user->resource, -1); | 330 xmlnode_insert_cdata(z, j->user->resource, -1); |
308 | 331 |
309 if (j->sid) { | 332 if (j->sid) { |
333 debug_printf("digest authentication (sid %s)\n", j->sid); | |
310 z = xmlnode_insert_tag(y, "digest"); | 334 z = xmlnode_insert_tag(y, "digest"); |
311 hash = pmalloc(x->p, strlen(j->sid) + strlen(j->pass) + 1); | 335 hash = pmalloc(x->p, strlen(j->sid) + strlen(j->pass) + 1); |
312 strcpy(hash, j->sid); | 336 strcpy(hash, j->sid); |
313 strcat(hash, j->pass); | 337 strcat(hash, j->pass); |
314 hash = shahash(hash); | 338 hash = shahash(hash); |
359 x = xmlnode_new_tag(name); | 383 x = xmlnode_new_tag(name); |
360 xmlnode_put_expat_attribs(x, attribs); | 384 xmlnode_put_expat_attribs(x, attribs); |
361 if (strcmp(name, "stream:stream") == 0) { | 385 if (strcmp(name, "stream:stream") == 0) { |
362 /* special case: name == stream:stream */ | 386 /* special case: name == stream:stream */ |
363 /* id attrib of stream is stored for digest auth */ | 387 /* id attrib of stream is stored for digest auth */ |
364 j->sid = xmlnode_get_attrib(x, "id"); | 388 j->sid = g_strdup(xmlnode_get_attrib(x, "id")); |
365 /* STATE_EVT(JCONN_STATE_AUTH) */ | 389 /* STATE_EVT(JCONN_STATE_AUTH) */ |
366 xmlnode_free(x); | 390 xmlnode_free(x); |
367 } else { | 391 } else { |
368 j->current = x; | 392 j->current = x; |
369 } | 393 } |
927 x = jutil_presnew(0, NULL, "Online"); | 951 x = jutil_presnew(0, NULL, "Online"); |
928 gjab_send(j, x); | 952 gjab_send(j, x); |
929 xmlnode_free(x); | 953 xmlnode_free(x); |
930 } | 954 } |
931 | 955 |
932 static void jabber_handlevcard(gjconn j, xmlnode querynode, char *from) { | 956 static void jabber_handlevcard(gjconn j, xmlnode querynode, char *from) |
957 { | |
933 struct gaim_connection *gc = GJ_GC(j); | 958 struct gaim_connection *gc = GJ_GC(j); |
934 char buf[1024]; | 959 char buf[1024]; |
935 char *fn, *url, *email, *nickname, *status, *desc; | 960 char *fn, *url, *email, *nickname, *status, *desc; |
936 jid who; | 961 jid who; |
937 char *buddy; | 962 char *buddy; |
970 } | 995 } |
971 | 996 |
972 static void jabber_handleauthresp(gjconn j, jpacket p) | 997 static void jabber_handleauthresp(gjconn j, jpacket p) |
973 { | 998 { |
974 if (jpacket_subtype(p) == JPACKET__RESULT) { | 999 if (jpacket_subtype(p) == JPACKET__RESULT) { |
975 debug_printf("auth success\n"); | 1000 if (xmlnode_has_children(p->x)) { |
976 | 1001 xmlnode query = xmlnode_get_tag(p->x, "query"); |
977 account_online(GJ_GC(j)); | 1002 set_login_progress(GJ_GC(j), 4, "Authenticating"); |
978 serv_finish_login(GJ_GC(j)); | 1003 if (!xmlnode_get_tag(query, "digest")) { |
979 | 1004 g_free(j->sid); |
980 if (bud_list_cache_exists(GJ_GC(j))) | 1005 j->sid = NULL; |
981 do_import(GJ_GC(j), NULL); | 1006 } |
982 | 1007 gjab_auth(j); |
983 ((struct jabber_data *)GJ_GC(j)->proto_data)->did_import = TRUE; | 1008 } else { |
984 | 1009 debug_printf("auth success\n"); |
985 gjab_reqroster(j); | 1010 |
1011 account_online(GJ_GC(j)); | |
1012 serv_finish_login(GJ_GC(j)); | |
1013 | |
1014 if (bud_list_cache_exists(GJ_GC(j))) | |
1015 do_import(GJ_GC(j), NULL); | |
1016 | |
1017 ((struct jabber_data *)GJ_GC(j)->proto_data)->did_import = TRUE; | |
1018 | |
1019 gjab_reqroster(j); | |
1020 } | |
986 } else { | 1021 } else { |
987 xmlnode xerr; | 1022 xmlnode xerr; |
988 char *errmsg = NULL; | 1023 char *errmsg = NULL; |
989 int errcode = 0; | 1024 int errcode = 0; |
990 struct jabber_data *jd = GJ_GC(j)->proto_data; | 1025 struct jabber_data *jd = GJ_GC(j)->proto_data; |
1086 xmlnode_free(x); | 1121 xmlnode_free(x); |
1087 } | 1122 } |
1088 | 1123 |
1089 static void jabber_handlepacket(gjconn j, jpacket p) | 1124 static void jabber_handlepacket(gjconn j, jpacket p) |
1090 { | 1125 { |
1126 char *id; | |
1091 switch (p->type) { | 1127 switch (p->type) { |
1092 case JPACKET_MESSAGE: | 1128 case JPACKET_MESSAGE: |
1093 jabber_handlemessage(j, p); | 1129 jabber_handlemessage(j, p); |
1094 break; | 1130 break; |
1095 case JPACKET_PRESENCE: | 1131 case JPACKET_PRESENCE: |
1096 jabber_handlepresence(j, p); | 1132 jabber_handlepresence(j, p); |
1097 break; | 1133 break; |
1098 case JPACKET_IQ: | 1134 case JPACKET_IQ: |
1099 debug_printf("jpacket_subtype: %d\n", jpacket_subtype(p)); | 1135 debug_printf("jpacket_subtype: %d\n", jpacket_subtype(p)); |
1100 | 1136 |
1101 if (xmlnode_get_attrib(p->x, "id") && (strcmp(xmlnode_get_attrib(p->x, "id"), IQID_AUTH) == 0)) { | 1137 if (((id = xmlnode_get_attrib(p->x, "id")) != NULL) && !strcmp(id, IQID_AUTH)) { |
1102 jabber_handleauthresp(j, p); | 1138 jabber_handleauthresp(j, p); |
1103 break; /* I'm not sure if you like this style, Eric. */ | 1139 break; |
1104 } | 1140 } |
1105 | 1141 |
1106 if (jpacket_subtype(p) == JPACKET__SET) { | 1142 if (jpacket_subtype(p) == JPACKET__SET) { |
1107 } else if (jpacket_subtype(p) == JPACKET__GET) { | 1143 } else if (jpacket_subtype(p) == JPACKET__GET) { |
1108 xmlnode querynode; | 1144 xmlnode querynode; |
1109 querynode = xmlnode_get_tag(p->x, "query"); | 1145 querynode = xmlnode_get_tag(p->x, "query"); |
1110 if(NSCHECK(querynode, NS_VERSION)) { | 1146 if (NSCHECK(querynode, NS_VERSION)) { |
1111 jabber_handleversion(j, p->x); | 1147 jabber_handleversion(j, p->x); |
1112 } else if (NSCHECK(querynode, NS_TIME)) { | 1148 } else if (NSCHECK(querynode, NS_TIME)) { |
1113 jabber_handletime(j, p->x); | 1149 jabber_handletime(j, p->x); |
1114 } else if (NSCHECK(querynode, "jabber:iq:last")) { | 1150 } else if (NSCHECK(querynode, "jabber:iq:last")) { |
1115 jabber_handlelast(j, p->x); | 1151 jabber_handlelast(j, p->x); |
1174 case JCONN_STATE_OFF: | 1210 case JCONN_STATE_OFF: |
1175 hide_login_progress(GJ_GC(j), "Unable to connect"); | 1211 hide_login_progress(GJ_GC(j), "Unable to connect"); |
1176 signoff(GJ_GC(j)); | 1212 signoff(GJ_GC(j)); |
1177 break; | 1213 break; |
1178 case JCONN_STATE_CONNECTED: | 1214 case JCONN_STATE_CONNECTED: |
1179 set_login_progress(GJ_GC(j), 3, "Connected"); | 1215 set_login_progress(GJ_GC(j), 2, "Connected"); |
1180 break; | 1216 break; |
1181 case JCONN_STATE_ON: | 1217 case JCONN_STATE_ON: |
1182 set_login_progress(GJ_GC(j), 5, "Logging in..."); | 1218 set_login_progress(GJ_GC(j), 3, "Requesting Authentication Method"); |
1183 gjab_auth(j); | 1219 gjab_reqauth(j); |
1184 break; | 1220 break; |
1185 default: | 1221 default: |
1186 debug_printf("state change: %d\n", state); | 1222 debug_printf("state change: %d\n", state); |
1187 } | 1223 } |
1188 return; | 1224 return; |
1232 if (gc->inpa) | 1268 if (gc->inpa) |
1233 gaim_input_remove(gc->inpa); | 1269 gaim_input_remove(gc->inpa); |
1234 close(jd->jc->fd); | 1270 close(jd->jc->fd); |
1235 g_timeout_add(50, jabber_free, jd->jc); | 1271 g_timeout_add(50, jabber_free, jd->jc); |
1236 xmlnode_free(jd->jc->current); | 1272 xmlnode_free(jd->jc->current); |
1273 g_free(jd->jc->sid); | |
1237 jd->jc = NULL; | 1274 jd->jc = NULL; |
1238 g_free(jd); | 1275 g_free(jd); |
1239 gc->proto_data = NULL; | 1276 gc->proto_data = NULL; |
1240 } | 1277 } |
1241 | 1278 |