|
Packit |
b00eeb |
/*
|
|
Packit |
b00eeb |
* gnome-keyring
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Copyright (C) 2008 Stefan Walter
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
b00eeb |
* it under the terms of the GNU Lesser General Public License as
|
|
Packit |
b00eeb |
* published by the Free Software Foundation; either version 2.1 of
|
|
Packit |
b00eeb |
* the License, or (at your option) any later version.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* This program is distributed in the hope that it will be useful, but
|
|
Packit |
b00eeb |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
b00eeb |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
b00eeb |
* Lesser General Public License for more details.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
b00eeb |
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
#include "config.h"
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
#include "gcr/gcr-import-interaction.h"
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
#include "gcr-dialog-util.h"
|
|
Packit |
b00eeb |
#include "gcr-pkcs11-import-interaction.h"
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
#include <glib/gi18n-lib.h>
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
#define GCR_PKCS11_IMPORT_INTERACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_PKCS11_IMPORT_INTERACTION, GcrPkcs11ImportInteractionClass))
|
|
Packit |
b00eeb |
#define GCR_IS_PKCS11_IMPORT_INTERACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_PKCS11_IMPORT_INTERACTION))
|
|
Packit |
b00eeb |
#define GCR_PKCS11_IMPORT_INTERACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_PKCS11_IMPORT_INTERACTION, GcrPkcs11ImportInteractionClass))
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
enum {
|
|
Packit |
b00eeb |
PROP_0,
|
|
Packit |
b00eeb |
PROP_PARENT_WINDOW
|
|
Packit |
b00eeb |
};
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
typedef struct _GcrPkcs11ImportInteractionClass GcrPkcs11ImportInteractionClass;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
struct _GcrPkcs11ImportInteraction {
|
|
Packit |
b00eeb |
GTlsInteraction parent;
|
|
Packit |
b00eeb |
gboolean supplemented;
|
|
Packit |
b00eeb |
GtkWindow *parent_window;
|
|
Packit |
b00eeb |
GcrPkcs11ImportDialog *dialog;
|
|
Packit |
b00eeb |
};
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
struct _GcrPkcs11ImportInteractionClass {
|
|
Packit |
b00eeb |
GTlsInteractionClass parent_class;
|
|
Packit |
b00eeb |
};
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void _gcr_pkcs11_import_interaction_iface_init (GcrImportInteractionIface *iface);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
G_DEFINE_TYPE_WITH_CODE(GcrPkcs11ImportInteraction, _gcr_pkcs11_import_interaction, G_TYPE_TLS_INTERACTION,
|
|
Packit |
b00eeb |
G_IMPLEMENT_INTERFACE (GCR_TYPE_IMPORT_INTERACTION, _gcr_pkcs11_import_interaction_iface_init));
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_interaction_init (GcrPkcs11ImportInteraction *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
self->dialog = _gcr_pkcs11_import_dialog_new (self->parent_window);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_interaction_dispose (GObject *obj)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (obj);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_clear_object (&self->dialog);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
G_OBJECT_CLASS (_gcr_pkcs11_import_interaction_parent_class)->dispose (obj);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_interaction_set_property (GObject *obj,
|
|
Packit |
b00eeb |
guint prop_id,
|
|
Packit |
b00eeb |
const GValue *value,
|
|
Packit |
b00eeb |
GParamSpec *pspec)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (obj);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
switch (prop_id) {
|
|
Packit |
b00eeb |
case PROP_PARENT_WINDOW:
|
|
Packit |
b00eeb |
gtk_window_set_transient_for (GTK_WINDOW (self->dialog),
|
|
Packit |
b00eeb |
g_value_get_object (value));
|
|
Packit |
b00eeb |
break;
|
|
Packit |
b00eeb |
default:
|
|
Packit |
b00eeb |
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
|
|
Packit |
b00eeb |
break;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_interaction_get_property (GObject *obj,
|
|
Packit |
b00eeb |
guint prop_id,
|
|
Packit |
b00eeb |
GValue *value,
|
|
Packit |
b00eeb |
GParamSpec *pspec)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (obj);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
switch (prop_id) {
|
|
Packit |
b00eeb |
case PROP_PARENT_WINDOW:
|
|
Packit |
b00eeb |
g_value_set_object (value, gtk_window_get_transient_for (GTK_WINDOW (self->dialog)));
|
|
Packit |
b00eeb |
break;
|
|
Packit |
b00eeb |
default:
|
|
Packit |
b00eeb |
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
|
|
Packit |
b00eeb |
break;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static GTlsInteractionResult
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_interaction_ask_password (GTlsInteraction *interaction,
|
|
Packit |
b00eeb |
GTlsPassword *password,
|
|
Packit |
b00eeb |
GCancellable *cancellable,
|
|
Packit |
b00eeb |
GError **error)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
self->supplemented = TRUE;
|
|
Packit |
b00eeb |
return _gcr_pkcs11_import_dialog_run_ask_password (self->dialog, password, cancellable, error);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_interaction_supplement_prep (GcrImportInteraction *interaction,
|
|
Packit |
b00eeb |
GckBuilder *builder)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
self->supplemented = FALSE;
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_dialog_set_supplements (self->dialog, builder);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static GTlsInteractionResult
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_interaction_supplement (GcrImportInteraction *interaction,
|
|
Packit |
b00eeb |
GckBuilder *builder,
|
|
Packit |
b00eeb |
GCancellable *cancellable,
|
|
Packit |
b00eeb |
GError **error)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
if (self->supplemented)
|
|
Packit |
b00eeb |
return G_TLS_INTERACTION_HANDLED;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
self->supplemented = TRUE;
|
|
Packit |
b00eeb |
if (_gcr_pkcs11_import_dialog_run (self->dialog)) {
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_dialog_get_supplements (self->dialog, builder);
|
|
Packit |
b00eeb |
return G_TLS_INTERACTION_HANDLED;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
} else {
|
|
Packit |
b00eeb |
g_set_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED, _("The user cancelled the operation"));
|
|
Packit |
b00eeb |
return G_TLS_INTERACTION_FAILED;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
on_dialog_run_async (GObject *source,
|
|
Packit |
b00eeb |
GAsyncResult *result,
|
|
Packit |
b00eeb |
gpointer user_data)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
|
|
Packit |
b00eeb |
GckBuilder *builder = g_simple_async_result_get_op_res_gpointer (res);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
if (_gcr_pkcs11_import_dialog_run_finish (GCR_PKCS11_IMPORT_DIALOG (source), result)) {
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_dialog_get_supplements (GCR_PKCS11_IMPORT_DIALOG (source), builder);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
} else {
|
|
Packit |
b00eeb |
g_simple_async_result_set_error (res, G_IO_ERROR, G_IO_ERROR_CANCELLED,
|
|
Packit |
b00eeb |
_("The user cancelled the operation"));
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_simple_async_result_complete (res);
|
|
Packit |
b00eeb |
g_object_unref (res);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_interaction_supplement_async (GcrImportInteraction *interaction,
|
|
Packit |
b00eeb |
GckBuilder *builder,
|
|
Packit |
b00eeb |
GCancellable *cancellable,
|
|
Packit |
b00eeb |
GAsyncReadyCallback callback,
|
|
Packit |
b00eeb |
gpointer user_data)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction);
|
|
Packit |
b00eeb |
GSimpleAsyncResult *res;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_if_fail (self->dialog != NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
res = g_simple_async_result_new (G_OBJECT (interaction), callback, user_data,
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_interaction_supplement_async);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/* If dialog was already shown, then short circuit */
|
|
Packit |
b00eeb |
if (self->supplemented) {
|
|
Packit |
b00eeb |
g_simple_async_result_complete_in_idle (res);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
} else {
|
|
Packit |
b00eeb |
self->supplemented = TRUE;
|
|
Packit |
b00eeb |
g_simple_async_result_set_op_res_gpointer (res, gck_builder_ref (builder),
|
|
Packit |
b00eeb |
(GDestroyNotify)gck_builder_unref);
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_dialog_run_async (self->dialog, cancellable,
|
|
Packit |
b00eeb |
on_dialog_run_async, g_object_ref (res));
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_object_unref (res);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static GTlsInteractionResult
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_interaction_supplement_finish (GcrImportInteraction *interaction,
|
|
Packit |
b00eeb |
GAsyncResult *result,
|
|
Packit |
b00eeb |
GError **error)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED);
|
|
Packit |
b00eeb |
g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (interaction),
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_interaction_supplement_async), G_TLS_INTERACTION_UNHANDLED);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
|
|
Packit |
b00eeb |
return G_TLS_INTERACTION_FAILED;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return G_TLS_INTERACTION_HANDLED;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_interaction_iface_init (GcrImportInteractionIface *iface)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
iface->supplement_prep = _gcr_pkcs11_import_interaction_supplement_prep;
|
|
Packit |
b00eeb |
iface->supplement = _gcr_pkcs11_import_interaction_supplement;
|
|
Packit |
b00eeb |
iface->supplement_async = _gcr_pkcs11_import_interaction_supplement_async;
|
|
Packit |
b00eeb |
iface->supplement_finish = _gcr_pkcs11_import_interaction_supplement_finish;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_interaction_class_init (GcrPkcs11ImportInteractionClass *klass)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
Packit |
b00eeb |
GTlsInteractionClass *interaction_class = G_TLS_INTERACTION_CLASS (klass);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
gobject_class->dispose = _gcr_pkcs11_import_interaction_dispose;
|
|
Packit |
b00eeb |
gobject_class->set_property = _gcr_pkcs11_import_interaction_set_property;
|
|
Packit |
b00eeb |
gobject_class->get_property = _gcr_pkcs11_import_interaction_get_property;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
interaction_class->ask_password = _gcr_pkcs11_import_interaction_ask_password;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_object_class_install_property (gobject_class, PROP_PARENT_WINDOW,
|
|
Packit |
b00eeb |
g_param_spec_object ("parent-window", "Parent Window", "Prompt Parent Window",
|
|
Packit |
b00eeb |
GTK_TYPE_WINDOW, G_PARAM_READWRITE));
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
GTlsInteraction *
|
|
Packit |
b00eeb |
_gcr_pkcs11_import_interaction_new (GtkWindow *parent_window)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
g_return_val_if_fail (parent_window == NULL || GTK_IS_WINDOW (parent_window), NULL);
|
|
Packit |
b00eeb |
return g_object_new (GCR_TYPE_PKCS11_IMPORT_INTERACTION,
|
|
Packit |
b00eeb |
"parent-window", parent_window,
|
|
Packit |
b00eeb |
NULL);
|
|
Packit |
b00eeb |
}
|