libpurple/protocols/oscar/family_auth.c

changeset 17443
bae8548d98b3
parent 17294
00ffeeba1a1b
child 18341
8990ff4ec97c
equal deleted inserted replaced
17427:5cd92816909d 17443:bae8548d98b3
127 */ 127 */
128 static int 128 static int
129 goddamnicq2(OscarData *od, FlapConnection *conn, const char *sn, const char *password, ClientInfo *ci) 129 goddamnicq2(OscarData *od, FlapConnection *conn, const char *sn, const char *password, ClientInfo *ci)
130 { 130 {
131 FlapFrame *frame; 131 FlapFrame *frame;
132 aim_tlvlist_t *tl = NULL; 132 GSList *tlvlist = NULL;
133 int passwdlen; 133 int passwdlen;
134 guint8 *password_encoded; 134 guint8 *password_encoded;
135 135
136 passwdlen = strlen(password); 136 passwdlen = strlen(password);
137 password_encoded = (guint8 *)g_malloc(passwdlen+1); 137 password_encoded = (guint8 *)g_malloc(passwdlen+1);
141 frame = flap_frame_new(od, 0x01, 1152); 141 frame = flap_frame_new(od, 0x01, 1152);
142 142
143 aim_encode_password(password, password_encoded); 143 aim_encode_password(password, password_encoded);
144 144
145 byte_stream_put32(&frame->data, 0x00000001); /* FLAP Version */ 145 byte_stream_put32(&frame->data, 0x00000001); /* FLAP Version */
146 aim_tlvlist_add_str(&tl, 0x0001, sn); 146 aim_tlvlist_add_str(&tlvlist, 0x0001, sn);
147 aim_tlvlist_add_raw(&tl, 0x0002, passwdlen, password_encoded); 147 aim_tlvlist_add_raw(&tlvlist, 0x0002, passwdlen, password_encoded);
148 148
149 if (ci->clientstring) 149 if (ci->clientstring)
150 aim_tlvlist_add_str(&tl, 0x0003, ci->clientstring); 150 aim_tlvlist_add_str(&tlvlist, 0x0003, ci->clientstring);
151 aim_tlvlist_add_16(&tl, 0x0016, (guint16)ci->clientid); 151 aim_tlvlist_add_16(&tlvlist, 0x0016, (guint16)ci->clientid);
152 aim_tlvlist_add_16(&tl, 0x0017, (guint16)ci->major); 152 aim_tlvlist_add_16(&tlvlist, 0x0017, (guint16)ci->major);
153 aim_tlvlist_add_16(&tl, 0x0018, (guint16)ci->minor); 153 aim_tlvlist_add_16(&tlvlist, 0x0018, (guint16)ci->minor);
154 aim_tlvlist_add_16(&tl, 0x0019, (guint16)ci->point); 154 aim_tlvlist_add_16(&tlvlist, 0x0019, (guint16)ci->point);
155 aim_tlvlist_add_16(&tl, 0x001a, (guint16)ci->build); 155 aim_tlvlist_add_16(&tlvlist, 0x001a, (guint16)ci->build);
156 aim_tlvlist_add_32(&tl, 0x0014, (guint32)ci->distrib); /* distribution chan */ 156 aim_tlvlist_add_32(&tlvlist, 0x0014, (guint32)ci->distrib); /* distribution chan */
157 aim_tlvlist_add_str(&tl, 0x000f, ci->lang); 157 aim_tlvlist_add_str(&tlvlist, 0x000f, ci->lang);
158 aim_tlvlist_add_str(&tl, 0x000e, ci->country); 158 aim_tlvlist_add_str(&tlvlist, 0x000e, ci->country);
159 159
160 aim_tlvlist_write(&frame->data, &tl); 160 aim_tlvlist_write(&frame->data, &tlvlist);
161 161
162 g_free(password_encoded); 162 g_free(password_encoded);
163 aim_tlvlist_free(&tl); 163 aim_tlvlist_free(tlvlist);
164 164
165 flap_connection_send(conn, frame); 165 flap_connection_send(conn, frame);
166 166
167 return 0; 167 return 0;
168 } 168 }
199 */ 199 */
200 int 200 int
201 aim_send_login(OscarData *od, FlapConnection *conn, const char *sn, const char *password, gboolean truncate_pass, ClientInfo *ci, const char *key) 201 aim_send_login(OscarData *od, FlapConnection *conn, const char *sn, const char *password, gboolean truncate_pass, ClientInfo *ci, const char *key)
202 { 202 {
203 FlapFrame *frame; 203 FlapFrame *frame;
204 aim_tlvlist_t *tl = NULL; 204 GSList *tlvlist = NULL;
205 guint8 digest[16]; 205 guint8 digest[16];
206 aim_snacid_t snacid; 206 aim_snacid_t snacid;
207 size_t password_len; 207 size_t password_len;
208 208
209 if (!ci || !sn || !password) 209 if (!ci || !sn || !password)
218 frame = flap_frame_new(od, 0x02, 1152); 218 frame = flap_frame_new(od, 0x02, 1152);
219 219
220 snacid = aim_cachesnac(od, 0x0017, 0x0002, 0x0000, NULL, 0); 220 snacid = aim_cachesnac(od, 0x0017, 0x0002, 0x0000, NULL, 0);
221 aim_putsnac(&frame->data, 0x0017, 0x0002, 0x0000, snacid); 221 aim_putsnac(&frame->data, 0x0017, 0x0002, 0x0000, snacid);
222 222
223 aim_tlvlist_add_str(&tl, 0x0001, sn); 223 aim_tlvlist_add_str(&tlvlist, 0x0001, sn);
224 224
225 /* Truncate ICQ and AOL passwords, if necessary */ 225 /* Truncate ICQ and AOL passwords, if necessary */
226 password_len = strlen(password); 226 password_len = strlen(password);
227 if (isdigit(sn[0]) && (password_len > MAXICQPASSLEN)) 227 if (isdigit(sn[0]) && (password_len > MAXICQPASSLEN))
228 password_len = MAXICQPASSLEN; 228 password_len = MAXICQPASSLEN;
229 else if (truncate_pass && password_len > 8) 229 else if (truncate_pass && password_len > 8)
230 password_len = 8; 230 password_len = 8;
231 231
232 aim_encode_password_md5(password, password_len, key, digest); 232 aim_encode_password_md5(password, password_len, key, digest);
233 233
234 aim_tlvlist_add_raw(&tl, 0x0025, 16, digest); 234 aim_tlvlist_add_raw(&tlvlist, 0x0025, 16, digest);
235 235
236 #ifndef USE_OLD_MD5 236 #ifndef USE_OLD_MD5
237 aim_tlvlist_add_noval(&tl, 0x004c); 237 aim_tlvlist_add_noval(&tlvlist, 0x004c);
238 #endif 238 #endif
239 239
240 if (ci->clientstring) 240 if (ci->clientstring)
241 aim_tlvlist_add_str(&tl, 0x0003, ci->clientstring); 241 aim_tlvlist_add_str(&tlvlist, 0x0003, ci->clientstring);
242 aim_tlvlist_add_16(&tl, 0x0016, (guint16)ci->clientid); 242 aim_tlvlist_add_16(&tlvlist, 0x0016, (guint16)ci->clientid);
243 aim_tlvlist_add_16(&tl, 0x0017, (guint16)ci->major); 243 aim_tlvlist_add_16(&tlvlist, 0x0017, (guint16)ci->major);
244 aim_tlvlist_add_16(&tl, 0x0018, (guint16)ci->minor); 244 aim_tlvlist_add_16(&tlvlist, 0x0018, (guint16)ci->minor);
245 aim_tlvlist_add_16(&tl, 0x0019, (guint16)ci->point); 245 aim_tlvlist_add_16(&tlvlist, 0x0019, (guint16)ci->point);
246 aim_tlvlist_add_16(&tl, 0x001a, (guint16)ci->build); 246 aim_tlvlist_add_16(&tlvlist, 0x001a, (guint16)ci->build);
247 aim_tlvlist_add_32(&tl, 0x0014, (guint32)ci->distrib); 247 aim_tlvlist_add_32(&tlvlist, 0x0014, (guint32)ci->distrib);
248 aim_tlvlist_add_str(&tl, 0x000f, ci->lang); 248 aim_tlvlist_add_str(&tlvlist, 0x000f, ci->lang);
249 aim_tlvlist_add_str(&tl, 0x000e, ci->country); 249 aim_tlvlist_add_str(&tlvlist, 0x000e, ci->country);
250 250
251 /* 251 /*
252 * If set, old-fashioned buddy lists will not work. You will need 252 * If set, old-fashioned buddy lists will not work. You will need
253 * to use SSI. 253 * to use SSI.
254 */ 254 */
255 aim_tlvlist_add_8(&tl, 0x004a, 0x01); 255 aim_tlvlist_add_8(&tlvlist, 0x004a, 0x01);
256 256
257 aim_tlvlist_write(&frame->data, &tl); 257 aim_tlvlist_write(&frame->data, &tlvlist);
258 258
259 aim_tlvlist_free(&tl); 259 aim_tlvlist_free(tlvlist);
260 260
261 flap_connection_send(conn, frame); 261 flap_connection_send(conn, frame);
262 262
263 return 0; 263 return 0;
264 } 264 }
272 * its nonzero, there was an error. 272 * its nonzero, there was an error.
273 */ 273 */
274 static int 274 static int
275 parse(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, ByteStream *bs) 275 parse(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, ByteStream *bs)
276 { 276 {
277 aim_tlvlist_t *tlvlist; 277 GSList *tlvlist;
278 aim_rxcallback_t userfunc; 278 aim_rxcallback_t userfunc;
279 struct aim_authresp_info *info; 279 struct aim_authresp_info *info;
280 int ret = 0; 280 int ret = 0;
281 281
282 info = g_new0(struct aim_authresp_info, 1); 282 info = g_new0(struct aim_authresp_info, 1);
400 od->authinfo = info; 400 od->authinfo = info;
401 401
402 if ((userfunc = aim_callhandler(od, snac ? snac->family : 0x0017, snac ? snac->subtype : 0x0003))) 402 if ((userfunc = aim_callhandler(od, snac ? snac->family : 0x0017, snac ? snac->subtype : 0x0003)))
403 ret = userfunc(od, conn, frame, info); 403 ret = userfunc(od, conn, frame, info);
404 404
405 aim_tlvlist_free(&tlvlist); 405 aim_tlvlist_free(tlvlist);
406 406
407 return ret; 407 return ret;
408 } 408 }
409 409
410 #ifdef USE_XOR_FOR_ICQ 410 #ifdef USE_XOR_FOR_ICQ
469 int 469 int
470 aim_request_login(OscarData *od, FlapConnection *conn, const char *sn) 470 aim_request_login(OscarData *od, FlapConnection *conn, const char *sn)
471 { 471 {
472 FlapFrame *frame; 472 FlapFrame *frame;
473 aim_snacid_t snacid; 473 aim_snacid_t snacid;
474 aim_tlvlist_t *tl = NULL; 474 GSList *tlvlist = NULL;
475 475
476 if (!od || !conn || !sn) 476 if (!od || !conn || !sn)
477 return -EINVAL; 477 return -EINVAL;
478 478
479 #ifdef USE_XOR_FOR_ICQ 479 #ifdef USE_XOR_FOR_ICQ
484 frame = flap_frame_new(od, 0x02, 10+2+2+strlen(sn)+8); 484 frame = flap_frame_new(od, 0x02, 10+2+2+strlen(sn)+8);
485 485
486 snacid = aim_cachesnac(od, 0x0017, 0x0006, 0x0000, NULL, 0); 486 snacid = aim_cachesnac(od, 0x0017, 0x0006, 0x0000, NULL, 0);
487 aim_putsnac(&frame->data, 0x0017, 0x0006, 0x0000, snacid); 487 aim_putsnac(&frame->data, 0x0017, 0x0006, 0x0000, snacid);
488 488
489 aim_tlvlist_add_str(&tl, 0x0001, sn); 489 aim_tlvlist_add_str(&tlvlist, 0x0001, sn);
490 490
491 /* Tell the server we support SecurID logins. */ 491 /* Tell the server we support SecurID logins. */
492 aim_tlvlist_add_noval(&tl, 0x004b); 492 aim_tlvlist_add_noval(&tlvlist, 0x004b);
493 493
494 /* Unknown. Sent in recent WinAIM clients.*/ 494 /* Unknown. Sent in recent WinAIM clients.*/
495 aim_tlvlist_add_noval(&tl, 0x005a); 495 aim_tlvlist_add_noval(&tlvlist, 0x005a);
496 496
497 aim_tlvlist_write(&frame->data, &tl); 497 aim_tlvlist_write(&frame->data, &tlvlist);
498 aim_tlvlist_free(&tl); 498 aim_tlvlist_free(tlvlist);
499 499
500 flap_connection_send(conn, frame); 500 flap_connection_send(conn, frame);
501 501
502 return 0; 502 return 0;
503 } 503 }
515 keyparse(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, ByteStream *bs) 515 keyparse(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, ByteStream *bs)
516 { 516 {
517 int keylen, ret = 1; 517 int keylen, ret = 1;
518 aim_rxcallback_t userfunc; 518 aim_rxcallback_t userfunc;
519 char *keystr; 519 char *keystr;
520 aim_tlvlist_t *tlvlist; 520 GSList *tlvlist;
521 gboolean truncate_pass; 521 gboolean truncate_pass;
522 522
523 keylen = byte_stream_get16(bs); 523 keylen = byte_stream_get16(bs);
524 keystr = byte_stream_getstr(bs, keylen); 524 keystr = byte_stream_getstr(bs, keylen);
525 tlvlist = aim_tlvlist_read(bs); 525 tlvlist = aim_tlvlist_read(bs);
537 537
538 if ((userfunc = aim_callhandler(od, snac->family, snac->subtype))) 538 if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
539 ret = userfunc(od, conn, frame, keystr, (int)truncate_pass); 539 ret = userfunc(od, conn, frame, keystr, (int)truncate_pass);
540 540
541 g_free(keystr); 541 g_free(keystr);
542 aim_tlvlist_free(&tlvlist); 542 aim_tlvlist_free(tlvlist);
543 543
544 return ret; 544 return ret;
545 } 545 }
546 546
547 /** 547 /**

mercurial