summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Catanzaro <mcatanzaro@igalia.com>2019-04-07 16:57:36 -0500
committerMichael Catanzaro <mcatanzaro@posteo.net>2019-05-15 14:02:30 +0000
commit97a854b2a3ef83dc6b1837216c38099386183fe1 (patch)
treef8fb610fa312dd921a1ede8b1da138cea49140c4
parenta88a969a00a9cbf93cd43908e3f056dd32f4c580 (diff)
downloadglib-networking-97a854b2a3ef83dc6b1837216c38099386183fe1.tar.gz
gtlsbackend-openssl: use G_DECLARE_FINAL_TYPE
There's no reason for this to be derivable. It has one vfunc that is not needed because nothing inherits from it. (It used to be derivable for GnuTLS only to support the old GnuTLS PKCS#11 backend's separate GTlsDatabase.)
-rw-r--r--tls/openssl/gtlsbackend-openssl.c70
-rw-r--r--tls/openssl/gtlsbackend-openssl.h7
2 files changed, 49 insertions, 28 deletions
diff --git a/tls/openssl/gtlsbackend-openssl.c b/tls/openssl/gtlsbackend-openssl.c
index e6b8cd9..486dd1c 100644
--- a/tls/openssl/gtlsbackend-openssl.c
+++ b/tls/openssl/gtlsbackend-openssl.c
@@ -37,16 +37,17 @@
#include "gtlsclientconnection-openssl.h"
#include "gtlsfiledatabase-openssl.h"
-typedef struct _GTlsBackendOpensslPrivate
+struct _GTlsBackendOpenssl
{
+ GObject parent_instance;
+
GMutex mutex;
GTlsDatabase *default_database;
-} GTlsBackendOpensslPrivate;
+};
static void g_tls_backend_openssl_interface_init (GTlsBackendInterface *iface);
G_DEFINE_DYNAMIC_TYPE_EXTENDED (GTlsBackendOpenssl, g_tls_backend_openssl, G_TYPE_OBJECT, 0,
- G_ADD_PRIVATE_DYNAMIC (GTlsBackendOpenssl)
G_IMPLEMENT_INTERFACE_DYNAMIC (G_TYPE_TLS_BACKEND,
g_tls_backend_openssl_interface_init))
@@ -149,10 +150,6 @@ static GOnce openssl_inited = G_ONCE_INIT;
static void
g_tls_backend_openssl_init (GTlsBackendOpenssl *backend)
{
- GTlsBackendOpensslPrivate *priv;
-
- priv = g_tls_backend_openssl_get_instance_private (backend);
-
/* Once we call gtls_openssl_init(), we can't allow the module to be
* unloaded (since if openssl gets unloaded but gcrypt doesn't, then
* gcrypt will have dangling pointers to openssl's mutex functions).
@@ -162,7 +159,7 @@ g_tls_backend_openssl_init (GTlsBackendOpenssl *backend)
*/
g_once (&openssl_inited, gtls_openssl_init, NULL);
- g_mutex_init (&priv->mutex);
+ g_mutex_init (&backend->mutex);
}
static void
@@ -171,12 +168,9 @@ g_tls_backend_openssl_finalize (GObject *object)
int i;
GTlsBackendOpenssl *backend = G_TLS_BACKEND_OPENSSL (object);
- GTlsBackendOpensslPrivate *priv;
-
- priv = g_tls_backend_openssl_get_instance_private (backend);
- g_clear_object (&priv->default_database);
- g_mutex_clear (&priv->mutex);
+ g_clear_object (&backend->default_database);
+ g_mutex_clear (&backend->mutex);
CRYPTO_set_id_callback (NULL);
CRYPTO_set_locking_callback (NULL);
@@ -190,6 +184,41 @@ g_tls_backend_openssl_finalize (GObject *object)
G_OBJECT_CLASS (g_tls_backend_openssl_parent_class)->finalize (object);
}
+static GTlsDatabase *
+g_tls_backend_openssl_create_database (GTlsBackendOpenssl *self,
+ GError **error)
+{
+ gchar *anchor_file = NULL;
+ GTlsDatabase *database;
+
+#ifdef G_OS_WIN32
+ if (g_getenv ("G_TLS_OPENSSL_HANDLE_CERT_RELOCATABLE") != NULL)
+ {
+ gchar *module_dir;
+
+ module_dir = g_win32_get_package_installation_directory_of_module (NULL);
+ anchor_file = g_build_filename (module_dir, "bin", "cert.pem", NULL);
+ g_free (module_dir);
+ }
+#endif
+
+ if (anchor_file == NULL)
+ {
+ const gchar *openssl_cert_file;
+
+ openssl_cert_file = g_getenv (X509_get_default_cert_file_env ());
+ if (openssl_cert_file == NULL)
+ openssl_cert_file = X509_get_default_cert_file ();
+
+ anchor_file = g_strdup (openssl_cert_file);
+ }
+
+ database = g_tls_file_database_new (anchor_file, error);
+ g_free (anchor_file);
+
+ return database;
+}
+
static void
g_tls_backend_openssl_class_init (GTlsBackendOpensslClass *klass)
{
@@ -203,21 +232,18 @@ g_tls_backend_openssl_class_finalize (GTlsBackendOpensslClass *backend_class)
{
}
-static GTlsDatabase*
+static GTlsDatabase *
g_tls_backend_openssl_get_default_database (GTlsBackend *backend)
{
GTlsBackendOpenssl *openssl_backend = G_TLS_BACKEND_OPENSSL (backend);
- GTlsBackendOpensslPrivate *priv;
GTlsDatabase *result;
GError *error = NULL;
- priv = g_tls_backend_openssl_get_instance_private (openssl_backend);
-
- g_mutex_lock (&priv->mutex);
+ g_mutex_lock (&openssl_backend->mutex);
- if (priv->default_database)
+ if (openssl_backend->default_database)
{
- result = g_object_ref (priv->default_database);
+ result = g_object_ref (openssl_backend->default_database);
}
else
{
@@ -231,11 +257,11 @@ g_tls_backend_openssl_get_default_database (GTlsBackend *backend)
else
{
g_assert (result);
- priv->default_database = g_object_ref (result);
+ openssl_backend->default_database = g_object_ref (result);
}
}
- g_mutex_unlock (&priv->mutex);
+ g_mutex_unlock (&openssl_backend->mutex);
return result;
}
diff --git a/tls/openssl/gtlsbackend-openssl.h b/tls/openssl/gtlsbackend-openssl.h
index f34c5f8..557691f 100644
--- a/tls/openssl/gtlsbackend-openssl.h
+++ b/tls/openssl/gtlsbackend-openssl.h
@@ -31,13 +31,8 @@
G_BEGIN_DECLS
#define G_TYPE_TLS_BACKEND_OPENSSL (g_tls_backend_openssl_get_type ())
-G_DECLARE_DERIVABLE_TYPE (GTlsBackendOpenssl, g_tls_backend_openssl,
- G, TLS_BACKEND_OPENSSL, GObject)
-struct _GTlsBackendOpensslClass
-{
- GObjectClass parent_class;
-};
+G_DECLARE_FINAL_TYPE (GTlsBackendOpenssl, g_tls_backend_openssl, G, TLS_BACKEND_OPENSSL, GObject)
void g_tls_backend_openssl_register (GIOModule *module);