No release numbers
------------------
+ - Thu Dec 14 03:39:34 UTC 2000
+ - Change the 0x01 to a 0x00 in auth request to make buddy lists work again
+ - Rearrange bytes in setversions() to match winaim
+ - Add several cachesnac() calls
+ - Add hostonline and hostversions parsers (superfluous)
+
- Wed Dec 13 02:26:39 UTC 2000
- Create aim_cachesnac()
- Some long overdue cleanups
curbyte += aim_puttlv_32(newpacket->data+curbyte, 0x0014, clientinfo->unknown);
curbyte += aim_puttlv_16(newpacket->data+curbyte, 0x0009, 0x0015);
- curbyte += aim_puttlv_8(newpacket->data+curbyte, 0x004a, 0x01);
+ curbyte += aim_puttlv_8(newpacket->data+curbyte, 0x004a, 0x00);
} else {
/* Use very specific version numbers, to further indicate the hack. */
curbyte += aim_puttlv_16(newpacket->data+curbyte, 0x0016, 0x010a);
newpacket->lock = 1;
i = aim_putsnac(newpacket->data, 0x0001, 0x0017, 0x0000, sess->snac_nextid);
+ aim_cachesnac(sess, 0x0001, 0x0017, 0x0000, NULL, 0);
i += aimutil_put16(newpacket->data+i, 0x0001);
i += aimutil_put16(newpacket->data+i, 0x0003);
+ i += aimutil_put16(newpacket->data+i, 0x0013);
+ i += aimutil_put16(newpacket->data+i, 0x0001);
+
i += aimutil_put16(newpacket->data+i, 0x0002);
i += aimutil_put16(newpacket->data+i, 0x0001);
i += aimutil_put16(newpacket->data+i, 0x0001);
i += aimutil_put16(newpacket->data+i, 0x000b);
- i += aimutil_put16(newpacket->data+i, 0x0002);
-
- i += aimutil_put16(newpacket->data+i, 0x000c);
i += aimutil_put16(newpacket->data+i, 0x0001);
- i += aimutil_put16(newpacket->data+i, 0x0013);
- i += aimutil_put16(newpacket->data+i, 0x0001);
-
- i += aimutil_put16(newpacket->data+i, 0x0015);
+ i += aimutil_put16(newpacket->data+i, 0x000c);
i += aimutil_put16(newpacket->data+i, 0x0001);
-#if 0
- for (j = 0; j < 0x10; j++) {
- i += aimutil_put16(newpacket->data+i, j); /* family */
- i += aimutil_put16(newpacket->data+i, 0x0003); /* version */
- }
-#endif
-
newpacket->commandlen = i;
newpacket->lock = 0;
aim_tx_enqueue(sess, newpacket);
- return (sess->snac_nextid++);
+ return sess->snac_nextid;
}
newpacket->lock = 1;
aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid);
-
+
+ aim_cachesnac(sess, family, subtype, 0x0000, NULL, 0);
+
aim_tx_enqueue(sess, newpacket);
- return (sess->snac_nextid++);
+ return sess->snac_nextid;
}
/*
newpacket->lock = 1;
aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid);
+ aim_cachesnac(sess, family, subtype, 0x0000, NULL, 0);
/* copy in data */
newlong = htonl(*longdata);
memcpy(&(newpacket->data[10]), &newlong, sizeof(u_long));
aim_tx_enqueue(sess, newpacket);
- return (sess->snac_nextid++);
+ return sess->snac_nextid;
}
faim_internal unsigned long aim_genericreq_s(struct aim_session_t *sess,
newpacket->lock = 1;
aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid);
+ aim_cachesnac(sess, family, subtype, 0x0000, NULL, 0);
/* copy in data */
newshort = htons(*shortdata);
memcpy(&(newpacket->data[10]), &newshort, sizeof(u_short));
aim_tx_enqueue(sess, newpacket);
- return (sess->snac_nextid++);
+ return sess->snac_nextid;
}
/*
newpacket->lock = 1;
i = aim_putsnac(newpacket->data, 0x0004, 0x0002, 0x0000, sess->snac_nextid);
+ aim_cachesnac(sess, 0x0004, 0x0002, 0x0000, NULL, 0);
+
i += aimutil_put16(newpacket->data+i, 0x0000);
i += aimutil_put16(newpacket->data+i, 0x0000);
i += aimutil_put16(newpacket->data+i, 0x0003);
aim_tx_enqueue(sess, newpacket);
- return (sess->snac_nextid);
+ return sess->snac_nextid;
}
/*
else
workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0017, 0xffff, workingPtr);
break;
- case 0x0007:
- if (subtype == 0x0005)
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_ADM, AIM_CB_ADM_INFOCHANGE_REPLY, workingPtr);
- break;
- case AIM_CB_FAM_SPECIAL:
- if (subtype == AIM_CB_SPECIAL_DEBUGCONN_CONNECT) {
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, family, subtype, workingPtr);
- break;
- } /* others fall through */
- default:
-#if 0
- /* Old login protocol */
- /* any user callbacks will be called from here */
- workingPtr->handled = aim_authparse(sess, workingPtr);
-#endif
+ case 0x0001:
+ if (subtype == 0x0003)
+ workingPtr->handled = aim_parse_hostonline(sess, workingPtr);
+ else
+ workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0017, 0xffff, workingPtr);
+ break;
+ case 0x0007:
+ if (subtype == 0x0005)
+ workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_ADM, AIM_CB_ADM_INFOCHANGE_REPLY, workingPtr);
+ break;
+ case AIM_CB_FAM_SPECIAL:
+ if (subtype == AIM_CB_SPECIAL_DEBUGCONN_CONNECT) {
+ workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, family, subtype, workingPtr);
+ break;
+ } else
+ workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0017, 0xffff, workingPtr);
+ break;
+ default:
break;
}
}
workingPtr->handled = aim_parse_generalerrs(sess, workingPtr);
break;
case 0x0003:
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0003, workingPtr);
+ workingPtr->handled = aim_parse_hostonline(sess, workingPtr);
break;
case 0x0005:
workingPtr->handled = aim_handleredirect_middle(sess, workingPtr);
case 0x0013:
workingPtr->handled = aim_parsemotd_middle(sess, workingPtr);
break;
+ case 0x0018:
+ workingPtr->handled = aim_parse_hostversions(sess, workingPtr);
+ break;
default:
workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_GEN, AIM_CB_GEN_DEFAULT, workingPtr);
break;
if ((family == 0x0000) && (subtype == 0x00001)) {
workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_FLAPVER, workingPtr);
+ } else if ((family == 0x0001) && (subtype == 0x0003)) {
+ workingPtr->handled = aim_parse_hostonline(sess, workingPtr);
} else if ((family == 0x000d) && (subtype == 0x0009)) {
workingPtr->handled = aim_chatnav_parse_info(sess, workingPtr);
} else {
if (subtype == 0x0001)
workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0001, workingPtr);
else if (subtype == 0x0003)
- workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0003, workingPtr);
+ workingPtr->handled = aim_parse_hostonline(sess, workingPtr);
else if (subtype == 0x0007)
workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0007, workingPtr);
else
return ret;
}
+faim_internal int aim_parse_hostonline(struct aim_session_t *sess,
+ struct command_rx_struct *command, ...)
+{
+ rxcallback_t userfunc = NULL;
+ int ret = 1;
+ unsigned short *families = NULL;
+ int famcount = 0, i;
+
+ famcount = (command->commandlen-10)/2;
+ if (!(families = malloc(command->commandlen-10)))
+ return ret;
+
+ for (i = 0; i < famcount; i++)
+ families[i] = aimutil_get16(command->data+((i*2)+10));
+
+ if ((userfunc = aim_callhandler(command->conn, 0x0001, 0x0003)))
+ ret = userfunc(sess, command, famcount, families);
+
+ free(families);
+
+ return ret;
+}
+
+faim_internal int aim_parse_hostversions(struct aim_session_t *sess,
+ struct command_rx_struct *command, ...)
+{
+ rxcallback_t userfunc = NULL;
+ int ret = 1;
+ int vercount;
+
+ vercount = (command->commandlen-10)/4;
+
+ if ((userfunc = aim_callhandler(command->conn, 0x0001, 0x0018)))
+ ret = userfunc(sess, command, vercount, command->data+10);
+
+ return ret;
+}
+
faim_internal int aim_handleredirect_middle(struct aim_session_t *sess,
- struct command_rx_struct *command, ...)
+ struct command_rx_struct *command, ...)
{
int serviceid = 0;
unsigned char *cookie = NULL;
faim_export int aim_tx_flushqueue(struct aim_session_t *);
faim_internal int aim_tx_printqueue(struct aim_session_t *);
faim_export void aim_tx_purgequeue(struct aim_session_t *);
+faim_internal int aim_parse_hostonline(struct aim_session_t *sess, struct command_rx_struct *command, ...);
+faim_internal int aim_parse_hostversions(struct aim_session_t *sess, struct command_rx_struct *command, ...);
+
struct aim_rxcblist_t {
u_short family;
int faimtest_authsvrready(struct aim_session_t *, struct command_rx_struct *command, ...);
int faimtest_pwdchngdone(struct aim_session_t *, struct command_rx_struct *command, ...);
int faimtest_serverready(struct aim_session_t *, struct command_rx_struct *command, ...);
+int faimtest_hostversions(struct aim_session_t *sess, struct command_rx_struct *command, ...);
int faimtest_parse_misses(struct aim_session_t *, struct command_rx_struct *command, ...);
int faimtest_parse_msgack(struct aim_session_t *, struct command_rx_struct *command, ...);
int faimtest_parse_motd(struct aim_session_t *, struct command_rx_struct *command, ...);
static int msgerrreasonslen = 25;
static char *screenname,*password,*server=NULL;
+static int connected = 0;
int faimtest_reportinterval(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
switch(command->conn->type) {
case AIM_CONN_TYPE_BOS: {
/* this is the new buddy list */
- char buddies[] = "Buddy1&Buddy2&ThisHereIsAName2&";
+ char buddies[] = "Buddy1&Buddy2&ThisHereIsAName2&midendian&ewarmenhoven&";
/* this is the new profile */
char profile[] = "Hello";
return 1;
}
+int faimtest_hostversions(struct aim_session_t *sess, struct command_rx_struct *command, ...)
+{
+ int vercount, i;
+ unsigned char *versions;
+ va_list ap;
+
+ va_start(ap, command);
+ vercount = va_arg(ap, int); /* number of family/version pairs */
+ versions = va_arg(ap, unsigned char *);
+ va_end(ap);
+
+ printf("faimtest: SNAC versions supported by this host: ");
+ for (i = 0; i < vercount*4; i += 4)
+ printf("0x%04x:0x%04x ",
+ aimutil_get16(versions+i), /* SNAC family */
+ aimutil_get16(versions+i+2) /* Version number */);
+ printf("\n");
+
+ return 1;
+}
+
int faimtest_serverready(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- switch (command->conn->type)
- {
- case AIM_CONN_TYPE_BOS:
+ int famcount, i;
+ unsigned short *families;
+ va_list ap;
- aim_setversions(sess, command->conn);
- aim_bos_reqrate(sess, command->conn); /* request rate info */
+ va_start(ap, command);
+ famcount = va_arg(ap, int);
+ families = va_arg(ap, unsigned short *);
+ va_end(ap);
- fprintf(stderr, "faimtest: done with BOS ServerReady\n");
- break;
+ printf("faimtest: SNAC families supported by this host (type %d): ", command->conn->type);
+ for (i = 0; i < famcount; i++)
+ printf("0x%04x ", families[i]);
+ printf("\n");
- case AIM_CONN_TYPE_CHATNAV:
- fprintf(stderr, "faimtest: chatnav: got server ready\n");
- aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CTN, AIM_CB_CTN_INFO, faimtest_chatnav_info, 0);
- aim_bos_reqrate(sess, command->conn);
- aim_bos_ackrateresp(sess, command->conn);
- aim_chatnav_clientready(sess, command->conn);
- aim_chatnav_reqrights(sess, command->conn);
+ switch (command->conn->type) {
+ case AIM_CONN_TYPE_BOS:
- break;
- case AIM_CONN_TYPE_CHAT:
- aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERJOIN, faimtest_chat_join, 0);
- aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERLEAVE, faimtest_chat_leave, 0);
- aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_ROOMINFOUPDATE, faimtest_chat_infoupdate, 0);
- aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, faimtest_chat_incomingmsg, 0);
- aim_bos_reqrate(sess, command->conn);
- aim_bos_ackrateresp(sess, command->conn);
- aim_chat_clientready(sess, command->conn);
- break;
+ aim_setversions(sess, command->conn);
+ aim_bos_reqrate(sess, command->conn); /* request rate info */
- case AIM_CONN_TYPE_RENDEZVOUS: /* empty */
- break;
+ fprintf(stderr, "faimtest: done with BOS ServerReady\n");
+ break;
+
+ case AIM_CONN_TYPE_CHATNAV:
+ fprintf(stderr, "faimtest: chatnav: got server ready\n");
+ aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CTN, AIM_CB_CTN_INFO, faimtest_chatnav_info, 0);
+ aim_bos_reqrate(sess, command->conn);
+ aim_bos_ackrateresp(sess, command->conn);
+ aim_chatnav_clientready(sess, command->conn);
+ aim_chatnav_reqrights(sess, command->conn);
+
+ break;
+
+ case AIM_CONN_TYPE_CHAT:
+ aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERJOIN, faimtest_chat_join, 0);
+ aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERLEAVE, faimtest_chat_leave, 0);
+ aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_ROOMINFOUPDATE, faimtest_chat_infoupdate, 0);
+ aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, faimtest_chat_incomingmsg, 0);
+ aim_bos_reqrate(sess, command->conn);
+ aim_bos_ackrateresp(sess, command->conn);
+ aim_chat_clientready(sess, command->conn);
+ break;
+
+ case AIM_CONN_TYPE_RENDEZVOUS: /* empty */
+ break;
+
+ default:
+ fprintf(stderr, "faimtest: unknown connection type on Server Ready\n");
+ }
- default:
- fprintf(stderr, "faimtest: unknown connection type on Server Ready\n");
- }
return 1;
}
if ( (tstconn==NULL) || (tstconn->status & AIM_CONN_STATUS_RESOLVERR) )
fprintf(stderr, "faimtest: unable to reconnect with authorizer\n");
else {
+ aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_FLAPVER, faimtest_flapversion, 0);
aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNCOMPLETE, faimtest_conncomplete, 0);
/* Send the cookie to the Auth */
aim_auth_sendcookie(sess, tstconn, cookie);
aim_conn_addhandler(sess, bosconn, 0x0009, 0x0003, faimtest_bosrights, 0);
aim_conn_addhandler(sess, bosconn, 0x0001, 0x0007, faimtest_rateresp, 0); /* rate info */
aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ACK, AIM_CB_ACK_ACK, NULL, 0);
+ aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, 0x0018, faimtest_hostversions, 0);
aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_SERVERREADY, faimtest_serverready, 0);
aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATEINFO, NULL, 0);
aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_REDIRECT, faimtest_handleredirect, 0);
} else if (!strncmp(tmpstr, "open directim", 13)) {
struct aim_conn_t *newconn;
newconn = aim_directim_initiate(sess, command->conn, NULL, userinfo->sn);
+ } else if (!strncmp(tmpstr, "openauth", 8)) {
+ aim_bos_reqservice(sess, command->conn, AIM_CONN_TYPE_AUTH);
+ } else if (!strncmp(tmpstr, "auth", 4)) {
+ aim_genericreq_n(sess, aim_getconn_type(sess, AIM_CONN_TYPE_AUTH), 0x0007, 0x0002);
} else if (!strncmp(tmpstr, "reqsendmsg", 10)) {
aim_send_im(sess, command->conn, "vaxherder", 0, "sendmsg 7900");
} else if (!strncmp(tmpstr, "sendmsg", 7)) {
userinfo = va_arg(ap, struct aim_userinfo_s *);
va_end(ap);
- printf("\n%s is now online (flags: %04x = %s%s%s%s%s%s%s%s) (caps = 0x%04x)\n",
+ printf("%ld %s is now online (flags: %04x = %s%s%s%s%s%s%s%s) (caps = 0x%04x)\n",
+ time(NULL),
userinfo->sn, userinfo->flags,
(userinfo->flags&AIM_FLAG_UNCONFIRMED)?" UNCONFIRMED":"",
(userinfo->flags&AIM_FLAG_ADMINISTRATOR)?" ADMINISTRATOR":"",
printf("faimtest: motd: %s (%d / %s)\n", msg, id,
(id < codeslen)?codes[id]:"unknown");
+ if (!connected)
+ connected++;
+
return 1;
}