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