Mercurial > pidgin.yaz
annotate libfaim/aim_login.c @ 412:ad08e67ec874
[gaim-migrate @ 422]
A woman went to her doctor for advice. She told him that her husband had
developed a penchant for anal sex, and she was not sure that it was such
a good idea.
The doctor asked, "Do you enjoy it?"
She said that she did.
He asked, "Does it hurt you?"
She said that it didn't.
The doctor then told her, "Well, then, there's no reason that you
shouldn't practice anal sex, if that's what you like, so long as you
take care not to get pregnant."
The woman was mystified. She asked "You can get pregnant from anal sex?"
The doctor replied, "Of course. Where do you think attorneys come from?"
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Fri, 16 Jun 2000 09:29:36 +0000 |
parents | f3c8d79688db |
children | e4c34ca88d9b |
rev | line source |
---|---|
2 | 1 /* |
2 * aim_login.c | |
3 * | |
4 * This contains all the functions needed to actually login. | |
5 * | |
6 */ | |
7 | |
283
0f14e6d8a51b
[gaim-migrate @ 293]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
248
diff
changeset
|
8 #include <faim/aim.h> |
2 | 9 |
10 | |
11 /* | |
12 * FIXME: Reimplement the TIS stuff. | |
13 */ | |
14 #ifdef TIS_TELNET_PROXY | |
15 #include "tis_telnet_proxy.h" | |
16 #endif | |
17 | |
237 | 18 int aim_sendconnack(struct aim_session_t *sess, |
19 struct aim_conn_t *conn) | |
20 { | |
21 int curbyte=0; | |
22 | |
23 struct command_tx_struct *newpacket; | |
24 | |
25 if (!(newpacket = aim_tx_new(0x0001, conn, 4))) | |
26 return -1; | |
27 | |
28 newpacket->lock = 1; | |
29 | |
30 curbyte += aimutil_put16(newpacket->data+curbyte, 0x0000); | |
31 curbyte += aimutil_put16(newpacket->data+curbyte, 0x0001); | |
32 | |
33 newpacket->lock = 0; | |
34 return aim_tx_enqueue(sess, newpacket); | |
35 } | |
36 | |
37 #ifdef SNACLOGIN | |
2 | 38 /* |
237 | 39 * In AIM 3.5 protocol, the first stage of login is to request |
40 * login from the Authorizer, passing it the screen name | |
41 * for verification. If the name is invalid, a 0017/0003 | |
42 * is spit back, with the standard error contents. If valid, | |
43 * a 0017/0007 comes back, which is the signal to send | |
44 * it the main login command (0017/0002). | |
45 */ | |
46 int aim_request_login(struct aim_session_t *sess, | |
47 struct aim_conn_t *conn, | |
48 char *sn) | |
49 { | |
50 int curbyte=0; | |
51 | |
52 struct command_tx_struct *newpacket; | |
53 | |
54 if (!(newpacket = aim_tx_new(0x0002, conn, 10+2+2+strlen(sn)))) | |
55 return -1; | |
56 | |
57 newpacket->lock = 1; | |
58 | |
59 curbyte += aim_putsnac(newpacket->data+curbyte, 0x0017, 0x0006, 0x0000, 0x00010000); | |
60 curbyte += aim_puttlv_str(newpacket->data+curbyte, 0x0001, strlen(sn), sn); | |
61 | |
62 newpacket->lock = 0; | |
63 return aim_tx_enqueue(sess, newpacket); | |
64 } | |
65 #endif /* SNACLOGIN */ | |
66 | |
67 /* | |
68 * send_login(int socket, char *sn, char *password) | |
2 | 69 * |
70 * This is the initial login request packet. | |
71 * | |
72 * The password is encoded before transmition, as per | |
73 * encode_password(). See that function for their | |
74 * stupid method of doing it. | |
75 * | |
76 */ | |
237 | 77 int aim_send_login (struct aim_session_t *sess, |
78 struct aim_conn_t *conn, | |
79 char *sn, char *password, struct client_info_s *clientinfo) | |
2 | 80 { |
237 | 81 u_char *password_encoded = NULL; /* to store encoded password */ |
2 | 82 int curbyte=0; |
331
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
83 int icqmode = 0; |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
84 |
237 | 85 struct command_tx_struct *newpacket; |
86 | |
87 if (!clientinfo || !sn || !password) | |
88 return -1; | |
89 | |
90 if (!(newpacket = aim_tx_new(0x0002, conn, 1152))) | |
91 return -1; | |
2 | 92 |
331
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
93 /* |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
94 * For ICQ logins, the client version must be at |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
95 * least as high as ICQ2000a. |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
96 */ |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
97 if ((sn[0] >= '0') && (sn[0] <= '9')) { |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
98 icqmode = 1; /* needs a different password encoding */ |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
99 if (clientinfo && (clientinfo->major < 4)) { |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
100 printf("faim: icq: version must be at least 4.30.3141 for ICQ OSCAR login\n"); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
101 return -1; |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
102 } |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
103 if (strlen(password) > 8) { |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
104 printf("faim: icq: password too long (8 char max)\n"); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
105 return -1; |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
106 } |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
107 } |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
108 |
237 | 109 #ifdef SNACLOGIN |
110 newpacket->commandlen = 10; | |
111 newpacket->commandlen += 2 + 2 + strlen(sn); | |
112 newpacket->commandlen += 2 + 2 + strlen(password); | |
113 newpacket->commandlen += 2 + 2 + strlen(clientinfo->clientstring); | |
114 newpacket->commandlen += 56; | |
115 | |
116 newpacket->lock = 1; | |
2 | 117 |
237 | 118 curbyte = aim_putsnac(newpacket->data+curbyte, 0x0017, 0x0002, 0x0000, 0x00010000); |
119 curbyte+= aim_puttlv_str(newpacket->data+curbyte, 0x0001, strlen(sn), sn); | |
120 password_encoded = (u_char *) malloc(strlen(password)); | |
121 aim_encode_password(password, password_encoded); | |
122 curbyte+= aim_puttlv_str(newpacket->data+curbyte, 0x0002, strlen(password), password_encoded); | |
123 curbyte+= aim_puttlv_str(newpacket->data+curbyte, 0x0003, | |
124 strlen(clientinfo->clientstring), | |
125 clientinfo->clientstring); | |
126 /* XXX: should use clientinfo provided version info */ | |
127 curbyte+= aim_puttlv_16(newpacket->data+curbyte, 0x0016, 0x0004); | |
128 curbyte+= aim_puttlv_16(newpacket->data+curbyte, 0x0017, 0x0003); | |
129 curbyte+= aim_puttlv_16(newpacket->data+curbyte, 0x0018, 0x0005); | |
130 curbyte+= aim_puttlv_16(newpacket->data+curbyte, 0x0019, 0x0000); | |
131 curbyte+= aim_puttlv_16(newpacket->data+curbyte, 0x001a, 0x0686); | |
132 curbyte+= aim_puttlv_str(newpacket->data+curbyte, 0x0001, 0x0002, clientinfo->country); | |
133 curbyte+= aim_puttlv_str(newpacket->data+curbyte, 0x0001, 0x0002, clientinfo->lang); | |
134 curbyte+= aim_puttlv_32(newpacket->data+curbyte, 0x0014, 0x0000002a); | |
135 curbyte+= aim_puttlv_16(newpacket->data+curbyte, 0x0009, 0x0015); | |
136 #else | |
137 | |
331
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
138 newpacket->commandlen = 4 + 4 + strlen(sn) + 4+strlen(password) + 6; |
237 | 139 |
331
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
140 newpacket->commandlen += 8; /* tlv 0x0014 */ |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
141 |
237 | 142 if (clientinfo) { |
143 if (strlen(clientinfo->clientstring)) | |
144 newpacket->commandlen += 4+strlen(clientinfo->clientstring); | |
145 newpacket->commandlen += 6+6+6+6; | |
146 if (strlen(clientinfo->country)) | |
147 newpacket->commandlen += 4+strlen(clientinfo->country); | |
148 if (strlen(clientinfo->lang)) | |
149 newpacket->commandlen += 4+strlen(clientinfo->lang); | |
150 } | |
2 | 151 |
237 | 152 newpacket->lock = 1; |
153 newpacket->type = 0x01; | |
2 | 154 |
237 | 155 curbyte += aimutil_put16(newpacket->data+curbyte, 0x0000); |
156 curbyte += aimutil_put16(newpacket->data+curbyte, 0x0001); | |
157 curbyte += aimutil_put16(newpacket->data+curbyte, 0x0001); | |
158 curbyte += aimutil_put16(newpacket->data+curbyte, strlen(sn)); | |
159 curbyte += aimutil_putstr(newpacket->data+curbyte, sn, strlen(sn)); | |
2 | 160 |
237 | 161 curbyte += aimutil_put16(newpacket->data+curbyte, 0x0002); |
162 curbyte += aimutil_put16(newpacket->data+curbyte, strlen(password)); | |
2 | 163 password_encoded = (char *) malloc(strlen(password)); |
331
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
164 if (icqmode) |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
165 aimicq_encode_password(password, password_encoded); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
166 else |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
167 aim_encode_password(password, password_encoded); |
237 | 168 curbyte += aimutil_putstr(newpacket->data+curbyte, password_encoded, strlen(password)); |
2 | 169 free(password_encoded); |
170 | |
331
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
171 if (strlen(clientinfo->clientstring)) { |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
172 curbyte += aimutil_put16(newpacket->data+curbyte, 0x0003); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
173 curbyte += aimutil_put16(newpacket->data+curbyte, strlen(clientinfo->clientstring)); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
174 curbyte += aimutil_putstr(newpacket->data+curbyte, clientinfo->clientstring, strlen(clientinfo->clientstring)); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
175 } |
412
ad08e67ec874
[gaim-migrate @ 422]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
331
diff
changeset
|
176 curbyte += aim_puttlv_16(newpacket->data+curbyte, 0x0016, /*0x010a*/ 0x0004); |
331
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
177 curbyte += aim_puttlv_16(newpacket->data+curbyte, 0x0017, clientinfo->major /*0x0001*/); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
178 curbyte += aim_puttlv_16(newpacket->data+curbyte, 0x0018, clientinfo->minor /*0x0001*/); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
179 curbyte += aim_puttlv_16(newpacket->data+curbyte, 0x0019, 0x0001); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
180 curbyte += aim_puttlv_16(newpacket->data+curbyte, 0x001a, clientinfo->build /*0x0013*/); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
181 |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
182 curbyte += aim_puttlv_32(newpacket->data+curbyte, 0x0014, 0x00000055); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
183 |
412
ad08e67ec874
[gaim-migrate @ 422]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
331
diff
changeset
|
184 if (strlen(clientinfo->lang)) { |
ad08e67ec874
[gaim-migrate @ 422]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
331
diff
changeset
|
185 curbyte += aimutil_put16(newpacket->data+curbyte, 0x000f); |
ad08e67ec874
[gaim-migrate @ 422]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
331
diff
changeset
|
186 curbyte += aimutil_put16(newpacket->data+curbyte, strlen(clientinfo->lang)); |
ad08e67ec874
[gaim-migrate @ 422]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
331
diff
changeset
|
187 curbyte += aimutil_putstr(newpacket->data+curbyte, clientinfo->lang, strlen(clientinfo->lang)); |
ad08e67ec874
[gaim-migrate @ 422]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
331
diff
changeset
|
188 } |
ad08e67ec874
[gaim-migrate @ 422]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
331
diff
changeset
|
189 |
331
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
190 if (strlen(clientinfo->country)) { |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
191 curbyte += aimutil_put16(newpacket->data+curbyte, 0x000e); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
192 curbyte += aimutil_put16(newpacket->data+curbyte, strlen(clientinfo->country)); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
193 curbyte += aimutil_putstr(newpacket->data+curbyte, clientinfo->country, strlen(clientinfo->country)); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
194 } |
2 | 195 |
237 | 196 #endif |
2 | 197 |
237 | 198 newpacket->lock = 0; |
199 return aim_tx_enqueue(sess, newpacket); | |
2 | 200 } |
201 | |
202 /* | |
203 * int encode_password( | |
204 * const char *password, | |
205 * char *encoded | |
206 * ); | |
207 * | |
208 * This takes a const pointer to a (null terminated) string | |
209 * containing the unencoded password. It also gets passed | |
210 * an already allocated buffer to store the encoded password. | |
211 * This buffer should be the exact length of the password without | |
212 * the null. The encoded password buffer IS NOT NULL TERMINATED. | |
213 * | |
214 * The encoding_table seems to be a fixed set of values. We'll | |
215 * hope it doesn't change over time! | |
216 * | |
217 */ | |
237 | 218 int aim_encode_password(const char *password, u_char *encoded) |
2 | 219 { |
237 | 220 u_char encoding_table[] = { |
412
ad08e67ec874
[gaim-migrate @ 422]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
331
diff
changeset
|
221 #if 0 |
2 | 222 0xf3, 0xb3, 0x6c, 0x99, |
223 0x95, 0x3f, 0xac, 0xb6, | |
224 0xc5, 0xfa, 0x6b, 0x63, | |
225 0x69, 0x6c, 0xc3, 0x9f | |
412
ad08e67ec874
[gaim-migrate @ 422]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
331
diff
changeset
|
226 #else |
ad08e67ec874
[gaim-migrate @ 422]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
331
diff
changeset
|
227 0xf3, 0x26, 0x81, 0xc4, |
ad08e67ec874
[gaim-migrate @ 422]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
331
diff
changeset
|
228 0x39, 0x86, 0xdb, 0x92, |
ad08e67ec874
[gaim-migrate @ 422]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
331
diff
changeset
|
229 0x71, 0xa3, 0xb9, 0xe6, |
ad08e67ec874
[gaim-migrate @ 422]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
331
diff
changeset
|
230 0x53, 0x7a, 0x95, 0x7c |
ad08e67ec874
[gaim-migrate @ 422]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
331
diff
changeset
|
231 #endif |
2 | 232 }; |
233 | |
234 int i; | |
235 | |
236 for (i = 0; i < strlen(password); i++) | |
237 encoded[i] = (password[i] ^ encoding_table[i]); | |
238 | |
239 return 0; | |
240 } | |
241 | |
237 | 242 /* |
331
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
243 * They changed the hash slightly for ICQ. |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
244 * This new hash may work for AIM too (though |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
245 * the max password length for ICQ is only |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
246 * eight characters, where its 16 with AIM). |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
247 * |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
248 */ |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
249 int aimicq_encode_password(const char *password, u_char *encoded) |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
250 { |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
251 u_char encoding_table[] = { |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
252 0xf3, 0x26, 0x81, 0xc4, |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
253 0x39, 0x86, 0xdb, 0x92 |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
254 }; |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
255 |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
256 int i; |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
257 |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
258 if (strlen(password) > 8) |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
259 return -1; |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
260 |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
261 for (i = 0; i < strlen(password); i++) |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
262 encoded[i] = (password[i] ^ encoding_table[i]); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
263 |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
264 return 0; |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
265 } |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
266 |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
267 /* |
237 | 268 * This is sent back as a general response to the login command. |
269 * It can be either an error or a success, depending on the | |
270 * precense of certain TLVs. | |
271 * | |
272 * The client should check the value of logininfo->errorcode. If | |
273 * its nonzero, there was an error. | |
274 * | |
275 */ | |
276 int aim_authparse(struct aim_session_t *sess, | |
277 struct command_rx_struct *command) | |
278 { | |
279 struct aim_tlvlist_t *tlvlist; | |
280 int ret = 1; | |
281 char *sn; | |
282 rxcallback_t userfunc = NULL; | |
283 | |
284 memset(&sess->logininfo, 0x00, sizeof(sess->logininfo)); | |
285 | |
286 /* | |
287 * Read block of TLVs. All further data is derived | |
288 * from what is parsed here. | |
289 */ | |
290 #ifdef SNACLOGIN | |
291 tlvlist = aim_readtlvchain(command->data+10, command->commandlen-10); | |
292 #else | |
293 tlvlist = aim_readtlvchain(command->data, command->commandlen); | |
294 #endif | |
295 /* | |
296 * No matter what, we should have a screen name. | |
297 */ | |
298 sn = aim_gettlv_str(tlvlist, 0x0001, 1); | |
299 memcpy(sess->logininfo.screen_name, sn, strlen(sn)); | |
300 sn[(strlen(sn))] = '\0'; | |
301 | |
302 /* | |
303 * Check for an error code. If so, we should also | |
304 * have an error url. | |
305 */ | |
331
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
306 if (aim_gettlv(tlvlist, 0x0008, 1)) { |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
307 struct aim_tlv_t *errtlv; |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
308 errtlv = aim_gettlv(tlvlist, 0x0008, 1); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
309 sess->logininfo.errorcode = aimutil_get16(errtlv->value); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
310 sess->logininfo.errorurl = aim_gettlv_str(tlvlist, 0x0004, 1); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
311 } |
237 | 312 /* |
313 * If we have both an IP number (0x0005) and a cookie (0x0006), | |
314 * then the login was successful. | |
315 */ | |
331
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
316 else if (aim_gettlv(tlvlist, 0x0005, 1) && aim_gettlv(tlvlist, 0x0006, 1)) { |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
317 struct aim_tlv_t *tmptlv; |
237 | 318 |
331
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
319 /* |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
320 * IP address of BOS server. |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
321 */ |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
322 sess->logininfo.BOSIP = aim_gettlv_str(tlvlist, 0x0005, 1); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
323 |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
324 /* |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
325 * Authorization Cookie |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
326 */ |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
327 tmptlv = aim_gettlv(tlvlist, 0x0006, 1); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
328 memcpy(sess->logininfo.cookie, tmptlv->value, AIM_COOKIELEN); |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
329 |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
330 /* |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
331 * The email address attached to this account |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
332 * Not available for ICQ logins. |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
333 */ |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
334 if (aim_gettlv(tlvlist, 0x0011, 1)) |
237 | 335 sess->logininfo.email = aim_gettlv_str(tlvlist, 0x0011, 1); |
331
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
336 |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
337 /* |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
338 * The registration status. (Not real sure what it means.) |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
339 * Not available for ICQ logins. |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
340 */ |
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
341 if ((tmptlv = aim_gettlv(tlvlist, 0x0013, 1))) |
237 | 342 sess->logininfo.regstatus = aimutil_get16(tmptlv->value); |
343 | |
331
f3c8d79688db
[gaim-migrate @ 341]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
344 } |
237 | 345 |
346 #ifdef SNACLOGIN | |
347 userfunc = aim_callhandler(command->conn, 0x0017, 0x0003); | |
348 #else | |
349 userfunc = aim_callhandler(command->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_AUTHSUCCESS); | |
350 #endif | |
351 if (userfunc) | |
352 ret = userfunc(sess, command); | |
353 | |
354 aim_freetlvchain(&tlvlist); | |
355 | |
356 /* These have been clobbered by the freetlvchain */ | |
357 sess->logininfo.BOSIP = NULL; | |
358 sess->logininfo.email = NULL; | |
359 sess->logininfo.errorurl = NULL; | |
360 | |
361 return ret; | |
362 } | |
363 | |
364 /* | |
365 * Generate an authorization response. | |
366 * | |
367 * You probably don't want this unless you're writing an AIM server. | |
368 * | |
369 */ | |
370 unsigned long aim_sendauthresp(struct aim_session_t *sess, | |
371 struct aim_conn_t *conn, | |
372 char *sn, char *bosip, | |
373 char *cookie, char *email, | |
374 int regstatus) | |
375 { | |
376 struct command_tx_struct *tx; | |
377 struct aim_tlvlist_t *tlvlist = NULL; | |
378 | |
248
cfc73b8501a7
[gaim-migrate @ 258]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
237
diff
changeset
|
379 if (!(tx = aim_tx_new(0x0004, conn, 1152))) |
237 | 380 return -1; |
381 | |
382 tx->lock = 1; | |
383 | |
384 if (sn) | |
385 aim_addtlvtochain_str(&tlvlist, 0x0001, sn, strlen(sn)); | |
386 else | |
387 aim_addtlvtochain_str(&tlvlist, 0x0001, sess->logininfo.screen_name, strlen(sess->logininfo.screen_name)); | |
388 | |
389 if (sess->logininfo.errorcode) { | |
390 aim_addtlvtochain16(&tlvlist, 0x0008, sess->logininfo.errorcode); | |
391 aim_addtlvtochain_str(&tlvlist, 0x0004, sess->logininfo.errorurl, strlen(sess->logininfo.errorurl)); | |
392 } else { | |
393 aim_addtlvtochain_str(&tlvlist, 0x0005, bosip, strlen(bosip)); | |
394 aim_addtlvtochain_str(&tlvlist, 0x0006, cookie, AIM_COOKIELEN); | |
395 aim_addtlvtochain_str(&tlvlist, 0x0011, email, strlen(email)); | |
396 aim_addtlvtochain16(&tlvlist, 0x0013, regstatus); | |
397 } | |
398 | |
399 tx->commandlen = aim_writetlvchain(tx->data, tx->commandlen, &tlvlist); | |
400 tx->lock = 0; | |
401 return aim_tx_enqueue(sess, tx); | |
402 } | |
403 | |
404 /* | |
405 * Generate a random cookie. (Non-client use only) | |
406 */ | |
407 int aim_gencookie(unsigned char *buf) | |
408 { | |
409 int i; | |
410 | |
411 srand(time(NULL)); | |
412 | |
413 for (i=0; i < AIM_COOKIELEN; i++) | |
414 buf[i] = 1+(int) (256.0*rand()/(RAND_MAX+0.0)); | |
415 | |
416 return i; | |
417 } | |
418 | |
419 /* | |
420 * Send Server Ready. (Non-client) | |
421 */ | |
422 int aim_sendserverready(struct aim_session_t *sess, struct aim_conn_t *conn) | |
423 { | |
424 struct command_tx_struct *tx; | |
425 int i = 0; | |
426 | |
248
cfc73b8501a7
[gaim-migrate @ 258]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
237
diff
changeset
|
427 if (!(tx = aim_tx_new(0x0002, conn, 10+0x22))) |
237 | 428 return -1; |
429 | |
430 tx->lock = 1; | |
431 | |
248
cfc73b8501a7
[gaim-migrate @ 258]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
237
diff
changeset
|
432 i += aim_putsnac(tx->data, 0x0001, 0x0003, 0x0000, sess->snac_nextid++); |
237 | 433 |
434 i += aimutil_put16(tx->data+i, 0x0001); | |
435 i += aimutil_put16(tx->data+i, 0x0002); | |
436 i += aimutil_put16(tx->data+i, 0x0003); | |
437 i += aimutil_put16(tx->data+i, 0x0004); | |
438 i += aimutil_put16(tx->data+i, 0x0006); | |
439 i += aimutil_put16(tx->data+i, 0x0008); | |
440 i += aimutil_put16(tx->data+i, 0x0009); | |
441 i += aimutil_put16(tx->data+i, 0x000a); | |
442 i += aimutil_put16(tx->data+i, 0x000b); | |
443 i += aimutil_put16(tx->data+i, 0x000c); | |
248
cfc73b8501a7
[gaim-migrate @ 258]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
237
diff
changeset
|
444 i += aimutil_put16(tx->data+i, 0x0013); |
cfc73b8501a7
[gaim-migrate @ 258]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
237
diff
changeset
|
445 i += aimutil_put16(tx->data+i, 0x0015); |
237 | 446 |
248
cfc73b8501a7
[gaim-migrate @ 258]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
237
diff
changeset
|
447 tx->commandlen = i; |
237 | 448 tx->lock = 0; |
449 return aim_tx_enqueue(sess, tx); | |
450 } | |
2 | 451 |
452 | |
237 | 453 /* |
454 * Send service redirect. (Non-Client) | |
455 */ | |
456 unsigned long aim_sendredirect(struct aim_session_t *sess, | |
457 struct aim_conn_t *conn, | |
458 unsigned short servid, | |
459 char *ip, | |
460 char *cookie) | |
461 { | |
462 struct command_tx_struct *tx; | |
463 struct aim_tlvlist_t *tlvlist = NULL; | |
464 int i = 0; | |
2 | 465 |
237 | 466 if (!(tx = aim_tx_new(0x0002, conn, 1152))) |
467 return -1; | |
468 | |
469 tx->lock = 1; | |
470 | |
471 i += aimutil_put16(tx->data+i, 0x0001); | |
472 i += aimutil_put16(tx->data+i, 0x0005); | |
473 i += aimutil_put16(tx->data+i, 0x0000); | |
474 i += aimutil_put16(tx->data+i, 0x0000); | |
475 i += aimutil_put16(tx->data+i, 0x0000); | |
476 | |
477 aim_addtlvtochain16(&tlvlist, 0x000d, servid); | |
478 aim_addtlvtochain_str(&tlvlist, 0x0005, ip, strlen(ip)); | |
479 aim_addtlvtochain_str(&tlvlist, 0x0006, cookie, AIM_COOKIELEN); | |
480 | |
481 tx->commandlen = aim_writetlvchain(tx->data+i, tx->commandlen-i, &tlvlist)+i; | |
482 aim_freetlvchain(&tlvlist); | |
483 | |
484 tx->lock = 0; | |
485 return aim_tx_enqueue(sess, tx); | |
486 } |