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