libpurple/protocols/oscar/kerberos.c

Fri, 10 Mar 2017 20:36:55 -0600

author
Gary Kramlich <grim@reaperworld.com>
date
Fri, 10 Mar 2017 20:36:55 -0600
changeset 38240
0552f69f1996
parent 37772
d2294123c226
parent 38208
31ecbdda7ff3
child 39998
15488497cd1a
permissions
-rw-r--r--

Merge 2.12.0 into default

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 *
37700
b3fc32a626df oscar: Fix the file comment which still had references to the clientLogin auth
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37699
diff changeset
26 * This doesn't use SNACs or FLAPs at all. It makes https
b3fc32a626df oscar: Fix the file comment which still had references to the clientLogin auth
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37699
diff changeset
27 * POSTs to AOL KDC server to validate the user based on the password they
b3fc32a626df oscar: Fix the file comment which still had references to the clientLogin auth
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37699
diff changeset
28 * provided to us. Upon successful authentication we receive two tokens
b3fc32a626df oscar: Fix the file comment which still had references to the clientLogin auth
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37699
diff changeset
29 * in the response. One is assumed to be the kerberos ticket for authentication
b3fc32a626df oscar: Fix the file comment which still had references to the clientLogin auth
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37699
diff changeset
30 * on the various AOL websites, while the other contains BOSS information, such
b3fc32a626df oscar: Fix the file comment which still had references to the clientLogin auth
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37699
diff changeset
31 * as the hostname and port number to use, the TLS certificate name as well as
b3fc32a626df oscar: Fix the file comment which still had references to the clientLogin auth
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37699
diff changeset
32 * the cookie to use to authenticate to the BOS server.
b3fc32a626df oscar: Fix the file comment which still had references to the clientLogin auth
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37699
diff changeset
33 * And then everything else is the same as with BUCP.
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
34 *
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
35 */
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
36
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
37 #include "oscar.h"
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
38 #include "oscarcommon.h"
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
39 #include "core.h"
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
40
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
41 #define MAXAIMPASSLEN 16
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 /*
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
44 * 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
45 * 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
46 */
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
47 typedef struct {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
48 aim_tlv_t *main_tlv;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
49 gchar *principal1;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
50 gchar *service;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
51 gchar *principal1_again;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
52 gchar *principal2;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
53 gchar unknown;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
54 guint8 *footer;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
55 struct {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
56 guint32 unknown1;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
57 guint32 unknown2;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
58 guint32 epoch_now;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
59 guint32 epoch_valid;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
60 guint32 epoch_renew;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
61 guint32 epoch_expire;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
62 guint32 unknown3;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
63 guint32 unknown4;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
64 guint32 unknown5;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
65 } dates;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
66 GSList *tlvlist;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
67 } aim_xsnac_token_t;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
68
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
69 typedef struct {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
70 guint16 family;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
71 guint16 subtype;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
72 guint8 flags[8];
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
73 guint16 request_id;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
74 guint32 epoch;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
75 guint32 unknown;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
76 gchar *principal1;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
77 gchar *principal2;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
78 guint16 num_tokens;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
79 aim_xsnac_token_t *tokens;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
80 GSList *tlvlist;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
81 } aim_xsnac_t;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
82
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
83 static gchar *get_kdc_url(OscarData *od)
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 PurpleAccount *account = purple_connection_get_account(od->gc);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
86 const gchar *server;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
87 gchar *url;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
88 gchar *port_str = NULL;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
89 gint port;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
90
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
91 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
92 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
93 if (port != 443)
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
94 port_str = g_strdup_printf(":%d", port);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
95 url = g_strdup_printf("https://%s%s/", server, port_str ? port_str : "");
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
96 g_free(port_str);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
97
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
98 return url;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
99 }
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 static const char *get_client_key(OscarData *od)
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 return oscar_get_ui_info_string(
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
104 od->icq ? "prpl-icq-clientkey" : "prpl-aim-clientkey",
38208
31ecbdda7ff3 aim: Switch to new libpurple/finch distid/devids provided by AOL
dx <dx@dxzone.com.ar>
parents: 37703
diff changeset
105 od->icq ? ICQ_DEFAULT_CLIENT_KEY : AIM_DEFAULT_CLIENT_KEY);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
106 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
107
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
108 static void
37699
fcafc93ddd4d oscar: Set password_xored as gchar to remove a warning
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37698
diff changeset
109 aim_encode_password(const char *password, gchar *encoded)
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
110 {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
111 guint8 encoding_table[] = {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
112 0x76, 0x91, 0xc5, 0xe7,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
113 0xd0, 0xd9, 0x95, 0xdd,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
114 0x9e, 0x2F, 0xea, 0xd8,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
115 0x6B, 0x21, 0xc2, 0xbc,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
116
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
117 };
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
118 guint i;
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 * 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
122 * the official client does as well.
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 for (i = 0; i < strlen(password) && i < MAXAIMPASSLEN; i++)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
125 encoded[i] = (password[i] ^ encoding_table[i]);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
126 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
127
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
128 static void
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
129 aim_xsnac_free(aim_xsnac_t *xsnac)
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 gint i;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
132
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
133 g_free(xsnac->principal1);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
134 g_free(xsnac->principal2);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
135 aim_tlvlist_free(xsnac->tlvlist);
37697
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 < xsnac->num_tokens; i++) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
138 g_free(xsnac->tokens[i].main_tlv->value);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
139 g_free(xsnac->tokens[i].main_tlv);
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
140 g_free(xsnac->tokens[i].principal1);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
141 g_free(xsnac->tokens[i].service);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
142 g_free(xsnac->tokens[i].principal1_again);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
143 g_free(xsnac->tokens[i].principal2);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
144 g_free(xsnac->tokens[i].footer);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
145 aim_tlvlist_free(xsnac->tokens[i].tlvlist);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
146 }
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
147 g_free(xsnac->tokens);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
148 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
149
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
150 static void
37762
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
151 kerberos_login_cb(PurpleHttpConnection *http_conn,
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
152 PurpleHttpResponse *response, gpointer _od)
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
153 {
37762
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
154 OscarData *od = _od;
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
155 PurpleConnection *gc;
37762
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
156 const gchar *got_data;
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
157 size_t got_len;
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
158 ByteStream bs;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
159 aim_xsnac_t xsnac = {0};
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
160 guint16 len;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
161 gchar *bosip = NULL;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
162 gchar *tlsCertName = NULL;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
163 guint8 *cookie = NULL;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
164 guint32 cookie_len = 0;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
165 char *host; int port;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
166 gsize i;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
167
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
168 gc = od->gc;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
169
37762
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
170 od->hc = NULL;
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
171
37762
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
172 if (!purple_http_response_is_successful(response)) {
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
173 gchar *tmp;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
174 gchar *url;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
175
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
176 url = get_kdc_url(od);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
177 tmp = g_strdup_printf(_("Error requesting %s: %s"),
37762
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
178 url,
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
179 purple_http_response_get_error(response));
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
180 purple_connection_error(gc,
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
181 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
182 g_free(tmp);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
183 g_free(url);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
184 return;
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
37762
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
187 got_data = purple_http_response_get_data(response, &got_len);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
188 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
189
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
190 byte_stream_init(&bs, (guint8 *)got_data, got_len);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
191
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
192 xsnac.family = byte_stream_get16(&bs);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
193 xsnac.subtype = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
194 byte_stream_getrawbuf(&bs, (guint8 *) xsnac.flags, 8);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
195
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
196 if (xsnac.family == 0x50C && xsnac.subtype == 0x0005) {
37762
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
197 purple_connection_error(gc,
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
198 PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
199 _("Incorrect password"));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
200 return;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
201 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
202 if (xsnac.family != 0x50C || xsnac.subtype != 0x0003) {
37762
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
203 purple_connection_error(gc,
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
204 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
205 _("Error parsing response from authentication server"));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
206 return;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
207 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
208 xsnac.request_id = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
209 xsnac.epoch = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
210 xsnac.unknown = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
211 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
212 xsnac.principal1 = byte_stream_getstr(&bs, len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
213 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
214 xsnac.principal2 = byte_stream_getstr(&bs, len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
215 xsnac.num_tokens = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
216
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
217 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
218 xsnac.num_tokens, xsnac.principal1, xsnac.principal2);
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
219 xsnac.tokens = g_new0(aim_xsnac_token_t, xsnac.num_tokens);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
220 for (i = 0; i < xsnac.num_tokens; i++) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
221 GSList *tlv;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
222
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
223 tlv = aim_tlvlist_readnum(&bs, 1);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
224 if (tlv)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
225 xsnac.tokens[i].main_tlv = tlv->data;
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
226 g_slist_free(tlv);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
227
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.tokens[i].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.tokens[i].service = byte_stream_getstr(&bs, len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
232 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
233 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
234 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
235 xsnac.tokens[i].principal2 = byte_stream_getstr(&bs, len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
236 xsnac.tokens[i].unknown = byte_stream_get8(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
237 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
238 xsnac.tokens[i].footer = byte_stream_getraw(&bs, len);
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 xsnac.tokens[i].dates.unknown1 = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
241 xsnac.tokens[i].dates.unknown2 = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
242 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
243 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
244 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
245 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
246 xsnac.tokens[i].dates.unknown3 = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
247 xsnac.tokens[i].dates.unknown4 = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
248 xsnac.tokens[i].dates.unknown5 = byte_stream_get32(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
249
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
250 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
251 xsnac.tokens[i].tlvlist = aim_tlvlist_readnum(&bs, len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
252
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
253 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
254 i, len, xsnac.tokens[i].service);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
255 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
256 len = byte_stream_get16(&bs);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
257 xsnac.tlvlist = aim_tlvlist_readnum(&bs, len);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
258
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
259 for (i = 0; i < xsnac.num_tokens; i++) {
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
260 if (purple_strequal(xsnac.tokens[i].service, "im/boss")) {
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
261 aim_tlv_t *tlv;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
262 GSList *tlvlist;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
263 ByteStream tbs;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
264
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
265 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
266 if (tlv != NULL) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
267 byte_stream_init(&tbs, tlv->value, tlv->length);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
268 byte_stream_get32(&tbs);
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
269 tlvlist = aim_tlvlist_read(&tbs);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
270 if (aim_tlv_gettlv(tlvlist, 0x0005, 1))
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
271 bosip = aim_tlv_getstr(tlvlist, 0x0005, 1);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
272 if (aim_tlv_gettlv(tlvlist, 0x0005, 1))
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
273 tlsCertName = aim_tlv_getstr(tlvlist, 0x008D, 1);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
274 tlv = aim_tlv_gettlv(tlvlist, 0x0006, 1);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
275 if (tlv) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
276 cookie_len = tlv->length;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
277 cookie = tlv->value;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
278 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
279 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
280 break;
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 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
283 if (bosip && cookie) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
284 port = AIM_DEFAULT_KDC_PORT;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
285 for (i = 0; i < strlen(bosip); i++) {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
286 if (bosip[i] == ':') {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
287 port = atoi(&(bosip[i+1]));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
288 break;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
289 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
290 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
291 host = g_strndup(bosip, i);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
292 oscar_connect_to_bos(gc, od, host, port, cookie, cookie_len, tlsCertName);
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
293 g_free(host);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
294 } else {
37762
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
295 purple_connection_error(gc,
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
296 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
297 _("Unknown error during authentication"));
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
298 }
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
299 aim_xsnac_free(&xsnac);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
300 g_free(tlsCertName);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
301 g_free(bosip);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
302 }
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
303
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
304 /**
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
305 * 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
306 * 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
307 * 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
308 * BOSS server.
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
309 * 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
310 * 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
311 * to SNAC packets but somehow different.
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
312 * 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
313 * 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
314 * some reason followed by the 'US' and 'en' strings.
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
315 * 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
316 * 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
317 * 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
318 * '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
319 * '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
320 * 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
321 * 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
322 * this point.
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 void send_kerberos_login(OscarData *od, const char *username)
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
325 {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
326 PurpleConnection *gc;
37762
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
327 PurpleHttpRequest *req;
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
328 gchar *url;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
329 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
330 gchar password_xored[MAXAIMPASSLEN];
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
331 const gchar *client_key;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
332 gchar *imapp_key;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
333 GString *body;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
334 guint16 len_be;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
335 guint16 reqid;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
336 const gchar header[] = {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
337 0x05, 0x0C, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
339 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
340 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x05,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
341 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
342 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x18, 0x99,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
343 0x00, 0x05, 0x00, 0x04, 0x43, 0x4F, 0x4F, 0x4C,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
344 0x00, 0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x0B,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
345 0x00, 0x04, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
346 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
347 0x55, 0x53, 0x00, 0x02, 0x65, 0x6E, 0x00, 0x04,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
348 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0D,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
349 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
350 0x00, 0x05};
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
351 const gchar pre_username[] = {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
352 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x01, 0x8B,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
353 0x01, 0x00, 0x00, 0x00, 0x00};
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
354 const gchar post_username[] = {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
355 0x00, 0x07, 0x69, 0x6D, 0x2F, 0x62, 0x6F, 0x73,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
356 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
357 0x04, 0x00, 0x02};
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
358 const gchar pre_password[] = {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
359 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
360 0x00, 0x00};
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
361 const gchar post_password[] = {0x00, 0x00, 0x00, 0x1D};
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
362 const gchar footer[] = {
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
363 0x00, 0x21, 0x00, 0x32, 0x00, 0x01, 0x10, 0x03,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
364 0x00, 0x2C, 0x00, 0x07, 0x00, 0x14, 0x00, 0x04,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
365 0x00, 0x00, 0x01, 0x8B, 0x00, 0x16, 0x00, 0x02,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
366 0x00, 0x26, 0x00, 0x17, 0x00, 0x02, 0x00, 0x07,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
367 0x00, 0x18, 0x00, 0x02, 0x00, 0x00, 0x00, 0x19,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
368 0x00, 0x02, 0x00, 0x0D, 0x00, 0x1A, 0x00, 0x02,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
369 0x00, 0x04, 0x00, 0xAB, 0x00, 0x00, 0x00, 0x28,
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
370 0x00, 0x00};
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
371
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
372 gc = od->gc;
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
373
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
374 password = purple_connection_get_password(gc);
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
375 aim_encode_password(password, password_xored);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
376
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
377 client_key = get_client_key(od);
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
378 imapp_key = g_strdup_printf("imApp key=%s", client_key);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
379
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
380 /* Construct the body of the HTTP POST request */
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
381 body = g_string_new(NULL);
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
382 g_string_append_len(body, header, sizeof(header));
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
383 reqid = (guint16) g_random_int();
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
384 g_string_overwrite_len(body, 0xC, (void *)&reqid, sizeof(guint16));
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
385
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
386 len_be = GUINT16_TO_BE(strlen(imapp_key));
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
387 g_string_append_len(body, (void *)&len_be, sizeof(guint16));
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
388 g_string_append(body, imapp_key);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
389
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
390 len_be = GUINT16_TO_BE(strlen(username));
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
391 g_string_append_len(body, pre_username, sizeof(pre_username));
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
392 g_string_append_len(body, (void *)&len_be, sizeof(guint16));
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
393 g_string_append(body, username);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
394 g_string_append_len(body, post_username, sizeof(post_username));
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
395
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
396 len_be = GUINT16_TO_BE(strlen(password) + 0x10);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
397 g_string_append_len(body, (void *)&len_be, sizeof(guint16));
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
398 g_string_append_len(body, pre_password, sizeof(pre_password));
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
399 len_be = GUINT16_TO_BE(strlen(password) + 4);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
400 g_string_append_len(body, (void *)&len_be, sizeof(guint16));
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
401 len_be = GUINT16_TO_BE(strlen(password));
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
402 g_string_append_len(body, (void *)&len_be, sizeof(guint16));
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
403 g_string_append_len(body, password_xored, strlen(password));
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
404 g_string_append_len(body, post_password, sizeof(post_password));
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
405
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
406 len_be = GUINT16_TO_BE(strlen(client_key));
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
407 g_string_append_len(body, (void *)&len_be, sizeof(guint16));
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
408 g_string_append(body, client_key);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
409 g_string_append_len(body, footer, sizeof(footer));
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
410
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
411 g_free(imapp_key);
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
412
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
413 url = get_kdc_url(od);
37762
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
414 req = purple_http_request_new(url);
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
415 purple_http_request_set_method(req, "POST");
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
416 purple_http_request_header_set(req, "Content-Type",
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
417 "application/x-snac");
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
418 purple_http_request_header_set(req, "Accept",
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
419 "application/x-snac");
37766
3538db90056f Use GString to build the KDC request body instead of memcpy into a malloc-ed raw array. Makes for much cleaner code.
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37765
diff changeset
420 purple_http_request_set_contents(req, body->str, body->len);
37762
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
421 od->hc = purple_http_request(gc, req, kerberos_login_cb, od);
0105b155a3d1 oscar: Add kerberos authentication method support for AIM
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
422 purple_http_request_unref(req);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
423
37703
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
424 g_string_free(body, TRUE);
82f57388d70c oscar: Fix coding style, no whitespace before parenthesis of function calls
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 37702
diff changeset
425 g_free(url);
37697
eda46d7224d7 oscar: Adding kerberos-based authentication
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents:
diff changeset
426 }

mercurial