1 /* GIO - GLib Input, Output and Streaming Library
3 * Copyright (C) 2011 Collabora Ltd.
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.
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.
15 * You should have received a copy of the GNU Lesser General
16 * Public License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 * Boston, MA 02111-1307, USA.
21 #include "gtesttlsbackend.h"
25 static GType
_g_test_tls_certificate_get_type (void);
26 static GType
_g_test_tls_connection_get_type (void);
28 struct _GTestTlsBackend
{
29 GObject parent_instance
;
32 static void g_test_tls_backend_iface_init (GTlsBackendInterface
*iface
);
34 #define g_test_tls_backend_get_type _g_test_tls_backend_get_type
35 G_DEFINE_TYPE_WITH_CODE (GTestTlsBackend
, g_test_tls_backend
, G_TYPE_OBJECT
,
36 G_IMPLEMENT_INTERFACE (G_TYPE_TLS_BACKEND
,
37 g_test_tls_backend_iface_init
)
38 g_io_extension_point_set_required_type (
39 g_io_extension_point_register (G_TLS_BACKEND_EXTENSION_POINT_NAME
),
41 g_io_extension_point_implement (G_TLS_BACKEND_EXTENSION_POINT_NAME
,
47 g_test_tls_backend_init (GTestTlsBackend
*backend
)
52 g_test_tls_backend_class_init (GTestTlsBackendClass
*backend_class
)
57 g_test_tls_backend_iface_init (GTlsBackendInterface
*iface
)
59 iface
->get_certificate_type
= _g_test_tls_certificate_get_type
;
60 iface
->get_client_connection_type
= _g_test_tls_connection_get_type
;
61 iface
->get_server_connection_type
= _g_test_tls_connection_get_type
;
64 /* Test certificate type */
66 typedef struct _GTestTlsCertificate GTestTlsCertificate
;
67 typedef struct _GTestTlsCertificateClass GTestTlsCertificateClass
;
69 struct _GTestTlsCertificate
{
70 GTlsCertificate parent_instance
;
75 struct _GTestTlsCertificateClass
{
76 GTlsCertificateClass parent_class
;
83 PROP_CERT_CERTIFICATE
,
84 PROP_CERT_CERTIFICATE_PEM
,
85 PROP_CERT_PRIVATE_KEY
,
86 PROP_CERT_PRIVATE_KEY_PEM
,
90 static void g_test_tls_certificate_initable_iface_init (GInitableIface
*iface
);
92 #define g_test_tls_certificate_get_type _g_test_tls_certificate_get_type
93 G_DEFINE_TYPE_WITH_CODE (GTestTlsCertificate
, g_test_tls_certificate
, G_TYPE_TLS_CERTIFICATE
,
94 G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE
,
95 g_test_tls_certificate_initable_iface_init
);)
98 g_test_tls_certificate_get_property (GObject
*object
,
103 GTestTlsCertificate
*cert
= (GTestTlsCertificate
*) object
;
107 case PROP_CERT_CERTIFICATE_PEM
:
108 g_value_set_string (value
, cert
->cert_pem
);
110 case PROP_CERT_PRIVATE_KEY_PEM
:
111 g_value_set_string (value
, cert
->key_pem
);
114 g_assert_not_reached ();
120 g_test_tls_certificate_set_property (GObject
*object
,
125 GTestTlsCertificate
*cert
= (GTestTlsCertificate
*) object
;
129 case PROP_CERT_CERTIFICATE_PEM
:
130 cert
->cert_pem
= g_value_dup_string (value
);
132 case PROP_CERT_PRIVATE_KEY_PEM
:
133 cert
->key_pem
= g_value_dup_string (value
);
135 case PROP_CERT_CERTIFICATE
:
136 case PROP_CERT_PRIVATE_KEY
:
137 case PROP_CERT_ISSUER
:
141 g_assert_not_reached ();
147 g_test_tls_certificate_finalize (GObject
*object
)
149 GTestTlsCertificate
*cert
= (GTestTlsCertificate
*) object
;
151 g_free (cert
->cert_pem
);
152 g_free (cert
->key_pem
);
156 g_test_tls_certificate_class_init (GTestTlsCertificateClass
*certificate_class
)
158 GObjectClass
*gobject_class
= G_OBJECT_CLASS (certificate_class
);
160 gobject_class
->get_property
= g_test_tls_certificate_get_property
;
161 gobject_class
->set_property
= g_test_tls_certificate_set_property
;
162 gobject_class
->finalize
= g_test_tls_certificate_finalize
;
164 g_object_class_override_property (gobject_class
, PROP_CERT_CERTIFICATE
, "certificate");
165 g_object_class_override_property (gobject_class
, PROP_CERT_CERTIFICATE_PEM
, "certificate-pem");
166 g_object_class_override_property (gobject_class
, PROP_CERT_PRIVATE_KEY
, "private-key");
167 g_object_class_override_property (gobject_class
, PROP_CERT_PRIVATE_KEY_PEM
, "private-key-pem");
168 g_object_class_override_property (gobject_class
, PROP_CERT_ISSUER
, "issuer");
172 g_test_tls_certificate_init (GTestTlsCertificate
*certificate
)
177 g_test_tls_certificate_initable_init (GInitable
*initable
,
178 GCancellable
*cancellable
,
185 g_test_tls_certificate_initable_iface_init (GInitableIface
*iface
)
187 iface
->init
= g_test_tls_certificate_initable_init
;
190 /* Dummy connection type; since GTlsClientConnection and
191 * GTlsServerConnection are just interfaces, we can implement them
192 * both on a single object.
195 typedef struct _GTestTlsConnection GTestTlsConnection
;
196 typedef struct _GTestTlsConnectionClass GTestTlsConnectionClass
;
198 struct _GTestTlsConnection
{
199 GTlsConnection parent_instance
;
202 struct _GTestTlsConnectionClass
{
203 GTlsConnectionClass parent_class
;
210 PROP_CONN_BASE_IO_STREAM
,
211 PROP_CONN_USE_SYSTEM_CERTDB
,
212 PROP_CONN_REQUIRE_CLOSE_NOTIFY
,
213 PROP_CONN_REHANDSHAKE_MODE
,
214 PROP_CONN_CERTIFICATE
,
215 PROP_CONN_PEER_CERTIFICATE
,
216 PROP_CONN_PEER_CERTIFICATE_ERRORS
,
217 PROP_CONN_VALIDATION_FLAGS
,
218 PROP_CONN_SERVER_IDENTITY
,
220 PROP_CONN_ACCEPTED_CAS
,
221 PROP_CONN_AUTHENTICATION_MODE
224 static void g_test_tls_connection_initable_iface_init (GInitableIface
*iface
);
226 #define g_test_tls_connection_get_type _g_test_tls_connection_get_type
227 G_DEFINE_TYPE_WITH_CODE (GTestTlsConnection
, g_test_tls_connection
, G_TYPE_TLS_CONNECTION
,
228 G_IMPLEMENT_INTERFACE (G_TYPE_TLS_CLIENT_CONNECTION
, NULL
);
229 G_IMPLEMENT_INTERFACE (G_TYPE_TLS_SERVER_CONNECTION
, NULL
);
230 G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE
,
231 g_test_tls_connection_initable_iface_init
);)
234 g_test_tls_connection_get_property (GObject
*object
,
242 g_test_tls_connection_set_property (GObject
*object
,
250 g_test_tls_connection_close (GIOStream
*stream
,
251 GCancellable
*cancellable
,
258 g_test_tls_connection_class_init (GTestTlsConnectionClass
*connection_class
)
260 GObjectClass
*gobject_class
= G_OBJECT_CLASS (connection_class
);
261 GIOStreamClass
*io_stream_class
= G_IO_STREAM_CLASS (connection_class
);
263 gobject_class
->get_property
= g_test_tls_connection_get_property
;
264 gobject_class
->set_property
= g_test_tls_connection_set_property
;
266 /* Need to override this because when initable_init fails it will
267 * dispose the connection, which will close it, which would
268 * otherwise try to close its input/output streams, which don't
271 io_stream_class
->close_fn
= g_test_tls_connection_close
;
273 g_object_class_override_property (gobject_class
, PROP_CONN_BASE_IO_STREAM
, "base-io-stream");
274 g_object_class_override_property (gobject_class
, PROP_CONN_USE_SYSTEM_CERTDB
, "use-system-certdb");
275 g_object_class_override_property (gobject_class
, PROP_CONN_REQUIRE_CLOSE_NOTIFY
, "require-close-notify");
276 g_object_class_override_property (gobject_class
, PROP_CONN_REHANDSHAKE_MODE
, "rehandshake-mode");
277 g_object_class_override_property (gobject_class
, PROP_CONN_CERTIFICATE
, "certificate");
278 g_object_class_override_property (gobject_class
, PROP_CONN_PEER_CERTIFICATE
, "peer-certificate");
279 g_object_class_override_property (gobject_class
, PROP_CONN_PEER_CERTIFICATE_ERRORS
, "peer-certificate-errors");
280 g_object_class_override_property (gobject_class
, PROP_CONN_VALIDATION_FLAGS
, "validation-flags");
281 g_object_class_override_property (gobject_class
, PROP_CONN_SERVER_IDENTITY
, "server-identity");
282 g_object_class_override_property (gobject_class
, PROP_CONN_USE_SSL3
, "use-ssl3");
283 g_object_class_override_property (gobject_class
, PROP_CONN_ACCEPTED_CAS
, "accepted-cas");
284 g_object_class_override_property (gobject_class
, PROP_CONN_AUTHENTICATION_MODE
, "authentication-mode");
288 g_test_tls_connection_init (GTestTlsConnection
*connection
)
293 g_test_tls_connection_initable_init (GInitable
*initable
,
294 GCancellable
*cancellable
,
297 g_set_error_literal (error
, G_TLS_ERROR
, G_TLS_ERROR_UNAVAILABLE
,
298 "TLS Connection support is not available");
303 g_test_tls_connection_initable_iface_init (GInitableIface
*iface
)
305 iface
->init
= g_test_tls_connection_initable_init
;
309 g_test_tls_connection_get_private_key_pem (GTlsCertificate
*cert
)
311 return ((GTestTlsCertificate
*)cert
)->key_pem
;