diff options
author | Lubomir Rintel <lkundrak@v3.sk> | 2017-02-22 18:43:53 +0100 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2017-03-19 21:06:16 +0100 |
commit | d370e12c77f89de1a68baf0415d1441cf371ed10 (patch) | |
tree | 85d0380d9b60081d9b610df91a3c01cdef716f9d | |
parent | 33c173281412e5ab0da70dd39257880c2a41f75b (diff) | |
download | network-manager-applet-d370e12c77f89de1a68baf0415d1441cf371ed10.tar.gz |
libnma: add a file certificate chooser
This is a simple certificate chooser that allows selecting the
certificate and key pair from plain files.
This one is available from libnm-gtk too, otherwise the cert chooser
interface alone would be useless.
-rw-r--r-- | Makefile.am | 17 | ||||
-rw-r--r-- | po/POTFILES.in | 1 | ||||
-rw-r--r-- | src/libnm-gtk/libnm-gtk.ver | 2 | ||||
-rw-r--r-- | src/libnma/nma-cert-chooser.c | 8 | ||||
-rw-r--r-- | src/libnma/nma-file-cert-chooser.c | 425 | ||||
-rw-r--r-- | src/libnma/nma-file-cert-chooser.h | 50 |
6 files changed, 497 insertions, 6 deletions
diff --git a/Makefile.am b/Makefile.am index 4a3505cc..fe3c7188 100644 --- a/Makefile.am +++ b/Makefile.am @@ -361,6 +361,7 @@ libnm_gtk_c_real = \ src/libnm-gtk/nm-mobile-providers.c \ src/libnm-gtk/nm-vpn-password-dialog.c \ src/libnma/nma-cert-chooser.c \ + src/libnma/nma-file-cert-chooser.c \ src/libnm-gtk/init.c src_libnm_gtk_libnmgtkdir = $(includedir)/libnm-gtk @@ -491,7 +492,11 @@ libnma_c_real = \ src/libnma/nma-vpn-password-dialog.c \ src/libnma/nma-ui-utils.c \ src/libnma/init.c \ - src/libnma/nma-cert-chooser.c + src/libnma/nma-cert-chooser.c \ + src/libnma/nma-file-cert-chooser.c + +libnma_h_priv_real = \ + src/libnma/nma-file-cert-chooser.h src_libnma_libnmadir = $(includedir)/libnma @@ -501,9 +506,11 @@ src_libnma_libnma_HEADERS = \ lib_LTLIBRARIES += src/libnma/libnma.la src_libnma_libnma_la_SOURCES = \ + $(libnma_h_priv_real) \ $(libnma_c_real) nodist_src_libnma_libnma_la_SOURCES = \ + $(libnma_h_priv_gen) \ $(libnma_c_gen) src_libnma_libnma_la_CFLAGS = \ @@ -529,8 +536,6 @@ src_libnma_libnma_la_LIBADD = \ $(LIBNM_LIBS) \ $(GUDEV_LIBS) -$(src_libnma_libnma_la_OBJECTS): $(libnma_h_priv_gen) - EXTRA_src_libnma_libnma_la_DEPENDENCIES = src/libnma/libnma.ver src_libnma_libnma_la_LDFLAGS = \ @@ -854,10 +859,12 @@ CFILE_GLOB = $(top_srcdir)/src/libnma/*.c IGNORE_HFILES = \ nma-resources.h \ - nma-version.h + nma-version.h \ + nma-file-cert-chooser.h mkdb_ignore_c_files = \ - nma-resources.c + nma-resources.c \ + nma-file-cert-chooser.c MKDB_OPTIONS = --ignore-files "$(IGNORE_HFILES) $(mkdb_ignore_c_files)" diff --git a/po/POTFILES.in b/po/POTFILES.in index b696c3ed..983b3ef9 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -75,6 +75,7 @@ src/connection-editor/vpn-helpers.c src/ethernet-dialog.c [type: gettext/glade]src/gsm-unlock.ui [type: gettext/glade]src/info.ui +src/libnma/nma-file-cert-chooser.c src/libnma/nma-mobile-providers.c src/libnma/nma-mobile-wizard.c src/libnma/nma-ui-utils.c diff --git a/src/libnm-gtk/libnm-gtk.ver b/src/libnm-gtk/libnm-gtk.ver index 2c5eaaef..6e9d3b19 100644 --- a/src/libnm-gtk/libnm-gtk.ver +++ b/src/libnm-gtk/libnm-gtk.ver @@ -39,4 +39,6 @@ global: nma_cert_chooser_update_cert_password_storage; nma_cert_chooser_update_key_password_storage; nma_cert_chooser_validate; +local: + nma_file_cert_chooser_*; } libnm_gtk_1_0_6; diff --git a/src/libnma/nma-cert-chooser.c b/src/libnma/nma-cert-chooser.c index b6e1f88c..272839b4 100644 --- a/src/libnma/nma-cert-chooser.c +++ b/src/libnma/nma-cert-chooser.c @@ -22,6 +22,7 @@ #include "nm-default.h" #include "nma-cert-chooser.h" +#include "nma-file-cert-chooser.h" /** * SECTION:nma-cert-chooser @@ -636,7 +637,12 @@ nma_cert_chooser_get_key_password_flags (NMACertChooser *cert_chooser) static GObject * constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties) { - g_return_val_if_reached (NULL); + if (type == NMA_TYPE_CERT_CHOOSER) + type = NMA_TYPE_FILE_CERT_CHOOSER; + + return G_OBJECT_CLASS (nma_cert_chooser_parent_class)->constructor (type, + n_construct_properties, + construct_properties); } static void diff --git a/src/libnma/nma-file-cert-chooser.c b/src/libnma/nma-file-cert-chooser.c new file mode 100644 index 00000000..4f53f07c --- /dev/null +++ b/src/libnma/nma-file-cert-chooser.c @@ -0,0 +1,425 @@ +/* NetworkManager Applet -- allow user control over networking + * + * Dan Williams <dcbw@redhat.com> + * Lubomir Rintel <lkundrak@v3.sk> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + * Copyright (C) 2015,2017 Red Hat, Inc. + */ + +#include "nm-default.h" +#include "nma-file-cert-chooser.h" +#ifdef LIBNM_BUILD +#include "nma-ui-utils.h" +#else +#include "nm-ui-utils.h" +#endif +#include "utils.h" + +typedef struct { + GtkWidget *key_button_label; + GtkWidget *key_password_label; + GtkWidget *cert_button_label; + GtkWidget *key_button; + GtkWidget *key_password; + GtkWidget *cert_button; + GtkWidget *show_password; +} NMAFileCertChooserPrivate; + +#define NMA_FILE_CERT_CHOOSER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ + NMA_TYPE_FILE_CERT_CHOOSER, \ + NMAFileCertChooserPrivate)) + +G_DEFINE_TYPE (NMAFileCertChooser, nma_file_cert_chooser, NMA_TYPE_CERT_CHOOSER) + +static void +set_key_password (NMACertChooser *cert_chooser, const gchar *password) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (cert_chooser); + + g_return_if_fail (priv->key_password != NULL); + gtk_entry_set_text (GTK_ENTRY (priv->key_password), password); +} + +static const gchar * +get_key_password (NMACertChooser *cert_chooser) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (cert_chooser); + + g_return_val_if_fail (priv->key_password != NULL, NULL); + return gtk_entry_get_text (GTK_ENTRY (priv->key_password)); +} + +static void +set_key_uri (NMACertChooser *cert_chooser, const gchar *uri) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (cert_chooser); + + if (uri) + gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (priv->key_button), uri); +} + +static gchar * +get_key_uri (NMACertChooser *cert_chooser) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (cert_chooser); + + return gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (priv->key_button)); +} + +static void +set_cert_uri (NMACertChooser *cert_chooser, const gchar *uri) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (cert_chooser); + + if (uri) + gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (priv->cert_button), uri); +} + +static gchar * +get_cert_uri (NMACertChooser *cert_chooser) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (cert_chooser); + + return gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (priv->cert_button)); +} + +static void +add_to_size_group (NMACertChooser *cert_chooser, GtkSizeGroup *group) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (cert_chooser); + + gtk_size_group_add_widget (group, priv->cert_button_label); + gtk_size_group_add_widget (group, priv->key_button_label); + gtk_size_group_add_widget (group, priv->key_password_label); +} + +static gboolean +validate (NMACertChooser *cert_chooser, GError **error) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (cert_chooser); + GError *local = NULL; + char *tmp; + + tmp = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (priv->cert_button)); + if (tmp) { + g_free (tmp); + } else { + g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("No certificate set")); + return FALSE; + } + + g_signal_emit_by_name (cert_chooser, "cert-validate", &local); + if (local) { + widget_set_error (priv->cert_button); + g_propagate_error (error, local); + return FALSE; + } else { + widget_unset_error (priv->cert_button); + } + + if (gtk_widget_get_visible (priv->key_button)) { + tmp = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (priv->key_button)); + if (tmp) { + g_free (tmp); + } else { + g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("No key set")); + return FALSE; + } + + g_signal_emit_by_name (cert_chooser, "key-validate", &local); + if (local) { + widget_set_error (priv->key_button); + g_propagate_error (error, local); + return FALSE; + } else { + widget_unset_error (priv->key_button); + } + + g_signal_emit_by_name (cert_chooser, "key-password-validate", &local); + if (local) { + widget_set_error (priv->key_password); + g_propagate_error (error, local); + return FALSE; + } else { + widget_unset_error (priv->key_password); + } + } + + return TRUE; +} + +static void +setup_key_password_storage (NMACertChooser *cert_chooser, + NMSettingSecretFlags initial_flags, + NMSetting *setting, + const char *password_flags_name, + gboolean with_not_required, + gboolean ask_mode) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (cert_chooser); + + nma_utils_setup_password_storage (priv->key_password, + initial_flags, + setting, + password_flags_name, + with_not_required, + ask_mode); +} + +static void +update_key_password_storage (NMACertChooser *cert_chooser, + NMSettingSecretFlags secret_flags, + NMSetting *setting, + const char *password_flags_name) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (cert_chooser); + + nma_utils_update_password_storage (priv->key_password, + secret_flags, + setting, + password_flags_name); +} + + +static NMSettingSecretFlags +get_key_password_flags (NMACertChooser *cert_chooser) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (cert_chooser); + + return nma_utils_menu_to_secret_flags (priv->key_password); +} + +static void +reset_filter (GtkWidget *widget, GParamSpec *spec, gpointer user_data) +{ + if (!gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (widget))) { + g_signal_handlers_block_by_func (widget, reset_filter, user_data); + gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (widget), GTK_FILE_FILTER (user_data)); + g_signal_handlers_unblock_by_func (widget, reset_filter, user_data); + } +} + +static void +cert_changed_cb (GtkFileChooserButton *file_chooser_button, gpointer user_data) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (user_data); + + if (gtk_widget_get_visible (priv->key_button)) { + gtk_widget_set_sensitive (priv->key_button, TRUE); + gtk_widget_set_sensitive (priv->key_button_label, TRUE); + } + g_signal_emit_by_name (user_data, "changed"); +} + +static void +key_changed_cb (GtkFileChooserButton *file_chooser_button, gpointer user_data) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (user_data); + + gtk_widget_set_sensitive (priv->key_password, TRUE); + gtk_widget_set_sensitive (priv->key_password_label, TRUE); + g_signal_emit_by_name (user_data, "changed"); +} + +static void +key_password_changed_cb (GtkEntry *entry, gpointer user_data) +{ + g_signal_emit_by_name (user_data, "changed"); +} + +static void +show_toggled_cb (GtkCheckButton *button, gpointer user_data) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (user_data); + + gtk_entry_set_visibility (GTK_ENTRY (priv->key_password), + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button))); +} + +static void +set_title (NMACertChooser *cert_chooser, const gchar *title) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (cert_chooser); + gchar *text; + + text = g_strdup_printf (_("Choose a key for %s Certificate"), title); + gtk_file_chooser_button_set_title (GTK_FILE_CHOOSER_BUTTON (priv->key_button), text); + g_free (text); + + text = g_strdup_printf (_("%s private _key:"), title); + gtk_label_set_text_with_mnemonic (GTK_LABEL (priv->key_button_label), text); + g_free (text); + + text = g_strdup_printf (_("%s key _password:"), title); + gtk_label_set_text_with_mnemonic (GTK_LABEL (priv->key_password_label), text); + g_free (text); + + text = g_strdup_printf (_("Choose %s Certificate"), title); + gtk_file_chooser_button_set_title (GTK_FILE_CHOOSER_BUTTON (priv->cert_button), text); + g_free (text); + + text = g_strdup_printf (_("%s _certificate:"), title); + gtk_label_set_text_with_mnemonic (GTK_LABEL (priv->cert_button_label), text); + g_free (text); +} + +static void +set_flags (NMACertChooser *cert_chooser, NMACertChooserFlags flags) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (cert_chooser); + + if (flags & NMA_CERT_CHOOSER_FLAG_CERT) { + gtk_widget_hide (priv->key_button); + gtk_widget_hide (priv->key_button_label); + gtk_widget_hide (priv->key_password); + gtk_widget_hide (priv->key_password_label); + gtk_widget_hide (priv->show_password); + } + + if (flags & NMA_CERT_CHOOSER_FLAG_PASSWORDS) { + gtk_widget_hide (priv->cert_button); + gtk_widget_hide (priv->cert_button_label); + gtk_widget_hide (priv->key_button); + gtk_widget_hide (priv->key_button_label); + } +} + +static void +nma_file_cert_chooser_class_init (NMAFileCertChooserClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + NMACertChooserClass *chooser_class = NMA_CERT_CHOOSER_CLASS (klass); + + g_type_class_add_private (object_class, sizeof (NMAFileCertChooserPrivate)); + + chooser_class->set_title = set_title; + chooser_class->set_flags = set_flags; + + chooser_class->set_cert_uri = set_cert_uri; + chooser_class->get_cert_uri = get_cert_uri; + chooser_class->set_key_uri = set_key_uri; + chooser_class->get_key_uri = get_key_uri; + chooser_class->set_key_password = set_key_password; + chooser_class->get_key_password = get_key_password; + + chooser_class->add_to_size_group = add_to_size_group; + chooser_class->validate = validate; + + chooser_class->setup_key_password_storage = setup_key_password_storage; + chooser_class->update_key_password_storage = update_key_password_storage; + chooser_class->get_key_password_flags = get_key_password_flags; +} + +static void +nma_file_cert_chooser_init (NMAFileCertChooser *file_cert_chooser) +{ + NMAFileCertChooserPrivate *priv = NMA_FILE_CERT_CHOOSER_GET_PRIVATE (file_cert_chooser); + GtkFileFilter *filter; + + gtk_grid_insert_column (GTK_GRID (file_cert_chooser), 2); + gtk_grid_set_row_spacing (GTK_GRID (file_cert_chooser), 6); + gtk_grid_set_column_spacing (GTK_GRID (file_cert_chooser), 12); + + /* The key chooser */ + gtk_grid_insert_row (GTK_GRID (file_cert_chooser), 0); + + priv->key_button = g_object_new (GTK_TYPE_FILE_CHOOSER_BUTTON, + "action", GTK_FILE_CHOOSER_ACTION_OPEN, + "filter", utils_key_filter (), + "local-only", TRUE, + NULL); + gtk_grid_attach (GTK_GRID (file_cert_chooser), priv->key_button, 1, 0, 1, 1); + gtk_widget_set_hexpand (priv->key_button, TRUE); + gtk_widget_set_sensitive (priv->key_button, FALSE); + gtk_widget_show (priv->key_button); + gtk_widget_set_no_show_all (priv->key_button, TRUE); + + g_signal_connect (priv->key_button, "selection-changed", + G_CALLBACK (key_changed_cb), file_cert_chooser); + + priv->key_button_label = gtk_label_new (NULL); + g_object_set (priv->key_button_label, "xalign", (gfloat) 0, NULL); + gtk_label_set_mnemonic_widget (GTK_LABEL (priv->key_button_label), priv->key_button); + gtk_grid_attach (GTK_GRID (file_cert_chooser), priv->key_button_label, 0, 0, 1, 1); + gtk_widget_set_sensitive (priv->key_button_label, FALSE); + gtk_widget_show (priv->key_button_label); + gtk_widget_set_no_show_all (priv->key_button_label, TRUE); + + /* The key password entry */ + gtk_grid_insert_row (GTK_GRID (file_cert_chooser), 1); + + priv->key_password = gtk_entry_new (); + gtk_entry_set_visibility (GTK_ENTRY (priv->key_password), FALSE); + gtk_grid_attach (GTK_GRID (file_cert_chooser), priv->key_password, 1, 1, 1, 1); + gtk_widget_set_hexpand (priv->key_password, TRUE); + gtk_widget_set_sensitive (priv->key_password, FALSE); + gtk_widget_show (priv->key_password); + gtk_widget_set_no_show_all (priv->key_password, TRUE); + + g_signal_connect (priv->key_password, "changed", + G_CALLBACK (key_password_changed_cb), file_cert_chooser); + + priv->key_password_label = gtk_label_new (NULL); + g_object_set (priv->key_password_label, "xalign", (gfloat) 0, NULL); + gtk_label_set_mnemonic_widget (GTK_LABEL (priv->key_password_label), priv->key_password); + gtk_grid_attach (GTK_GRID (file_cert_chooser), priv->key_password_label, 0, 1, 1, 1); + gtk_widget_set_sensitive (priv->key_password_label, FALSE); + gtk_widget_show (priv->key_password_label); + gtk_widget_set_no_show_all (priv->key_password_label, TRUE); + + /* Show password */ + gtk_grid_insert_row (GTK_GRID (file_cert_chooser), 2); + priv->show_password = gtk_check_button_new_with_mnemonic ("Sho_w password"); + gtk_grid_attach (GTK_GRID (file_cert_chooser), priv->show_password, 1, 2, 1, 1); + gtk_widget_show (priv->show_password); + gtk_widget_set_no_show_all (priv->show_password, TRUE); + g_signal_connect (priv->show_password, "toggled", + G_CALLBACK (show_toggled_cb), file_cert_chooser); + + /* The certificate chooser */ + gtk_grid_insert_row (GTK_GRID (file_cert_chooser), 0); + + filter = utils_cert_filter (); + priv->cert_button = g_object_new (GTK_TYPE_FILE_CHOOSER_BUTTON, + "action", GTK_FILE_CHOOSER_ACTION_OPEN, + "filter", filter, + "local-only", TRUE, + NULL); + gtk_grid_attach (GTK_GRID (file_cert_chooser), priv->cert_button, 1, 0, 1, 1); + gtk_widget_set_hexpand (priv->cert_button, TRUE); + gtk_widget_show (priv->cert_button); + gtk_widget_set_no_show_all (priv->cert_button, TRUE); + + /* For some reason, GTK+ calls set_current_filter (..., NULL) from + * gtkfilechooserdefault.c::show_and_select_files_finished_loading() on our + * dialog; so force-reset the filter to what we want it to be whenever + * it gets cleared. + */ + g_signal_connect (priv->cert_button, "notify::filter", + G_CALLBACK (reset_filter), filter); + + g_signal_connect (priv->cert_button, "selection-changed", + G_CALLBACK (cert_changed_cb), file_cert_chooser); + + priv->cert_button_label = gtk_label_new (NULL); + g_object_set (priv->cert_button_label, "xalign", (gfloat) 0, NULL); + gtk_label_set_mnemonic_widget (GTK_LABEL (priv->cert_button_label), priv->cert_button); + gtk_grid_attach (GTK_GRID (file_cert_chooser), priv->cert_button_label, 0, 0, 1, 1); + gtk_widget_show (priv->cert_button_label); + gtk_widget_set_no_show_all (priv->cert_button_label, TRUE); +} diff --git a/src/libnma/nma-file-cert-chooser.h b/src/libnma/nma-file-cert-chooser.h new file mode 100644 index 00000000..fb95650d --- /dev/null +++ b/src/libnma/nma-file-cert-chooser.h @@ -0,0 +1,50 @@ +/* NetworkManager Applet -- allow user control over networking + * + * Lubomir Rintel <lkundrak@v3.sk> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + * Copyright (C) 2015,2017 Red Hat, Inc. + */ + +#ifndef NMA_FILE_CERT_CHOOSER_H +#define NMA_FILE_CERT_CHOOSER_H + +#include <gtk/gtk.h> +#include "nma-cert-chooser.h" + +G_BEGIN_DECLS + +#define NMA_TYPE_FILE_CERT_CHOOSER (nma_file_cert_chooser_get_type ()) +#define NMA_FILE_CERT_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMA_TYPE_FILE_CERT_CHOOSER, NMAFileCertChooser)) +#define NMA_FILE_CERT_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMA_TYPE_FILE_CERT_CHOOSER, NMAFileCertChooserClass)) +#define NMA_IS_FILE_CERT_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMA_TYPE_FILE_CERT_CHOOSER)) +#define NMA_IS_FILE_CERT_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NMA_TYPE_FILE_CERT_CHOOSER)) +#define NMA_FILE_CERT_CHOOSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMA_TYPE_FILE_CERT_CHOOSER, NMAFileCertChooserClass)) + +typedef struct { + NMACertChooser parent; +} NMAFileCertChooser; + +typedef struct { + NMACertChooserClass parent_class; +} NMAFileCertChooserClass; + +GType nma_file_cert_chooser_get_type (void); + +G_END_DECLS + +#endif /* NMA_FILE_CERT_CHOOSER_H */ |