X-Git-Url: http://andersk.mit.edu/gitweb/libfaim.git/blobdiff_plain/5ac21963e7e99cbffce3b0bb009a1320885776c7..ee49b735a9cbcb7b15f86e0e3dc69118ba2a4607:/aim_info.c diff --git a/aim_info.c b/aim_info.c index 4f53747..396ddb9 100644 --- a/aim_info.c +++ b/aim_info.c @@ -10,7 +10,7 @@ #include struct aim_priv_inforeq { - char sn[MAXSNLEN]; + char sn[MAXSNLEN+1]; unsigned short infotype; }; @@ -20,6 +20,7 @@ faim_export unsigned long aim_getinfo(struct aim_session_t *sess, unsigned short infotype) { struct command_tx_struct *newpacket; + struct aim_priv_inforeq privdata; int i = 0; if (!sess || !conn || !sn) @@ -39,22 +40,11 @@ faim_export unsigned long aim_getinfo(struct aim_session_t *sess, newpacket->lock = 0; aim_tx_enqueue(sess, newpacket); - { - struct aim_snac_t snac; - - snac.id = sess->snac_nextid; - snac.family = 0x0002; - snac.type = 0x0005; - snac.flags = 0x0000; - - snac.data = malloc(sizeof(struct aim_priv_inforeq)); - strcpy(((struct aim_priv_inforeq *)snac.data)->sn, sn); - ((struct aim_priv_inforeq *)snac.data)->infotype = infotype; + strncpy(privdata.sn, sn, sizeof(privdata.sn)); + privdata.infotype = infotype; + aim_cachesnac(sess, 0x0002, 0x0005, 0x0000, &privdata, sizeof(struct aim_priv_inforeq)); - aim_newsnac(sess, &snac); - } - - return (sess->snac_nextid++); + return sess->snac_nextid; } faim_internal int aim_parse_locateerr(struct aim_session_t *sess, @@ -259,7 +249,7 @@ faim_internal int aim_extractuserinfo(u_char *buf, struct aim_userinfo_s *outinf break; /* - * Type = 0x0001: Member Class. + * Type = 0x0001: User flags * * Specified as any of the following bitwise ORed together: * 0x0001 Trial (user less than 60days) @@ -277,7 +267,7 @@ faim_internal int aim_extractuserinfo(u_char *buf, struct aim_userinfo_s *outinf case 0x0001: if (tlv1) /* use only the first */ break; - outinfo->class = aimutil_get16(&buf[i+4]); + outinfo->flags = aimutil_get16(&buf[i+4]); tlv1++; break; @@ -313,6 +303,37 @@ faim_internal int aim_extractuserinfo(u_char *buf, struct aim_userinfo_s *outinf outinfo->idletime = aimutil_get16(&buf[i+4]); break; + /* + * Type = 0x0006: ICQ Online Status + * + * ICQ's Away/DND/etc "enriched" status + * Some decoding of values done by Scott + */ + case 0x0006: + outinfo->icqinfo.status = aimutil_get16(buf+i+2+2+2); + break; + + + /* + * Type = 0x000a + * + * ICQ User IP Address. + * Ahh, the joy of ICQ security. + */ + case 0x000a: + outinfo->icqinfo.ipaddr = aimutil_get32(&buf[i+4]); + break; + + /* Type = 0x000c + * + * random crap containing the IP address, + * apparently a port number, and some Other Stuff. + * + */ + case 0x000c: + memcpy(outinfo->icqinfo.crap, &buf[i+4], 0x25); + break; + /* * Type = 0x000d * @@ -550,7 +571,7 @@ faim_internal int aim_parse_userinfo_middle(struct aim_session_t *sess, */ faim_internal int aim_putuserinfo(u_char *buf, int buflen, struct aim_userinfo_s *info) { - int i = 0; + int i = 0, numtlv = 0; struct aim_tlvlist_t *tlvlist = NULL; if (!buf || !info) @@ -561,18 +582,36 @@ faim_internal int aim_putuserinfo(u_char *buf, int buflen, struct aim_userinfo_s i += aimutil_put16(buf+i, info->warnlevel); - /* XXX: we only put down five */ - i += aimutil_put16(buf+i, 5); - aim_addtlvtochain16(&tlvlist, 0x0001, info->class); + + aim_addtlvtochain16(&tlvlist, 0x0001, info->flags); + numtlv++; + aim_addtlvtochain32(&tlvlist, 0x0002, info->membersince); + numtlv++; + aim_addtlvtochain32(&tlvlist, 0x0003, info->onlinesince); + numtlv++; + aim_addtlvtochain16(&tlvlist, 0x0004, info->idletime); - /* XXX: should put caps here */ - aim_addtlvtochain32(&tlvlist, (unsigned short)((info->class)&AIM_CLASS_AOL?0x0010:0x000f), info->sessionlen); - - i += aim_writetlvchain(buf+i, buflen-i, &tlvlist); + numtlv++; + +#if ICQ_OSCAR_SUPPORT + if(atoi(info->sn) != 0) { + aim_addtlvtochain16(&tlvlist, 0x0006, info->icqinfo.status); + aim_addtlvtochain32(&tlvlist, 0x000a, info->icqinfo.ipaddr); + } +#endif + + aim_addtlvtochain_caps(&tlvlist, 0x000d, info->capabilities); + numtlv++; + + aim_addtlvtochain32(&tlvlist, (unsigned short)((info->flags)&AIM_FLAG_AOL?0x0010:0x000f), info->sessionlen); + numtlv++; + + i += aimutil_put16(buf+i, numtlv); /* tlvcount */ + i += aim_writetlvchain(buf+i, buflen-i, &tlvlist); /* tlvs */ aim_freetlvchain(&tlvlist); - + return i; }