annotate src/protocols/msn/nexus.c @ 19783:995aea35b05c

[gaim-migrate @ 16329] change it to windows Live Messenger Basic TWN authentication OK now committer: Ethan Blanton <elb@pidgin.im>
author Ma Yuan <mayuan2006@gmail.com>
date Sat, 24 Jun 2006 12:04:32 +0000
parents 33bef17125c2
children bc30c6270d9f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9198
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
1 /**
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
2 * @file nexus.c MSN Nexus functions
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
3 *
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
4 * gaim
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
5 *
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
6 * Gaim is the legal property of its developers, whose names are too numerous
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
7 * to list here. Please refer to the COPYRIGHT file distributed with this
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
8 * source distribution.
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
9 *
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
10 * This program is free software; you can redistribute it and/or modify
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
11 * it under the terms of the GNU General Public License as published by
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
12 * the Free Software Foundation; either version 2 of the License, or
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
13 * (at your option) any later version.
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
14 *
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
15 * This program is distributed in the hope that it will be useful,
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
18 * GNU General Public License for more details.
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
19 *
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
20 * You should have received a copy of the GNU General Public License
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
21 * along with this program; if not, write to the Free Software
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
ab6636c5a136 [gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents: 9193
diff changeset
23 */
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
24 #include "msn.h"
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
25 #include "nexus.h"
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
26 #include "notification.h"
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
27
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
28 /**************************************************************************
10481
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
29 * Main
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
30 **************************************************************************/
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
31
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
32 MsnNexus *
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
33 msn_nexus_new(MsnSession *session)
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
34 {
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
35 MsnNexus *nexus;
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
36
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
37 nexus = g_new0(MsnNexus, 1);
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
38 nexus->session = session;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
39 nexus->challenge_data = g_hash_table_new_full(g_str_hash,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
40 g_str_equal, g_free, g_free);
10481
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
41
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
42 return nexus;
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
43 }
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
44
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
45 void
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
46 msn_nexus_destroy(MsnNexus *nexus)
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
47 {
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
48 g_free(nexus->login_host);
10481
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
49
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
50 g_free(nexus->login_path);
10481
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
51
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
52 if (nexus->challenge_data != NULL)
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
53 g_hash_table_destroy(nexus->challenge_data);
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
54
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
55 if (nexus->input_handler > 0)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
56 gaim_input_remove(nexus->input_handler);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
57 g_free(nexus->write_buf);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
58 g_free(nexus->read_buf);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
59
10481
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
60 g_free(nexus);
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
61 }
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
62
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
63 /**************************************************************************
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
64 * Util
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
65 **************************************************************************/
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
66
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
67 static gssize
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
68 msn_ssl_read(MsnNexus *nexus)
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
69 {
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
70 gssize len;
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
71 gssize total_len = 0;
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
72 char temp_buf[4096];
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
73
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
74 if((len = gaim_ssl_read(nexus->gsc, temp_buf,
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
75 sizeof(temp_buf))) > 0)
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
76 {
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
77 #if 0
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
78 g_string_append(nexus->read_buf,temp_buf);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
79 #else
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
80 total_len += len;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
81 nexus->read_buf = g_realloc(nexus->read_buf,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
82 nexus->read_len + len + 1);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
83 strncpy(nexus->read_buf + nexus->read_len, temp_buf, len);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
84 nexus->read_len += len;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
85 nexus->read_buf[nexus->read_len] = '\0';
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
86 #endif
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
87 }
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
88 // gaim_debug_info("MaYuan","nexus ssl read:{%s}\n",nexus->read_buf);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
89 return total_len;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
90 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
91
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
92 static void
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
93 nexus_write_cb(gpointer data, gint source, GaimInputCondition cond)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
94 {
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
95 MsnNexus *nexus = data;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
96 int len, total_len;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
97
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
98 total_len = strlen(nexus->write_buf);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
99
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
100 /*
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
101 * write the content to SSL server,
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
102 * We use SOAP to request Windows Live ID authentication
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
103 */
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
104 len = gaim_ssl_write(nexus->gsc,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
105 nexus->write_buf + nexus->written_len,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
106 total_len - nexus->written_len);
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
107
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
108 if (len < 0 && errno == EAGAIN)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
109 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
110 else if (len <= 0) {
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
111 gaim_input_remove(nexus->input_handler);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
112 nexus->input_handler = -1;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
113 /* TODO: notify of the error */
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
114 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
115 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
116 nexus->written_len += len;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
117
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
118 if (nexus->written_len < total_len)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
119 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
120
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
121 gaim_input_remove(nexus->input_handler);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
122 nexus->input_handler = -1;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
123
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
124 g_free(nexus->write_buf);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
125 nexus->write_buf = NULL;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
126 nexus->written_len = 0;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
127
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
128 nexus->written_cb(nexus, source, 0);
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
129 }
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
130
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
131 /**************************************************************************
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
132 * Login
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
133 **************************************************************************/
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
134
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
135 static void
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
136 login_connect_cb(gpointer data, GaimSslConnection *gsc,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
137 GaimInputCondition cond);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
138
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
139 static void
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
140 login_error_cb(GaimSslConnection *gsc, GaimSslErrorType error, void *data)
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
141 {
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
142 MsnNexus *nexus;
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
143 MsnSession *session;
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
144
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
145 nexus = data;
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
146 g_return_if_fail(nexus != NULL);
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
147
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
148 session = nexus->session;
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
149 g_return_if_fail(session != NULL);
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
150
10481
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
151 msn_session_set_error(session, MSN_ERROR_AUTH, _("Unable to connect"));
10568
fed2a7c2471d [gaim-migrate @ 11954]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10519
diff changeset
152 /* the above line will result in nexus being destroyed, so we don't want
fed2a7c2471d [gaim-migrate @ 11954]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10519
diff changeset
153 * to destroy it here, or we'd crash */
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
154 }
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
155
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
156 static void
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
157 nexus_login_written_cb(gpointer data, gint source, GaimInputCondition cond)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
158 {
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
159 MsnNexus *nexus = data;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
160 MsnSession *session;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
161 int len;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
162
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
163 session = nexus->session;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
164 g_return_if_fail(session != NULL);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
165
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
166 if (nexus->input_handler == -1)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
167 nexus->input_handler = gaim_input_add(nexus->gsc->fd,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
168 GAIM_INPUT_READ, nexus_login_written_cb, nexus);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
169
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
170 /*read the request header*/
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
171 len = msn_ssl_read(nexus);
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
172 if (len < 0 && errno == EAGAIN){
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
173 return;
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
174 }else if (len < 0) {
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
175 gaim_input_remove(nexus->input_handler);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
176 nexus->input_handler = -1;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
177 g_free(nexus->read_buf);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
178 nexus->read_buf = NULL;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
179 nexus->read_len = 0;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
180 /* TODO: error handling */
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
181 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
182 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
183
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
184 if(nexus->read_buf == NULL){
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
185 return;
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
186 }
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
187 if (g_strstr_len(nexus->read_buf, nexus->read_len,
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
188 "</S:Envelope>") == NULL){
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
189 return;
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
190 }
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
191
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
192 gaim_input_remove(nexus->input_handler);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
193 nexus->input_handler = -1;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
194 gaim_ssl_close(nexus->gsc);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
195 nexus->gsc = NULL;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
196
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
197 // gaim_debug_misc("msn", "TWN Server Reply: {%s}", nexus->read_buf);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
198
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
199 if (strstr(nexus->read_buf, "HTTP/1.1 302") != NULL){
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
200 /* Redirect. */
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
201 char *location, *c;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
202
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
203 location = strstr(nexus->read_buf, "Location: ");
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
204 if (location == NULL)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
205 {
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
206 g_free(nexus->read_buf);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
207 nexus->read_buf = NULL;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
208 nexus->read_len = 0;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
209
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
210 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
211 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
212 location = strchr(location, ' ') + 1;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
213
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
214 if ((c = strchr(location, '\r')) != NULL)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
215 *c = '\0';
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
216
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
217 /* Skip the http:// */
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
218 if ((c = strchr(location, '/')) != NULL)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
219 location = c + 2;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
220
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
221 if ((c = strchr(location, '/')) != NULL)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
222 {
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
223 g_free(nexus->login_path);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
224 nexus->login_path = g_strdup(c);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
225
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
226 *c = '\0';
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
227 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
228
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
229 g_free(nexus->login_host);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
230 nexus->login_host = g_strdup(location);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
231
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
232 gaim_ssl_connect(session->account, nexus->login_host,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
233 GAIM_SSL_DEFAULT_PORT, login_connect_cb,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
234 login_error_cb, nexus);
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
235 }else if (strstr(nexus->read_buf, "HTTP/1.1 401 Unauthorized") != NULL){
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
236 const char *error;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
237
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
238 if ((error = strstr(nexus->read_buf, "WWW-Authenticate")) != NULL) {
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
239 if ((error = strstr(error, "cbtxt=")) != NULL){
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
240 const char *c;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
241 char *temp;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
242
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
243 error += strlen("cbtxt=");
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
244
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
245 if ((c = strchr(error, '\n')) == NULL)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
246 c = error + strlen(error);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
247
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
248 temp = g_strndup(error, c - error);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
249 error = gaim_url_decode(temp);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
250 g_free(temp);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
251 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
252 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
253 msn_session_set_error(session, MSN_ERROR_AUTH, error);
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
254 }else if (strstr(nexus->read_buf, "HTTP/1.1 200 OK")){
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
255 /*reply OK, we should process the SOAP body*/
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
256 char *base, *c;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
257 char *login_params;
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
258 char *length_start,*length_end,*body_len;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
259
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
260 char **elems, **cur, **tokens;
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
261 const char * cert_str;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
262
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
263 gaim_debug_info("MaYuan","Receive 200\n");
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
264 #if 0
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
265 length_start = strstr(nexus->read_buf, "Content-Length: ");
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
266 length_start += strlen("Content-Length: ");
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
267 length_end = strstr(length_start, "\r\n");
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
268 body_len = g_strndup(length_start,length_end - length_start);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
269 // gaim_debug_info("MaYuan","body length is :%s\n",body_len);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
270
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
271 g_free(body_len);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
272 // g_return_if_fail(body_len != NULL);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
273 #endif
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
274 //TODO: we should parse it using XML
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
275 base = strstr(base, TWN_START_TOKEN);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
276 base += strlen(TWN_START_TOKEN);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
277 // gaim_debug_info("MaYuan","base is :%s\n",base);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
278 c = strstr(base, TWN_END_TOKEN);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
279 // gaim_debug_info("MaYuan","c is :%s\n",c);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
280 // gaim_debug_info("MaYuan","len is :%d\n",c-base);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
281 login_params = g_strndup(base, c - base);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
282
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
283 gaim_debug_info("msn", "TWN Cert: {%s}\n", login_params);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
284
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
285 /* Parse the challenge data. */
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
286 elems = g_strsplit(login_params, "&amp;", 0);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
287
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
288 for (cur = elems; *cur != NULL; cur++){
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
289 tokens = g_strsplit(*cur, "=", 2);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
290 g_hash_table_insert(session->nexus->challenge_data, tokens[0], tokens[1]);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
291 /* Don't free each of the tokens, only the array. */
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
292 g_free(tokens);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
293 }
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
294
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
295 g_strfreev(elems);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
296
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
297 cert_str = g_strdup_printf("t=%s&p=%s",
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
298 (char *)g_hash_table_lookup(nexus->challenge_data, "t"),
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
299 (char *)g_hash_table_lookup(nexus->challenge_data, "p")
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
300 );
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
301 msn_got_login_params(session, cert_str);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
302
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
303 g_free(cert_str);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
304 // g_free(body_len);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
305 g_free(login_params);
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
306 // return;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
307 msn_nexus_destroy(nexus);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
308 session->nexus = NULL;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
309 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
310 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
311
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
312 g_free(nexus->read_buf);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
313 nexus->read_buf = NULL;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
314 nexus->read_len = 0;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
315 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
316
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
317
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
318 void
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
319 login_connect_cb(gpointer data, GaimSslConnection *gsc,
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
320 GaimInputCondition cond)
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
321 {
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
322 MsnNexus *nexus;
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
323 MsnSession *session;
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
324 char *username, *password;
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
325 char *request_str, *head, *tail,*challenge_str;
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
326 char *buffer = NULL;
9966
b15c177895b9 [gaim-migrate @ 10875]
Luke Schierer <lschiere@pidgin.im>
parents: 9198
diff changeset
327 guint32 ctint;
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
328
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
329 gaim_debug_info("MaYuan","starting Windows Live ID authentication\n");
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
330 nexus = data;
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
331 g_return_if_fail(nexus != NULL);
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
332
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
333 session = nexus->session;
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
334 g_return_if_fail(session != NULL);
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
335
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
336 nexus->gsc = gsc;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
337
10519
bec9130b24d2 [gaim-migrate @ 11833]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10504
diff changeset
338 msn_session_set_login_step(session, MSN_LOGIN_STEP_GET_COOKIE);
10481
bcfea6c3d5c9 [gaim-migrate @ 11769]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10345
diff changeset
339
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
340 username = g_strdup(gaim_account_get_username(session->account));
9966
b15c177895b9 [gaim-migrate @ 10875]
Luke Schierer <lschiere@pidgin.im>
parents: 9198
diff changeset
341
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
342 password = g_strdup(gaim_connection_get_password(session->account->gc));
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
343 // g_strdup(gaim_url_encode(gaim_connection_get_password(session->account->gc)));
12457
e585695bc16b [gaim-migrate @ 14766]
Mark Doliner <mark@kingant.net>
parents: 10740
diff changeset
344
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
345 challenge_str = g_strdup_printf(
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
346 "lc=%s&amp;id=%s&amp;tw=%s&amp;fs=%s&amp;ru=%s&amp;ct=%s&amp;kpp=%s&amp;kv=%s&amp;ver=%s&amp;rn=%s&amp;tpf=%s\r\n",
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
347 (char *)g_hash_table_lookup(nexus->challenge_data, "lc"),
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
348 (char *)g_hash_table_lookup(nexus->challenge_data, "id"),
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
349 (char *)g_hash_table_lookup(nexus->challenge_data, "tw"),
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
350 (char *)g_hash_table_lookup(nexus->challenge_data, "fs"),
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
351 (char *)g_hash_table_lookup(nexus->challenge_data, "ru"),
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
352 (char *)g_hash_table_lookup(nexus->challenge_data, "ct"),
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
353 (char *)g_hash_table_lookup(nexus->challenge_data, "kpp"),
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
354 (char *)g_hash_table_lookup(nexus->challenge_data, "kv"),
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
355 (char *)g_hash_table_lookup(nexus->challenge_data, "ver"),
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
356 (char *)g_hash_table_lookup(nexus->challenge_data, "rn"),
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
357 (char *)g_hash_table_lookup(nexus->challenge_data, "tpf")
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
358 );
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
359
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
360 /*build the SOAP windows Live ID XML body */
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
361 tail = g_strdup_printf(TWN_ENVELOP_TEMPLATE,username,password,challenge_str );
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
362
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
363 nexus->login_path = g_strdup(TWN_POST_URL);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
364 head = g_strdup_printf(
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
365 "POST %s HTTP/1.1\r\n"
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
366 "Accept: text/*\r\n"
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
367 "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n"
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
368 "Host: %s\r\n"
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
369 "Content-Length: %d\r\n"
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
370 "Connection: Keep-Alive\r\n"
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
371 "Cache-Control: no-cache\r\n\r\n",
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
372 nexus->login_path,nexus->login_host,strlen(tail));
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
373
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
374 request_str = g_strdup_printf("%s%s", head,tail);
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
375 // gaim_debug_misc("msn", "TWN Sending: {%s}\n", request_str);
12457
e585695bc16b [gaim-migrate @ 14766]
Mark Doliner <mark@kingant.net>
parents: 10740
diff changeset
376
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
377 // g_free(nexus->login_path);
12457
e585695bc16b [gaim-migrate @ 14766]
Mark Doliner <mark@kingant.net>
parents: 10740
diff changeset
378 g_free(buffer);
e585695bc16b [gaim-migrate @ 14766]
Mark Doliner <mark@kingant.net>
parents: 10740
diff changeset
379 g_free(head);
e585695bc16b [gaim-migrate @ 14766]
Mark Doliner <mark@kingant.net>
parents: 10740
diff changeset
380 g_free(tail);
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
381 g_free(username);
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
382 g_free(password);
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
383
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
384 nexus->write_buf = request_str;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
385 nexus->written_len = 0;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
386
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
387 nexus->read_len = 0;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
388
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
389 nexus->written_cb = nexus_login_written_cb;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
390
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
391 nexus->input_handler = gaim_input_add(gsc->fd, GAIM_INPUT_WRITE,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
392 nexus_write_cb, nexus);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
393
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
394 nexus_write_cb(nexus, gsc->fd, GAIM_INPUT_WRITE);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
395
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
396 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
397 }
8171
d0ba2f7b40e7 [gaim-migrate @ 8884]
Christian Hammond <chipx86@chipx86.com>
parents:
diff changeset
398
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
399 /**************************************************************************
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
400 * Connect
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
401 **************************************************************************/
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
402 void
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
403 msn_nexus_connect(MsnNexus *nexus)
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
404 {
19783
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
405 /* Authenticate via Windows Live ID. */
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
406 gaim_debug_info("MaYuan","msn_nexus_connect...\n");
995aea35b05c [gaim-migrate @ 16329]
Ma Yuan <mayuan2006@gmail.com>
parents: 13200
diff changeset
407 nexus->login_host = g_strdup(TWN_SERVER);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
408 gaim_ssl_connect(nexus->session->account, nexus->login_host,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
409 GAIM_SSL_DEFAULT_PORT, login_connect_cb, login_error_cb,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
410 nexus);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12457
diff changeset
411 }