X-Git-Url: http://andersk.mit.edu/gitweb/libfaim.git/blobdiff_plain/e80a0fa9198d4acd23acebd7e1bd5f6113b469bb..001c9b80011b5cb7de24a181916e939863951234:/utils/faimtest/faimtest.c diff --git a/utils/faimtest/faimtest.c b/utils/faimtest/faimtest.c index 2875afc..b5d9076 100644 --- a/utils/faimtest/faimtest.c +++ b/utils/faimtest/faimtest.c @@ -75,7 +75,7 @@ static char *dprintf_ctime(void) int faimtest_parse_oncoming(struct aim_session_t *, struct command_rx_struct *, ...); int faimtest_parse_offgoing(struct aim_session_t *, struct command_rx_struct *, ...); int faimtest_parse_login_phase3d_f(struct aim_session_t *, struct command_rx_struct *, ...); -int faimtest_parse_authresp(struct aim_session_t *, struct command_rx_struct *, ...); +static int faimtest_parse_authresp(struct aim_session_t *, struct command_rx_struct *, ...); int faimtest_parse_incoming_im(struct aim_session_t *, struct command_rx_struct *command, ...); int faimtest_parse_userinfo(struct aim_session_t *, struct command_rx_struct *command, ...); int faimtest_handleredirect(struct aim_session_t *, struct command_rx_struct *command, ...); @@ -148,6 +148,7 @@ static char *msgerrreasons[] = { "Not while on AOL"}; static int msgerrreasonslen = 25; +static char *aimbinarypath = NULL; static char *screenname,*password,*server=NULL; static char *proxy = NULL, *proxyusername = NULL, *proxypass = NULL; static char *ohcaptainmycaptain = NULL; @@ -259,7 +260,7 @@ int logout(void) { if (ohcaptainmycaptain) - aim_send_im(&aimsess, aim_getconn_type(&aimsess, AIM_CONN_TYPE_BOS), ohcaptainmycaptain, 0, "ta ta..."); + aim_send_im(&aimsess, aim_getconn_type(&aimsess, AIM_CONN_TYPE_BOS), ohcaptainmycaptain, 0, "ta ta...", strlen("ta ta...")); aim_session_kill(&aimsess); @@ -319,6 +320,8 @@ int main(int argc, char **argv) int i; int selstat = 0; static int faimtest_mode = 0; + struct timeval tv; + time_t lastnop = 0; screenname = getenv("SCREENNAME"); password = getenv("PASSWORD"); @@ -329,7 +332,7 @@ int main(int argc, char **argv) listingpath = getenv("LISTINGPATH"); - while ((i = getopt(argc, argv, "u:p:a:U:P:A:l:c:hoO")) != EOF) { + while ((i = getopt(argc, argv, "u:p:a:U:P:A:l:c:hoOb:")) != EOF) { switch (i) { case 'u': screenname = optarg; break; case 'p': password = optarg; break; @@ -341,6 +344,7 @@ int main(int argc, char **argv) case 'c': ohcaptainmycaptain = optarg; break; case 'o': faimtest_mode = 1; break; /* half old interface */ case 'O': faimtest_mode = 2; break; /* full old interface */ + case 'b': aimbinarypath = optarg; break; case 'h': default: printf("faimtest\n"); @@ -398,12 +402,21 @@ int main(int argc, char **argv) } while (keepgoing) { - waitingconn = aim_select(&aimsess, NULL, &selstat); + + tv.tv_sec = 5; + tv.tv_usec = 0; + + waitingconn = aim_select(&aimsess, &tv, &selstat); + + if (connected && ((time(NULL) - lastnop) > 30)) { + lastnop = time(NULL); + aim_flap_nop(&aimsess, aim_getconn_type(&aimsess, AIM_CONN_TYPE_BOS)); + } if (selstat == -1) { /* error */ keepgoing = 0; /* fall through */ } else if (selstat == 0) { /* no events pending */ - keepgoing = 0; + ; } else if (selstat == 1) { /* outgoing data pending */ aim_tx_flushqueue(&aimsess); } else if (selstat == 2) { /* incoming data pending */ @@ -784,7 +797,106 @@ int faimtest_handleredirect(struct aim_session_t *sess, struct command_rx_struct return 1; } -int faimtest_parse_authresp(struct aim_session_t *sess, struct command_rx_struct *command, ...) +static int getaimdata(unsigned char *buf, int buflen, unsigned long offset, const char *modname) +{ + FILE *f; + static const char defaultmod[] = "aim.exe"; + char *filename = NULL; + + memset(buf, 0, buflen); + + if (modname) { + + if (!(filename = malloc(strlen(aimbinarypath)+1+strlen(modname)+4+1))) { + dperror("memrequest: malloc"); + return -1; + } + + sprintf(filename, "%s/%s.ocm", aimbinarypath, modname); + + } else { + + if (!(filename = malloc(strlen(aimbinarypath)+1+strlen(defaultmod)+1))) { + dperror("memrequest: malloc"); + return -1; + } + + sprintf(filename, "%s/%s", aimbinarypath, defaultmod); + + } + + dvprintf("memrequest: loading %d bytes from 0x%08lx in \"%s\"...\n", buflen, offset, filename); + + if (!(f = fopen(filename, "r"))) { + dperror("memrequest: fopen"); + free(filename); + return -1; + } + + free(filename); + + if (buflen) { + if (fseek(f, offset, SEEK_SET) == -1) { + dperror("memrequest: fseek"); + fclose(f); + return -1; + } + + if (fread(buf, buflen, 1, f) != 1) { + dperror("memrequest: fread"); + fclose(f); + return -1; + } + } + + fclose(f); + + return buflen; +} + +/* + * This will get an offset and a length. The client should read this + * data out of whatever AIM.EXE binary the user has provided (hopefully + * it matches the client information thats sent at login) and pass a + * buffer back to libfaim so it can hash the data and send it to AOL for + * inspection by the client police. + */ +static int faimtest_memrequest(struct aim_session_t *sess, struct command_rx_struct *command, ...) +{ + va_list ap; + unsigned long offset, len; + unsigned char *buf; + char *modname; + + va_start(ap, command); + offset = va_arg(ap, unsigned long); + len = va_arg(ap, unsigned long); + modname = va_arg(ap, char *); + va_end(ap); + + if (!(buf = malloc(len))) { + dperror("memrequest: malloc"); + return 0; + } + + if (aimbinarypath && (getaimdata(buf, len, offset, modname) == len)) { + + aim_sendmemblock(sess, command->conn, offset, len, buf); + + } else { + + dvprintf("memrequest: unable to use AIM binary (\"%s/%s\"), sending defaults...\n", aimbinarypath, modname); + + aim_sendmemblock(sess, command->conn, offset, len, NULL); + + } + + free(buf); + + return 1; +} + +static int faimtest_parse_authresp(struct aim_session_t *sess, struct command_rx_struct *command, ...) { va_list ap; struct aim_conn_t *bosconn = NULL; @@ -881,7 +993,8 @@ int faimtest_parse_authresp(struct aim_session_t *sess, struct command_rx_struct aim_conn_addhandler(sess, bosconn, 0x0009, 0x0001, faimtest_parse_genericerr, 0); aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, faimtest_parse_connerr, 0); - + aim_conn_addhandler(sess, bosconn, 0x0001, 0x001f, faimtest_memrequest, 0); + aim_conn_addhandler(sess, bosconn, 0xffff, 0xffff, faimtest_parse_unknown, 0); aim_auth_sendcookie(sess, bosconn, cookie); @@ -955,7 +1068,7 @@ static int faimtest_handlecmd(struct aim_session_t *sess, struct command_rx_stru } else if (strstr(tmpstr, "goodday")) { - aim_send_im(sess, command->conn, userinfo->sn, AIM_IMFLAGS_ACK, "Good day to you too."); + aim_send_im(sess, command->conn, userinfo->sn, AIM_IMFLAGS_ACK, "Good day to you too.", strlen("Good day to you too.")); } else if (strstr(tmpstr, "warnme")) { @@ -981,7 +1094,7 @@ static int faimtest_handlecmd(struct aim_session_t *sess, struct command_rx_stru if (!ohcaptainmycaptain) { - aim_send_im(sess, command->conn, userinfo->sn, AIM_IMFLAGS_ACK, "I have no owner!"); + aim_send_im(sess, command->conn, userinfo->sn, AIM_IMFLAGS_ACK, "I have no owner!", strlen("I have no owner!")); } else { struct aim_conn_t *newconn; @@ -1035,7 +1148,7 @@ static int faimtest_handlecmd(struct aim_session_t *sess, struct command_rx_stru } else if (!strncmp(tmpstr, "reqsendmsg", 10)) { - aim_send_im(sess, command->conn, ohcaptainmycaptain, 0, "sendmsg 7900"); + aim_send_im(sess, command->conn, ohcaptainmycaptain, 0, "sendmsg 7900", strlen("sendmsg 7900")); } else if (!strncmp(tmpstr, "reqauth", 7)) { @@ -1069,7 +1182,7 @@ static int faimtest_handlecmd(struct aim_session_t *sess, struct command_rx_stru newbuf[z] = (z % 10)+0x30; } newbuf[i] = '\0'; - aim_send_im(sess, command->conn, userinfo->sn, 0, newbuf); + aim_send_im(sess, command->conn, userinfo->sn, 0, newbuf, strlen(newbuf)); free(newbuf); } @@ -1472,15 +1585,25 @@ int faimtest_parse_oncoming(struct aim_session_t *sess, struct command_rx_struct int faimtest_parse_offgoing(struct aim_session_t *sess, struct command_rx_struct *command, ...) { - char *sn; + struct aim_userinfo_s *userinfo; + va_list ap; - va_start(ap, command); - sn = va_arg(ap, char *); + userinfo = va_arg(ap, struct aim_userinfo_s *); va_end(ap); - dvprintf("\n%s has left\n", sn); - + dvprintf("%ld %s is now offline (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":"", + (userinfo->flags&AIM_FLAG_AOL)?" AOL":"", + (userinfo->flags&AIM_FLAG_OSCAR_PAY)?" OSCAR_PAY":"", + (userinfo->flags&AIM_FLAG_FREE)?" FREE":"", + (userinfo->flags&AIM_FLAG_AWAY)?" AWAY":"", + (userinfo->flags&AIM_FLAG_UNKNOWN40)?" UNKNOWN40":"", + (userinfo->flags&AIM_FLAG_UNKNOWN80)?" UNKNOWN80":"", + userinfo->capabilities); return 1; } @@ -1518,10 +1641,6 @@ int faimtest_parse_motd(struct aim_session_t *sess, struct command_rx_struct *co aim_0002_000b(sess, command->conn, sess->sn); #endif - /* As of 26 Mar 2001 you need to send this to keep from getting kicked off */ - aim_0001_0020(sess, command->conn); - - return 1; } @@ -1715,7 +1834,7 @@ int faimtest_chat_incomingmsg(struct aim_session_t *sess, struct command_rx_stru if (strcmp(userinfo->sn, sess->sn) != 0) { sprintf(tmpbuf, "(%s said \"%s\")", userinfo->sn, msg); - aim_chat_send_im(sess, command->conn, tmpbuf); + aim_chat_send_im(sess, command->conn, 0, tmpbuf, strlen(tmpbuf)); } return 1; @@ -1797,6 +1916,8 @@ int faimtest_parse_connerr(struct aim_session_t *sess, struct command_rx_struct dvprintf("faimtest: connerr: Code 0x%04x: %s\n", code, msg); aim_conn_kill(sess, &command->conn); /* this will break the main loop */ + connected = 0; + return 1; }