2 * empathy-auth-factory.c - Source for EmpathyAuthFactory
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-auth-factory.h"
23 #include <telepathy-glib/interfaces.h>
24 #include <telepathy-glib/simple-handler.h>
25 #include <telepathy-glib/util.h>
27 #define DEBUG_FLAG EMPATHY_DEBUG_TLS
28 #include "empathy-debug.h"
29 #include "empathy-server-tls-handler.h"
30 #include "empathy-utils.h"
32 #include "extensions/extensions.h"
34 G_DEFINE_TYPE (EmpathyAuthFactory, empathy_auth_factory, G_TYPE_OBJECT);
37 TpBaseClient *handler;
38 TpHandleChannelsContext *context;
41 } EmpathyAuthFactoryPriv;
44 NEW_SERVER_TLS_HANDLER,
48 static guint signals[LAST_SIGNAL] = { 0, };
50 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyAuthFactory)
52 static EmpathyAuthFactory *auth_factory_singleton = NULL;
55 server_tls_handler_ready_cb (GObject *source,
59 EmpathyServerTLSHandler *handler;
61 EmpathyAuthFactory *self = user_data;
62 EmpathyAuthFactoryPriv *priv = GET_PRIV (self);
64 handler = empathy_server_tls_handler_new_finish (res, &error);
68 DEBUG ("Failed to create a server TLS handler; error %s",
70 tp_handle_channels_context_fail (priv->context, error);
76 tp_handle_channels_context_accept (priv->context);
77 g_signal_emit (self, signals[NEW_SERVER_TLS_HANDLER], 0,
80 g_object_unref (handler);
83 tp_clear_object (&priv->context);
87 handle_channels_cb (TpSimpleHandler *handler,
89 TpConnection *connection,
91 GList *requests_satisfied,
92 gint64 user_action_time,
93 TpHandleChannelsContext *context,
97 const GError *dbus_error;
99 EmpathyAuthFactory *self = user_data;
100 EmpathyAuthFactoryPriv *priv = GET_PRIV (self);
102 DEBUG ("Handle TLS carrier channels.");
104 /* there can't be more than one ServerTLSConnection channels
105 * at the same time, for the same connection/account.
107 if (g_list_length (channels) != 1)
109 g_set_error_literal (&error, TP_ERROR, TP_ERROR_INVALID_ARGUMENT,
110 "Can't handle more than one ServerTLSConnection channel "
111 "for the same connection.");
116 channel = channels->data;
118 if (tp_channel_get_channel_type_id (channel) !=
119 EMP_IFACE_QUARK_CHANNEL_TYPE_SERVER_TLS_CONNECTION)
121 g_set_error (&error, TP_ERROR, TP_ERROR_INVALID_ARGUMENT,
122 "Can only handle ServerTLSConnection channels, this was a %s "
123 "channel", tp_channel_get_channel_type (channel));
128 dbus_error = tp_proxy_get_invalidated (channel);
130 if (dbus_error != NULL)
132 error = g_error_copy (dbus_error);
136 /* create a handler */
137 priv->context = g_object_ref (context);
138 tp_handle_channels_context_delay (context);
139 empathy_server_tls_handler_new_async (channel, server_tls_handler_ready_cb,
145 tp_handle_channels_context_fail (context, error);
146 g_clear_error (&error);
150 empathy_auth_factory_constructor (GType type,
152 GObjectConstructParam *params)
156 if (auth_factory_singleton != NULL)
158 retval = g_object_ref (auth_factory_singleton);
162 retval = G_OBJECT_CLASS (empathy_auth_factory_parent_class)->constructor
163 (type, n_params, params);
165 auth_factory_singleton = EMPATHY_AUTH_FACTORY (retval);
166 g_object_add_weak_pointer (retval, (gpointer *) &auth_factory_singleton);
173 empathy_auth_factory_init (EmpathyAuthFactory *self)
175 EmpathyAuthFactoryPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
176 EMPATHY_TYPE_AUTH_FACTORY, EmpathyAuthFactoryPriv);
178 GError *error = NULL;
182 bus = tp_dbus_daemon_dup (&error);
185 g_critical ("Failed to get TpDBusDaemon: %s", error->message);
186 g_error_free (error);
190 priv->handler = tp_simple_handler_new (bus, FALSE, FALSE, "Empathy.Auth",
191 FALSE, handle_channels_cb, self, NULL);
193 tp_base_client_take_handler_filter (priv->handler, tp_asv_new (
194 TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING,
195 EMP_IFACE_CHANNEL_TYPE_SERVER_TLS_CONNECTION,
196 TP_PROP_CHANNEL_TARGET_HANDLE_TYPE, G_TYPE_UINT,
197 TP_HANDLE_TYPE_NONE, NULL));
199 g_object_unref (bus);
203 empathy_auth_factory_dispose (GObject *object)
205 EmpathyAuthFactoryPriv *priv = GET_PRIV (object);
207 if (priv->dispose_run)
210 priv->dispose_run = TRUE;
212 tp_clear_object (&priv->handler);
213 tp_clear_object (&priv->context);
215 G_OBJECT_CLASS (empathy_auth_factory_parent_class)->dispose (object);
219 empathy_auth_factory_class_init (EmpathyAuthFactoryClass *klass)
221 GObjectClass *oclass = G_OBJECT_CLASS (klass);
223 oclass->constructor = empathy_auth_factory_constructor;
224 oclass->dispose = empathy_auth_factory_dispose;
226 g_type_class_add_private (klass, sizeof (EmpathyAuthFactoryPriv));
228 signals[NEW_SERVER_TLS_HANDLER] =
229 g_signal_new ("new-server-tls-handler",
230 G_TYPE_FROM_CLASS (klass),
231 G_SIGNAL_RUN_LAST, 0,
233 g_cclosure_marshal_VOID__OBJECT,
235 1, EMPATHY_TYPE_SERVER_TLS_HANDLER);
239 empathy_auth_factory_dup_singleton (void)
241 return g_object_new (EMPATHY_TYPE_AUTH_FACTORY, NULL);
245 empathy_auth_factory_register (EmpathyAuthFactory *self,
248 EmpathyAuthFactoryPriv *priv = GET_PRIV (self);
250 return tp_base_client_register (priv->handler, error);