2 * empathy-tls-certificate.c - Source for EmpathyTLSCertificate
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
23 #include "empathy-tls-certificate.h"
25 #define DEBUG_FLAG EMPATHY_DEBUG_TLS
26 #include "empathy-debug.h"
27 #include "empathy-utils.h"
29 #include "extensions/extensions.h"
31 static void async_initable_iface_init (GAsyncInitableIface *iface);
45 GSimpleAsyncResult *async_init_res;
47 /* TLSCertificate properties */
50 EmpTLSCertificateState state;
51 EmpTLSCertificateRejectReason reject_reason;
52 } EmpathyTLSCertificatePriv;
54 G_DEFINE_TYPE_WITH_CODE (EmpathyTLSCertificate, empathy_tls_certificate,
56 G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, async_initable_iface_init));
58 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyTLSCertificate);
61 tls_certificate_init_finish (GAsyncInitable *initable,
65 gboolean retval = TRUE;
66 EmpathyTLSCertificate *self = EMPATHY_TLS_CERTIFICATE (initable);
67 EmpathyTLSCertificatePriv *priv = GET_PRIV (self);
69 if (g_simple_async_result_propagate_error (priv->async_init_res, error))
76 array_of_ay_get_type (void)
80 if (G_UNLIKELY (t == 0))
82 t = dbus_g_type_get_collection ("GPtrArray",
83 dbus_g_type_get_collection ("GArray",
91 tls_certificate_got_all_cb (TpProxy *proxy,
92 GHashTable *properties,
98 EmpathyTLSCertificate *self = EMPATHY_TLS_CERTIFICATE (weak_object);
99 EmpathyTLSCertificatePriv *priv = GET_PRIV (self);
103 g_simple_async_result_set_from_error (priv->async_init_res, error);
104 g_simple_async_result_complete_in_idle (priv->async_init_res);
109 priv->cert_type = g_strdup (tp_asv_get_string (properties,
111 priv->state = tp_asv_get_uint32 (properties, "State", NULL);
112 priv->reject_reason = tp_asv_get_uint32 (properties, "RejectReason", NULL);
114 cert_data = tp_asv_get_boxed (properties, "CertificateChainData",
115 array_of_ay_get_type ());
116 g_assert (cert_data != NULL);
117 priv->cert_data = g_boxed_copy (array_of_ay_get_type (), cert_data);
119 DEBUG ("Got a certificate chain long %u, of type %s",
120 priv->cert_data->len, priv->cert_type);
122 g_simple_async_result_complete_in_idle (priv->async_init_res);
126 tls_certificate_init_async (GAsyncInitable *initable,
128 GCancellable *cancellable,
129 GAsyncReadyCallback callback,
133 GError *error = NULL;
134 EmpathyTLSCertificate *self = EMPATHY_TLS_CERTIFICATE (initable);
135 EmpathyTLSCertificatePriv *priv = GET_PRIV (self);
137 g_assert (priv->object_path != NULL);
138 g_assert (priv->bus_name != NULL);
140 priv->async_init_res = g_simple_async_result_new (G_OBJECT (self),
141 callback, user_data, NULL);
142 dbus = tp_dbus_daemon_dup (&error);
146 g_simple_async_result_set_from_error (priv->async_init_res, error);
147 g_simple_async_result_complete_in_idle (priv->async_init_res);
149 g_error_free (error);
153 DEBUG ("Creating a proxy for object at path %s, owned by %s",
154 priv->object_path, priv->bus_name);
156 priv->proxy = g_object_new (TP_TYPE_PROXY,
157 "object-path", priv->object_path,
158 "bus-name", priv->bus_name,
159 "dbus-daemon", dbus, NULL);
161 /* call GetAll() on the certificate */
162 tp_cli_dbus_properties_call_get_all (priv->proxy,
163 -1, EMP_IFACE_AUTHENTICATION_TLS_CERTIFICATE,
164 tls_certificate_got_all_cb, NULL, NULL, G_OBJECT (self));
166 g_object_unref (dbus);
170 async_initable_iface_init (GAsyncInitableIface *iface)
172 iface->init_async = tls_certificate_init_async;
173 iface->init_finish = tls_certificate_init_finish;
177 empathy_tls_certificate_finalize (GObject *object)
179 EmpathyTLSCertificatePriv *priv = GET_PRIV (object);
181 g_free (priv->object_path);
183 G_OBJECT_CLASS (empathy_tls_certificate_parent_class)->finalize (object);
187 empathy_tls_certificate_get_property (GObject *object,
192 EmpathyTLSCertificatePriv *priv = GET_PRIV (object);
196 case PROP_OBJECT_PATH:
197 g_value_set_string (value, priv->object_path);
200 g_value_set_string (value, priv->bus_name);
203 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
209 empathy_tls_certificate_set_property (GObject *object,
214 EmpathyTLSCertificatePriv *priv = GET_PRIV (object);
218 case PROP_OBJECT_PATH:
219 priv->object_path = g_value_dup_string (value);
222 priv->bus_name = g_value_dup_string (value);
225 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
231 empathy_tls_certificate_init (EmpathyTLSCertificate *self)
233 self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
234 EMPATHY_TYPE_TLS_CERTIFICATE, EmpathyTLSCertificatePriv);
238 empathy_tls_certificate_class_init (EmpathyTLSCertificateClass *klass)
241 GObjectClass *oclass = G_OBJECT_CLASS (klass);
243 oclass->get_property = empathy_tls_certificate_get_property;
244 oclass->set_property = empathy_tls_certificate_set_property;
245 oclass->finalize = empathy_tls_certificate_finalize;
247 g_type_class_add_private (klass, sizeof (EmpathyTLSCertificatePriv));
249 pspec = g_param_spec_string ("object-path", "The object path",
250 "The path on the bus where the object we proxy is living.",
252 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
253 g_object_class_install_property (oclass, PROP_OBJECT_PATH, pspec);
255 pspec = g_param_spec_string ("bus-name", "The bus name",
256 "The bus name owning this certificate.",
258 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
259 g_object_class_install_property (oclass, PROP_BUS_NAME, pspec);
263 empathy_tls_certificate_new_async (const gchar *bus_name,
264 const gchar *object_path,
265 GAsyncReadyCallback callback,
268 g_assert (object_path != NULL);
270 g_async_initable_new_async (EMPATHY_TYPE_TLS_CERTIFICATE,
271 G_PRIORITY_DEFAULT, NULL, callback, user_data,
272 "bus-name", bus_name,
273 "object-path", object_path, NULL);
276 EmpathyTLSCertificate *
277 empathy_tls_certificate_new_finish (GAsyncResult *res,
280 GObject *object, *source_object;
282 source_object = g_async_result_get_source_object (res);
284 object = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object),
286 g_object_unref (source_object);
289 return EMPATHY_TLS_CERTIFICATE (object);