Fri, 29 Apr 2016 11:25:12 +0200
sslconn: fix infinite wait in purple_ssl_close()
If GIOStream has some unsent data and the connection is broken
(e.g. cable unplugged), g_io_stream_close() may wait indefinitely for
its internal buffer to get empty.
Do the close anynchronously and if it doesn't finish within 15 seconds,
cancel it and free the resources held by the IO stream.
|
20147
66f05a854eee
applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents:
19859
diff
changeset
|
1 | /* purple |
| 6703 | 2 | * |
| 15884 | 3 | * Purple is the legal property of its developers, whose names are too numerous |
| 8046 | 4 | * to list here. Please refer to the COPYRIGHT file distributed with this |
| 5 | * source distribution. | |
| 6703 | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or modify | |
| 8 | * it under the terms of the GNU General Public License as published by | |
| 9 | * the Free Software Foundation; either version 2 of the License, or | |
| 10 | * (at your option) any later version. | |
| 11 | * | |
| 12 | * This program is distributed in the hope that it will be useful, | |
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 15 | * GNU General Public License for more details. | |
| 16 | * | |
| 17 | * You should have received a copy of the GNU General Public License | |
| 18 | * along with this program; if not, write to the Free Software | |
|
19859
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
19670
diff
changeset
|
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
| 6703 | 20 | */ |
|
24569
5dbd0617a27d
Build everything with the *_DISABLE_DEPRECATED flags set. This allows us
Richard Laager <rlaager@pidgin.im>
parents:
24116
diff
changeset
|
21 | #define _PURPLE_SSLCONN_C_ |
|
5dbd0617a27d
Build everything with the *_DISABLE_DEPRECATED flags set. This allows us
Richard Laager <rlaager@pidgin.im>
parents:
24116
diff
changeset
|
22 | |
| 6703 | 23 | #include "internal.h" |
| 24 | ||
| 25 | #include "debug.h" | |
|
36509
86e882c3cfdf
Refactored libpurple according to the changes
Ankit Vani <a@nevitus.org>
parents:
36431
diff
changeset
|
26 | #include "plugins.h" |
|
24116
56d1536da928
Close notify and request dialogs with PurpleSslConnection as handle.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
20147
diff
changeset
|
27 | #include "request.h" |
| 6703 | 28 | #include "sslconn.h" |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
29 | #include "tls-certificate.h" |
| 6703 | 30 | |
|
37682
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
31 | #define CONNECTION_CLOSE_TIMEOUT 15 |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
32 | |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
33 | static void |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
34 | emit_error(PurpleSslConnection *gsc, int error_code) |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
35 | { |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
36 | if (gsc->error_cb != NULL) |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
37 | gsc->error_cb(gsc, error_code, gsc->connect_cb_data); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
38 | } |
|
6738
aa797bcc69dd
[gaim-migrate @ 7270]
Christian Hammond <chipx86@chipx86.com>
parents:
6735
diff
changeset
|
39 | |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
40 | static void |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
41 | tls_handshake_cb(GObject *source, GAsyncResult *res, gpointer user_data) |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
42 | { |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
43 | PurpleSslConnection *gsc = user_data; |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
44 | GError *error = NULL; |
|
7018
c441ecf99639
[gaim-migrate @ 7581]
Christian Hammond <chipx86@chipx86.com>
parents:
7016
diff
changeset
|
45 | |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
46 | if (!g_tls_connection_handshake_finish(G_TLS_CONNECTION(source), res, |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
47 | &error)) { |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
48 | if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
49 | /* Connection already closed/freed. Escape. */ |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
50 | return; |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
51 | } else if (g_error_matches(error, G_TLS_ERROR, |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
52 | G_TLS_ERROR_HANDSHAKE)) { |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
53 | /* In Gio, a handshake error is because of the cert */ |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
54 | emit_error(gsc, PURPLE_SSL_CERTIFICATE_INVALID); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
55 | } else { |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
56 | /* Report any other errors as handshake failing */ |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
57 | emit_error(gsc, PURPLE_SSL_HANDSHAKE_FAILED); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
58 | } |
|
7018
c441ecf99639
[gaim-migrate @ 7581]
Christian Hammond <chipx86@chipx86.com>
parents:
7016
diff
changeset
|
59 | |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
60 | purple_ssl_close(gsc); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
61 | return; |
|
14222
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
62 | } |
|
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
63 | |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
64 | gsc->connect_cb(gsc->connect_cb_data, gsc, PURPLE_INPUT_READ); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
65 | } |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
66 | |
|
37634
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
67 | static gboolean |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
68 | tls_connect(PurpleSslConnection *gsc) |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
69 | { |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
70 | GSocket *socket; |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
71 | GSocketConnection *conn; |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
72 | GSocketConnectable *identity; |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
73 | GIOStream *tls_conn; |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
74 | GError *error = NULL; |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
75 | |
|
37634
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
76 | g_return_val_if_fail(gsc->conn == NULL, FALSE); |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
77 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
78 | socket = g_socket_new_from_fd(gsc->fd, &error); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
79 | if (socket == NULL) { |
|
37634
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
80 | purple_debug_warning("sslconn", |
|
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
81 | "Error creating socket from fd (%u): %s", |
|
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
82 | gsc->fd, error->message); |
|
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
83 | g_clear_error(&error); |
|
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
84 | return FALSE; |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
85 | } |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
86 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
87 | conn = g_socket_connection_factory_create_connection(socket); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
88 | g_object_unref(socket); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
89 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
90 | identity = g_network_address_new(gsc->host, gsc->port); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
91 | tls_conn = g_tls_client_connection_new(G_IO_STREAM(conn), identity, |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
92 | &error); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
93 | g_object_unref(identity); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
94 | g_object_unref(conn); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
95 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
96 | if (tls_conn == NULL) { |
|
37634
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
97 | purple_debug_warning("sslconn", |
|
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
98 | "Error creating TLS client connection: %s", |
|
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
99 | error->message); |
|
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
100 | g_clear_error(&error); |
|
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
101 | return FALSE; |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
102 | } |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
103 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
104 | gsc->conn = G_TLS_CONNECTION(tls_conn); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
105 | gsc->cancellable = g_cancellable_new(); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
106 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
107 | purple_tls_certificate_attach_to_tls_connection(gsc->conn); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
108 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
109 | g_tls_connection_handshake_async(gsc->conn, G_PRIORITY_DEFAULT, |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
110 | gsc->cancellable, tls_handshake_cb, gsc); |
|
37634
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
111 | |
|
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
112 | return TRUE; |
| 6703 | 113 | } |
| 114 | ||
|
14222
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
115 | static void |
| 15884 | 116 | purple_ssl_connect_cb(gpointer data, gint source, const gchar *error_message) |
|
14222
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
117 | { |
| 15884 | 118 | PurpleSslConnection *gsc; |
|
14222
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
119 | |
|
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
120 | gsc = data; |
|
14324
8cbedd82b6ac
[gaim-migrate @ 16944]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
121 | gsc->connect_data = NULL; |
|
14222
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
122 | |
|
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
123 | if (source < 0) |
|
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
124 | { |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
125 | emit_error(gsc, PURPLE_SSL_CONNECT_FAILED); |
| 15884 | 126 | purple_ssl_close(gsc); |
|
14222
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
127 | return; |
|
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
128 | } |
|
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
129 | |
|
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
130 | gsc->fd = source; |
|
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
131 | |
|
37634
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
132 | if (!tls_connect(gsc)) { |
|
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
133 | emit_error(gsc, PURPLE_SSL_CONNECT_FAILED); |
|
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
134 | purple_ssl_close(gsc); |
|
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
135 | } |
|
14222
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
136 | } |
|
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
137 | |
| 15884 | 138 | PurpleSslConnection * |
| 139 | purple_ssl_connect(PurpleAccount *account, const char *host, int port, | |
| 140 | PurpleSslInputFunction func, PurpleSslErrorFunction error_func, | |
|
7274
42ec5f56e32a
[gaim-migrate @ 7851]
Christian Hammond <chipx86@chipx86.com>
parents:
7024
diff
changeset
|
141 | void *data) |
| 6703 | 142 | { |
|
27813
7989c9bb5000
Add purple_ssl_connect_with_ssl_cn, which takes a host to connect to
Paul Aurich <darkrain42@pidgin.im>
parents:
25888
diff
changeset
|
143 | return purple_ssl_connect_with_ssl_cn(account, host, port, func, error_func, |
|
7989c9bb5000
Add purple_ssl_connect_with_ssl_cn, which takes a host to connect to
Paul Aurich <darkrain42@pidgin.im>
parents:
25888
diff
changeset
|
144 | NULL, data); |
|
7989c9bb5000
Add purple_ssl_connect_with_ssl_cn, which takes a host to connect to
Paul Aurich <darkrain42@pidgin.im>
parents:
25888
diff
changeset
|
145 | } |
|
7989c9bb5000
Add purple_ssl_connect_with_ssl_cn, which takes a host to connect to
Paul Aurich <darkrain42@pidgin.im>
parents:
25888
diff
changeset
|
146 | |
|
7989c9bb5000
Add purple_ssl_connect_with_ssl_cn, which takes a host to connect to
Paul Aurich <darkrain42@pidgin.im>
parents:
25888
diff
changeset
|
147 | PurpleSslConnection * |
|
7989c9bb5000
Add purple_ssl_connect_with_ssl_cn, which takes a host to connect to
Paul Aurich <darkrain42@pidgin.im>
parents:
25888
diff
changeset
|
148 | purple_ssl_connect_with_ssl_cn(PurpleAccount *account, const char *host, int port, |
|
7989c9bb5000
Add purple_ssl_connect_with_ssl_cn, which takes a host to connect to
Paul Aurich <darkrain42@pidgin.im>
parents:
25888
diff
changeset
|
149 | PurpleSslInputFunction func, PurpleSslErrorFunction error_func, |
|
7989c9bb5000
Add purple_ssl_connect_with_ssl_cn, which takes a host to connect to
Paul Aurich <darkrain42@pidgin.im>
parents:
25888
diff
changeset
|
150 | const char *ssl_cn, void *data) |
|
7989c9bb5000
Add purple_ssl_connect_with_ssl_cn, which takes a host to connect to
Paul Aurich <darkrain42@pidgin.im>
parents:
25888
diff
changeset
|
151 | { |
| 15884 | 152 | PurpleSslConnection *gsc; |
| 6703 | 153 | |
| 154 | g_return_val_if_fail(host != NULL, NULL); | |
| 155 | g_return_val_if_fail(port != 0 && port != -1, NULL); | |
| 156 | g_return_val_if_fail(func != NULL, NULL); | |
| 157 | ||
| 15884 | 158 | gsc = g_new0(PurpleSslConnection, 1); |
|
6738
aa797bcc69dd
[gaim-migrate @ 7270]
Christian Hammond <chipx86@chipx86.com>
parents:
6735
diff
changeset
|
159 | |
|
14222
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
160 | gsc->fd = -1; |
|
27813
7989c9bb5000
Add purple_ssl_connect_with_ssl_cn, which takes a host to connect to
Paul Aurich <darkrain42@pidgin.im>
parents:
25888
diff
changeset
|
161 | gsc->host = ssl_cn ? g_strdup(ssl_cn) : g_strdup(host); |
|
7274
42ec5f56e32a
[gaim-migrate @ 7851]
Christian Hammond <chipx86@chipx86.com>
parents:
7024
diff
changeset
|
162 | gsc->port = port; |
|
42ec5f56e32a
[gaim-migrate @ 7851]
Christian Hammond <chipx86@chipx86.com>
parents:
7024
diff
changeset
|
163 | gsc->connect_cb_data = data; |
|
42ec5f56e32a
[gaim-migrate @ 7851]
Christian Hammond <chipx86@chipx86.com>
parents:
7024
diff
changeset
|
164 | gsc->connect_cb = func; |
|
42ec5f56e32a
[gaim-migrate @ 7851]
Christian Hammond <chipx86@chipx86.com>
parents:
7024
diff
changeset
|
165 | gsc->error_cb = error_func; |
|
6738
aa797bcc69dd
[gaim-migrate @ 7270]
Christian Hammond <chipx86@chipx86.com>
parents:
6735
diff
changeset
|
166 | |
| 15884 | 167 | gsc->connect_data = purple_proxy_connect(NULL, account, host, port, purple_ssl_connect_cb, gsc); |
| 6703 | 168 | |
|
14324
8cbedd82b6ac
[gaim-migrate @ 16944]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
169 | if (gsc->connect_data == NULL) |
| 6703 | 170 | { |
|
6738
aa797bcc69dd
[gaim-migrate @ 7270]
Christian Hammond <chipx86@chipx86.com>
parents:
6735
diff
changeset
|
171 | g_free(gsc->host); |
|
aa797bcc69dd
[gaim-migrate @ 7270]
Christian Hammond <chipx86@chipx86.com>
parents:
6735
diff
changeset
|
172 | g_free(gsc); |
| 6703 | 173 | |
| 174 | return NULL; | |
| 175 | } | |
| 176 | ||
| 15884 | 177 | return (PurpleSslConnection *)gsc; |
| 6703 | 178 | } |
| 179 | ||
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
180 | static gboolean |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
181 | recv_cb(GObject *source, gpointer data) |
| 6764 | 182 | { |
| 15884 | 183 | PurpleSslConnection *gsc = data; |
| 6764 | 184 | |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
185 | gsc->recv_cb(gsc->recv_cb_data, gsc, PURPLE_INPUT_READ); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
186 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
187 | return TRUE; |
| 6764 | 188 | } |
| 189 | ||
| 190 | void | |
| 15884 | 191 | purple_ssl_input_add(PurpleSslConnection *gsc, PurpleSslInputFunction func, |
|
7274
42ec5f56e32a
[gaim-migrate @ 7851]
Christian Hammond <chipx86@chipx86.com>
parents:
7024
diff
changeset
|
192 | void *data) |
| 6764 | 193 | { |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
194 | GInputStream *input; |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
195 | GSource *source; |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
196 | |
| 6764 | 197 | g_return_if_fail(func != NULL); |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
198 | g_return_if_fail(gsc->conn != NULL); |
| 6764 | 199 | |
|
34262
3b8ce83bac96
HTTP: get rid of one (of two) msn's own http implementations
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents:
32438
diff
changeset
|
200 | purple_ssl_input_remove(gsc); |
|
3b8ce83bac96
HTTP: get rid of one (of two) msn's own http implementations
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents:
32438
diff
changeset
|
201 | |
| 6764 | 202 | gsc->recv_cb_data = data; |
|
7274
42ec5f56e32a
[gaim-migrate @ 7851]
Christian Hammond <chipx86@chipx86.com>
parents:
7024
diff
changeset
|
203 | gsc->recv_cb = func; |
|
42ec5f56e32a
[gaim-migrate @ 7851]
Christian Hammond <chipx86@chipx86.com>
parents:
7024
diff
changeset
|
204 | |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
205 | input = g_io_stream_get_input_stream(G_IO_STREAM(gsc->conn)); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
206 | /* Pass NULL for cancellable as we don't want it notified on cancel */ |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
207 | source = g_pollable_input_stream_create_source( |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
208 | G_POLLABLE_INPUT_STREAM(input), NULL); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
209 | g_source_set_callback(source, (GSourceFunc)recv_cb, gsc, NULL); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
210 | gsc->inpa = g_source_attach(source, NULL); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
211 | g_source_unref(source); |
| 6764 | 212 | } |
| 213 | ||
|
34262
3b8ce83bac96
HTTP: get rid of one (of two) msn's own http implementations
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents:
32438
diff
changeset
|
214 | void |
|
3b8ce83bac96
HTTP: get rid of one (of two) msn's own http implementations
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents:
32438
diff
changeset
|
215 | purple_ssl_input_remove(PurpleSslConnection *gsc) |
|
3b8ce83bac96
HTTP: get rid of one (of two) msn's own http implementations
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents:
32438
diff
changeset
|
216 | { |
|
3b8ce83bac96
HTTP: get rid of one (of two) msn's own http implementations
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents:
32438
diff
changeset
|
217 | if (gsc->inpa > 0) { |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
218 | g_source_remove(gsc->inpa); |
|
34262
3b8ce83bac96
HTTP: get rid of one (of two) msn's own http implementations
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents:
32438
diff
changeset
|
219 | gsc->inpa = 0; |
|
3b8ce83bac96
HTTP: get rid of one (of two) msn's own http implementations
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents:
32438
diff
changeset
|
220 | } |
|
3b8ce83bac96
HTTP: get rid of one (of two) msn's own http implementations
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents:
32438
diff
changeset
|
221 | } |
|
3b8ce83bac96
HTTP: get rid of one (of two) msn's own http implementations
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
parents:
32438
diff
changeset
|
222 | |
|
18487
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
223 | const gchar * |
|
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
224 | purple_ssl_strerror(PurpleSslErrorType error) |
|
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
225 | { |
|
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
226 | switch(error) { |
|
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
227 | case PURPLE_SSL_CONNECT_FAILED: |
|
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
228 | return _("SSL Connection Failed"); |
|
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
229 | case PURPLE_SSL_HANDSHAKE_FAILED: |
|
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
230 | return _("SSL Handshake Failed"); |
|
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
231 | case PURPLE_SSL_CERTIFICATE_INVALID: |
|
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
232 | return _("SSL peer presented an invalid certificate"); |
|
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
233 | default: |
|
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
234 | purple_debug_warning("sslconn", "Unknown SSL error code %d\n", error); |
|
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
235 | return _("Unknown SSL error"); |
|
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
236 | } |
|
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
237 | } |
|
0730e45141fd
- Add purple_ssl_strerror for handy error description power!
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18478
diff
changeset
|
238 | |
| 15884 | 239 | PurpleSslConnection * |
|
17765
04aaa6965b10
Fixed one of the issues in the ssl stuff, allowing CN cert checks for starttls-connections in XMPP.
Andreas Monitzer <am@adiumx.com>
parents:
17316
diff
changeset
|
240 | purple_ssl_connect_with_host_fd(PurpleAccount *account, int fd, |
|
04aaa6965b10
Fixed one of the issues in the ssl stuff, allowing CN cert checks for starttls-connections in XMPP.
Andreas Monitzer <am@adiumx.com>
parents:
17316
diff
changeset
|
241 | PurpleSslInputFunction func, |
|
04aaa6965b10
Fixed one of the issues in the ssl stuff, allowing CN cert checks for starttls-connections in XMPP.
Andreas Monitzer <am@adiumx.com>
parents:
17316
diff
changeset
|
242 | PurpleSslErrorFunction error_func, |
|
04aaa6965b10
Fixed one of the issues in the ssl stuff, allowing CN cert checks for starttls-connections in XMPP.
Andreas Monitzer <am@adiumx.com>
parents:
17316
diff
changeset
|
243 | const char *host, |
|
04aaa6965b10
Fixed one of the issues in the ssl stuff, allowing CN cert checks for starttls-connections in XMPP.
Andreas Monitzer <am@adiumx.com>
parents:
17316
diff
changeset
|
244 | void *data) |
|
6762
2349053f14aa
[gaim-migrate @ 7294]
Christian Hammond <chipx86@chipx86.com>
parents:
6745
diff
changeset
|
245 | { |
| 15884 | 246 | PurpleSslConnection *gsc; |
|
6762
2349053f14aa
[gaim-migrate @ 7294]
Christian Hammond <chipx86@chipx86.com>
parents:
6745
diff
changeset
|
247 | |
|
14048
b577c53406c0
[gaim-migrate @ 16556]
Mark Doliner <markdoliner@pidgin.im>
parents:
13664
diff
changeset
|
248 | g_return_val_if_fail(fd != -1, NULL); |
|
6762
2349053f14aa
[gaim-migrate @ 7294]
Christian Hammond <chipx86@chipx86.com>
parents:
6745
diff
changeset
|
249 | g_return_val_if_fail(func != NULL, NULL); |
|
2349053f14aa
[gaim-migrate @ 7294]
Christian Hammond <chipx86@chipx86.com>
parents:
6745
diff
changeset
|
250 | |
| 15884 | 251 | gsc = g_new0(PurpleSslConnection, 1); |
|
6762
2349053f14aa
[gaim-migrate @ 7294]
Christian Hammond <chipx86@chipx86.com>
parents:
6745
diff
changeset
|
252 | |
|
7274
42ec5f56e32a
[gaim-migrate @ 7851]
Christian Hammond <chipx86@chipx86.com>
parents:
7024
diff
changeset
|
253 | gsc->connect_cb_data = data; |
|
42ec5f56e32a
[gaim-migrate @ 7851]
Christian Hammond <chipx86@chipx86.com>
parents:
7024
diff
changeset
|
254 | gsc->connect_cb = func; |
|
42ec5f56e32a
[gaim-migrate @ 7851]
Christian Hammond <chipx86@chipx86.com>
parents:
7024
diff
changeset
|
255 | gsc->error_cb = error_func; |
|
14222
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
256 | gsc->fd = fd; |
|
17765
04aaa6965b10
Fixed one of the issues in the ssl stuff, allowing CN cert checks for starttls-connections in XMPP.
Andreas Monitzer <am@adiumx.com>
parents:
17316
diff
changeset
|
257 | if(host) |
|
04aaa6965b10
Fixed one of the issues in the ssl stuff, allowing CN cert checks for starttls-connections in XMPP.
Andreas Monitzer <am@adiumx.com>
parents:
17316
diff
changeset
|
258 | gsc->host = g_strdup(host); |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
259 | gsc->cancellable = g_cancellable_new(); |
|
18587
f5ce93d75799
(this revision will be disapproved)
William Ehlhardt <williamehlhardt@gmail.com>
parents:
18586
diff
changeset
|
260 | |
|
37634
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
261 | if (!tls_connect(gsc)) { |
|
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
262 | emit_error(gsc, PURPLE_SSL_CONNECT_FAILED); |
|
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
263 | g_clear_pointer(&gsc, purple_ssl_close); |
|
ee6f9faeee6f
sslconn: Clean up tls_connect() function error paths
Mike Ruprecht <cmaiku@gmail.com>
parents:
37631
diff
changeset
|
264 | } |
|
6762
2349053f14aa
[gaim-migrate @ 7294]
Christian Hammond <chipx86@chipx86.com>
parents:
6745
diff
changeset
|
265 | |
| 15884 | 266 | return (PurpleSslConnection *)gsc; |
|
6762
2349053f14aa
[gaim-migrate @ 7294]
Christian Hammond <chipx86@chipx86.com>
parents:
6745
diff
changeset
|
267 | } |
|
2349053f14aa
[gaim-migrate @ 7294]
Christian Hammond <chipx86@chipx86.com>
parents:
6745
diff
changeset
|
268 | |
|
37682
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
269 | static void |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
270 | connection_closed_cb(GObject *stream, GAsyncResult *result, |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
271 | gpointer timeout_id) |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
272 | { |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
273 | GError *error = NULL; |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
274 | |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
275 | purple_timeout_remove(GPOINTER_TO_UINT(timeout_id)); |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
276 | |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
277 | g_io_stream_close_finish(G_IO_STREAM(stream), result, &error); |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
278 | |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
279 | if (error) { |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
280 | purple_debug_info("sslconn", "Connection close error: %s", |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
281 | error->message); |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
282 | g_clear_error(&error); |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
283 | } else { |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
284 | purple_debug_info("sslconn", "Connection closed."); |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
285 | } |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
286 | } |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
287 | |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
288 | static void |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
289 | cleanup_cancellable_cb(gpointer data, GObject *where_the_object_was) |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
290 | { |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
291 | g_object_unref(G_CANCELLABLE(data)); |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
292 | } |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
293 | |
| 6703 | 294 | void |
| 15884 | 295 | purple_ssl_close(PurpleSslConnection *gsc) |
| 6703 | 296 | { |
| 297 | g_return_if_fail(gsc != NULL); | |
| 298 | ||
|
24116
56d1536da928
Close notify and request dialogs with PurpleSslConnection as handle.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
20147
diff
changeset
|
299 | purple_request_close_with_handle(gsc); |
|
56d1536da928
Close notify and request dialogs with PurpleSslConnection as handle.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
20147
diff
changeset
|
300 | purple_notify_close_with_handle(gsc); |
|
56d1536da928
Close notify and request dialogs with PurpleSslConnection as handle.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
20147
diff
changeset
|
301 | |
|
14324
8cbedd82b6ac
[gaim-migrate @ 16944]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
302 | if (gsc->connect_data != NULL) |
| 15884 | 303 | purple_proxy_connect_cancel(gsc->connect_data); |
|
14222
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
304 | |
|
71d8761db708
[gaim-migrate @ 16808]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
305 | if (gsc->inpa > 0) |
| 15884 | 306 | purple_input_remove(gsc->inpa); |
|
6738
aa797bcc69dd
[gaim-migrate @ 7270]
Christian Hammond <chipx86@chipx86.com>
parents:
6735
diff
changeset
|
307 | |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
308 | /* Stop any pending operations */ |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
309 | if (G_IS_CANCELLABLE(gsc->cancellable)) { |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
310 | g_cancellable_cancel(gsc->cancellable); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
311 | g_clear_object(&gsc->cancellable); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
312 | } |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
313 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
314 | if (gsc->conn != NULL) { |
|
37682
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
315 | GCancellable *cancellable; |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
316 | guint timer_id; |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
317 | |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
318 | cancellable = g_cancellable_new(); |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
319 | g_object_weak_ref(G_OBJECT(gsc->conn), cleanup_cancellable_cb, |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
320 | cancellable); |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
321 | |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
322 | timer_id = purple_timeout_add_seconds(CONNECTION_CLOSE_TIMEOUT, |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
323 | (GSourceFunc)g_cancellable_cancel, cancellable); |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
324 | |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
325 | g_io_stream_close_async(G_IO_STREAM(gsc->conn), |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
326 | G_PRIORITY_DEFAULT, cancellable, |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
327 | connection_closed_cb, |
|
c49f5f42b10e
sslconn: fix infinite wait in purple_ssl_close()
Jakub Adam <jakub.adam@ktknet.cz>
parents:
37635
diff
changeset
|
328 | GUINT_TO_POINTER(timer_id)); |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
329 | g_clear_object(&gsc->conn); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
330 | } |
|
6738
aa797bcc69dd
[gaim-migrate @ 7270]
Christian Hammond <chipx86@chipx86.com>
parents:
6735
diff
changeset
|
331 | |
|
14048
b577c53406c0
[gaim-migrate @ 16556]
Mark Doliner <markdoliner@pidgin.im>
parents:
13664
diff
changeset
|
332 | g_free(gsc->host); |
|
6738
aa797bcc69dd
[gaim-migrate @ 7270]
Christian Hammond <chipx86@chipx86.com>
parents:
6735
diff
changeset
|
333 | g_free(gsc); |
| 6703 | 334 | } |
| 335 | ||
| 336 | size_t | |
| 15884 | 337 | purple_ssl_read(PurpleSslConnection *gsc, void *data, size_t len) |
| 6703 | 338 | { |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
339 | GInputStream *input; |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
340 | gssize outlen; |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
341 | GError *error = NULL; |
| 6703 | 342 | |
| 343 | g_return_val_if_fail(gsc != NULL, 0); | |
| 344 | g_return_val_if_fail(data != NULL, 0); | |
| 345 | g_return_val_if_fail(len > 0, 0); | |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
346 | g_return_val_if_fail(gsc->conn != NULL, 0); |
| 6703 | 347 | |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
348 | input = g_io_stream_get_input_stream(G_IO_STREAM(gsc->conn)); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
349 | outlen = g_pollable_input_stream_read_nonblocking( |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
350 | G_POLLABLE_INPUT_STREAM(input), data, len, |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
351 | gsc->cancellable, &error); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
352 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
353 | if (outlen < 0) { |
|
37631
30cc3ef7c5d3
Fix handling EAGAIN in purple_ssl_read()
Mike Ruprecht <cmaiku@gmail.com>
parents:
37630
diff
changeset
|
354 | if (g_error_matches(error, G_IO_ERROR, |
|
30cc3ef7c5d3
Fix handling EAGAIN in purple_ssl_read()
Mike Ruprecht <cmaiku@gmail.com>
parents:
37630
diff
changeset
|
355 | G_IO_ERROR_WOULD_BLOCK)) { |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
356 | errno = EAGAIN; |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
357 | } |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
358 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
359 | g_clear_error(&error); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
360 | } |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
361 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
362 | return outlen; |
| 6703 | 363 | } |
| 364 | ||
| 365 | size_t | |
| 15884 | 366 | purple_ssl_write(PurpleSslConnection *gsc, const void *data, size_t len) |
| 6703 | 367 | { |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
368 | GOutputStream *output; |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
369 | gssize outlen; |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
370 | GError *error = NULL; |
| 6703 | 371 | |
| 372 | g_return_val_if_fail(gsc != NULL, 0); | |
| 373 | g_return_val_if_fail(data != NULL, 0); | |
| 374 | g_return_val_if_fail(len > 0, 0); | |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
375 | g_return_val_if_fail(gsc->conn != NULL, 0); |
| 6703 | 376 | |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
377 | output = g_io_stream_get_output_stream(G_IO_STREAM(gsc->conn)); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
378 | outlen = g_pollable_output_stream_write_nonblocking( |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
379 | G_POLLABLE_OUTPUT_STREAM(output), data, len, |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
380 | gsc->cancellable, &error); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
381 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
382 | if (outlen < 0) { |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
383 | if (g_error_matches(error, G_IO_ERROR, |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
384 | G_IO_ERROR_WOULD_BLOCK)) { |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
385 | errno = EAGAIN; |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
386 | } |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
387 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
388 | g_clear_error(&error); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
389 | } |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
390 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
391 | return outlen; |
|
6738
aa797bcc69dd
[gaim-migrate @ 7270]
Christian Hammond <chipx86@chipx86.com>
parents:
6735
diff
changeset
|
392 | } |
|
aa797bcc69dd
[gaim-migrate @ 7270]
Christian Hammond <chipx86@chipx86.com>
parents:
6735
diff
changeset
|
393 | |
|
18451
304d2fa12f6a
- purple_ssl_get_peer_certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents:
17765
diff
changeset
|
394 | GList * |
|
304d2fa12f6a
- purple_ssl_get_peer_certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents:
17765
diff
changeset
|
395 | purple_ssl_get_peer_certificates(PurpleSslConnection *gsc) |
|
304d2fa12f6a
- purple_ssl_get_peer_certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents:
17765
diff
changeset
|
396 | { |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
397 | GTlsCertificate *certificate; |
|
18451
304d2fa12f6a
- purple_ssl_get_peer_certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents:
17765
diff
changeset
|
398 | |
|
304d2fa12f6a
- purple_ssl_get_peer_certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents:
17765
diff
changeset
|
399 | g_return_val_if_fail(gsc != NULL, NULL); |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
400 | g_return_val_if_fail(gsc->conn != NULL, NULL); |
|
18451
304d2fa12f6a
- purple_ssl_get_peer_certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents:
17765
diff
changeset
|
401 | |
|
37623
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
402 | certificate = g_tls_connection_get_peer_certificate(gsc->conn); |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
403 | |
|
53718d3c53f0
Port sslconn.[ch] to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents:
37417
diff
changeset
|
404 | return certificate != NULL ? g_list_append(NULL, certificate) : NULL; |
|
18451
304d2fa12f6a
- purple_ssl_get_peer_certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents:
17765
diff
changeset
|
405 | } |
|
304d2fa12f6a
- purple_ssl_get_peer_certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents:
17765
diff
changeset
|
406 |