Mercurial > pidgin.yaz
diff libfaim/aim_login.c @ 2:68b230f8da5f
[gaim-migrate @ 11]
A few more commits :)
committer: Tailor Script <tailor@pidgin.im>
author | Rob Flynn <gaim@robflynn.com> |
---|---|
date | Thu, 23 Mar 2000 03:16:06 +0000 |
parents | |
children | 6ced2f1c8b24 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libfaim/aim_login.c Thu Mar 23 03:16:06 2000 +0000 @@ -0,0 +1,142 @@ +/* + * aim_login.c + * + * This contains all the functions needed to actually login. + * + */ + +#include "aim.h" + + +/* + * FIXME: Reimplement the TIS stuff. + */ +#ifdef TIS_TELNET_PROXY +#include "tis_telnet_proxy.h" +#endif + +/* + * send_login(int socket, char *sn, char *password) + * + * This is the initial login request packet. + * + * The password is encoded before transmition, as per + * encode_password(). See that function for their + * stupid method of doing it. + * + * + * + */ +int aim_send_login (struct aim_conn_t *conn, char *sn, char *password, struct client_info_s *clientinfo) +{ + char *password_encoded = NULL; /* to store encoded password */ + int curbyte=0; + + struct command_tx_struct newpacket; + + if (conn) + newpacket.conn = conn; + else + newpacket.conn = aim_getconn_type(AIM_CONN_TYPE_AUTH); + + newpacket.commandlen = 6+2+strlen(sn)+1+1+2+strlen(password)+6; + + if (clientinfo) + { + if (strlen(clientinfo->clientstring)) + newpacket.commandlen += strlen(clientinfo->clientstring)+4; + newpacket.commandlen += 6+6+6; + if (strlen(clientinfo->country)) + newpacket.commandlen += strlen(clientinfo->country)+4; + if (strlen(clientinfo->lang)) + newpacket.commandlen += strlen(clientinfo->lang)+4; + } + + newpacket.data = (char *) calloc (1, newpacket.commandlen ); + newpacket.lock = 1; + newpacket.type = 0x01; + + curbyte += aimutil_put16(newpacket.data+curbyte, 0x0000); + curbyte += aimutil_put16(newpacket.data+curbyte, 0x0001); + curbyte += aimutil_put16(newpacket.data+curbyte, 0x0001); + curbyte += aimutil_put16(newpacket.data+curbyte, strlen(sn)); + curbyte += aimutil_putstr(newpacket.data+curbyte, sn, strlen(sn)); + + curbyte += aimutil_put16(newpacket.data+curbyte, 0x0002); + curbyte += aimutil_put16(newpacket.data+curbyte, strlen(password)); + password_encoded = (char *) malloc(strlen(password)); + aim_encode_password(password, password_encoded); + curbyte += aimutil_putstr(newpacket.data+curbyte, password_encoded, strlen(password)); + free(password_encoded); + + curbyte += aim_puttlv_16(newpacket.data+curbyte, 0x0016, 0x0001); + + if (clientinfo) + { + if (strlen(clientinfo->clientstring)) + { + curbyte += aimutil_put16(newpacket.data+curbyte, 0x0003); + curbyte += aimutil_put16(newpacket.data+curbyte, strlen(clientinfo->clientstring)); + curbyte += aimutil_putstr(newpacket.data+curbyte, clientinfo->clientstring, strlen(clientinfo->clientstring)); + } + curbyte += aim_puttlv_16(newpacket.data+curbyte, 0x0017, 0x0001); + curbyte += aim_puttlv_16(newpacket.data+curbyte, 0x0018, 0x0001); + curbyte += aim_puttlv_16(newpacket.data+curbyte, 0x001a, 0x0013); + if (strlen(clientinfo->country)) + { + curbyte += aimutil_put16(newpacket.data+curbyte, 0x000e); + curbyte += aimutil_put16(newpacket.data+curbyte, strlen(clientinfo->country)); + curbyte += aimutil_putstr(newpacket.data+curbyte, clientinfo->country, strlen(clientinfo->country)); + } + if (strlen(clientinfo->lang)) + { + curbyte += aimutil_put16(newpacket.data+curbyte, 0x000f); + curbyte += aimutil_put16(newpacket.data+curbyte, strlen(clientinfo->lang)); + curbyte += aimutil_putstr(newpacket.data+curbyte, clientinfo->lang, strlen(clientinfo->lang)); + } + } + + curbyte += aim_puttlv_16(newpacket.data+curbyte, 0x0009, 0x0015); + + newpacket.lock = 0; + aim_tx_enqueue(&newpacket); + + return 0; +} + +/* + * int encode_password( + * const char *password, + * char *encoded + * ); + * + * This takes a const pointer to a (null terminated) string + * containing the unencoded password. It also gets passed + * an already allocated buffer to store the encoded password. + * This buffer should be the exact length of the password without + * the null. The encoded password buffer IS NOT NULL TERMINATED. + * + * The encoding_table seems to be a fixed set of values. We'll + * hope it doesn't change over time! + * + */ +int aim_encode_password(const char *password, char *encoded) +{ + char encoding_table[] = { + 0xf3, 0xb3, 0x6c, 0x99, + 0x95, 0x3f, 0xac, 0xb6, + 0xc5, 0xfa, 0x6b, 0x63, + 0x69, 0x6c, 0xc3, 0x9f + }; + + int i; + + for (i = 0; i < strlen(password); i++) + encoded[i] = (password[i] ^ encoding_table[i]); + + return 0; +} + + + +