• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  
29  struct _GDBusAuthMechanismAnonPrivate
30  {
31    gboolean is_client;
32    gboolean is_server;
33    GDBusAuthMechanismState state;
34  };
35  
36  static gint                     mechanism_get_priority              (void);
37  static const gchar             *mechanism_get_name                  (void);
38  
39  static gboolean                 mechanism_is_supported              (GDBusAuthMechanism   *mechanism);
40  static gchar                   *mechanism_encode_data               (GDBusAuthMechanism   *mechanism,
41                                                                       const gchar          *data,
42                                                                       gsize                 data_len,
43                                                                       gsize                *out_data_len);
44  static gchar                   *mechanism_decode_data               (GDBusAuthMechanism   *mechanism,
45                                                                       const gchar          *data,
46                                                                       gsize                 data_len,
47                                                                       gsize                *out_data_len);
48  static GDBusAuthMechanismState  mechanism_server_get_state          (GDBusAuthMechanism   *mechanism);
49  static void                     mechanism_server_initiate           (GDBusAuthMechanism   *mechanism,
50                                                                       const gchar          *initial_response,
51                                                                       gsize                 initial_response_len);
52  static void                     mechanism_server_data_receive       (GDBusAuthMechanism   *mechanism,
53                                                                       const gchar          *data,
54                                                                       gsize                 data_len);
55  static gchar                   *mechanism_server_data_send          (GDBusAuthMechanism   *mechanism,
56                                                                       gsize                *out_data_len);
57  static gchar                   *mechanism_server_get_reject_reason  (GDBusAuthMechanism   *mechanism);
58  static void                     mechanism_server_shutdown           (GDBusAuthMechanism   *mechanism);
59  static GDBusAuthMechanismState  mechanism_client_get_state          (GDBusAuthMechanism   *mechanism);
60  static gchar                   *mechanism_client_initiate           (GDBusAuthMechanism   *mechanism,
61                                                                       gsize                *out_initial_response_len);
62  static void                     mechanism_client_data_receive       (GDBusAuthMechanism   *mechanism,
63                                                                       const gchar          *data,
64                                                                       gsize                 data_len);
65  static gchar                   *mechanism_client_data_send          (GDBusAuthMechanism   *mechanism,
66                                                                       gsize                *out_data_len);
67  static void                     mechanism_client_shutdown           (GDBusAuthMechanism   *mechanism);
68  
69  /* ---------------------------------------------------------------------------------------------------- */
70  
G_DEFINE_TYPE_WITH_PRIVATE(GDBusAuthMechanismAnon,_g_dbus_auth_mechanism_anon,G_TYPE_DBUS_AUTH_MECHANISM)71  G_DEFINE_TYPE_WITH_PRIVATE (GDBusAuthMechanismAnon, _g_dbus_auth_mechanism_anon, G_TYPE_DBUS_AUTH_MECHANISM)
72  
73  /* ---------------------------------------------------------------------------------------------------- */
74  
75  static 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  
84  static void
_g_dbus_auth_mechanism_anon_class_init(GDBusAuthMechanismAnonClass * klass)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  
112  static void
_g_dbus_auth_mechanism_anon_init(GDBusAuthMechanismAnon * mechanism)113  _g_dbus_auth_mechanism_anon_init (GDBusAuthMechanismAnon *mechanism)
114  {
115    mechanism->priv = _g_dbus_auth_mechanism_anon_get_instance_private (mechanism);
116  }
117  
118  /* ---------------------------------------------------------------------------------------------------- */
119  
120  
121  static gint
mechanism_get_priority(void)122  mechanism_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  
129  static const gchar *
mechanism_get_name(void)130  mechanism_get_name (void)
131  {
132    return "ANONYMOUS";
133  }
134  
135  static gboolean
mechanism_is_supported(GDBusAuthMechanism * mechanism)136  mechanism_is_supported (GDBusAuthMechanism *mechanism)
137  {
138    g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism), FALSE);
139    return TRUE;
140  }
141  
142  static gchar *
mechanism_encode_data(GDBusAuthMechanism * mechanism,const gchar * data,gsize data_len,gsize * out_data_len)143  mechanism_encode_data (GDBusAuthMechanism   *mechanism,
144                         const gchar          *data,
145                         gsize                 data_len,
146                         gsize                *out_data_len)
147  {
148    return NULL;
149  }
150  
151  
152  static gchar *
mechanism_decode_data(GDBusAuthMechanism * mechanism,const gchar * data,gsize data_len,gsize * out_data_len)153  mechanism_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  
163  static GDBusAuthMechanismState
mechanism_server_get_state(GDBusAuthMechanism * mechanism)164  mechanism_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  
174  static void
mechanism_server_initiate(GDBusAuthMechanism * mechanism,const gchar * initial_response,gsize initial_response_len)175  mechanism_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  
190  static void
mechanism_server_data_receive(GDBusAuthMechanism * mechanism,const gchar * data,gsize data_len)191  mechanism_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  
205  static gchar *
mechanism_server_data_send(GDBusAuthMechanism * mechanism,gsize * out_data_len)206  mechanism_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  
221  static gchar *
mechanism_server_get_reject_reason(GDBusAuthMechanism * mechanism)222  mechanism_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  
236  static void
mechanism_server_shutdown(GDBusAuthMechanism * mechanism)237  mechanism_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  
249  static GDBusAuthMechanismState
mechanism_client_get_state(GDBusAuthMechanism * mechanism)250  mechanism_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  
260  static gchar *
mechanism_client_initiate(GDBusAuthMechanism * mechanism,gsize * out_initial_response_len)261  mechanism_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 ("GDBus 0.1");
275    *out_initial_response_len = strlen (result);
276  
277    return result;
278  }
279  
280  static void
mechanism_client_data_receive(GDBusAuthMechanism * mechanism,const gchar * data,gsize data_len)281  mechanism_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  
295  static gchar *
mechanism_client_data_send(GDBusAuthMechanism * mechanism,gsize * out_data_len)296  mechanism_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  
311  static void
mechanism_client_shutdown(GDBusAuthMechanism * mechanism)312  mechanism_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