2 * empathy-server-tls-handler.c - Source for EmpathyServerTLSHandler
3 * Copyright (C) 2010 Collabora Ltd.
4 * @author Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 #include "empathy-server-tls-handler.h"
23 #include <telepathy-glib/util.h>
25 #define DEBUG_FLAG EMPATHY_DEBUG_TLS
26 #include "empathy-debug.h"
27 #include "empathy-tls-certificate.h"
28 #include "empathy-utils.h"
30 #include "extensions/extensions.h"
32 static void async_initable_iface_init (GAsyncInitableIface *iface);
44 EmpathyTLSCertificate *certificate;
47 GSimpleAsyncResult *async_init_res;
48 } EmpathyServerTLSHandlerPriv;
50 G_DEFINE_TYPE_WITH_CODE (EmpathyServerTLSHandler, empathy_server_tls_handler,
52 G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, async_initable_iface_init));
54 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyServerTLSHandler);
57 tls_certificate_prepared_cb (GObject *source,
61 EmpathyTLSCertificate *certificate = EMPATHY_TLS_CERTIFICATE (source);
62 EmpathyServerTLSHandler *self = user_data;
64 EmpathyServerTLSHandlerPriv *priv = GET_PRIV (self);
66 empathy_tls_certificate_prepare_finish (certificate, result, &error);
70 g_simple_async_result_set_from_error (priv->async_init_res, error);
74 g_simple_async_result_complete_in_idle (priv->async_init_res);
75 tp_clear_object (&priv->async_init_res);
79 tls_handler_init_finish (GAsyncInitable *initable,
83 gboolean retval = TRUE;
85 if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res),
93 tls_handler_init_async (GAsyncInitable *initable,
95 GCancellable *cancellable,
96 GAsyncReadyCallback callback,
99 GHashTable *properties;
100 const gchar *cert_object_path;
101 const gchar *hostname;
102 const gchar *bus_name;
104 GError *error = NULL;
105 EmpathyServerTLSHandler *self = EMPATHY_SERVER_TLS_HANDLER (initable);
106 EmpathyServerTLSHandlerPriv *priv = GET_PRIV (self);
108 g_assert (priv->channel != NULL);
110 priv->async_init_res = g_simple_async_result_new (G_OBJECT (self),
111 callback, user_data, empathy_server_tls_handler_new_async);
112 properties = tp_channel_borrow_immutable_properties (priv->channel);
114 hostname = tp_asv_get_string (properties,
115 EMP_IFACE_CHANNEL_TYPE_SERVER_TLS_CONNECTION ".Hostname");
116 priv->hostname = g_strdup (hostname);
118 DEBUG ("Received hostname: %s", hostname);
120 cert_object_path = tp_asv_get_object_path (properties,
121 EMP_IFACE_CHANNEL_TYPE_SERVER_TLS_CONNECTION ".ServerCertificate");
122 bus_name = tp_proxy_get_bus_name (TP_PROXY (priv->channel));
123 dbus = tp_proxy_get_dbus_daemon (TP_PROXY (priv->channel));
125 DEBUG ("Creating an EmpathyTLSCertificate for path %s, bus name %s",
126 cert_object_path, bus_name);
128 priv->certificate = empathy_tls_certificate_new (dbus, bus_name,
129 cert_object_path, &error);
133 DEBUG ("Unable to create the EmpathyTLSCertificate: error %s",
136 g_simple_async_result_set_from_error (priv->async_init_res, error);
137 g_simple_async_result_complete_in_idle (priv->async_init_res);
139 g_error_free (error);
140 tp_clear_object (&priv->async_init_res);
145 empathy_tls_certificate_prepare_async (priv->certificate,
146 tls_certificate_prepared_cb, self);
150 async_initable_iface_init (GAsyncInitableIface *iface)
152 iface->init_async = tls_handler_init_async;
153 iface->init_finish = tls_handler_init_finish;
157 empathy_server_tls_handler_finalize (GObject *object)
159 EmpathyServerTLSHandlerPriv *priv = GET_PRIV (object);
161 DEBUG ("%p", object);
163 tp_clear_object (&priv->channel);
164 tp_clear_object (&priv->certificate);
166 G_OBJECT_CLASS (empathy_server_tls_handler_parent_class)->finalize (object);
170 empathy_server_tls_handler_get_property (GObject *object,
175 EmpathyServerTLSHandlerPriv *priv = GET_PRIV (object);
180 g_value_set_object (value, priv->channel);
182 case PROP_TLS_CERTIFICATE:
183 g_value_set_object (value, priv->certificate);
186 g_value_set_string (value, priv->hostname);
189 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
195 empathy_server_tls_handler_set_property (GObject *object,
200 EmpathyServerTLSHandlerPriv *priv = GET_PRIV (object);
205 priv->channel = g_value_dup_object (value);
208 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
214 empathy_server_tls_handler_class_init (EmpathyServerTLSHandlerClass *klass)
216 GObjectClass *oclass = G_OBJECT_CLASS (klass);
219 oclass->get_property = empathy_server_tls_handler_get_property;
220 oclass->set_property = empathy_server_tls_handler_set_property;
221 oclass->finalize = empathy_server_tls_handler_finalize;
223 g_type_class_add_private (klass, sizeof (EmpathyServerTLSHandlerPriv));
225 pspec = g_param_spec_object ("channel", "The TpChannel",
226 "The TpChannel this handler is supposed to handle.",
228 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
229 g_object_class_install_property (oclass, PROP_CHANNEL, pspec);
231 pspec = g_param_spec_object ("certificate", "The EmpathyTLSCertificate",
232 "The EmpathyTLSCertificate carried by the channel.",
233 EMPATHY_TYPE_TLS_CERTIFICATE,
234 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
235 g_object_class_install_property (oclass, PROP_TLS_CERTIFICATE, pspec);
237 pspec = g_param_spec_string ("hostname", "The hostname",
238 "The hostname which should be certified by the server certificate.",
240 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
241 g_object_class_install_property (oclass, PROP_HOSTNAME, pspec);
245 empathy_server_tls_handler_init (EmpathyServerTLSHandler *self)
247 self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
248 EMPATHY_TYPE_SERVER_TLS_HANDLER, EmpathyServerTLSHandlerPriv);
252 empathy_server_tls_handler_new_async (TpChannel *channel,
253 GAsyncReadyCallback callback,
256 g_assert (TP_IS_CHANNEL (channel));
257 g_assert (channel != NULL);
259 g_async_initable_new_async (EMPATHY_TYPE_SERVER_TLS_HANDLER,
260 G_PRIORITY_DEFAULT, NULL, callback, user_data,
261 "channel", channel, NULL);
264 EmpathyServerTLSHandler *
265 empathy_server_tls_handler_new_finish (GAsyncResult *result,
268 GObject *object, *source_object;
270 source_object = g_async_result_get_source_object (result);
272 object = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object),
274 g_object_unref (source_object);
277 return EMPATHY_SERVER_TLS_HANDLER (object);
282 EmpathyTLSCertificate *
283 empathy_server_tls_handler_get_certificate (EmpathyServerTLSHandler *self)
285 EmpathyServerTLSHandlerPriv *priv = GET_PRIV (self);
287 g_assert (priv->certificate != NULL);
289 return priv->certificate;