Branch data Line data Source code
1 : : /* GIO - GLib Input, Output and Streaming Library
2 : : *
3 : : * Copyright © 2010 Red Hat, Inc
4 : : * Copyright © 2015 Collabora, Ltd.
5 : : *
6 : : * SPDX-License-Identifier: LGPL-2.1-or-later
7 : : *
8 : : * This library is free software; you can redistribute it and/or
9 : : * modify it under the terms of the GNU Lesser General Public
10 : : * License as published by the Free Software Foundation; either
11 : : * version 2.1 of the License, or (at your option) any later version.
12 : : *
13 : : * This library is distributed in the hope that it will be useful,
14 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 : : * Lesser General Public License for more details.
17 : : *
18 : : * You should have received a copy of the GNU Lesser General
19 : : * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
20 : : */
21 : :
22 : : #include "config.h"
23 : : #include "glib.h"
24 : :
25 : : #include "gtlsbackend.h"
26 : : #include "gtlsdatabase.h"
27 : : #include "gdummytlsbackend.h"
28 : : #include "gioenumtypes.h"
29 : : #include "giomodule-priv.h"
30 : :
31 : : /**
32 : : * GTlsBackend:
33 : : *
34 : : * TLS (Transport Layer Security, aka SSL) and DTLS backend. This is an
35 : : * internal type used to coordinate the different classes implemented
36 : : * by a TLS backend.
37 : : *
38 : : * Since: 2.28
39 : : */
40 : :
41 : 336 : G_DEFINE_INTERFACE (GTlsBackend, g_tls_backend, G_TYPE_OBJECT)
42 : :
43 : : static GTlsDatabase *default_database;
44 : : G_LOCK_DEFINE_STATIC (default_database_lock);
45 : :
46 : : static void
47 : 5 : g_tls_backend_default_init (GTlsBackendInterface *iface)
48 : : {
49 : 5 : }
50 : :
51 : : static GTlsBackend *tls_backend_default_singleton = NULL; /* (owned) (atomic) */
52 : :
53 : : /**
54 : : * g_tls_backend_get_default:
55 : : *
56 : : * Gets the default #GTlsBackend for the system.
57 : : *
58 : : * Returns: (not nullable) (transfer none): a #GTlsBackend, which will be a
59 : : * dummy object if no TLS backend is available
60 : : *
61 : : * Since: 2.28
62 : : */
63 : : GTlsBackend *
64 : 30 : g_tls_backend_get_default (void)
65 : : {
66 : 30 : if (g_once_init_enter_pointer (&tls_backend_default_singleton))
67 : : {
68 : : GTlsBackend *singleton;
69 : :
70 : 3 : singleton = _g_io_module_get_default (G_TLS_BACKEND_EXTENSION_POINT_NAME,
71 : : "GIO_USE_TLS",
72 : : NULL);
73 : :
74 : 3 : g_once_init_leave_pointer (&tls_backend_default_singleton, singleton);
75 : : }
76 : :
77 : 30 : return tls_backend_default_singleton;
78 : : }
79 : :
80 : : /**
81 : : * g_tls_backend_supports_tls:
82 : : * @backend: the #GTlsBackend
83 : : *
84 : : * Checks if TLS is supported; if this returns %FALSE for the default
85 : : * #GTlsBackend, it means no "real" TLS backend is available.
86 : : *
87 : : * Returns: whether or not TLS is supported
88 : : *
89 : : * Since: 2.28
90 : : */
91 : : gboolean
92 : 0 : g_tls_backend_supports_tls (GTlsBackend *backend)
93 : : {
94 : 0 : if (G_TLS_BACKEND_GET_INTERFACE (backend)->supports_tls)
95 : 0 : return G_TLS_BACKEND_GET_INTERFACE (backend)->supports_tls (backend);
96 : 0 : else if (G_IS_DUMMY_TLS_BACKEND (backend))
97 : 0 : return FALSE;
98 : : else
99 : 0 : return TRUE;
100 : : }
101 : :
102 : : /**
103 : : * g_tls_backend_supports_dtls:
104 : : * @backend: the #GTlsBackend
105 : : *
106 : : * Checks if DTLS is supported. DTLS support may not be available even if TLS
107 : : * support is available, and vice-versa.
108 : : *
109 : : * Returns: whether DTLS is supported
110 : : *
111 : : * Since: 2.48
112 : : */
113 : : gboolean
114 : 0 : g_tls_backend_supports_dtls (GTlsBackend *backend)
115 : : {
116 : 0 : if (G_TLS_BACKEND_GET_INTERFACE (backend)->supports_dtls)
117 : 0 : return G_TLS_BACKEND_GET_INTERFACE (backend)->supports_dtls (backend);
118 : :
119 : 0 : return FALSE;
120 : : }
121 : :
122 : : /**
123 : : * g_tls_backend_get_default_database:
124 : : * @backend: the #GTlsBackend
125 : : *
126 : : * Gets the default #GTlsDatabase used to verify TLS connections.
127 : : *
128 : : * Returns: (transfer full): the default database, which should be
129 : : * unreffed when done.
130 : : *
131 : : * Since: 2.30
132 : : */
133 : : GTlsDatabase *
134 : 3 : g_tls_backend_get_default_database (GTlsBackend *backend)
135 : : {
136 : : GTlsDatabase *db;
137 : :
138 : 3 : g_return_val_if_fail (G_IS_TLS_BACKEND (backend), NULL);
139 : :
140 : : /* This method was added later, so accept the (remote) possibility it can be NULL */
141 : 3 : if (!G_TLS_BACKEND_GET_INTERFACE (backend)->get_default_database)
142 : 0 : return NULL;
143 : :
144 : 3 : G_LOCK (default_database_lock);
145 : :
146 : 3 : if (!default_database)
147 : 2 : default_database = G_TLS_BACKEND_GET_INTERFACE (backend)->get_default_database (backend);
148 : 3 : db = default_database ? g_object_ref (default_database) : NULL;
149 : 3 : G_UNLOCK (default_database_lock);
150 : :
151 : 3 : return db;
152 : : }
153 : :
154 : : /**
155 : : * g_tls_backend_set_default_database:
156 : : * @backend: the #GTlsBackend
157 : : * @database: (nullable): the #GTlsDatabase
158 : : *
159 : : * Set the default #GTlsDatabase used to verify TLS connections
160 : : *
161 : : * Any subsequent call to g_tls_backend_get_default_database() will return
162 : : * the database set in this call. Existing databases and connections are not
163 : : * modified.
164 : : *
165 : : * Setting a %NULL default database will reset to using the system default
166 : : * database as if g_tls_backend_set_default_database() had never been called.
167 : : *
168 : : * Since: 2.60
169 : : */
170 : : void
171 : 2 : g_tls_backend_set_default_database (GTlsBackend *backend,
172 : : GTlsDatabase *database)
173 : : {
174 : 2 : g_return_if_fail (G_IS_TLS_BACKEND (backend));
175 : 2 : g_return_if_fail (database == NULL || G_IS_TLS_DATABASE (database));
176 : :
177 : 2 : G_LOCK (default_database_lock);
178 : 2 : g_set_object (&default_database, database);
179 : 2 : G_UNLOCK (default_database_lock);
180 : : }
181 : :
182 : : /**
183 : : * g_tls_backend_get_certificate_type:
184 : : * @backend: the #GTlsBackend
185 : : *
186 : : * Gets the #GType of @backend's #GTlsCertificate implementation.
187 : : *
188 : : * Returns: the #GType of @backend's #GTlsCertificate
189 : : * implementation.
190 : : *
191 : : * Since: 2.28
192 : : */
193 : : GType
194 : 26 : g_tls_backend_get_certificate_type (GTlsBackend *backend)
195 : : {
196 : 26 : return G_TLS_BACKEND_GET_INTERFACE (backend)->get_certificate_type ();
197 : : }
198 : :
199 : : /**
200 : : * g_tls_backend_get_client_connection_type:
201 : : * @backend: the #GTlsBackend
202 : : *
203 : : * Gets the #GType of @backend's #GTlsClientConnection implementation.
204 : : *
205 : : * Returns: the #GType of @backend's #GTlsClientConnection
206 : : * implementation.
207 : : *
208 : : * Since: 2.28
209 : : */
210 : : GType
211 : 1 : g_tls_backend_get_client_connection_type (GTlsBackend *backend)
212 : : {
213 : 1 : return G_TLS_BACKEND_GET_INTERFACE (backend)->get_client_connection_type ();
214 : : }
215 : :
216 : : /**
217 : : * g_tls_backend_get_server_connection_type:
218 : : * @backend: the #GTlsBackend
219 : : *
220 : : * Gets the #GType of @backend's #GTlsServerConnection implementation.
221 : : *
222 : : * Returns: the #GType of @backend's #GTlsServerConnection
223 : : * implementation.
224 : : *
225 : : * Since: 2.28
226 : : */
227 : : GType
228 : 42 : g_tls_backend_get_server_connection_type (GTlsBackend *backend)
229 : : {
230 : 42 : return G_TLS_BACKEND_GET_INTERFACE (backend)->get_server_connection_type ();
231 : : }
232 : :
233 : : /**
234 : : * g_tls_backend_get_dtls_client_connection_type:
235 : : * @backend: the #GTlsBackend
236 : : *
237 : : * Gets the #GType of @backend’s #GDtlsClientConnection implementation.
238 : : *
239 : : * Returns: the #GType of @backend’s #GDtlsClientConnection
240 : : * implementation, or %G_TYPE_INVALID if this backend doesn’t support DTLS.
241 : : *
242 : : * Since: 2.48
243 : : */
244 : : GType
245 : 1 : g_tls_backend_get_dtls_client_connection_type (GTlsBackend *backend)
246 : : {
247 : : GTlsBackendInterface *iface;
248 : :
249 : 1 : g_return_val_if_fail (G_IS_TLS_BACKEND (backend), G_TYPE_INVALID);
250 : :
251 : 1 : iface = G_TLS_BACKEND_GET_INTERFACE (backend);
252 : 1 : if (iface->get_dtls_client_connection_type == NULL)
253 : 0 : return G_TYPE_INVALID;
254 : :
255 : 1 : return iface->get_dtls_client_connection_type ();
256 : : }
257 : :
258 : : /**
259 : : * g_tls_backend_get_dtls_server_connection_type:
260 : : * @backend: the #GTlsBackend
261 : : *
262 : : * Gets the #GType of @backend’s #GDtlsServerConnection implementation.
263 : : *
264 : : * Returns: the #GType of @backend’s #GDtlsServerConnection
265 : : * implementation, or %G_TYPE_INVALID if this backend doesn’t support DTLS.
266 : : *
267 : : * Since: 2.48
268 : : */
269 : : GType
270 : 0 : g_tls_backend_get_dtls_server_connection_type (GTlsBackend *backend)
271 : : {
272 : : GTlsBackendInterface *iface;
273 : :
274 : 0 : g_return_val_if_fail (G_IS_TLS_BACKEND (backend), G_TYPE_INVALID);
275 : :
276 : 0 : iface = G_TLS_BACKEND_GET_INTERFACE (backend);
277 : 0 : if (iface->get_dtls_server_connection_type == NULL)
278 : 0 : return G_TYPE_INVALID;
279 : :
280 : 0 : return iface->get_dtls_server_connection_type ();
281 : : }
282 : :
283 : : /**
284 : : * g_tls_backend_get_file_database_type:
285 : : * @backend: the #GTlsBackend
286 : : *
287 : : * Gets the #GType of @backend's #GTlsFileDatabase implementation.
288 : : *
289 : : * Returns: the #GType of backend's #GTlsFileDatabase implementation.
290 : : *
291 : : * Since: 2.30
292 : : */
293 : : GType
294 : 1 : g_tls_backend_get_file_database_type (GTlsBackend *backend)
295 : : {
296 : 1 : g_return_val_if_fail (G_IS_TLS_BACKEND (backend), 0);
297 : :
298 : : /* This method was added later, so accept the (remote) possibility it can be NULL */
299 : 1 : if (!G_TLS_BACKEND_GET_INTERFACE (backend)->get_file_database_type)
300 : 0 : return 0;
301 : :
302 : 1 : return G_TLS_BACKEND_GET_INTERFACE (backend)->get_file_database_type ();
303 : : }
|