[kdbus] KDBUS_ITEM_PAYLOAD_OFF items are (once again) relative to msg header
[platform/upstream/glib.git] / gio / gdummytlsbackend.c
1 /* GIO - GLib Input, Output and Streaming Library
2  *
3  * Copyright (C) 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 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
19 #include "config.h"
20
21 #include "gdummytlsbackend.h"
22
23 #include <glib.h>
24
25 #include "gasyncresult.h"
26 #include "gcancellable.h"
27 #include "ginitable.h"
28 #include "gtlsbackend.h"
29 #include "gtlscertificate.h"
30 #include "gtlsclientconnection.h"
31 #include "gtlsdatabase.h"
32 #include "gtlsfiledatabase.h"
33 #include "gtlsserverconnection.h"
34 #include "gsimpleasyncresult.h"
35
36 #include "giomodule.h"
37 #include "giomodule-priv.h"
38
39 #include "glibintl.h"
40
41 static GType _g_dummy_tls_certificate_get_type (void);
42 static GType _g_dummy_tls_connection_get_type (void);
43 static GType _g_dummy_tls_database_get_type (void);
44
45 struct _GDummyTlsBackend {
46   GObject       parent_instance;
47   GTlsDatabase *database;
48 };
49
50 static void g_dummy_tls_backend_iface_init (GTlsBackendInterface *iface);
51
52 #define g_dummy_tls_backend_get_type _g_dummy_tls_backend_get_type
53 G_DEFINE_TYPE_WITH_CODE (GDummyTlsBackend, g_dummy_tls_backend, G_TYPE_OBJECT,
54                          G_IMPLEMENT_INTERFACE (G_TYPE_TLS_BACKEND,
55                                                 g_dummy_tls_backend_iface_init)
56                          _g_io_modules_ensure_extension_points_registered ();
57                          g_io_extension_point_implement (G_TLS_BACKEND_EXTENSION_POINT_NAME,
58                                                          g_define_type_id,
59                                                          "dummy",
60                                                          -100))
61
62 static void
63 g_dummy_tls_backend_init (GDummyTlsBackend *dummy)
64 {
65 }
66
67 static void
68 g_dummy_tls_backend_finalize (GObject *object)
69 {
70   GDummyTlsBackend *dummy = G_DUMMY_TLS_BACKEND (object);
71
72   g_clear_object (&dummy->database);
73
74   G_OBJECT_CLASS (g_dummy_tls_backend_parent_class)->finalize (object);
75 }
76
77 static void
78 g_dummy_tls_backend_class_init (GDummyTlsBackendClass *backend_class)
79 {
80   GObjectClass *object_class = G_OBJECT_CLASS (backend_class);
81
82   object_class->finalize = g_dummy_tls_backend_finalize;
83 }
84
85 static GTlsDatabase *
86 g_dummy_tls_backend_get_default_database (GTlsBackend *backend)
87 {
88   GDummyTlsBackend *dummy = G_DUMMY_TLS_BACKEND (backend);
89
90   if (g_once_init_enter (&dummy->database))
91     {
92       GTlsDatabase *tlsdb;
93
94       tlsdb = g_object_new (_g_dummy_tls_database_get_type (), NULL);
95       g_once_init_leave (&dummy->database, tlsdb);
96     }
97
98   return g_object_ref (dummy->database);
99 }
100
101 static void
102 g_dummy_tls_backend_iface_init (GTlsBackendInterface *iface)
103 {
104   iface->get_certificate_type = _g_dummy_tls_certificate_get_type;
105   iface->get_client_connection_type = _g_dummy_tls_connection_get_type;
106   iface->get_server_connection_type = _g_dummy_tls_connection_get_type;
107   iface->get_file_database_type = _g_dummy_tls_database_get_type;
108   iface->get_default_database = g_dummy_tls_backend_get_default_database;
109 }
110
111 /* Dummy certificate type */
112
113 typedef struct _GDummyTlsCertificate      GDummyTlsCertificate;
114 typedef struct _GDummyTlsCertificateClass GDummyTlsCertificateClass;
115
116 struct _GDummyTlsCertificate {
117   GTlsCertificate parent_instance;
118 };
119
120 struct _GDummyTlsCertificateClass {
121   GTlsCertificateClass parent_class;
122 };
123
124 enum
125 {
126   PROP_CERTIFICATE_0,
127
128   PROP_CERT_CERTIFICATE,
129   PROP_CERT_CERTIFICATE_PEM,
130   PROP_CERT_PRIVATE_KEY,
131   PROP_CERT_PRIVATE_KEY_PEM,
132   PROP_CERT_ISSUER
133 };
134
135 static void g_dummy_tls_certificate_initable_iface_init (GInitableIface *iface);
136
137 #define g_dummy_tls_certificate_get_type _g_dummy_tls_certificate_get_type
138 G_DEFINE_TYPE_WITH_CODE (GDummyTlsCertificate, g_dummy_tls_certificate, G_TYPE_TLS_CERTIFICATE,
139                          G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
140                                                 g_dummy_tls_certificate_initable_iface_init);)
141
142 static void
143 g_dummy_tls_certificate_get_property (GObject    *object,
144                                       guint       prop_id,
145                                       GValue     *value,
146                                       GParamSpec *pspec)
147 {
148   /* We need to define this method to make GObject happy, but it will
149    * never be possible to construct a working GDummyTlsCertificate, so
150    * it doesn't have to do anything useful.
151    */
152 }
153
154 static void
155 g_dummy_tls_certificate_set_property (GObject      *object,
156                                       guint         prop_id,
157                                       const GValue *value,
158                                       GParamSpec   *pspec)
159 {
160   /* Just ignore all attempts to set properties. */
161 }
162
163 static void
164 g_dummy_tls_certificate_class_init (GDummyTlsCertificateClass *certificate_class)
165 {
166   GObjectClass *gobject_class = G_OBJECT_CLASS (certificate_class);
167
168   gobject_class->get_property = g_dummy_tls_certificate_get_property;
169   gobject_class->set_property = g_dummy_tls_certificate_set_property;
170
171   g_object_class_override_property (gobject_class, PROP_CERT_CERTIFICATE, "certificate");
172   g_object_class_override_property (gobject_class, PROP_CERT_CERTIFICATE_PEM, "certificate-pem");
173   g_object_class_override_property (gobject_class, PROP_CERT_PRIVATE_KEY, "private-key");
174   g_object_class_override_property (gobject_class, PROP_CERT_PRIVATE_KEY_PEM, "private-key-pem");
175   g_object_class_override_property (gobject_class, PROP_CERT_ISSUER, "issuer");
176 }
177
178 static void
179 g_dummy_tls_certificate_init (GDummyTlsCertificate *certificate)
180 {
181 }
182
183 static gboolean
184 g_dummy_tls_certificate_initable_init (GInitable       *initable,
185                                        GCancellable    *cancellable,
186                                        GError         **error)
187 {
188   g_set_error_literal (error, G_TLS_ERROR, G_TLS_ERROR_UNAVAILABLE,
189                        _("TLS support is not available"));
190   return FALSE;
191 }
192
193 static void
194 g_dummy_tls_certificate_initable_iface_init (GInitableIface  *iface)
195 {
196   iface->init = g_dummy_tls_certificate_initable_init;
197 }
198
199 /* Dummy connection type; since GTlsClientConnection and
200  * GTlsServerConnection are just interfaces, we can implement them
201  * both on a single object.
202  */
203
204 typedef struct _GDummyTlsConnection      GDummyTlsConnection;
205 typedef struct _GDummyTlsConnectionClass GDummyTlsConnectionClass;
206
207 struct _GDummyTlsConnection {
208   GTlsConnection parent_instance;
209 };
210
211 struct _GDummyTlsConnectionClass {
212   GTlsConnectionClass parent_class;
213 };
214
215 enum
216 {
217   PROP_CONNECTION_0,
218
219   PROP_CONN_BASE_IO_STREAM,
220   PROP_CONN_USE_SYSTEM_CERTDB,
221   PROP_CONN_REQUIRE_CLOSE_NOTIFY,
222   PROP_CONN_REHANDSHAKE_MODE,
223   PROP_CONN_CERTIFICATE,
224   PROP_CONN_DATABASE,
225   PROP_CONN_INTERACTION,
226   PROP_CONN_PEER_CERTIFICATE,
227   PROP_CONN_PEER_CERTIFICATE_ERRORS,
228   PROP_CONN_VALIDATION_FLAGS,
229   PROP_CONN_SERVER_IDENTITY,
230   PROP_CONN_USE_SSL3,
231   PROP_CONN_ACCEPTED_CAS,
232   PROP_CONN_AUTHENTICATION_MODE
233 };
234
235 static void g_dummy_tls_connection_initable_iface_init (GInitableIface *iface);
236
237 #define g_dummy_tls_connection_get_type _g_dummy_tls_connection_get_type
238 G_DEFINE_TYPE_WITH_CODE (GDummyTlsConnection, g_dummy_tls_connection, G_TYPE_TLS_CONNECTION,
239                          G_IMPLEMENT_INTERFACE (G_TYPE_TLS_CLIENT_CONNECTION, NULL);
240                          G_IMPLEMENT_INTERFACE (G_TYPE_TLS_SERVER_CONNECTION, NULL);
241                          G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
242                                                 g_dummy_tls_connection_initable_iface_init);)
243
244 static void
245 g_dummy_tls_connection_get_property (GObject    *object,
246                                      guint       prop_id,
247                                      GValue     *value,
248                                      GParamSpec *pspec)
249 {
250 }
251
252 static void
253 g_dummy_tls_connection_set_property (GObject      *object,
254                                      guint         prop_id,
255                                      const GValue *value,
256                                      GParamSpec   *pspec)
257 {
258 }
259
260 static gboolean
261 g_dummy_tls_connection_close (GIOStream     *stream,
262                               GCancellable  *cancellable,
263                               GError       **error)
264 {
265   return TRUE;
266 }
267
268 static void
269 g_dummy_tls_connection_class_init (GDummyTlsConnectionClass *connection_class)
270 {
271   GObjectClass *gobject_class = G_OBJECT_CLASS (connection_class);
272   GIOStreamClass *io_stream_class = G_IO_STREAM_CLASS (connection_class);
273
274   gobject_class->get_property = g_dummy_tls_connection_get_property;
275   gobject_class->set_property = g_dummy_tls_connection_set_property;
276
277   /* Need to override this because when initable_init fails it will
278    * dispose the connection, which will close it, which would
279    * otherwise try to close its input/output streams, which don't
280    * exist.
281    */
282   io_stream_class->close_fn = g_dummy_tls_connection_close;
283
284   g_object_class_override_property (gobject_class, PROP_CONN_BASE_IO_STREAM, "base-io-stream");
285   g_object_class_override_property (gobject_class, PROP_CONN_USE_SYSTEM_CERTDB, "use-system-certdb");
286   g_object_class_override_property (gobject_class, PROP_CONN_REQUIRE_CLOSE_NOTIFY, "require-close-notify");
287   g_object_class_override_property (gobject_class, PROP_CONN_REHANDSHAKE_MODE, "rehandshake-mode");
288   g_object_class_override_property (gobject_class, PROP_CONN_CERTIFICATE, "certificate");
289   g_object_class_override_property (gobject_class, PROP_CONN_DATABASE, "database");
290   g_object_class_override_property (gobject_class, PROP_CONN_INTERACTION, "interaction");
291   g_object_class_override_property (gobject_class, PROP_CONN_PEER_CERTIFICATE, "peer-certificate");
292   g_object_class_override_property (gobject_class, PROP_CONN_PEER_CERTIFICATE_ERRORS, "peer-certificate-errors");
293   g_object_class_override_property (gobject_class, PROP_CONN_VALIDATION_FLAGS, "validation-flags");
294   g_object_class_override_property (gobject_class, PROP_CONN_SERVER_IDENTITY, "server-identity");
295   g_object_class_override_property (gobject_class, PROP_CONN_USE_SSL3, "use-ssl3");
296   g_object_class_override_property (gobject_class, PROP_CONN_ACCEPTED_CAS, "accepted-cas");
297   g_object_class_override_property (gobject_class, PROP_CONN_AUTHENTICATION_MODE, "authentication-mode");
298 }
299
300 static void
301 g_dummy_tls_connection_init (GDummyTlsConnection *connection)
302 {
303 }
304
305 static gboolean
306 g_dummy_tls_connection_initable_init (GInitable       *initable,
307                                       GCancellable    *cancellable,
308                                       GError         **error)
309 {
310   g_set_error_literal (error, G_TLS_ERROR, G_TLS_ERROR_UNAVAILABLE,
311                        _("TLS support is not available"));
312   return FALSE;
313 }
314
315 static void
316 g_dummy_tls_connection_initable_iface_init (GInitableIface  *iface)
317 {
318   iface->init = g_dummy_tls_connection_initable_init;
319 }
320
321 /* Dummy database type.
322  */
323
324 typedef struct _GDummyTlsDatabase      GDummyTlsDatabase;
325 typedef struct _GDummyTlsDatabaseClass GDummyTlsDatabaseClass;
326
327 struct _GDummyTlsDatabase {
328   GTlsDatabase parent_instance;
329 };
330
331 struct _GDummyTlsDatabaseClass {
332   GTlsDatabaseClass parent_class;
333 };
334
335 enum
336 {
337   PROP_DATABASE_0,
338
339   PROP_ANCHORS,
340 };
341
342 static void g_dummy_tls_database_file_database_iface_init (GTlsFileDatabaseInterface *iface);
343 static void g_dummy_tls_database_initable_iface_init (GInitableIface *iface);
344
345 #define g_dummy_tls_database_get_type _g_dummy_tls_database_get_type
346 G_DEFINE_TYPE_WITH_CODE (GDummyTlsDatabase, g_dummy_tls_database, G_TYPE_TLS_DATABASE,
347                          G_IMPLEMENT_INTERFACE (G_TYPE_TLS_FILE_DATABASE,
348                                                 g_dummy_tls_database_file_database_iface_init);
349                          G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
350                                                 g_dummy_tls_database_initable_iface_init);)
351
352
353 static void
354 g_dummy_tls_database_get_property (GObject    *object,
355                                    guint       prop_id,
356                                    GValue     *value,
357                                    GParamSpec *pspec)
358 {
359   /* We need to define this method to make GObject happy, but it will
360    * never be possible to construct a working GDummyTlsDatabase, so
361    * it doesn't have to do anything useful.
362    */
363 }
364
365 static void
366 g_dummy_tls_database_set_property (GObject      *object,
367                                    guint         prop_id,
368                                    const GValue *value,
369                                    GParamSpec   *pspec)
370 {
371   /* Just ignore all attempts to set properties. */
372 }
373
374 static void
375 g_dummy_tls_database_class_init (GDummyTlsDatabaseClass *database_class)
376 {
377   GObjectClass *gobject_class = G_OBJECT_CLASS (database_class);
378
379   gobject_class->get_property = g_dummy_tls_database_get_property;
380   gobject_class->set_property = g_dummy_tls_database_set_property;
381
382   g_object_class_override_property (gobject_class, PROP_ANCHORS, "anchors");
383 }
384
385 static void
386 g_dummy_tls_database_init (GDummyTlsDatabase *database)
387 {
388 }
389
390 static void
391 g_dummy_tls_database_file_database_iface_init (GTlsFileDatabaseInterface  *iface)
392 {
393 }
394
395 static gboolean
396 g_dummy_tls_database_initable_init (GInitable       *initable,
397                                     GCancellable    *cancellable,
398                                     GError         **error)
399 {
400   g_set_error_literal (error, G_TLS_ERROR, G_TLS_ERROR_UNAVAILABLE,
401                        _("TLS support is not available"));
402   return FALSE;
403 }
404
405 static void
406 g_dummy_tls_database_initable_iface_init (GInitableIface  *iface)
407 {
408   iface->init = g_dummy_tls_database_initable_init;
409 }