libpurple/protocols/oscar/kerberos.c

Tue, 14 Jun 2016 18:08:10 -0400

author
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
date
Tue, 14 Jun 2016 18:08:10 -0400
branch
release-2.x.y
changeset 37699
fcafc93ddd4d
parent 37698
76757030e995
child 37700
b3fc32a626df
permissions
-rw-r--r--

oscar: Set password_xored as gchar to remove a warning

g_string_append_len expects a gchar, not a guint8

37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
1 /*
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
2 * Purple's oscar protocol plugin
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
3 * This file is the legal property of its developers.
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
4 * Please see the AUTHORS file distributed alongside this file.
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
5 *
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
6 * This library is free software; you can redistribute it and/or
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
9 * version 2 of the License, or (at your option) any later version.
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
10 *
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
11 * This library is distributed in the hope that it will be useful,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
14 * Lesser General Public License for more details.
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
15 *
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
17 * License along with this library; if not, write to the Free Software
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
19 */
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
20
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
21 /**
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
22 * This file implements AIM's kerberos procedure for authenticating
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
23 * users. This replaces the older MD5-based and XOR-based
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
24 * authentication methods that use SNAC family 0x0017.
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
25 *
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
26 * This doesn't use SNACs or FLAPs at all. It makes http and https
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
27 * POSTs to AOL to validate the user based on the password they
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
28 * provided to us. Upon successful authentication we request a
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
29 * connection to the BOS server by calling startOSCARsession. The
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
30 * AOL server gives us the hostname and port number to use, as well
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
31 * as the cookie to use to authenticate to the BOS server. And then
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
32 * everything else is the same as with BUCP.
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
33 *
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
34 * For details, see:
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
35 * http://dev.aol.com/aim/oscar/#AUTH
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
36 * http://dev.aol.com/authentication_for_clients
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
37 */
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
38
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
39 #include "oscar.h"
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
40 #include "oscarcommon.h"
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
41 #include "core.h"
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
42
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
43 #define MAXAIMPASSLEN 16
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
44
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
45 /*
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
46 * Incomplete X-SNAC format taken from reverse engineering doen by digsby:
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
47 * https://github.com/ifwe/digsby/blob/master/digsby/src/oscar/login2.py
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
48 */
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
49 typedef struct {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
50 aim_tlv_t *main_tlv;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
51 gchar *principal1;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
52 gchar *service;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
53 gchar *principal1_again;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
54 gchar *principal2;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
55 gchar unknown;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
56 guint8 *footer;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
57 struct {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
58 guint32 unknown1;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
59 guint32 unknown2;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
60 guint32 epoch_now;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
61 guint32 epoch_valid;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
62 guint32 epoch_renew;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
63 guint32 epoch_expire;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
64 guint32 unknown3;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
65 guint32 unknown4;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
66 guint32 unknown5;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
67 } dates;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
68 GSList *tlvlist;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
69 } aim_xsnac_token_t;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
70
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
71 typedef struct {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
72 guint16 family;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
73 guint16 subtype;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
74 guint8 flags[8];
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
75 guint16 request_id;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
76 guint32 epoch;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
77 guint32 unknown;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
78 gchar *principal1;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
79 gchar *principal2;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
80 guint16 num_tokens;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
81 aim_xsnac_token_t *tokens;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
82 GSList *tlvlist;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
83 } aim_xsnac_t;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
84
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
85 static gchar *get_kdc_url(OscarData *od)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
86 {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
87 PurpleAccount *account = purple_connection_get_account(od->gc);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
88 const gchar *server;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
89 gchar *url;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
90 gchar *port_str = NULL;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
91 gint port;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
92
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
93 server = purple_account_get_string(account, "server", AIM_DEFAULT_KDC_SERVER);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
94 port = purple_account_get_int(account, "port", AIM_DEFAULT_KDC_PORT);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
95 if (port != 443)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
96 port_str = g_strdup_printf (":%d", port);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
97 url = g_strdup_printf ("https://%s%s/", server, port_str ? port_str : "");
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
98 if (port_str)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
99 g_free (port_str);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
100
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
101 return url;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
102 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
103
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
104 /*
37698
76757030e995 oscar: Remove forgotten/unused variable
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37697
diff changeset
105 * Using kerberos auth requires a developer ID. This key is for libpurple.
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
106 * It is the default key for all libpurple-based clients. AOL encourages
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
107 * UIs (especially ones with lots of users) to override this with their
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
108 * own key. This key is owned by the AIM account "markdoliner"
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
109 *
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
110 * Keys can be managed at http://developer.aim.com/manageKeys.jsp
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
111 */
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
112 #define DEFAULT_CLIENT_KEY "ma15d7JTxbmVG-RP"
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
113
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
114 static const char *get_client_key(OscarData *od)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
115 {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
116 return oscar_get_ui_info_string(
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
117 od->icq ? "prpl-icq-clientkey" : "prpl-aim-clientkey",
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
118 DEFAULT_CLIENT_KEY);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
119 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
120
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
121 static void
37699
fcafc93ddd4d oscar: Set password_xored as gchar to remove a warning
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37698
diff changeset
122 aim_encode_password(const char *password, gchar *encoded)
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
123 {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
124 guint8 encoding_table[] = {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
125 0x76, 0x91, 0xc5, 0xe7,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
126 0xd0, 0xd9, 0x95, 0xdd,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
127 0x9e, 0x2F, 0xea, 0xd8,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
128 0x6B, 0x21, 0xc2, 0xbc,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
129
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
130 };
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
131 guint i;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
132
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
133 /*
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
134 * We truncate AIM passwords to 16 characters since that's what
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
135 * the official client does as well.
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
136 */
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
137 for (i = 0; i < strlen(password) && i < MAXAIMPASSLEN; i++)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
138 encoded[i] = (password[i] ^ encoding_table[i]);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
139 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
140
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
141 static void
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
142 aim_xsnac_free(aim_xsnac_t *xsnac)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
143 {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
144 gint i;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
145
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
146 if (xsnac->principal1)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
147 g_free (xsnac->principal1);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
148 if (xsnac->principal2)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
149 g_free (xsnac->principal2);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
150 aim_tlvlist_free (xsnac->tlvlist);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
151
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
152 for (i = 0; i < xsnac->num_tokens; i++) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
153 g_free(xsnac->tokens[i].main_tlv->value);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
154 g_free(xsnac->tokens[i].main_tlv);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
155 if (xsnac->tokens[i].principal1)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
156 g_free (xsnac->tokens[i].principal1);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
157 if (xsnac->tokens[i].principal1_again)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
158 if (xsnac->tokens[i].service)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
159 g_free (xsnac->tokens[i].service);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
160 g_free (xsnac->tokens[i].principal1_again);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
161 if (xsnac->tokens[i].principal2)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
162 g_free (xsnac->tokens[i].principal2);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
163 if (xsnac->tokens[i].footer)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
164 g_free (xsnac->tokens[i].footer);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
165 aim_tlvlist_free (xsnac->tokens[i].tlvlist);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
166 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
167 g_free (xsnac->tokens);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
168 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
169
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
170 static void
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
171 kerberos_login_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
172 const gchar *got_data, gsize got_len, const gchar *error_message)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
173 {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
174 OscarData *od = user_data;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
175 PurpleConnection *gc;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
176 ByteStream bs;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
177 aim_xsnac_t xsnac = {0};
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
178 guint16 len;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
179 gchar *bosip = NULL;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
180 gchar *tlsCertName = NULL;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
181 guint8 *cookie = NULL;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
182 guint32 cookie_len = 0;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
183 char *host; int port;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
184 gsize i;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
185
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
186 gc = od->gc;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
187
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
188 od->url_data = NULL;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
189
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
190 if (error_message != NULL || got_len == 0) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
191 gchar *tmp;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
192 gchar *url;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
193
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
194 url = get_kdc_url(od);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
195 tmp = g_strdup_printf(_("Error requesting %s: %s"),
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
196 url, error_message ?
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
197 error_message : _("The server returned an empty response"));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
198 purple_connection_error_reason(gc,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
199 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
200 g_free(tmp);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
201 g_free(url);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
202 return;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
203 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
204
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
205 purple_debug_info("oscar", "Received kerberos login HTTP response %lu : ", got_len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
206
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
207 byte_stream_init (&bs, (guint8 *)got_data, got_len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
208
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
209 xsnac.family = byte_stream_get16 (&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
210 xsnac.subtype = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
211 byte_stream_getrawbuf(&bs, (guint8 *) xsnac.flags, 8);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
212
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
213 if (xsnac.family == 0x50C && xsnac.subtype == 0x0005) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
214 purple_connection_error_reason(gc,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
215 PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
216 _("Incorrect password"));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
217 return;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
218 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
219 if (xsnac.family != 0x50C || xsnac.subtype != 0x0003) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
220 purple_connection_error_reason(gc,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
221 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
222 _("Error parsing response from authentication server"));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
223 return;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
224 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
225 xsnac.request_id = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
226 xsnac.epoch = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
227 xsnac.unknown = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
228 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
229 xsnac.principal1 = byte_stream_getstr(&bs, len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
230 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
231 xsnac.principal2 = byte_stream_getstr(&bs, len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
232 xsnac.num_tokens = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
233
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
234 purple_debug_info("oscar", "KDC: %d tokens between '%s' and '%s'\n",
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
235 xsnac.num_tokens, xsnac.principal1, xsnac.principal2);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
236 xsnac.tokens = g_new0 (aim_xsnac_token_t, xsnac.num_tokens);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
237 for (i = 0; i < xsnac.num_tokens; i++) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
238 GSList *tlv;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
239
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
240 tlv = aim_tlvlist_readnum(&bs, 1);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
241 if (tlv)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
242 xsnac.tokens[i].main_tlv = tlv->data;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
243 g_slist_free (tlv);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
244
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
245 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
246 xsnac.tokens[i].principal1 = byte_stream_getstr(&bs, len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
247 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
248 xsnac.tokens[i].service = byte_stream_getstr(&bs, len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
249 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
250 xsnac.tokens[i].principal1_again = byte_stream_getstr(&bs, len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
251 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
252 xsnac.tokens[i].principal2 = byte_stream_getstr(&bs, len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
253 xsnac.tokens[i].unknown = byte_stream_get8(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
254 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
255 xsnac.tokens[i].footer = byte_stream_getraw(&bs, len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
256
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
257 xsnac.tokens[i].dates.unknown1 = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
258 xsnac.tokens[i].dates.unknown2 = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
259 xsnac.tokens[i].dates.epoch_now = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
260 xsnac.tokens[i].dates.epoch_valid = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
261 xsnac.tokens[i].dates.epoch_renew = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
262 xsnac.tokens[i].dates.epoch_expire = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
263 xsnac.tokens[i].dates.unknown3 = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
264 xsnac.tokens[i].dates.unknown4 = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
265 xsnac.tokens[i].dates.unknown5 = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
266
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
267 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
268 xsnac.tokens[i].tlvlist = aim_tlvlist_readnum(&bs, len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
269
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
270 purple_debug_info("oscar", "Token %lu has %d TLVs for service '%s'\n",
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
271 i, len, xsnac.tokens[i].service);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
272 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
273 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
274 xsnac.tlvlist = aim_tlvlist_readnum(&bs, len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
275
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
276 for (i = 0; i < xsnac.num_tokens; i++) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
277 if (strcmp (xsnac.tokens[i].service, "im/boss") == 0) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
278 aim_tlv_t *tlv;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
279 GSList *tlvlist;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
280 ByteStream tbs;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
281
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
282 tlv = aim_tlv_gettlv(xsnac.tokens[i].tlvlist, 0x0003, 1);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
283 if (tlv != NULL) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
284 byte_stream_init(&tbs, tlv->value, tlv->length);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
285 byte_stream_get32(&tbs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
286 tlvlist = aim_tlvlist_read (&tbs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
287 if (aim_tlv_gettlv (tlvlist, 0x0005, 1))
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
288 bosip = aim_tlv_getstr (tlvlist, 0x0005, 1);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
289 if (aim_tlv_gettlv (tlvlist, 0x0005, 1))
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
290 tlsCertName = aim_tlv_getstr (tlvlist, 0x008D, 1);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
291 tlv = aim_tlv_gettlv(tlvlist, 0x0006, 1);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
292 if (tlv) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
293 cookie_len = tlv->length;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
294 cookie = tlv->value;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
295 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
296 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
297 break;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
298 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
299 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
300 if (bosip && cookie) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
301 port = AIM_DEFAULT_KDC_PORT;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
302 for (i = 0; i < strlen(bosip); i++) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
303 if (bosip[i] == ':') {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
304 port = atoi(&(bosip[i+1]));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
305 break;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
306 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
307 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
308 host = g_strndup(bosip, i);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
309 oscar_connect_to_bos(gc, od, host, port, cookie, cookie_len, tlsCertName);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
310 g_free (host);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
311 } else {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
312 purple_connection_error_reason(gc,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
313 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
314 _("Unknown error during authentication"));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
315 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
316 aim_xsnac_free (&xsnac);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
317 if (tlsCertName)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
318 g_free (tlsCertName);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
319 if (bosip)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
320 g_free (bosip);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
321 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
322
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
323 /**
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
324 * This function sends a binary blob request to the Kerberos KDC server
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
325 * https://kdc.uas.aol.com with the user's username and password and
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
326 * receives the IM cookie, which is used to request a connection to the
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
327 * BOSS server.
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
328 * The binary data below is what AIM 8.0.8.1 sends in order to authenticate
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
329 * to the KDC server. It is an 'X-SNAC' packet, which is relatively similar
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
330 * to SNAC packets but somehow different.
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
331 * The header starts with the 0x50C family follow by 0x0002 subtype, then
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
332 * some fixed length data and TLVs. The string "COOL" appears in there for
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
333 * some reason followed by the 'US' and 'en' strings.
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
334 * Then the 'imApp key=<client key>' comes after that, and then the username
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
335 * and the string "im/boss" which seems to represent the service we are
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
336 * requesting the authentication for. Changing that will lead to a
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
337 * 'unknown service' error. The client key is then added again (without the
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
338 * 'imApp key' string prepended to it) then a XOR-ed version of the password.
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
339 * The meaning of the header/footer/in-between bytes is not known but never
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
340 * seems to change so there is no need to reverse engineer their meaning at
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
341 * this point.
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
342 */
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
343 void send_kerberos_login(OscarData *od, const char *username)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
344 {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
345 PurpleConnection *gc;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
346 GString *request;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
347 gchar *url;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
348 const gchar *password;
37699
fcafc93ddd4d oscar: Set password_xored as gchar to remove a warning
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37698
diff changeset
349 gchar password_xored[MAXAIMPASSLEN];
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
350 const gchar *client_key;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
351 gchar *imapp_key;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
352 GString *body;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
353 guint16 len_be;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
354 guint16 reqid;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
355 const gchar header[] = {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
356 0x05, 0x0C, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
359 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x05,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
360 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
361 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x18, 0x99,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
362 0x00, 0x05, 0x00, 0x04, 0x43, 0x4F, 0x4F, 0x4C,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
363 0x00, 0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x0B,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
364 0x00, 0x04, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
365 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
366 0x55, 0x53, 0x00, 0x02, 0x65, 0x6E, 0x00, 0x04,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
367 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0D,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
368 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
369 0x00, 0x05};
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
370 const gchar pre_username[] = {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
371 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x01, 0x8B,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
372 0x01, 0x00, 0x00, 0x00, 0x00};
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
373 const gchar post_username[] = {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
374 0x00, 0x07, 0x69, 0x6D, 0x2F, 0x62, 0x6F, 0x73,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
375 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
376 0x04, 0x00, 0x02};
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
377 const gchar pre_password[] = {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
378 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
379 0x00, 0x00};
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
380 const gchar post_password[] = {0x00, 0x00, 0x00, 0x1D};
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
381 const gchar footer[] = {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
382 0x00, 0x21, 0x00, 0x32, 0x00, 0x01, 0x10, 0x03,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
383 0x00, 0x2C, 0x00, 0x07, 0x00, 0x14, 0x00, 0x04,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
384 0x00, 0x00, 0x01, 0x8B, 0x00, 0x16, 0x00, 0x02,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
385 0x00, 0x26, 0x00, 0x17, 0x00, 0x02, 0x00, 0x07,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
386 0x00, 0x18, 0x00, 0x02, 0x00, 0x00, 0x00, 0x19,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
387 0x00, 0x02, 0x00, 0x0D, 0x00, 0x1A, 0x00, 0x02,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
388 0x00, 0x04, 0x00, 0xAB, 0x00, 0x00, 0x00, 0x28,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
389 0x00, 0x00};
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
390
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
391 gc = od->gc;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
392
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
393 password = purple_connection_get_password(gc);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
394 aim_encode_password (password, password_xored);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
395
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
396 client_key = get_client_key(od);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
397 imapp_key = g_strdup_printf ("imApp key=%s", client_key);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
398
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
399 /* Construct the body of the HTTP POST request */
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
400 body = g_string_new(NULL);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
401 g_string_append_len (body, header, sizeof(header));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
402 reqid = (guint16) g_random_int();
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
403 g_string_overwrite_len (body, 0xC, (void *)&reqid, sizeof(guint16));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
404
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
405 len_be = GUINT16_TO_BE (strlen (imapp_key));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
406 g_string_append_len (body, (void *)&len_be, sizeof(guint16));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
407 g_string_append (body, imapp_key);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
408
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
409 len_be = GUINT16_TO_BE (strlen (username));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
410 g_string_append_len (body, pre_username, sizeof(pre_username));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
411 g_string_append_len (body, (void *)&len_be, sizeof(guint16));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
412 g_string_append (body, username);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
413 g_string_append_len (body, post_username, sizeof(post_username));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
414
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
415 len_be = GUINT16_TO_BE (strlen (password) + 0x10);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
416 g_string_append_len (body, (void *)&len_be, sizeof(guint16));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
417 g_string_append_len (body, pre_password, sizeof(pre_password));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
418 len_be = GUINT16_TO_BE (strlen (password) + 4);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
419 g_string_append_len (body, (void *)&len_be, sizeof(guint16));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
420 len_be = GUINT16_TO_BE (strlen (password));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
421 g_string_append_len (body, (void *)&len_be, sizeof(guint16));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
422 g_string_append_len (body, password_xored, strlen (password));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
423 g_string_append_len (body, post_password, sizeof(post_password));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
424
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
425 len_be = GUINT16_TO_BE (strlen (client_key));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
426 g_string_append_len (body, (void *)&len_be, sizeof(guint16));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
427 g_string_append (body, client_key);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
428 g_string_append_len (body, footer, sizeof(footer));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
429
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
430 g_free(imapp_key);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
431
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
432 url = get_kdc_url(od);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
433
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
434 /* Construct an HTTP POST request */
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
435 request = g_string_new("POST / HTTP/1.1\n"
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
436 "Connection: close\n"
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
437 "Accept: application/x-snac\n");
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
438
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
439 /* Tack on the body */
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
440 g_string_append_printf(request, "Content-Type: application/x-snac\n");
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
441 g_string_append_printf(request, "Content-Length: %" G_GSIZE_FORMAT "\n\n", body->len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
442 g_string_append_len(request, body->str, body->len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
443
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
444 /* Send the POST request */
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
445 od->url_data = purple_util_fetch_url_request_data_len_with_account(
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
446 purple_connection_get_account(gc), url,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
447 TRUE, NULL, TRUE, request->str, request->len, FALSE, -1,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
448 kerberos_login_cb, od);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
449 g_string_free(request, TRUE);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
450
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
451 g_string_free (body, TRUE);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
452 g_free (url);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
453 }

mercurial