| |
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 |