| 170 |
170 |
| 171 aimbs_put32(&fr->data, 0x00000001); |
171 aimbs_put32(&fr->data, 0x00000001); |
| 172 aim_addtlvtochain_raw(&tl, 0x0001, strlen(sn), sn); |
172 aim_addtlvtochain_raw(&tl, 0x0001, strlen(sn), sn); |
| 173 aim_addtlvtochain_raw(&tl, 0x0002, strlen(password), password_encoded); |
173 aim_addtlvtochain_raw(&tl, 0x0002, strlen(password), password_encoded); |
| 174 aim_addtlvtochain_raw(&tl, 0x0003, strlen(clientstr), clientstr); |
174 aim_addtlvtochain_raw(&tl, 0x0003, strlen(clientstr), clientstr); |
| 175 aim_addtlvtochain16(&tl, 0x0016, 0x010a); |
175 aim_addtlvtochain16(&tl, 0x0016, 0x010a); /* cliend ID */ |
| 176 aim_addtlvtochain16(&tl, 0x0017, 0x0004); |
176 aim_addtlvtochain16(&tl, 0x0017, 0x0004); /* major version */ |
| 177 aim_addtlvtochain16(&tl, 0x0018, 0x0041); |
177 aim_addtlvtochain16(&tl, 0x0018, 0x0041); /* minor version */ |
| 178 aim_addtlvtochain16(&tl, 0x0019, 0x0001); |
178 aim_addtlvtochain16(&tl, 0x0019, 0x0001); /* point version */ |
| 179 aim_addtlvtochain16(&tl, 0x001a, 0x0cd1); |
179 aim_addtlvtochain16(&tl, 0x001a, 0x0cd1); /* build */ |
| 180 aim_addtlvtochain32(&tl, 0x0014, 0x00000055); |
180 aim_addtlvtochain32(&tl, 0x0014, 0x00000055); /* distribution chan */ |
| 181 aim_addtlvtochain_raw(&tl, 0x000f, strlen(lang), lang); |
181 aim_addtlvtochain_raw(&tl, 0x000f, strlen(lang), lang); |
| 182 aim_addtlvtochain_raw(&tl, 0x000e, strlen(country), country); |
182 aim_addtlvtochain_raw(&tl, 0x000e, strlen(country), country); |
| 183 |
183 |
| 184 aim_writetlvchain(&fr->data, &tl); |
184 aim_writetlvchain(&fr->data, &tl); |
| 185 |
185 |
| 198 * |
198 * |
| 199 * NOTE!! If you want/need to make use of the aim_sendmemblock() function, |
199 * NOTE!! If you want/need to make use of the aim_sendmemblock() function, |
| 200 * then the client information you send here must exactly match the |
200 * then the client information you send here must exactly match the |
| 201 * executable that you're pulling the data from. |
201 * executable that you're pulling the data from. |
| 202 * |
202 * |
| 203 * Latest WinAIM: |
203 * WinAIM 4.8.2540 |
| |
204 * clientstring = "AOL Instant Messenger (SM), version 4.8.2540/WIN32" |
| |
205 * clientid = 0x0109 |
| |
206 * major = 0x0004 |
| |
207 * minor = 0x0008 |
| |
208 * point = 0x0000 |
| |
209 * build = 0x09ec |
| |
210 * t(0x0014) = 0x000000af |
| |
211 * t(0x004a) = 0x01 |
| |
212 * |
| |
213 * WinAIM 4.3.2188: |
| 204 * clientstring = "AOL Instant Messenger (SM), version 4.3.2188/WIN32" |
214 * clientstring = "AOL Instant Messenger (SM), version 4.3.2188/WIN32" |
| 205 * major2 = 0x0109 |
215 * clientid = 0x0109 |
| 206 * major = 0x0400 |
216 * major = 0x0400 |
| 207 * minor = 0x0003 |
217 * minor = 0x0003 |
| 208 * minor2 = 0x0000 |
218 * point = 0x0000 |
| 209 * build = 0x088c |
219 * build = 0x088c |
| 210 * unknown = 0x00000086 |
220 * unknown = 0x00000086 |
| 211 * lang = "en" |
221 * lang = "en" |
| 212 * country = "us" |
222 * country = "us" |
| 213 * unknown4a = 0x01 |
223 * unknown4a = 0x01 |
| 214 * |
224 * |
| 215 * Latest WinAIM that libfaim can emulate without server-side buddylists: |
225 * Latest WinAIM that libfaim can emulate without server-side buddylists: |
| 216 * clientstring = "AOL Instant Messenger (SM), version 4.1.2010/WIN32" |
226 * clientstring = "AOL Instant Messenger (SM), version 4.1.2010/WIN32" |
| 217 * major2 = 0x0004 |
227 * clientid = 0x0004 |
| 218 * major = 0x0004 |
228 * major = 0x0004 |
| 219 * minor = 0x0001 |
229 * minor = 0x0001 |
| 220 * minor2 = 0x0000 |
230 * point = 0x0000 |
| 221 * build = 0x07da |
231 * build = 0x07da |
| 222 * unknown= 0x0000004b |
232 * unknown= 0x0000004b |
| 223 * |
233 * |
| 224 * WinAIM 3.5.1670: |
234 * WinAIM 3.5.1670: |
| 225 * clientstring = "AOL Instant Messenger (SM), version 3.5.1670/WIN32" |
235 * clientstring = "AOL Instant Messenger (SM), version 3.5.1670/WIN32" |
| 226 * major2 = 0x0004 |
236 * clientid = 0x0004 |
| 227 * major = 0x0003 |
237 * major = 0x0003 |
| 228 * minor = 0x0005 |
238 * minor = 0x0005 |
| 229 * minor2 = 0x0000 |
239 * point = 0x0000 |
| 230 * build = 0x0686 |
240 * build = 0x0686 |
| 231 * unknown =0x0000002a |
241 * unknown =0x0000002a |
| 232 * |
242 * |
| 233 * Java AIM 1.1.19: |
243 * Java AIM 1.1.19: |
| 234 * clientstring = "AOL Instant Messenger (TM) version 1.1.19 for Java built 03/24/98, freeMem 215871 totalMem 1048567, i686, Linus, #2 SMP Sun Feb 11 03:41:17 UTC 2001 2.4.1-ac9, IBM Corporation, 1.1.8, 45.3, Tue Mar 27 12:09:17 PST 2001" |
244 * clientstring = "AOL Instant Messenger (TM) version 1.1.19 for Java built 03/24/98, freeMem 215871 totalMem 1048567, i686, Linus, #2 SMP Sun Feb 11 03:41:17 UTC 2001 2.4.1-ac9, IBM Corporation, 1.1.8, 45.3, Tue Mar 27 12:09:17 PST 2001" |
| 235 * major2 = 0x0001 |
245 * clientid = 0x0001 |
| 236 * major = 0x0001 |
246 * major = 0x0001 |
| 237 * minor = 0x0001 |
247 * minor = 0x0001 |
| 238 * minor2 = (not sent) |
248 * point = (not sent) |
| 239 * build = 0x0013 |
249 * build = 0x0013 |
| 240 * unknown= (not sent) |
250 * unknown= (not sent) |
| 241 * |
251 * |
| 242 * AIM for Linux 1.1.112: |
252 * AIM for Linux 1.1.112: |
| 243 * clientstring = "AOL Instant Messenger (SM)" |
253 * clientstring = "AOL Instant Messenger (SM)" |
| 244 * major2 = 0x1d09 |
254 * clientid = 0x1d09 |
| 245 * major = 0x0001 |
255 * major = 0x0001 |
| 246 * minor = 0x0001 |
256 * minor = 0x0001 |
| 247 * minor2 = 0x0001 |
257 * point = 0x0001 |
| 248 * build = 0x0070 |
258 * build = 0x0070 |
| 249 * unknown= 0x0000008b |
259 * unknown= 0x0000008b |
| 250 * serverstore = 0x01 |
260 * serverstore = 0x01 |
| 251 * |
261 * |
| 252 */ |
262 */ |
| 253 faim_export int aim_send_login(aim_session_t *sess, aim_conn_t *conn, const char *sn, const char *password, struct client_info_s *clientinfo, const char *key) |
263 faim_export int aim_send_login(aim_session_t *sess, aim_conn_t *conn, const char *sn, const char *password, struct client_info_s *ci, const char *key) |
| 254 { |
264 { |
| 255 aim_frame_t *fr; |
265 aim_frame_t *fr; |
| 256 aim_tlvlist_t *tl = NULL; |
266 aim_tlvlist_t *tl = NULL; |
| 257 fu8_t digest[16]; |
267 fu8_t digest[16]; |
| 258 aim_snacid_t snacid; |
268 aim_snacid_t snacid; |
| 259 |
269 |
| 260 if (!clientinfo || !sn || !password) |
270 if (!ci || !sn || !password) |
| 261 return -EINVAL; |
271 return -EINVAL; |
| 262 |
272 |
| |
273 /* |
| |
274 * What the XORLOGIN flag _really_ means is that its an ICQ login, |
| |
275 * which is really stupid and painful, so its not done here. |
| |
276 * |
| |
277 */ |
| 263 if (sess->flags & AIM_SESS_FLAGS_XORLOGIN) |
278 if (sess->flags & AIM_SESS_FLAGS_XORLOGIN) |
| 264 return goddamnicq2(sess, conn, sn, password); |
279 return goddamnicq2(sess, conn, sn, password); |
| 265 |
280 |
| |
281 |
| 266 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 1152))) |
282 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 1152))) |
| 267 return -ENOMEM; |
283 return -ENOMEM; |
| 268 |
284 |
| 269 if (sess->flags & AIM_SESS_FLAGS_XORLOGIN) { |
|
| 270 fr->hdr.flap.type = 0x01; |
|
| 271 |
|
| 272 /* Use very specific version numbers to further indicate hack */ |
|
| 273 clientinfo->major2 = 0x010a; |
|
| 274 clientinfo->major = 0x0004; |
|
| 275 clientinfo->minor = 0x003c; |
|
| 276 clientinfo->minor2 = 0x0001; |
|
| 277 clientinfo->build = 0x0cce; |
|
| 278 clientinfo->unknown = 0x00000055; |
|
| 279 } |
|
| 280 |
|
| 281 snacid = aim_cachesnac(sess, 0x0017, 0x0002, 0x0000, NULL, 0); |
285 snacid = aim_cachesnac(sess, 0x0017, 0x0002, 0x0000, NULL, 0); |
| 282 aim_putsnac(&fr->data, 0x0017, 0x0002, 0x0000, snacid); |
286 aim_putsnac(&fr->data, 0x0017, 0x0002, 0x0000, snacid); |
| 283 |
287 |
| 284 aim_addtlvtochain_raw(&tl, 0x0001, strlen(sn), sn); |
288 aim_addtlvtochain_raw(&tl, 0x0001, strlen(sn), sn); |
| 285 |
289 |
| 286 aim_encode_password_md5(password, key, digest); |
290 aim_encode_password_md5(password, key, digest); |
| 287 aim_addtlvtochain_raw(&tl, 0x0025, 16, digest); |
291 aim_addtlvtochain_raw(&tl, 0x0025, 16, digest); |
| 288 |
292 |
| 289 aim_addtlvtochain_raw(&tl, 0x0003, strlen(clientinfo->clientstring), clientinfo->clientstring); |
293 if (ci->clientstring) |
| 290 aim_addtlvtochain16(&tl, 0x0016, (fu16_t)clientinfo->major2); |
294 aim_addtlvtochain_raw(&tl, 0x0003, strlen(ci->clientstring), ci->clientstring); |
| 291 aim_addtlvtochain16(&tl, 0x0017, (fu16_t)clientinfo->major); |
295 aim_addtlvtochain16(&tl, 0x0016, (fu16_t)ci->clientid); |
| 292 aim_addtlvtochain16(&tl, 0x0018, (fu16_t)clientinfo->minor); |
296 aim_addtlvtochain16(&tl, 0x0017, (fu16_t)ci->major); |
| 293 aim_addtlvtochain16(&tl, 0x0019, (fu16_t)clientinfo->minor2); |
297 aim_addtlvtochain16(&tl, 0x0018, (fu16_t)ci->minor); |
| 294 aim_addtlvtochain16(&tl, 0x001a, (fu16_t)clientinfo->build); |
298 aim_addtlvtochain16(&tl, 0x0019, (fu16_t)ci->point); |
| 295 aim_addtlvtochain_raw(&tl, 0x000e, strlen(clientinfo->country), clientinfo->country); |
299 aim_addtlvtochain16(&tl, 0x001a, (fu16_t)ci->build); |
| 296 aim_addtlvtochain_raw(&tl, 0x000f, strlen(clientinfo->lang), clientinfo->lang); |
300 aim_addtlvtochain_raw(&tl, 0x000e, strlen(ci->country), ci->country); |
| 297 aim_addtlvtochain16(&tl, 0x0009, 0x0015); |
301 aim_addtlvtochain_raw(&tl, 0x000f, strlen(ci->lang), ci->lang); |
| |
302 |
| |
303 /* |
| |
304 * If set, old-fashioned buddy lists will not work. You will need |
| |
305 * to use SSI. |
| |
306 */ |
| |
307 if (0) |
| |
308 aim_addtlvtochain8(&tl, 0x004a, 0x01); |
| 298 |
309 |
| 299 aim_writetlvchain(&fr->data, &tl); |
310 aim_writetlvchain(&fr->data, &tl); |
| 300 |
311 |
| 301 aim_freetlvchain(&tl); |
312 aim_freetlvchain(&tl); |
| 302 |
313 |