1/* GDBus - GLib D-Bus Library
2 *
3 * Copyright (C) 2008-2010 Red Hat, Inc.
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General
16 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
17 *
18 * Author: David Zeuthen <davidz@redhat.com>
19 */
20
21#include "config.h"
22
23#include "gdbusauthmechanismanon.h"
24#include "gdbuserror.h"
25#include "gioenumtypes.h"
26
27#include "glibintl.h"
28
29struct _GDBusAuthMechanismAnonPrivate
30{
31 gboolean is_client;
32 gboolean is_server;
33 GDBusAuthMechanismState state;
34};
35
36static gint mechanism_get_priority (void);
37static const gchar *mechanism_get_name (void);
38
39static gboolean mechanism_is_supported (GDBusAuthMechanism *mechanism);
40static gchar *mechanism_encode_data (GDBusAuthMechanism *mechanism,
41 const gchar *data,
42 gsize data_len,
43 gsize *out_data_len);
44static gchar *mechanism_decode_data (GDBusAuthMechanism *mechanism,
45 const gchar *data,
46 gsize data_len,
47 gsize *out_data_len);
48static GDBusAuthMechanismState mechanism_server_get_state (GDBusAuthMechanism *mechanism);
49static void mechanism_server_initiate (GDBusAuthMechanism *mechanism,
50 const gchar *initial_response,
51 gsize initial_response_len);
52static void mechanism_server_data_receive (GDBusAuthMechanism *mechanism,
53 const gchar *data,
54 gsize data_len);
55static gchar *mechanism_server_data_send (GDBusAuthMechanism *mechanism,
56 gsize *out_data_len);
57static gchar *mechanism_server_get_reject_reason (GDBusAuthMechanism *mechanism);
58static void mechanism_server_shutdown (GDBusAuthMechanism *mechanism);
59static GDBusAuthMechanismState mechanism_client_get_state (GDBusAuthMechanism *mechanism);
60static gchar *mechanism_client_initiate (GDBusAuthMechanism *mechanism,
61 gsize *out_initial_response_len);
62static void mechanism_client_data_receive (GDBusAuthMechanism *mechanism,
63 const gchar *data,
64 gsize data_len);
65static gchar *mechanism_client_data_send (GDBusAuthMechanism *mechanism,
66 gsize *out_data_len);
67static void mechanism_client_shutdown (GDBusAuthMechanism *mechanism);
68
69/* ---------------------------------------------------------------------------------------------------- */
70
71G_DEFINE_TYPE_WITH_PRIVATE (GDBusAuthMechanismAnon, _g_dbus_auth_mechanism_anon, G_TYPE_DBUS_AUTH_MECHANISM)
72
73/* ---------------------------------------------------------------------------------------------------- */
74
75static void
76_g_dbus_auth_mechanism_anon_finalize (GObject *object)
77{
78 //GDBusAuthMechanismAnon *mechanism = G_DBUS_AUTH_MECHANISM_ANON (object);
79
80 if (G_OBJECT_CLASS (_g_dbus_auth_mechanism_anon_parent_class)->finalize != NULL)
81 G_OBJECT_CLASS (_g_dbus_auth_mechanism_anon_parent_class)->finalize (object);
82}
83
84static void
85_g_dbus_auth_mechanism_anon_class_init (GDBusAuthMechanismAnonClass *klass)
86{
87 GObjectClass *gobject_class;
88 GDBusAuthMechanismClass *mechanism_class;
89
90 gobject_class = G_OBJECT_CLASS (klass);
91 gobject_class->finalize = _g_dbus_auth_mechanism_anon_finalize;
92
93 mechanism_class = G_DBUS_AUTH_MECHANISM_CLASS (klass);
94 mechanism_class->get_priority = mechanism_get_priority;
95 mechanism_class->get_name = mechanism_get_name;
96 mechanism_class->is_supported = mechanism_is_supported;
97 mechanism_class->encode_data = mechanism_encode_data;
98 mechanism_class->decode_data = mechanism_decode_data;
99 mechanism_class->server_get_state = mechanism_server_get_state;
100 mechanism_class->server_initiate = mechanism_server_initiate;
101 mechanism_class->server_data_receive = mechanism_server_data_receive;
102 mechanism_class->server_data_send = mechanism_server_data_send;
103 mechanism_class->server_get_reject_reason = mechanism_server_get_reject_reason;
104 mechanism_class->server_shutdown = mechanism_server_shutdown;
105 mechanism_class->client_get_state = mechanism_client_get_state;
106 mechanism_class->client_initiate = mechanism_client_initiate;
107 mechanism_class->client_data_receive = mechanism_client_data_receive;
108 mechanism_class->client_data_send = mechanism_client_data_send;
109 mechanism_class->client_shutdown = mechanism_client_shutdown;
110}
111
112static void
113_g_dbus_auth_mechanism_anon_init (GDBusAuthMechanismAnon *mechanism)
114{
115 mechanism->priv = _g_dbus_auth_mechanism_anon_get_instance_private (self: mechanism);
116}
117
118/* ---------------------------------------------------------------------------------------------------- */
119
120
121static gint
122mechanism_get_priority (void)
123{
124 /* We prefer ANONYMOUS to most other mechanism (such as DBUS_COOKIE_SHA1) but not to EXTERNAL */
125 return 50;
126}
127
128
129static const gchar *
130mechanism_get_name (void)
131{
132 return "ANONYMOUS";
133}
134
135static gboolean
136mechanism_is_supported (GDBusAuthMechanism *mechanism)
137{
138 g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism), FALSE);
139 return TRUE;
140}
141
142static gchar *
143mechanism_encode_data (GDBusAuthMechanism *mechanism,
144 const gchar *data,
145 gsize data_len,
146 gsize *out_data_len)
147{
148 return NULL;
149}
150
151
152static gchar *
153mechanism_decode_data (GDBusAuthMechanism *mechanism,
154 const gchar *data,
155 gsize data_len,
156 gsize *out_data_len)
157{
158 return NULL;
159}
160
161/* ---------------------------------------------------------------------------------------------------- */
162
163static GDBusAuthMechanismState
164mechanism_server_get_state (GDBusAuthMechanism *mechanism)
165{
166 GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism);
167
168 g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism), G_DBUS_AUTH_MECHANISM_STATE_INVALID);
169 g_return_val_if_fail (m->priv->is_server && !m->priv->is_client, G_DBUS_AUTH_MECHANISM_STATE_INVALID);
170
171 return m->priv->state;
172}
173
174static void
175mechanism_server_initiate (GDBusAuthMechanism *mechanism,
176 const gchar *initial_response,
177 gsize initial_response_len)
178{
179 GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism);
180
181 g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism));
182 g_return_if_fail (!m->priv->is_server && !m->priv->is_client);
183
184 //g_debug ("ANONYMOUS: initial_response was '%s'", initial_response);
185
186 m->priv->is_server = TRUE;
187 m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_ACCEPTED;
188}
189
190static void
191mechanism_server_data_receive (GDBusAuthMechanism *mechanism,
192 const gchar *data,
193 gsize data_len)
194{
195 GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism);
196
197 g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism));
198 g_return_if_fail (m->priv->is_server && !m->priv->is_client);
199 g_return_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_WAITING_FOR_DATA);
200
201 /* can never end up here because we are never in the WAITING_FOR_DATA state */
202 g_assert_not_reached ();
203}
204
205static gchar *
206mechanism_server_data_send (GDBusAuthMechanism *mechanism,
207 gsize *out_data_len)
208{
209 GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism);
210
211 g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism), NULL);
212 g_return_val_if_fail (m->priv->is_server && !m->priv->is_client, NULL);
213 g_return_val_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_HAVE_DATA_TO_SEND, NULL);
214
215 /* can never end up here because we are never in the HAVE_DATA_TO_SEND state */
216 g_assert_not_reached ();
217
218 return NULL;
219}
220
221static gchar *
222mechanism_server_get_reject_reason (GDBusAuthMechanism *mechanism)
223{
224 GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism);
225
226 g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism), NULL);
227 g_return_val_if_fail (m->priv->is_server && !m->priv->is_client, NULL);
228 g_return_val_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_REJECTED, NULL);
229
230 /* can never end up here because we are never in the REJECTED state */
231 g_assert_not_reached ();
232
233 return NULL;
234}
235
236static void
237mechanism_server_shutdown (GDBusAuthMechanism *mechanism)
238{
239 GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism);
240
241 g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism));
242 g_return_if_fail (m->priv->is_server && !m->priv->is_client);
243
244 m->priv->is_server = FALSE;
245}
246
247/* ---------------------------------------------------------------------------------------------------- */
248
249static GDBusAuthMechanismState
250mechanism_client_get_state (GDBusAuthMechanism *mechanism)
251{
252 GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism);
253
254 g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism), G_DBUS_AUTH_MECHANISM_STATE_INVALID);
255 g_return_val_if_fail (m->priv->is_client && !m->priv->is_server, G_DBUS_AUTH_MECHANISM_STATE_INVALID);
256
257 return m->priv->state;
258}
259
260static gchar *
261mechanism_client_initiate (GDBusAuthMechanism *mechanism,
262 gsize *out_initial_response_len)
263{
264 GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism);
265 gchar *result;
266
267 g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism), NULL);
268 g_return_val_if_fail (!m->priv->is_server && !m->priv->is_client, NULL);
269
270 m->priv->is_client = TRUE;
271 m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_ACCEPTED;
272
273 /* just return our library name and version */
274 result = g_strdup (str: "GDBus 0.1");
275 *out_initial_response_len = strlen (s: result);
276
277 return result;
278}
279
280static void
281mechanism_client_data_receive (GDBusAuthMechanism *mechanism,
282 const gchar *data,
283 gsize data_len)
284{
285 GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism);
286
287 g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism));
288 g_return_if_fail (m->priv->is_client && !m->priv->is_server);
289 g_return_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_WAITING_FOR_DATA);
290
291 /* can never end up here because we are never in the WAITING_FOR_DATA state */
292 g_assert_not_reached ();
293}
294
295static gchar *
296mechanism_client_data_send (GDBusAuthMechanism *mechanism,
297 gsize *out_data_len)
298{
299 GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism);
300
301 g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism), NULL);
302 g_return_val_if_fail (m->priv->is_client && !m->priv->is_server, NULL);
303 g_return_val_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_HAVE_DATA_TO_SEND, NULL);
304
305 /* can never end up here because we are never in the HAVE_DATA_TO_SEND state */
306 g_assert_not_reached ();
307
308 return NULL;
309}
310
311static void
312mechanism_client_shutdown (GDBusAuthMechanism *mechanism)
313{
314 GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism);
315
316 g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism));
317 g_return_if_fail (m->priv->is_client && !m->priv->is_server);
318
319 m->priv->is_client = FALSE;
320}
321
322/* ---------------------------------------------------------------------------------------------------- */
323

source code of gtk/subprojects/glib/gio/gdbusauthmechanismanon.c