Sun, 30 Apr 2000 21:47:04 +0000
[gaim-migrate @ 210]
Made the receive non-blocking, added a cancel button, and a few other updates.
No, sending a file to someone does not work yet. Be patient.
| 2 | 1 | /* |
| 2 | * aim_login.c | |
| 3 | * | |
| 4 | * This contains all the functions needed to actually login. | |
| 5 | * | |
| 6 | */ | |
| 7 | ||
| 8 | #include "aim.h" | |
| 9 | ||
| 10 | ||
| 11 | /* | |
| 12 | * FIXME: Reimplement the TIS stuff. | |
| 13 | */ | |
| 14 | #ifdef TIS_TELNET_PROXY | |
| 15 | #include "tis_telnet_proxy.h" | |
| 16 | #endif | |
| 17 | ||
| 18 | /* | |
| 19 | * send_login(int socket, char *sn, char *password) | |
| 20 | * | |
| 21 | * This is the initial login request packet. | |
| 22 | * | |
| 23 | * The password is encoded before transmition, as per | |
| 24 | * encode_password(). See that function for their | |
| 25 | * stupid method of doing it. | |
| 26 | * | |
| 27 | * | |
| 28 | * | |
| 29 | */ | |
| 30 | int aim_send_login (struct aim_conn_t *conn, char *sn, char *password, struct client_info_s *clientinfo) | |
| 31 | { | |
| 32 | char *password_encoded = NULL; /* to store encoded password */ | |
| 33 | int curbyte=0; | |
| 34 | ||
| 35 | struct command_tx_struct newpacket; | |
| 36 | ||
| 37 | if (conn) | |
| 38 | newpacket.conn = conn; | |
| 39 | else | |
| 40 | newpacket.conn = aim_getconn_type(AIM_CONN_TYPE_AUTH); | |
| 41 | ||
| 42 | newpacket.commandlen = 6+2+strlen(sn)+1+1+2+strlen(password)+6; | |
| 43 | ||
| 44 | if (clientinfo) | |
| 45 | { | |
| 46 | if (strlen(clientinfo->clientstring)) | |
| 47 | newpacket.commandlen += strlen(clientinfo->clientstring)+4; | |
| 48 | newpacket.commandlen += 6+6+6; | |
| 49 | if (strlen(clientinfo->country)) | |
| 50 | newpacket.commandlen += strlen(clientinfo->country)+4; | |
| 51 | if (strlen(clientinfo->lang)) | |
| 52 | newpacket.commandlen += strlen(clientinfo->lang)+4; | |
| 53 | } | |
| 54 | ||
| 55 | newpacket.data = (char *) calloc (1, newpacket.commandlen ); | |
| 56 | newpacket.lock = 1; | |
| 57 | newpacket.type = 0x01; | |
| 58 | ||
| 59 | curbyte += aimutil_put16(newpacket.data+curbyte, 0x0000); | |
| 60 | curbyte += aimutil_put16(newpacket.data+curbyte, 0x0001); | |
| 61 | curbyte += aimutil_put16(newpacket.data+curbyte, 0x0001); | |
| 62 | curbyte += aimutil_put16(newpacket.data+curbyte, strlen(sn)); | |
| 63 | curbyte += aimutil_putstr(newpacket.data+curbyte, sn, strlen(sn)); | |
| 64 | ||
| 65 | curbyte += aimutil_put16(newpacket.data+curbyte, 0x0002); | |
| 66 | curbyte += aimutil_put16(newpacket.data+curbyte, strlen(password)); | |
| 67 | password_encoded = (char *) malloc(strlen(password)); | |
| 68 | aim_encode_password(password, password_encoded); | |
| 69 | curbyte += aimutil_putstr(newpacket.data+curbyte, password_encoded, strlen(password)); | |
| 70 | free(password_encoded); | |
| 71 | ||
| 72 | curbyte += aim_puttlv_16(newpacket.data+curbyte, 0x0016, 0x0001); | |
| 73 | ||
| 74 | if (clientinfo) | |
| 75 | { | |
| 76 | if (strlen(clientinfo->clientstring)) | |
| 77 | { | |
| 78 | curbyte += aimutil_put16(newpacket.data+curbyte, 0x0003); | |
| 79 | curbyte += aimutil_put16(newpacket.data+curbyte, strlen(clientinfo->clientstring)); | |
| 80 | curbyte += aimutil_putstr(newpacket.data+curbyte, clientinfo->clientstring, strlen(clientinfo->clientstring)); | |
| 81 | } | |
| 82 | curbyte += aim_puttlv_16(newpacket.data+curbyte, 0x0017, 0x0001); | |
| 83 | curbyte += aim_puttlv_16(newpacket.data+curbyte, 0x0018, 0x0001); | |
| 84 | curbyte += aim_puttlv_16(newpacket.data+curbyte, 0x001a, 0x0013); | |
| 85 | if (strlen(clientinfo->country)) | |
| 86 | { | |
| 87 | curbyte += aimutil_put16(newpacket.data+curbyte, 0x000e); | |
| 88 | curbyte += aimutil_put16(newpacket.data+curbyte, strlen(clientinfo->country)); | |
| 89 | curbyte += aimutil_putstr(newpacket.data+curbyte, clientinfo->country, strlen(clientinfo->country)); | |
| 90 | } | |
| 91 | if (strlen(clientinfo->lang)) | |
| 92 | { | |
| 93 | curbyte += aimutil_put16(newpacket.data+curbyte, 0x000f); | |
| 94 | curbyte += aimutil_put16(newpacket.data+curbyte, strlen(clientinfo->lang)); | |
| 95 | curbyte += aimutil_putstr(newpacket.data+curbyte, clientinfo->lang, strlen(clientinfo->lang)); | |
| 96 | } | |
| 97 | } | |
| 98 | ||
| 99 | curbyte += aim_puttlv_16(newpacket.data+curbyte, 0x0009, 0x0015); | |
| 100 | ||
| 101 | newpacket.lock = 0; | |
| 102 | aim_tx_enqueue(&newpacket); | |
| 103 | ||
| 104 | return 0; | |
| 105 | } | |
| 106 | ||
| 107 | /* | |
| 108 | * int encode_password( | |
| 109 | * const char *password, | |
| 110 | * char *encoded | |
| 111 | * ); | |
| 112 | * | |
| 113 | * This takes a const pointer to a (null terminated) string | |
| 114 | * containing the unencoded password. It also gets passed | |
| 115 | * an already allocated buffer to store the encoded password. | |
| 116 | * This buffer should be the exact length of the password without | |
| 117 | * the null. The encoded password buffer IS NOT NULL TERMINATED. | |
| 118 | * | |
| 119 | * The encoding_table seems to be a fixed set of values. We'll | |
| 120 | * hope it doesn't change over time! | |
| 121 | * | |
| 122 | */ | |
| 123 | int aim_encode_password(const char *password, char *encoded) | |
| 124 | { | |
| 125 | char encoding_table[] = { | |
| 126 | 0xf3, 0xb3, 0x6c, 0x99, | |
| 127 | 0x95, 0x3f, 0xac, 0xb6, | |
| 128 | 0xc5, 0xfa, 0x6b, 0x63, | |
| 129 | 0x69, 0x6c, 0xc3, 0x9f | |
| 130 | }; | |
| 131 | ||
| 132 | int i; | |
| 133 | ||
| 134 | for (i = 0; i < strlen(password); i++) | |
| 135 | encoded[i] = (password[i] ^ encoding_table[i]); | |
| 136 | ||
| 137 | return 0; | |
| 138 | } | |
| 139 | ||
| 140 | ||
| 141 | ||
| 142 |