Mercurial > pidgin.yaz
annotate src/protocols/oscar/auth.c @ 10464:61ef9a964574
[gaim-migrate @ 11739]
SecurID support for AIM. This is untested. I'll try to get it tested
in the next few days. I'm backporting this to oldstatus. If you don't
know what SecurID, google around for it.
Basically it's an optional additional authentication method that
AOL members can opt for (and pay an extra fee). After entering your
password, you are prompted for a 6 digit number from a digit readout/
keychain-sized LCD screen. This number is pseudo-random and changes
every 60 seconds.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 02 Jan 2005 07:20:38 +0000 |
parents | 9cafe038c95e |
children | cbbf5af9e520 |
rev | line source |
---|---|
2086 | 1 /* |
3912 | 2 * Family 0x0017 - Authentication. |
3 * | |
4 * Deals with the authorizer for SNAC-based login, and also old-style | |
5 * non-SNAC login. | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
6 * |
2086 | 7 */ |
8 | |
9 #define FAIM_INTERNAL | |
5345 | 10 #include <aim.h> |
2086 | 11 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
12 #include "md5.h" |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
13 |
7282 | 14 #include <ctype.h> |
15 | |
7253 | 16 /** |
17 * Encode a password using old XOR method | |
18 * | |
19 * This takes a const pointer to a (null terminated) string | |
20 * containing the unencoded password. It also gets passed | |
21 * an already allocated buffer to store the encoded password. | |
22 * This buffer should be the exact length of the password without | |
23 * the null. The encoded password buffer /is not %NULL terminated/. | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
24 * |
7253 | 25 * The encoding_table seems to be a fixed set of values. We'll |
26 * hope it doesn't change over time! | |
27 * | |
28 * This is only used for the XOR method, not the better MD5 method. | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
29 * |
7253 | 30 * @param password Incoming password. |
31 * @param encoded Buffer to put encoded password. | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
32 */ |
7253 | 33 static int aim_encode_password(const char *password, fu8_t *encoded) |
2086 | 34 { |
7253 | 35 fu8_t encoding_table[] = { |
36 #if 0 /* old v1 table */ | |
37 0xf3, 0xb3, 0x6c, 0x99, | |
38 0x95, 0x3f, 0xac, 0xb6, | |
39 0xc5, 0xfa, 0x6b, 0x63, | |
40 0x69, 0x6c, 0xc3, 0x9f | |
41 #else /* v2.1 table, also works for ICQ */ | |
42 0xf3, 0x26, 0x81, 0xc4, | |
43 0x39, 0x86, 0xdb, 0x92, | |
44 0x71, 0xa3, 0xb9, 0xe6, | |
45 0x53, 0x7a, 0x95, 0x7c | |
46 #endif | |
47 }; | |
7631 | 48 unsigned int i; |
2086 | 49 |
7253 | 50 for (i = 0; i < strlen(password); i++) |
51 encoded[i] = (password[i] ^ encoding_table[i]); | |
2086 | 52 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
53 return 0; |
2086 | 54 } |
55 | |
7253 | 56 #ifdef USE_OLD_MD5 |
57 static int aim_encode_password_md5(const char *password, const char *key, fu8_t *digest) | |
58 { | |
59 md5_state_t state; | |
60 | |
10267 | 61 md5_init(&state); |
7253 | 62 md5_append(&state, (const md5_byte_t *)key, strlen(key)); |
63 md5_append(&state, (const md5_byte_t *)password, strlen(password)); | |
64 md5_append(&state, (const md5_byte_t *)AIM_MD5_STRING, strlen(AIM_MD5_STRING)); | |
65 md5_finish(&state, (md5_byte_t *)digest); | |
66 | |
67 return 0; | |
68 } | |
69 #else | |
70 static int aim_encode_password_md5(const char *password, const char *key, fu8_t *digest) | |
71 { | |
72 md5_state_t state; | |
73 fu8_t passdigest[16]; | |
74 | |
75 md5_init(&state); | |
76 md5_append(&state, (const md5_byte_t *)password, strlen(password)); | |
77 md5_finish(&state, (md5_byte_t *)&passdigest); | |
78 | |
10267 | 79 md5_init(&state); |
7253 | 80 md5_append(&state, (const md5_byte_t *)key, strlen(key)); |
81 md5_append(&state, (const md5_byte_t *)&passdigest, 16); | |
82 md5_append(&state, (const md5_byte_t *)AIM_MD5_STRING, strlen(AIM_MD5_STRING)); | |
83 md5_finish(&state, (md5_byte_t *)digest); | |
84 | |
85 return 0; | |
86 } | |
87 #endif | |
88 | |
2086 | 89 /* |
7313 | 90 * The FLAP version is sent by itself at the beginning of authorization |
91 * connections. The FLAP version is also sent before the cookie when connecting | |
92 * for other services (BOS, chatnav, chat, etc.). | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
93 */ |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
94 faim_export int aim_sendflapver(aim_session_t *sess, aim_conn_t *conn) |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
95 { |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
96 aim_frame_t *fr; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
97 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
98 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x01, 4))) |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
99 return -ENOMEM; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
100 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
101 aimbs_put32(&fr->data, 0x00000001); |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
102 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
103 aim_tx_enqueue(sess, fr); |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
104 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
105 return 0; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
106 } |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
107 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
108 /* |
7253 | 109 * This just pushes the passed cookie onto the passed connection, without |
110 * the SNAC header or any of that. | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
111 * |
7253 | 112 * Very commonly used, as every connection except auth will require this to |
113 * be the first thing you send. | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
114 * |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
115 */ |
7253 | 116 faim_export int aim_sendcookie(aim_session_t *sess, aim_conn_t *conn, const fu16_t length, const fu8_t *chipsahoy) |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
117 { |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
118 aim_frame_t *fr; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
119 aim_tlvlist_t *tl = NULL; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
120 |
10267 | 121 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x01, 4+2+2+length))) |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
122 return -ENOMEM; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
123 |
7253 | 124 aimbs_put32(&fr->data, 0x00000001); |
125 aim_tlvlist_add_raw(&tl, 0x0006, length, chipsahoy); | |
7167 | 126 aim_tlvlist_write(&fr->data, &tl); |
127 aim_tlvlist_free(&tl); | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
128 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
129 aim_tx_enqueue(sess, fr); |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
130 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
131 return 0; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
132 } |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
133 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
134 /* |
3458 | 135 * Part two of the ICQ hack. Note the ignoring of the key. |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
136 */ |
3458 | 137 static int goddamnicq2(aim_session_t *sess, aim_conn_t *conn, const char *sn, const char *password, struct client_info_s *ci) |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
138 { |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
139 aim_frame_t *fr; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
140 aim_tlvlist_t *tl = NULL; |
5345 | 141 int passwdlen; |
5927 | 142 fu8_t *password_encoded; |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
143 |
5345 | 144 passwdlen = strlen(password); |
145 if (!(password_encoded = (char *)malloc(passwdlen+1))) | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
146 return -ENOMEM; |
5345 | 147 if (passwdlen > MAXICQPASSLEN) |
148 passwdlen = MAXICQPASSLEN; | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
149 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
150 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x01, 1152))) { |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
151 free(password_encoded); |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
152 return -ENOMEM; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
153 } |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
154 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
155 aim_encode_password(password, password_encoded); |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
156 |
3458 | 157 aimbs_put32(&fr->data, 0x00000001); /* FLAP Version */ |
7167 | 158 aim_tlvlist_add_raw(&tl, 0x0001, strlen(sn), sn); |
159 aim_tlvlist_add_raw(&tl, 0x0002, passwdlen, password_encoded); | |
3458 | 160 |
161 if (ci->clientstring) | |
7167 | 162 aim_tlvlist_add_raw(&tl, 0x0003, strlen(ci->clientstring), ci->clientstring); |
163 aim_tlvlist_add_16(&tl, 0x0016, (fu16_t)ci->clientid); | |
164 aim_tlvlist_add_16(&tl, 0x0017, (fu16_t)ci->major); | |
165 aim_tlvlist_add_16(&tl, 0x0018, (fu16_t)ci->minor); | |
166 aim_tlvlist_add_16(&tl, 0x0019, (fu16_t)ci->point); | |
167 aim_tlvlist_add_16(&tl, 0x001a, (fu16_t)ci->build); | |
168 aim_tlvlist_add_32(&tl, 0x0014, (fu32_t)ci->distrib); /* distribution chan */ | |
169 aim_tlvlist_add_raw(&tl, 0x000f, strlen(ci->lang), ci->lang); | |
170 aim_tlvlist_add_raw(&tl, 0x000e, strlen(ci->country), ci->country); | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
171 |
7167 | 172 aim_tlvlist_write(&fr->data, &tl); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
173 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
174 free(password_encoded); |
7167 | 175 aim_tlvlist_free(&tl); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
176 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
177 aim_tx_enqueue(sess, fr); |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
178 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
179 return 0; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
180 } |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
181 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
182 /* |
7253 | 183 * Subtype 0x0002 |
184 * | |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
185 * This is the initial login request packet. |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
186 * |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
187 * NOTE!! If you want/need to make use of the aim_sendmemblock() function, |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
188 * then the client information you send here must exactly match the |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
189 * executable that you're pulling the data from. |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
190 * |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
191 * Java AIM 1.1.19: |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
192 * 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" |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
193 * clientid = 0x0001 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
194 * major = 0x0001 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
195 * minor = 0x0001 |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
196 * point = (not sent) |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
197 * build = 0x0013 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
198 * unknown= (not sent) |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
199 * |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
200 * AIM for Linux 1.1.112: |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
201 * clientstring = "AOL Instant Messenger (SM)" |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
202 * clientid = 0x1d09 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
203 * major = 0x0001 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
204 * minor = 0x0001 |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
205 * point = 0x0001 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
206 * build = 0x0070 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
207 * unknown= 0x0000008b |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
208 * serverstore = 0x01 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
209 * |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
210 */ |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
211 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) |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
212 { |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
213 aim_frame_t *fr; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
214 aim_tlvlist_t *tl = NULL; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
215 fu8_t digest[16]; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
216 aim_snacid_t snacid; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
217 |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
218 if (!ci || !sn || !password) |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
219 return -EINVAL; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
220 |
7282 | 221 /* If we're signing on an ICQ account then use the older, XOR login method */ |
222 if (isdigit(sn[0])) | |
3458 | 223 return goddamnicq2(sess, conn, sn, password, ci); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
224 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
225 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 1152))) |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
226 return -ENOMEM; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
227 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
228 snacid = aim_cachesnac(sess, 0x0017, 0x0002, 0x0000, NULL, 0); |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
229 aim_putsnac(&fr->data, 0x0017, 0x0002, 0x0000, snacid); |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
230 |
7167 | 231 aim_tlvlist_add_raw(&tl, 0x0001, strlen(sn), sn); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
232 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
233 aim_encode_password_md5(password, key, digest); |
7167 | 234 aim_tlvlist_add_raw(&tl, 0x0025, 16, digest); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
235 |
7253 | 236 #ifndef USE_OLD_MD5 |
237 aim_tlvlist_add_noval(&tl, 0x004c); | |
238 #endif | |
3213 | 239 |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
240 if (ci->clientstring) |
7167 | 241 aim_tlvlist_add_raw(&tl, 0x0003, strlen(ci->clientstring), ci->clientstring); |
242 aim_tlvlist_add_16(&tl, 0x0016, (fu16_t)ci->clientid); | |
243 aim_tlvlist_add_16(&tl, 0x0017, (fu16_t)ci->major); | |
244 aim_tlvlist_add_16(&tl, 0x0018, (fu16_t)ci->minor); | |
245 aim_tlvlist_add_16(&tl, 0x0019, (fu16_t)ci->point); | |
246 aim_tlvlist_add_16(&tl, 0x001a, (fu16_t)ci->build); | |
247 aim_tlvlist_add_32(&tl, 0x0014, (fu32_t)ci->distrib); | |
7253 | 248 aim_tlvlist_add_raw(&tl, 0x000f, strlen(ci->lang), ci->lang); |
7167 | 249 aim_tlvlist_add_raw(&tl, 0x000e, strlen(ci->country), ci->country); |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
250 |
4317 | 251 #ifndef NOSSI |
2821
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
252 /* |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
253 * If set, old-fashioned buddy lists will not work. You will need |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
254 * to use SSI. |
9467e4ee81be
[gaim-migrate @ 2834]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2704
diff
changeset
|
255 */ |
7167 | 256 aim_tlvlist_add_8(&tl, 0x004a, 0x01); |
4317 | 257 #endif |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
258 |
7167 | 259 aim_tlvlist_write(&fr->data, &tl); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
260 |
7167 | 261 aim_tlvlist_free(&tl); |
10267 | 262 |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
263 aim_tx_enqueue(sess, fr); |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
264 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
265 return 0; |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
266 } |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
267 |
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
268 /* |
2086 | 269 * This is sent back as a general response to the login command. |
270 * It can be either an error or a success, depending on the | |
271 * precense of certain TLVs. | |
272 * | |
273 * The client should check the value passed as errorcode. If | |
274 * its nonzero, there was an error. | |
275 */ | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
276 static int parse(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
2086 | 277 { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
278 aim_tlvlist_t *tlvlist; |
2704 | 279 aim_rxcallback_t userfunc; |
4102 | 280 struct aim_authresp_info *info; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
281 int ret = 0; |
2704 | 282 |
4102 | 283 info = (struct aim_authresp_info *)malloc(sizeof(struct aim_authresp_info)); |
284 memset(info, 0, sizeof(struct aim_authresp_info)); | |
2086 | 285 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
286 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
287 * Read block of TLVs. All further data is derived |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
288 * from what is parsed here. |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
289 */ |
7167 | 290 tlvlist = aim_tlvlist_read(bs); |
2086 | 291 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
292 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
293 * No matter what, we should have a screen name. |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
294 */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
295 memset(sess->sn, 0, sizeof(sess->sn)); |
7167 | 296 if (aim_tlv_gettlv(tlvlist, 0x0001, 1)) { |
297 info->sn = aim_tlv_getstr(tlvlist, 0x0001, 1); | |
4102 | 298 strncpy(sess->sn, info->sn, sizeof(sess->sn)); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
299 } |
2086 | 300 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
301 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
302 * Check for an error code. If so, we should also |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
303 * have an error url. |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
304 */ |
10267 | 305 if (aim_tlv_gettlv(tlvlist, 0x0008, 1)) |
7167 | 306 info->errorcode = aim_tlv_get16(tlvlist, 0x0008, 1); |
307 if (aim_tlv_gettlv(tlvlist, 0x0004, 1)) | |
308 info->errorurl = aim_tlv_getstr(tlvlist, 0x0004, 1); | |
2086 | 309 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
310 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
311 * BOS server address. |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
312 */ |
7167 | 313 if (aim_tlv_gettlv(tlvlist, 0x0005, 1)) |
314 info->bosip = aim_tlv_getstr(tlvlist, 0x0005, 1); | |
2086 | 315 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
316 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
317 * Authorization cookie. |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
318 */ |
7167 | 319 if (aim_tlv_gettlv(tlvlist, 0x0006, 1)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
320 aim_tlv_t *tmptlv; |
2086 | 321 |
7167 | 322 tmptlv = aim_tlv_gettlv(tlvlist, 0x0006, 1); |
2086 | 323 |
4293 | 324 info->cookielen = tmptlv->length; |
4102 | 325 info->cookie = tmptlv->value; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
326 } |
2086 | 327 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
328 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
329 * The email address attached to this account |
4102 | 330 * Not available for ICQ or @mac.com logins. |
331 * If you receive this TLV, then you are allowed to use | |
332 * family 0x0018 to check the status of your email. | |
4317 | 333 * XXX - Not really true! |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
334 */ |
7167 | 335 if (aim_tlv_gettlv(tlvlist, 0x0011, 1)) |
336 info->email = aim_tlv_getstr(tlvlist, 0x0011, 1); | |
2086 | 337 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
338 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
339 * The registration status. (Not real sure what it means.) |
4102 | 340 * Not available for ICQ or @mac.com logins. |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
341 * |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
342 * 1 = No disclosure |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
343 * 2 = Limited disclosure |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
344 * 3 = Full disclosure |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
345 * |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
346 * This has to do with whether your email address is available |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
347 * to other users or not. AFAIK, this feature is no longer used. |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
348 * |
4102 | 349 * Means you can use the admin family? (0x0007) |
350 * | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
351 */ |
7167 | 352 if (aim_tlv_gettlv(tlvlist, 0x0013, 1)) |
353 info->regstatus = aim_tlv_get16(tlvlist, 0x0013, 1); | |
2086 | 354 |
7167 | 355 if (aim_tlv_gettlv(tlvlist, 0x0040, 1)) |
356 info->latestbeta.build = aim_tlv_get32(tlvlist, 0x0040, 1); | |
357 if (aim_tlv_gettlv(tlvlist, 0x0041, 1)) | |
358 info->latestbeta.url = aim_tlv_getstr(tlvlist, 0x0041, 1); | |
359 if (aim_tlv_gettlv(tlvlist, 0x0042, 1)) | |
360 info->latestbeta.info = aim_tlv_getstr(tlvlist, 0x0042, 1); | |
361 if (aim_tlv_gettlv(tlvlist, 0x0043, 1)) | |
362 info->latestbeta.name = aim_tlv_getstr(tlvlist, 0x0043, 1); | |
363 if (aim_tlv_gettlv(tlvlist, 0x0048, 1)) | |
7253 | 364 ; /* beta serial */ |
2086 | 365 |
7167 | 366 if (aim_tlv_gettlv(tlvlist, 0x0044, 1)) |
367 info->latestrelease.build = aim_tlv_get32(tlvlist, 0x0044, 1); | |
368 if (aim_tlv_gettlv(tlvlist, 0x0045, 1)) | |
369 info->latestrelease.url = aim_tlv_getstr(tlvlist, 0x0045, 1); | |
370 if (aim_tlv_gettlv(tlvlist, 0x0046, 1)) | |
371 info->latestrelease.info = aim_tlv_getstr(tlvlist, 0x0046, 1); | |
372 if (aim_tlv_gettlv(tlvlist, 0x0047, 1)) | |
373 info->latestrelease.name = aim_tlv_getstr(tlvlist, 0x0047, 1); | |
374 if (aim_tlv_gettlv(tlvlist, 0x0049, 1)) | |
7253 | 375 ; /* lastest release serial */ |
2086 | 376 |
3912 | 377 /* |
378 * URL to change password. | |
379 */ | |
7167 | 380 if (aim_tlv_gettlv(tlvlist, 0x0054, 1)) |
381 info->chpassurl = aim_tlv_getstr(tlvlist, 0x0054, 1); | |
4102 | 382 |
383 /* | |
384 * Unknown. Seen on an @mac.com screen name with value of 0x003f | |
385 */ | |
7167 | 386 if (aim_tlv_gettlv(tlvlist, 0x0055, 1)) |
4102 | 387 ; |
388 | |
389 sess->authinfo = info; | |
2086 | 390 |
2704 | 391 if ((userfunc = aim_callhandler(sess, rx->conn, snac ? snac->family : 0x0017, snac ? snac->subtype : 0x0003))) |
4102 | 392 ret = userfunc(sess, rx, info); |
2086 | 393 |
7167 | 394 aim_tlvlist_free(&tlvlist); |
2086 | 395 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
396 return ret; |
2086 | 397 } |
398 | |
399 /* | |
7253 | 400 * Subtype 0x0007 (kind of) - Send a fake type 0x0007 SNAC to the client |
401 * | |
402 * This is a bit confusing. | |
403 * | |
404 * Normal SNAC login goes like this: | |
405 * - connect | |
406 * - server sends flap version | |
407 * - client sends flap version | |
408 * - client sends screen name (17/6) | |
409 * - server sends hash key (17/7) | |
410 * - client sends auth request (17/2 -- aim_send_login) | |
411 * - server yells | |
412 * | |
413 * XOR login (for ICQ) goes like this: | |
414 * - connect | |
415 * - server sends flap version | |
416 * - client sends auth request which contains flap version (aim_send_login) | |
417 * - server yells | |
418 * | |
419 * For the client API, we make them implement the most complicated version, | |
420 * and for the simpler version, we fake it and make it look like the more | |
421 * complicated process. | |
422 * | |
423 * This is done by giving the client a faked key, just so we can convince | |
424 * them to call aim_send_login right away, which will detect the session | |
425 * flag that says this is XOR login and ignore the key, sending an ICQ | |
426 * login request instead of the normal SNAC one. | |
427 * | |
428 * As soon as AOL makes ICQ log in the same way as AIM, this is /gone/. | |
429 * | |
430 * XXX This may cause problems if the client relies on callbacks only | |
431 * being called from the context of aim_rxdispatch()... | |
432 * | |
433 */ | |
434 static int goddamnicq(aim_session_t *sess, aim_conn_t *conn, const char *sn) | |
435 { | |
436 aim_frame_t fr; | |
437 aim_rxcallback_t userfunc; | |
10267 | 438 |
7253 | 439 fr.conn = conn; |
10267 | 440 |
7253 | 441 if ((userfunc = aim_callhandler(sess, conn, 0x0017, 0x0007))) |
442 userfunc(sess, &fr, ""); | |
443 | |
444 return 0; | |
445 } | |
446 | |
447 /* | |
448 * Subtype 0x0006 | |
449 * | |
450 * In AIM 3.5 protocol, the first stage of login is to request login from the | |
451 * Authorizer, passing it the screen name for verification. If the name is | |
452 * invalid, a 0017/0003 is spit back, with the standard error contents. If | |
453 * valid, a 0017/0007 comes back, which is the signal to send it the main | |
454 * login command (0017/0002). | |
455 * | |
456 */ | |
457 faim_export int aim_request_login(aim_session_t *sess, aim_conn_t *conn, const char *sn) | |
458 { | |
459 aim_frame_t *fr; | |
460 aim_snacid_t snacid; | |
461 aim_tlvlist_t *tl = NULL; | |
10267 | 462 |
7253 | 463 if (!sess || !conn || !sn) |
464 return -EINVAL; | |
465 | |
7313 | 466 if (isdigit(sn[0])) |
7253 | 467 return goddamnicq(sess, conn, sn); |
468 | |
469 aim_sendflapver(sess, conn); | |
470 | |
10464 | 471 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+2+2+strlen(sn)+8 ))) |
7253 | 472 return -ENOMEM; |
473 | |
474 snacid = aim_cachesnac(sess, 0x0017, 0x0006, 0x0000, NULL, 0); | |
475 aim_putsnac(&fr->data, 0x0017, 0x0006, 0x0000, snacid); | |
476 | |
477 aim_tlvlist_add_raw(&tl, 0x0001, strlen(sn), sn); | |
10464 | 478 |
479 /* | |
480 * These are sent in logins for recent WinAIM clients. Maybe tells | |
481 * the server we're able to handle SecurID requests? That's a complete | |
482 * guess. | |
483 */ | |
484 aim_tlvlist_add_noval(&tl, 0x004b); | |
485 aim_tlvlist_add_noval(&tl, 0x005a); | |
486 | |
7253 | 487 aim_tlvlist_write(&fr->data, &tl); |
488 aim_tlvlist_free(&tl); | |
489 | |
490 aim_tx_enqueue(sess, fr); | |
491 | |
492 return 0; | |
493 } | |
494 | |
495 /* | |
496 * Subtype 0x0007 | |
497 * | |
2086 | 498 * Middle handler for 0017/0007 SNACs. Contains the auth key prefixed |
499 * by only its length in a two byte word. | |
500 * | |
501 * Calls the client, which should then use the value to call aim_send_login. | |
502 * | |
503 */ | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
504 static int keyparse(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
2086 | 505 { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
506 int keylen, ret = 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
507 aim_rxcallback_t userfunc; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
508 char *keystr; |
2086 | 509 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
510 keylen = aimbs_get16(bs); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
511 keystr = aimbs_getstr(bs, keylen); |
2086 | 512 |
4230 | 513 /* XXX - When GiantGrayPanda signed on AIM I got a thing asking me to register |
514 * for the netscape network. This SNAC had a type 0x0058 TLV with length 10. | |
515 * Data is 0x0007 0004 3e19 ae1e 0006 0004 0000 0005 */ | |
516 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
517 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
518 ret = userfunc(sess, rx, keystr); |
2086 | 519 |
10267 | 520 free(keystr); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
521 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
522 return ret; |
2086 | 523 } |
524 | |
10464 | 525 /** |
526 * Subtype 0x000a | |
527 * | |
528 * Receive SecurID request. | |
529 */ | |
530 static int got_securid_request(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) | |
531 { | |
532 int ret = 0; | |
533 aim_rxcallback_t userfunc; | |
534 | |
535 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) | |
536 ret = userfunc(sess, rx); | |
537 | |
538 return ret; | |
539 } | |
540 | |
541 /** | |
542 * Subtype 0x000b | |
543 * | |
544 * Send SecurID response. | |
545 */ | |
546 faim_export int aim_auth_securid_send(aim_session_t *sess, const char *securid) | |
547 { | |
548 aim_conn_t *conn; | |
549 aim_frame_t *fr; | |
550 aim_snacid_t snacid; | |
551 int len; | |
552 | |
553 if (!sess || !(conn = aim_getconn_type_all(sess, AIM_CONN_TYPE_AUTH)) || !securid) | |
554 return -EINVAL; | |
555 | |
556 len = strlen(securid); | |
557 | |
558 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x01, 10+2+len))) | |
559 return -ENOMEM; | |
560 | |
561 snacid = aim_cachesnac(sess, AIM_CB_FAM_ATH, AIM_CB_ATH_SECURID_RESPONSE, 0x0000, NULL, 0); | |
562 aim_putsnac(&fr->data, AIM_CB_FAM_ATH, AIM_CB_ATH_SECURID_RESPONSE, 0x0000, 0); | |
563 | |
564 aimbs_put16(&fr->data, len); | |
565 aimbs_putraw(&fr->data, securid, len); | |
566 | |
567 aim_tx_enqueue(sess, fr); | |
568 | |
569 return 0; | |
570 } | |
571 | |
4102 | 572 static void auth_shutdown(aim_session_t *sess, aim_module_t *mod) |
573 { | |
574 if (sess->authinfo) { | |
575 free(sess->authinfo->sn); | |
576 free(sess->authinfo->bosip); | |
577 free(sess->authinfo->errorurl); | |
578 free(sess->authinfo->email); | |
579 free(sess->authinfo->chpassurl); | |
580 free(sess->authinfo->latestrelease.name); | |
581 free(sess->authinfo->latestrelease.url); | |
582 free(sess->authinfo->latestrelease.info); | |
583 free(sess->authinfo->latestbeta.name); | |
584 free(sess->authinfo->latestbeta.url); | |
585 free(sess->authinfo->latestbeta.info); | |
586 free(sess->authinfo); | |
587 } | |
588 } | |
589 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
590 static int snachandler(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
2086 | 591 { |
592 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
593 if (snac->subtype == 0x0003) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
594 return parse(sess, mod, rx, snac, bs); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
595 else if (snac->subtype == 0x0007) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
596 return keyparse(sess, mod, rx, snac, bs); |
10464 | 597 else if (snac->subtype == 0x000a) |
598 return got_securid_request(sess, mod, rx, snac, bs); | |
2086 | 599 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
600 return 0; |
2086 | 601 } |
602 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
603 faim_internal int auth_modfirst(aim_session_t *sess, aim_module_t *mod) |
2086 | 604 { |
605 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
606 mod->family = 0x0017; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
607 mod->version = 0x0000; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
608 mod->flags = 0; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
609 strncpy(mod->name, "auth", sizeof(mod->name)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
610 mod->snachandler = snachandler; |
4102 | 611 mod->shutdown = auth_shutdown; |
2086 | 612 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
613 return 0; |
2086 | 614 } |