Mercurial > pidgin
annotate src/protocols/oscar/auth.c @ 9166:1e51236d825e
[gaim-migrate @ 9951]
This removes some stuff for im image that isn't used anymore.
Basicly one of the things I did when i brought it back, was to make it so
the host widget doesn't have to do any special handling for its imhtml to
support <img id="###"> tags. And while this goal was achieved in 0.78,
there's still code all over the place that checks flags that aren't used
and iterates over lists that will always be empty. This doesn't remove all
of it, but removes some of it anyway.
committer: Tailor Script <tailor@pidgin.im>
author | Tim Ringenbach <marv@pidgin.im> |
---|---|
date | Wed, 02 Jun 2004 05:08:49 +0000 |
parents | ea2d07ad05a9 |
children | 9cafe038c95e |
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 | |
61 md5_init(&state); | |
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 | |
79 md5_init(&state); | |
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 |
7253 | 121 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x0001, 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); |
2703
441b84ab7f4e
[gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
262 |
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 */ |
7167 | 305 if (aim_tlv_gettlv(tlvlist, 0x0008, 1)) |
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; | |
438 | |
439 fr.conn = conn; | |
440 | |
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; | |
462 | |
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 | |
471 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+2+2+strlen(sn) /*+8*/ ))) | |
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); | |
478 /* aim_tlvlist_add_noval(&tl, 0x004b); | |
479 aim_tlvlist_add_noval(&tl, 0x005a); */ | |
480 aim_tlvlist_write(&fr->data, &tl); | |
481 aim_tlvlist_free(&tl); | |
482 | |
483 aim_tx_enqueue(sess, fr); | |
484 | |
485 return 0; | |
486 } | |
487 | |
488 /* | |
489 * Subtype 0x0007 | |
490 * | |
2086 | 491 * Middle handler for 0017/0007 SNACs. Contains the auth key prefixed |
492 * by only its length in a two byte word. | |
493 * | |
494 * Calls the client, which should then use the value to call aim_send_login. | |
495 * | |
496 */ | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
497 static int keyparse(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
2086 | 498 { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
499 int keylen, ret = 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
500 aim_rxcallback_t userfunc; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
501 char *keystr; |
2086 | 502 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
503 keylen = aimbs_get16(bs); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
504 keystr = aimbs_getstr(bs, keylen); |
2086 | 505 |
4230 | 506 /* XXX - When GiantGrayPanda signed on AIM I got a thing asking me to register |
507 * for the netscape network. This SNAC had a type 0x0058 TLV with length 10. | |
508 * Data is 0x0007 0004 3e19 ae1e 0006 0004 0000 0005 */ | |
509 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
510 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
511 ret = userfunc(sess, rx, keystr); |
2086 | 512 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
513 free(keystr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
514 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
515 return ret; |
2086 | 516 } |
517 | |
4102 | 518 static void auth_shutdown(aim_session_t *sess, aim_module_t *mod) |
519 { | |
520 if (sess->authinfo) { | |
521 free(sess->authinfo->sn); | |
522 free(sess->authinfo->bosip); | |
523 free(sess->authinfo->errorurl); | |
524 free(sess->authinfo->email); | |
525 free(sess->authinfo->chpassurl); | |
526 free(sess->authinfo->latestrelease.name); | |
527 free(sess->authinfo->latestrelease.url); | |
528 free(sess->authinfo->latestrelease.info); | |
529 free(sess->authinfo->latestbeta.name); | |
530 free(sess->authinfo->latestbeta.url); | |
531 free(sess->authinfo->latestbeta.info); | |
532 free(sess->authinfo); | |
533 } | |
534 } | |
535 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
536 static int snachandler(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
2086 | 537 { |
538 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
539 if (snac->subtype == 0x0003) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
540 return parse(sess, mod, rx, snac, bs); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
541 else if (snac->subtype == 0x0007) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
542 return keyparse(sess, mod, rx, snac, bs); |
2086 | 543 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
544 return 0; |
2086 | 545 } |
546 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
547 faim_internal int auth_modfirst(aim_session_t *sess, aim_module_t *mod) |
2086 | 548 { |
549 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
550 mod->family = 0x0017; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
551 mod->version = 0x0000; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
552 mod->flags = 0; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
553 strncpy(mod->name, "auth", sizeof(mod->name)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
554 mod->snachandler = snachandler; |
4102 | 555 mod->shutdown = auth_shutdown; |
2086 | 556 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
557 return 0; |
2086 | 558 } |