• 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