annotate libpurple/protocols/oscar/clientlogin.c @ 27161:7054f810b0f9

Check in code that connects to oscar using clientLogin. This is the authentication scheme they've publically documented. We still use the old MD5-style login as the default, but you can optionally try this out by checking a check box on the advanced tab of your oscar account. Functionally everything is supposed to be the same. However, for some reason users with Mobile IM forwarding turned on don't show up online and can't be messaged. Not sure why. Using clientLogin DOES make it easier for AOL to track us. And yes, it probably makes it easier for AOL to block us, too. But I don't believe they want to do that. I believe they're trying to keep their network open, and I think we should appreciate that and try to work with them. We're not just some small open source project that slips under the radar unnoticed anymore. It's good to have options, right? None of this code was taken from anywhere (outside of libpurple). I wrote it all from scratch (and took a few bits from other places in libpurple). I did use the documentation on http://dev.aol.com/aim , but I don't believe that affects us from a licensing standpoint in any way. If you disagree we should talk about it on the devel mailing list.
author Mark Doliner <mark@kingant.net>
date Tue, 23 Jun 2009 18:20:12 +0000
parents
children 1a255e11c02b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27161
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
1 /*
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
2 * Purple's oscar protocol plugin
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
3 * This file is the legal property of its developers.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
4 * Please see the AUTHORS file distributed alongside this file.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
5 *
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
6 * This library is free software; you can redistribute it and/or
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
9 * version 2 of the License, or (at your option) any later version.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
10 *
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
11 * This library is distributed in the hope that it will be useful,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
14 * Lesser General Public License for more details.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
15 *
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
17 * License along with this library; if not, write to the Free Software
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
19 */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
20
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
21 /**
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
22 * This file implements AIM's clientLogin procedure for authenticating
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
23 * users. This replaces the older MD5-based and XOR-based
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
24 * authentication methods that use SNAC family 0x0017.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
25 *
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
26 * This doesn't use SNACs or FLAPs at all. It makes http and https
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
27 * POSTs to AOL to validate the user based on the password they
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
28 * provided to us. Upon successful authentication we request a
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
29 * connection to the BOS server by calling startOSCARsession. The
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
30 * AOL server gives us the hostname and port number to use, as well
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
31 * as the cookie to use to authenticate to the BOS server. And then
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
32 * everything else is the same as with BUCP.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
33 *
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
34 * For details, see:
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
35 * http://dev.aol.com/aim/oscar/#AUTH
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
36 * http://dev.aol.com/authentication_for_clients
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
37 */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
38
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
39 #include "cipher.h"
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
40 #include "core.h"
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
41
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
42 #include "oscar.h"
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
43
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
44 #define URL_CLIENT_LOGIN "https://api.screenname.aol.com/auth/clientLogin"
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
45 #define URL_START_OSCAR_SESSION "http://api.oscar.aol.com/aim/startOSCARSession"
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
46
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
47 /*
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
48 * Using clientLogin requires a developer ID. This dev ID is owned by
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
49 * the AIM account "markdoliner"
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
50 */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
51 #define CLIENT_KEY "ma15d7JTxbmVG-RP"
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
52
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
53 /**
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
54 * This is similar to purple_url_encode() except that it follows
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
55 * RFC3986 a little more closely by not encoding - . _ and ~
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
56 * It also uses capital letters as hex characters because capital
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
57 * letters are required by AOL. The RFC says that capital letters
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
58 * are a SHOULD and that URLs that use capital letters are
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
59 * equivalent to URLs that use small letters.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
60 *
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
61 * TODO: Check if purple_url_encode() can be replaced with this
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
62 * version without breaking anything.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
63 */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
64 static const char *oscar_auth_url_encode(const char *str)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
65 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
66 const char *iter;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
67 static char buf[BUF_LEN];
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
68 char utf_char[6];
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
69 guint i, j = 0;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
70
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
71 g_return_val_if_fail(str != NULL, NULL);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
72 g_return_val_if_fail(g_utf8_validate(str, -1, NULL), NULL);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
73
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
74 iter = str;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
75 for (; *iter && j < (BUF_LEN - 1) ; iter = g_utf8_next_char(iter)) {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
76 gunichar c = g_utf8_get_char(iter);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
77 /* If the character is an ASCII character and is alphanumeric
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
78 * no need to escape */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
79 if ((c < 128 && isalnum(c)) || c =='-' || c == '.' || c == '_' || c == '~') {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
80 buf[j++] = c;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
81 } else {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
82 int bytes = g_unichar_to_utf8(c, utf_char);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
83 for (i = 0; i < bytes; i++) {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
84 if (j > (BUF_LEN - 4))
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
85 break;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
86 sprintf(buf + j, "%%%02X", utf_char[i] & 0xff);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
87 j += 3;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
88 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
89 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
90 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
91
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
92 buf[j] = '\0';
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
93
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
94 return buf;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
95 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
96
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
97 /**
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
98 * @return A null-terminated base64 encoded version of the HMAC
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
99 * calculated using the given key and data.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
100 */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
101 static gchar *hmac_sha256(const char *key, const char *message)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
102 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
103 PurpleCipherContext *context;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
104 guchar digest[32];
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
105
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
106 context = purple_cipher_context_new_by_name("hmac", NULL);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
107 purple_cipher_context_set_option(context, "hash", "sha256");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
108 purple_cipher_context_set_key(context, (guchar *)key);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
109 purple_cipher_context_append(context, (guchar *)message, strlen(message));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
110 purple_cipher_context_digest(context, sizeof(digest), digest, NULL);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
111 purple_cipher_context_destroy(context);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
112
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
113 return purple_base64_encode(digest, sizeof(digest));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
114 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
115
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
116 /**
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
117 * @return A base-64 encoded HMAC-SHA256 signature created using the
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
118 * technique documented at
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
119 * http://dev.aol.com/authentication_for_clients#signing
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
120 */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
121 static gchar *generate_signature(const char *method, const char *url, const char *parameters, const char *session_key)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
122 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
123 char *encoded_url, *signature_base_string, *signature;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
124 const char *encoded_parameters;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
125
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
126 encoded_url = g_strdup(oscar_auth_url_encode(url));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
127 encoded_parameters = oscar_auth_url_encode(parameters);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
128 signature_base_string = g_strdup_printf("%s&%s&%s",
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
129 method, encoded_url, encoded_parameters);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
130 g_free(encoded_url);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
131
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
132 signature = hmac_sha256(session_key, signature_base_string);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
133 g_free(signature_base_string);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
134
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
135 return signature;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
136 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
137
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
138 static gboolean parse_start_oscar_session_response(PurpleConnection *gc, const gchar *response, gsize response_len, char **host, unsigned short *port, char **cookie)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
139 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
140 xmlnode *response_node, *tmp_node, *data_node;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
141 xmlnode *host_node, *port_node, *cookie_node;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
142 char *tmp;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
143
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
144 /* Parse the response as XML */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
145 response_node = xmlnode_from_str(response, response_len);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
146 if (response_node == NULL)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
147 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
148 purple_debug_error("oscar", "startOSCARSession could not parse "
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
149 "response as XML: %s\n", response);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
150 purple_connection_error_reason(gc,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
151 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
152 _("Received unexpected response from " URL_START_OSCAR_SESSION));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
153 return FALSE;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
154 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
155
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
156 /* Grab the necessary XML nodes */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
157 tmp_node = xmlnode_get_child(response_node, "statusCode");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
158 data_node = xmlnode_get_child(response_node, "data");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
159 if (data_node != NULL) {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
160 host_node = xmlnode_get_child(data_node, "host");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
161 port_node = xmlnode_get_child(data_node, "port");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
162 cookie_node = xmlnode_get_child(data_node, "cookie");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
163 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
164
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
165 /* Make sure we have a status code */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
166 if (tmp_node == NULL || (tmp = xmlnode_get_data_unescaped(tmp_node)) == NULL) {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
167 purple_debug_error("oscar", "startOSCARSession response was "
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
168 "missing statusCode: %s\n", response);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
169 purple_connection_error_reason(gc,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
170 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
171 _("Received unexpected response from " URL_START_OSCAR_SESSION));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
172 xmlnode_free(response_node);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
173 return FALSE;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
174 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
175
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
176 /* Make sure the status code was 200 */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
177 if (strcmp(tmp, "200") != 0)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
178 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
179 purple_debug_error("oscar", "startOSCARSession response statusCode "
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
180 "was %s: %s\n", tmp, response);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
181
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
182 if (strcmp(tmp, "401") == 0)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
183 purple_connection_error_reason(gc,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
184 PURPLE_CONNECTION_ERROR_OTHER_ERROR,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
185 _("You have been connecting and disconnecting too "
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
186 "frequently. Wait ten minutes and try again. If "
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
187 "you continue to try, you will need to wait even "
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
188 "longer."));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
189 else
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
190 purple_connection_error_reason(gc,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
191 PURPLE_CONNECTION_ERROR_OTHER_ERROR,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
192 _("Received unexpected response from " URL_START_OSCAR_SESSION));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
193
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
194 g_free(tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
195 xmlnode_free(response_node);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
196 return FALSE;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
197 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
198 g_free(tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
199
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
200 /* Make sure we have everything else */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
201 if (data_node == NULL || host_node == NULL ||
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
202 port_node == NULL || cookie_node == NULL)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
203 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
204 purple_debug_error("oscar", "startOSCARSession response was missing "
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
205 "something: %s\n", response);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
206 purple_connection_error_reason(gc,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
207 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
208 _("Received unexpected response from " URL_START_OSCAR_SESSION));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
209 xmlnode_free(response_node);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
210 return FALSE;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
211 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
212
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
213 /* Extract data from the XML */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
214 *host = xmlnode_get_data_unescaped(host_node);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
215 tmp = xmlnode_get_data_unescaped(port_node);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
216 *cookie = xmlnode_get_data_unescaped(cookie_node);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
217 if (*host == NULL || **host == '\0' || tmp == NULL || *tmp == '\0' || cookie == NULL || *cookie == '\0')
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
218 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
219 purple_debug_error("oscar", "startOSCARSession response was missing "
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
220 "something: %s\n", response);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
221 purple_connection_error_reason(gc,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
222 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
223 _("Received unexpected response from " URL_START_OSCAR_SESSION));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
224 g_free(*host);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
225 g_free(tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
226 g_free(*cookie);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
227 xmlnode_free(response_node);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
228 return FALSE;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
229 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
230
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
231 *port = atoi(tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
232 g_free(tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
233
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
234 return TRUE;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
235 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
236
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
237 static void start_oscar_session_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
238 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
239 OscarData *od;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
240 PurpleConnection *gc;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
241 char *host, *cookie;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
242 unsigned short port;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
243 guint8 *cookiedata;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
244 gsize cookiedata_len;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
245
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
246 od = user_data;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
247 gc = od->gc;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
248
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
249 od->url_data = NULL;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
250
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
251 if (error_message != NULL || len == 0) {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
252 gchar *tmp;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
253 tmp = g_strdup_printf(_("Error requesting " URL_START_OSCAR_SESSION
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
254 ": %s"), error_message);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
255 purple_connection_error_reason(gc,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
256 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
257 g_free(tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
258 return;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
259 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
260
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
261 if (!parse_start_oscar_session_response(gc, url_text, len, &host, &port, &cookie))
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
262 return;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
263
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
264 cookiedata = purple_base64_decode(cookie, &cookiedata_len);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
265 oscar_connect_to_bos(gc, od, host, port, cookiedata, cookiedata_len);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
266 g_free(cookiedata);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
267
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
268 g_free(host);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
269 g_free(cookie);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
270 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
271
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
272 static void send_start_oscar_session(OscarData *od, const char *token, const char *session_key, time_t hosttime)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
273 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
274 char *query_string, *signature, *url;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
275
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
276 /* Construct the GET parameters */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
277 query_string = g_strdup_printf("a=%s"
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
278 "&f=xml"
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
279 "&k=" CLIENT_KEY
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
280 "&ts=%zu"
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
281 "&useTLS=0",
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
282 oscar_auth_url_encode(token), hosttime);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
283 signature = generate_signature("GET", URL_START_OSCAR_SESSION,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
284 query_string, session_key);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
285 url = g_strdup_printf(URL_START_OSCAR_SESSION "?%s&sig_sha256=%s",
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
286 query_string, signature);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
287 g_free(query_string);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
288 g_free(signature);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
289
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
290 /* Make the request */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
291 od->url_data = purple_util_fetch_url(url, TRUE, NULL, FALSE,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
292 start_oscar_session_cb, od);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
293 g_free(url);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
294 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
295
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
296 /**
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
297 * This function parses the given response from a clientLogin request
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
298 * and extracts the useful information.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
299 *
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
300 * @param gc The PurpleConnection. If the response data does
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
301 * not indicate then purple_connection_error_reason()
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
302 * will be called to close this connection.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
303 * @param response The response data from the clientLogin request.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
304 * @param response_len The length of the above response, or -1 if
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
305 * @response is NUL terminated.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
306 * @param token If parsing was successful then this will be set to
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
307 * a newly allocated string containing the token. The
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
308 * caller should g_free this string when it is finished
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
309 * with it. On failure this value will be untouched.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
310 * @param secret If parsing was successful then this will be set to
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
311 * a newly allocated string containing the secret. The
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
312 * caller should g_free this string when it is finished
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
313 * with it. On failure this value will be untouched.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
314 * @param hosttime If parsing was successful then this will be set to
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
315 * the time on the OpenAuth Server in seconds since the
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
316 * Unix epoch. On failure this value will be untouched.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
317 *
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
318 * @return TRUE if the request was successful and we were able to
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
319 * extract all info we need. Otherwise FALSE.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
320 */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
321 static gboolean parse_client_login_response(PurpleConnection *gc, const gchar *response, gsize response_len, char **token, char **secret, time_t *hosttime)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
322 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
323 xmlnode *response_node, *tmp_node, *data_node;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
324 xmlnode *secret_node, *hosttime_node, *token_node, *tokena_node;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
325 char *tmp;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
326
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
327 /* Parse the response as XML */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
328 response_node = xmlnode_from_str(response, response_len);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
329 if (response_node == NULL)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
330 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
331 purple_debug_error("oscar", "clientLogin could not parse "
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
332 "response as XML: %s\n", response);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
333 purple_connection_error_reason(gc,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
334 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
335 _("Received unexpected response from " URL_CLIENT_LOGIN));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
336 return FALSE;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
337 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
338
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
339 /* Grab the necessary XML nodes */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
340 tmp_node = xmlnode_get_child(response_node, "statusCode");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
341 data_node = xmlnode_get_child(response_node, "data");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
342 if (data_node != NULL) {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
343 secret_node = xmlnode_get_child(data_node, "sessionSecret");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
344 hosttime_node = xmlnode_get_child(data_node, "hostTime");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
345 token_node = xmlnode_get_child(data_node, "token");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
346 if (token_node != NULL)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
347 tokena_node = xmlnode_get_child(token_node, "a");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
348 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
349
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
350 /* Make sure we have a status code */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
351 if (tmp_node == NULL || (tmp = xmlnode_get_data_unescaped(tmp_node)) == NULL) {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
352 purple_debug_error("oscar", "clientLogin response was "
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
353 "missing statusCode: %s\n", response);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
354 purple_connection_error_reason(gc,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
355 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
356 _("Received unexpected response from " URL_CLIENT_LOGIN));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
357 xmlnode_free(response_node);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
358 return FALSE;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
359 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
360
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
361 /* Make sure the status code was 200 */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
362 if (strcmp(tmp, "200") != 0)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
363 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
364 int status_code, status_detail_code = 0;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
365
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
366 status_code = atoi(tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
367 g_free(tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
368 tmp_node = xmlnode_get_child(response_node, "statusDetailCode");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
369 if (tmp_node != NULL && (tmp = xmlnode_get_data_unescaped(tmp_node)) != NULL) {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
370 status_detail_code = atoi(tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
371 g_free(tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
372 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
373
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
374 purple_debug_error("oscar", "clientLogin response statusCode "
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
375 "was %d (%d): %s\n", status_code, status_detail_code, response);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
376
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
377 if (status_code == 330 && status_detail_code == 3011) {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
378 purple_connection_error_reason(gc,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
379 PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
380 _("Incorrect password."));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
381 } else if (status_code == 401 && status_detail_code == 3019) {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
382 purple_connection_error_reason(gc,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
383 PURPLE_CONNECTION_ERROR_OTHER_ERROR,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
384 _("AOL does not allow your screen name to authenticate via this site."));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
385 } else
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
386 purple_connection_error_reason(gc,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
387 PURPLE_CONNECTION_ERROR_OTHER_ERROR,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
388 _("Received unexpected response from " URL_CLIENT_LOGIN));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
389
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
390 xmlnode_free(response_node);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
391 return FALSE;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
392 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
393 g_free(tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
394
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
395 /* Make sure we have everything else */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
396 if (data_node == NULL || secret_node == NULL ||
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
397 token_node == NULL || tokena_node == NULL)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
398 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
399 purple_debug_error("oscar", "clientLogin response was missing "
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
400 "something: %s\n", response);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
401 purple_connection_error_reason(gc,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
402 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
403 _("Received unexpected response from " URL_CLIENT_LOGIN));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
404 xmlnode_free(response_node);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
405 return FALSE;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
406 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
407
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
408 /* Extract data from the XML */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
409 *token = xmlnode_get_data_unescaped(tokena_node);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
410 *secret = xmlnode_get_data_unescaped(secret_node);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
411 tmp = xmlnode_get_data_unescaped(hosttime_node);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
412 if (*token == NULL || **token == '\0' || *secret == NULL || **secret == '\0' || tmp == NULL || *tmp == '\0')
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
413 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
414 purple_debug_error("oscar", "clientLogin response was missing "
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
415 "something: %s\n", response);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
416 purple_connection_error_reason(gc,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
417 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
418 _("Received unexpected response from " URL_CLIENT_LOGIN));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
419 g_free(*token);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
420 g_free(*secret);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
421 g_free(tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
422 xmlnode_free(response_node);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
423 return FALSE;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
424 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
425
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
426 *hosttime = strtol(tmp, NULL, 10);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
427 g_free(tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
428
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
429 xmlnode_free(response_node);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
430
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
431 return TRUE;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
432 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
433
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
434 static void client_login_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
435 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
436 OscarData *od;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
437 PurpleConnection *gc;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
438 char *token, *secret, *session_key;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
439 time_t hosttime;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
440 int password_len;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
441 char *password;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
442
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
443 od = user_data;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
444 gc = od->gc;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
445
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
446 od->url_data = NULL;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
447
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
448 if (error_message != NULL || len == 0) {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
449 gchar *tmp;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
450 tmp = g_strdup_printf(_("Error requesting " URL_CLIENT_LOGIN
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
451 ": %s"), error_message);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
452 purple_connection_error_reason(gc,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
453 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
454 g_free(tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
455 return;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
456 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
457
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
458 if (!parse_client_login_response(gc, url_text, len, &token, &secret, &hosttime))
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
459 return;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
460
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
461 password_len = strlen(purple_connection_get_password(gc));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
462 password = g_strdup_printf("%.*s",
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
463 od->icq ? MIN(password_len, MAXICQPASSLEN) : password_len,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
464 purple_connection_get_password(gc));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
465 session_key = hmac_sha256(password, secret);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
466 g_free(password);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
467 g_free(secret);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
468
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
469 send_start_oscar_session(od, token, session_key, hosttime);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
470
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
471 g_free(token);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
472 g_free(session_key);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
473 }
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
474
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
475 /**
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
476 * This function sends a request to
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
477 * https://api.screenname.aol.com/auth/clientLogin with the user's
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
478 * username and password and receives the user's session key, which is
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
479 * used to request a connection to the BOSS server.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
480 */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
481 void send_client_login(OscarData *od, const char *username)
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
482 {
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
483 PurpleConnection *gc;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
484 GString *request, *body;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
485 const char *tmp;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
486 char *password;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
487 int password_len;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
488
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
489 gc = od->gc;
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
490
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
491 /*
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
492 * We truncate ICQ passwords to 8 characters. There is probably a
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
493 * limit for AIM passwords, too, but we really only need to do
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
494 * this for ICQ because older ICQ clients let you enter a password
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
495 * as long as you wanted and then they truncated it silently.
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
496 *
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
497 * And we can truncate based on the number of bytes and not the
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
498 * number of characters because passwords for AIM and ICQ are
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
499 * supposed to be plain ASCII (I don't know if this has always been
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
500 * the case, though).
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
501 */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
502 tmp = purple_connection_get_password(gc);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
503 password_len = strlen(tmp);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
504 password = g_strndup(tmp, od->icq ? MIN(password_len, MAXICQPASSLEN) : password_len);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
505
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
506 /* Construct the body of the HTTP POST request */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
507 body = g_string_new("");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
508 g_string_append_printf(body, "devId=" CLIENT_KEY);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
509 g_string_append_printf(body, "&f=xml");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
510 g_string_append_printf(body, "&pwd=%s", oscar_auth_url_encode(password));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
511 g_string_append_printf(body, "&s=%s", oscar_auth_url_encode(username));
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
512 g_free(password);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
513
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
514 /* Construct an HTTP POST request */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
515 request = g_string_new("POST /auth/clientLogin HTTP/1.0\r\n"
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
516 "Connection: close\r\n"
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
517 "Accept: */*\r\n");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
518
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
519 /* Tack on the body */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
520 g_string_append_printf(request, "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n");
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
521 g_string_append_printf(request, "Content-Length: %lu\r\n\r\n", body->len);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
522 g_string_append_len(request, body->str, body->len);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
523 g_string_free(body, TRUE);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
524
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
525 /* Send the POST request */
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
526 od->url_data = purple_util_fetch_url_request(URL_CLIENT_LOGIN,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
527 TRUE, NULL, FALSE, request->str, FALSE,
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
528 client_login_cb, od);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
529 g_string_free(request, TRUE);
7054f810b0f9 Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <mark@kingant.net>
parents:
diff changeset
530 }