annotate libpurple/protocols/oscar/clientlogin.c @ 27272:1a255e11c02b

Dear Compiler, Shut up!
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sat, 27 Jun 2009 10:37:26 +0000
parents 7054f810b0f9
children a2508ac2e536
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27243
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");
27272
1a255e11c02b Dear Compiler, Shut up!
Sadrul Habib Chowdhury <imadil@gmail.com>
parents: 27243
diff changeset
521 g_string_append_printf(request, "Content-Length: %" G_GSIZE_FORMAT "\r\n\r\n", body->len);
27243
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 }