[Pkg-xfce-commits] r2209 - in goodies/thunar-volman/debian: . patches
corsac at alioth.debian.org
corsac at alioth.debian.org
Wed Aug 13 20:59:53 UTC 2008
Author: corsac
Date: 2008-08-13 20:59:52 +0000 (Wed, 13 Aug 2008)
New Revision: 2209
Modified:
goodies/thunar-volman/debian/changelog
goodies/thunar-volman/debian/patches/02_encrypted-volumes.patch
Log:
enable luks partitions support
Modified: goodies/thunar-volman/debian/changelog
===================================================================
--- goodies/thunar-volman/debian/changelog 2008-08-12 19:47:41 UTC (rev 2208)
+++ goodies/thunar-volman/debian/changelog 2008-08-13 20:59:52 UTC (rev 2209)
@@ -1,4 +1,4 @@
-thunar-volman (0.2.0-3) unstable; urgency=low
+thunar-volman (0.2.0-3) UNRELEASED; urgency=low
* debian/patches:
- 02_encrypted-volumes added, add support for mounting encrypted volumes.
@@ -8,10 +8,8 @@
* debian/control:
- update standards version to 3.8.0, no change needed.
- update build deps on exo with luks support.
-
-WARNING: this version requires a exo with luks support, not yet uploaded.
- -- Yves-Alexis Perez <corsac at debian.org> Mon, 09 Jun 2008 17:42:35 +0200
+ -- Yves-Alexis Perez <corsac at debian.org> Tue, 12 Aug 2008 22:01:58 +0200
thunar-volman (0.2.0-2) unstable; urgency=low
Modified: goodies/thunar-volman/debian/patches/02_encrypted-volumes.patch
===================================================================
--- goodies/thunar-volman/debian/patches/02_encrypted-volumes.patch 2008-08-12 19:47:41 UTC (rev 2208)
+++ goodies/thunar-volman/debian/patches/02_encrypted-volumes.patch 2008-08-13 20:59:52 UTC (rev 2209)
@@ -1,3 +1,838 @@
+Index: thunar-volman/tvm-camera-device.h
+===================================================================
+--- thunar-volman/tvm-camera-device.h (revision 4898)
++++ thunar-volman/tvm-camera-device.h (working copy)
+@@ -22,7 +22,7 @@
+
+ #include <thunar-volman/tvm-device.h>
+
+-G_BEGIN_DECLS;
++G_BEGIN_DECLS
+
+ gboolean tvm_camera_device_added (TvmPreferences *preferences,
+ LibHalContext *context,
+@@ -30,6 +30,6 @@
+ const gchar *capability,
+ GError **error) G_GNUC_INTERNAL;
+
+-G_END_DECLS;
++G_END_DECLS
+
+ #endif /* !__TVM_CAMERA_DEVICE_H__ */
+Index: thunar-volman/tvm-block-device.h
+===================================================================
+--- thunar-volman/tvm-block-device.h (revision 4898)
++++ thunar-volman/tvm-block-device.h (working copy)
+@@ -22,7 +22,7 @@
+
+ #include <thunar-volman/tvm-device.h>
+
+-G_BEGIN_DECLS;
++G_BEGIN_DECLS
+
+ gboolean tvm_block_device_added (TvmPreferences *preferences,
+ LibHalContext *context,
+@@ -30,6 +30,6 @@
+ const gchar *capability,
+ GError **error) G_GNUC_INTERNAL;
+
+-G_END_DECLS;
++G_END_DECLS
+
+ #endif /* !__TVM_BLOCK_DEVICE_H__ */
+Index: thunar-volman/tvm-input-device.h
+===================================================================
+--- thunar-volman/tvm-input-device.h (revision 4898)
++++ thunar-volman/tvm-input-device.h (working copy)
+@@ -22,7 +22,7 @@
+
+ #include <thunar-volman/tvm-device.h>
+
+-G_BEGIN_DECLS;
++G_BEGIN_DECLS
+
+ gboolean tvm_input_device_added (TvmPreferences *preferences,
+ LibHalContext *context,
+@@ -30,6 +30,6 @@
+ const gchar *capability,
+ GError **error) G_GNUC_INTERNAL;
+
+-G_END_DECLS;
++G_END_DECLS
+
+ #endif /* !__TVM_INPUT_DEVICE_H__ */
+Index: thunar-volman/tvm-preferences-dialog.h
+===================================================================
+--- thunar-volman/tvm-preferences-dialog.h (revision 4898)
++++ thunar-volman/tvm-preferences-dialog.h (working copy)
+@@ -22,7 +22,7 @@
+
+ #include <thunar-volman/tvm-preferences.h>
+
+-G_BEGIN_DECLS;
++G_BEGIN_DECLS
+
+ typedef struct _TvmPreferencesDialogClass TvmPreferencesDialogClass;
+ typedef struct _TvmPreferencesDialog TvmPreferencesDialog;
+@@ -38,6 +38,6 @@
+
+ GtkWidget *tvm_preferences_dialog_new (void) G_GNUC_INTERNAL G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
+
+-G_END_DECLS;
++G_END_DECLS
+
+ #endif /* !__TVM_PREFERENCES_DIALOG_H__ */
+Index: thunar-volman/tvm-device.h
+===================================================================
+--- thunar-volman/tvm-device.h (revision 4898)
++++ thunar-volman/tvm-device.h (working copy)
+@@ -26,7 +26,7 @@
+
+ #include <thunar-volman/tvm-preferences.h>
+
+-G_BEGIN_DECLS;
++G_BEGIN_DECLS
+
+ /**
+ * TvmDeviceCallback:
+@@ -53,6 +53,6 @@
+ const gchar *udi,
+ GError **error) G_GNUC_INTERNAL;
+
+-G_END_DECLS;
++G_END_DECLS
+
+ #endif /* !__TVM_DEVICE_H__ */
+Index: thunar-volman/tvm-pda-device.h
+===================================================================
+--- thunar-volman/tvm-pda-device.h (revision 4898)
++++ thunar-volman/tvm-pda-device.h (working copy)
+@@ -22,7 +22,7 @@
+
+ #include <thunar-volman/tvm-device.h>
+
+-G_BEGIN_DECLS;
++G_BEGIN_DECLS
+
+ gboolean tvm_pda_device_added (TvmPreferences *preferences,
+ LibHalContext *context,
+@@ -30,6 +30,6 @@
+ const gchar *capability,
+ GError **error) G_GNUC_INTERNAL;
+
+-G_END_DECLS;
++G_END_DECLS
+
+ #endif /* !__TVM_PDA_DEVICE_H__ */
+Index: thunar-volman/tvm-command-entry.h
+===================================================================
+--- thunar-volman/tvm-command-entry.h (revision 4898)
++++ thunar-volman/tvm-command-entry.h (working copy)
+@@ -22,7 +22,7 @@
+
+ #include <exo/exo.h>
+
+-G_BEGIN_DECLS;
++G_BEGIN_DECLS
+
+ typedef struct _TvmCommandEntryClass TvmCommandEntryClass;
+ typedef struct _TvmCommandEntry TvmCommandEntry;
+@@ -56,6 +56,6 @@
+ void tvm_command_entry_set_command (TvmCommandEntry *command_entry,
+ const gchar *command) G_GNUC_INTERNAL;
+
+-G_END_DECLS;
++G_END_DECLS
+
+ #endif /* !__TVM_COMMAND_ENTRY_H__ */
+Index: thunar-volman/xfce-heading.h
+===================================================================
+--- thunar-volman/xfce-heading.h (revision 4898)
++++ thunar-volman/xfce-heading.h (working copy)
+@@ -23,7 +23,7 @@
+
+ #include <gtk/gtk.h>
+
+-G_BEGIN_DECLS;
++G_BEGIN_DECLS
+
+ typedef struct _XfceHeadingPrivate XfceHeadingPrivate;
+ typedef struct _XfceHeadingClass XfceHeadingClass;
+@@ -77,6 +77,6 @@
+ void xfce_heading_set_title (XfceHeading *heading,
+ const gchar *title);
+
+-G_END_DECLS;
++G_END_DECLS
+
+ #endif /* !__XFCE_HEADING_H__ */
+Index: thunar-volman/tvm-crypto-volume.c
+===================================================================
+--- thunar-volman/tvm-crypto-volume.c (revision 0)
++++ thunar-volman/tvm-crypto-volume.c (revision 0)
+@@ -0,0 +1,483 @@
++/* $Id$ */
++/*-
++ * Copyright (c) 2008 Benedikt Meurer <benny at xfce.org>.
++ * Copyright (c) 2008 Colin Leroy <colin at colino.net>.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the Free
++ * Software Foundation; either version 2 of the License, or (at your option)
++ * any later version.
++ *
++ * This program 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 General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place, Suite 330, Boston, MA 02111-1307 USA
++ */
++
++#ifdef HAVE_CONFIG_H
++#include <config.h>
++#endif
++
++#ifdef HAVE_SYS_TYPES_H
++#include <sys/types.h>
++#endif
++#ifdef HAVE_SYS_STAT_H
++#include <sys/stat.h>
++#endif
++#ifdef HAVE_SYS_WAIT_H
++#include <sys/wait.h>
++#endif
++
++#ifdef HAVE_MEMORY_H
++#include <memory.h>
++#endif
++#include <stdio.h>
++#ifdef HAVE_STRING_H
++#include <string.h>
++#endif
++#include <errno.h>
++
++#include <dbus/dbus-glib-lowlevel.h>
++#include <thunar-volman/tvm-block-device.h>
++#include <thunar-volman/tvm-crypto-volume.h>
++#include <libhal-storage.h>
++
++static void
++tvm_crypto_volume_prompt_update_text (GtkEditable *editable,
++ gchar *new_text,
++ gint new_text_len,
++ gint *position,
++ gpointer data)
++{
++ gchar **response = (gchar **)data;
++ if (response == NULL)
++ return;
++ g_free(*response);
++ *response = gtk_editable_get_chars(editable, 0, -1);
++}
++
++typedef struct _CryptoDialogValidate {
++ GtkWidget *dialog;
++ gint response;
++} CryptoDialogValidate;
++
++void
++tvm_crypto_volume_prompt_validate_text (GtkEntry *entry,
++ gpointer data)
++{
++ CryptoDialogValidate *validate_data = (CryptoDialogValidate *)data;
++ gtk_dialog_response(GTK_DIALOG(validate_data->dialog), validate_data->response);
++}
++
++static void
++tvm_crypto_volume_hal_device_removed (LibHalContext *context,
++ const gchar *udi)
++{
++ const gchar *dialog_udi;
++ GtkWidget *dialog = libhal_ctx_get_user_data (context);
++
++ /* check if the active UDI of the dialog was removed */
++ dialog_udi = g_object_get_data (G_OBJECT (dialog), "udi");
++ if (exo_str_is_equal (dialog_udi, udi))
++ {
++ /* cancel the dialog */
++ gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
++ }
++}
++
++ /**
++ * tvm_crypto_volume_ask_password:
++ * @context : a #LibHalContext.
++ * @udi : the UDI of the device being added, which is watched for removal.
++ * @icon : the icon or %NULL.
++ * @title : the prompt title.
++ * @response_text : the response text.
++ * @visible : whether text typed should be visible.
++ * @default_response : Which response to return on Enter.
++ * @primary_text : the primary prompt text.
++ * @secondary_text : the secondary prompt text.
++ * @first_button_text : the first button text.
++ * @... : %NULL-terminated list of button text, response id pairs.
++ *
++ * Return value: the selected response.
++ **/
++static gint
++tvm_crypto_volume_ask_password (LibHalContext *context,
++ const gchar *udi,
++ const gchar *icon,
++ const gchar *title,
++ gchar **response_text,
++ gboolean visible,
++ gint default_response,
++ const gchar *primary_text,
++ const gchar *secondary_text,
++ const gchar *first_button_text,
++ ...)
++{
++ GtkWidget *dialog;
++ GtkWidget *image;
++ GtkWidget *label;
++ GtkWidget *hbox;
++ GtkWidget *vbox;
++ GtkWidget *entry;
++ DBusError derror;
++ va_list args;
++ gint response;
++ CryptoDialogValidate validate_data;
++
++ g_return_val_if_fail (exo_hal_udi_validate (udi, -1, NULL), 0);
++ g_return_val_if_fail (context != NULL, GTK_RESPONSE_CANCEL);
++
++ /* allocate a new dialog */
++ dialog = gtk_dialog_new ();
++ gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
++ gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
++ g_object_set_data_full (G_OBJECT (dialog), "udi", g_strdup (udi), g_free);
++ gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 6);
++ gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), 12);
++
++ /* setup the specified title */
++ if (G_LIKELY (title != NULL))
++ gtk_window_set_title (GTK_WINDOW (dialog), title);
++
++ /* setup the specified buttons */
++ if (G_LIKELY (first_button_text != NULL))
++ {
++ va_start (args, first_button_text);
++ for (response = va_arg (args, gint); first_button_text != NULL; )
++ {
++ /* insert the button */
++ gtk_dialog_add_button (GTK_DIALOG (dialog), first_button_text, response);
++ first_button_text = va_arg (args, const gchar *);
++ if (G_UNLIKELY (first_button_text == NULL))
++ break;
++ response = va_arg (args, gint);
++ }
++ va_end (args);
++ }
++
++ /* setup the hbox */
++ hbox = gtk_hbox_new (FALSE, 12);
++ gtk_container_set_border_width (GTK_CONTAINER (hbox), 12);
++ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, TRUE, TRUE, 0);
++ gtk_widget_show (hbox);
++
++ /* setup the specified icon */
++ if (G_LIKELY (icon != NULL))
++ {
++ /* setup an image for the icon */
++ image = gtk_image_new_from_icon_name (icon, GTK_ICON_SIZE_DIALOG);
++ gtk_misc_set_alignment (GTK_MISC (image), 0.0f, 0.0f);
++ gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
++ gtk_widget_show (image);
++ }
++
++ /* setup the vbox */
++ vbox = gtk_vbox_new (FALSE, 0);
++ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
++ gtk_widget_show (vbox);
++ g_object_set_data(G_OBJECT(dialog), "main_vbox", vbox);
++
++ /* setup the primary text */
++ label = gtk_label_new (primary_text);
++ gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
++ gtk_misc_set_alignment (GTK_MISC (label), 0.0f, 0.5f);
++ gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
++ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
++ gtk_widget_show (label);
++
++ /* setup the secondary text */
++ if (G_LIKELY (secondary_text != NULL))
++ {
++ label = gtk_label_new (secondary_text);
++ gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
++ gtk_misc_set_alignment (GTK_MISC (label), 0.0f, 0.5f);
++ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
++ gtk_widget_show (label);
++ g_object_set_data(G_OBJECT(dialog), "secondary_text", label);
++ }
++
++ entry = gtk_entry_new();
++ gtk_entry_set_visibility(GTK_ENTRY(entry), visible);
++ gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
++ gtk_widget_show (entry);
++ g_object_set_data(G_OBJECT(dialog), "pass_entry", entry);
++
++ /* initialize D-Bus error */
++ dbus_error_init (&derror);
++
++ /* setup HAL to watch the UDI for removal */
++ libhal_ctx_set_user_data (context, dialog);
++ libhal_ctx_set_device_removed (context, tvm_crypto_volume_hal_device_removed);
++ libhal_device_property_watch_all (context, &derror);
++
++ /* setup handler for the entered text */
++ if (response_text)
++ *response_text = NULL;
++ g_signal_connect_after(G_OBJECT(entry), "insert-text",
++ G_CALLBACK(tvm_crypto_volume_prompt_update_text),
++ (gpointer) response_text);
++ validate_data.dialog = dialog;
++ validate_data.response = default_response;
++ g_signal_connect(G_OBJECT(entry), "activate",
++ G_CALLBACK(tvm_crypto_volume_prompt_validate_text),
++ (gpointer) &validate_data);
++
++ /* run the dialog */
++ response = gtk_dialog_run (GTK_DIALOG (dialog));
++ gtk_widget_destroy(dialog);
++
++ /* cleanup */
++ libhal_ctx_set_device_removed (context, NULL);
++ libhal_ctx_set_user_data (context, NULL);
++ dbus_error_free (&derror);
++
++ return response;
++}
++
++static gboolean
++progress_pulse(gpointer data)
++{
++ GtkProgressBar *progress = GTK_PROGRESS_BAR(data);
++ g_return_val_if_fail(progress != NULL, FALSE);
++
++ gtk_progress_bar_pulse(progress);
++
++ return TRUE;
++}
++
++static void
++tvm_crypto_volume_dbus_call_done (DBusPendingCall *call,
++ void *user_data)
++{
++ gtk_main_quit();
++}
++
++static gchar *
++tvm_crypto_volume_mount_install_crypto_volume (LibHalContext *context,
++ const gchar *udi,
++ LibHalVolume *volume,
++ const gchar *password,
++ gboolean *pass_error,
++ GError **error)
++{
++ gchar *plain_udi = NULL;
++ DBusMessage *message = NULL;
++ DBusMessage *result = NULL;
++ DBusConnection *dbus_connection = NULL;
++ DBusPendingCall *call = NULL;
++ DBusError derror;
++ dbus_bool_t send_err;
++ *pass_error = FALSE;
++ GtkWidget *window = NULL;
++ GtkWidget *label, *vbox, *hbox;
++ GtkWidget *wait_progress;
++ GtkWidget *image;
++ guint animator_id;
++ g_clear_error(error);
++
++ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
++ gtk_container_set_border_width(GTK_CONTAINER(window), 8);
++ gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
++ gtk_window_set_title(GTK_WINDOW(window), _("Encrypted volume"));
++ gtk_window_set_modal(GTK_WINDOW(window), TRUE);
++ gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
++
++ vbox = gtk_vbox_new(FALSE, 6);
++ hbox = gtk_hbox_new(FALSE, 6);
++ image = gtk_image_new_from_icon_name ("gtk-dialog-authentication", GTK_ICON_SIZE_DIALOG);
++ gtk_misc_set_alignment (GTK_MISC (image), 0.0f, 0.0f);
++ gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
++ gtk_widget_show (image);
++
++ label = gtk_label_new(_("<span weight=\"bold\" size=\"larger\">Mounting encrypted volume...</span>"));
++ gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
++ gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
++ gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, FALSE, 0);
++
++ label = gtk_label_new(_("Setting up the crypto layer..."));
++ gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
++ gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, FALSE, 0);
++
++ wait_progress = gtk_progress_bar_new();
++ gtk_box_pack_start(GTK_BOX(vbox), wait_progress, TRUE, FALSE, 0);
++
++ gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
++
++ gtk_container_add(GTK_CONTAINER(window), hbox);
++ gtk_widget_show_all(hbox);
++ animator_id = g_timeout_add(100, progress_pulse, wait_progress);
++
++ gtk_widget_show_now(window);
++
++ message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
++ "org.freedesktop.Hal.Device.Volume.Crypto",
++ "Setup");
++
++ if (G_UNLIKELY (message == NULL))
++ {
++ /* out of memory */
++oom: g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOMEM, g_strerror (ENOMEM));
++ goto out;
++ }
++
++ if (!dbus_message_append_args (message,
++ DBUS_TYPE_STRING, &password,
++ DBUS_TYPE_INVALID)) {
++ dbus_message_unref (message);
++ goto oom;
++ }
++
++ dbus_error_init (&derror);
++
++ dbus_connection = dbus_bus_get (DBUS_BUS_SYSTEM, &derror);
++ if (G_UNLIKELY (dbus_connection == NULL))
++ {
++ /* propagate the error */
++ dbus_set_g_error (error, &derror);
++ goto out;
++ }
++
++ send_err = dbus_connection_send_with_reply (dbus_connection, message, &call, -1);
++ if (G_UNLIKELY (send_err == FALSE))
++ {
++ /* release the result */
++ dbus_message_unref (message);
++ goto out;
++ }
++
++ dbus_pending_call_set_notify(call, tvm_crypto_volume_dbus_call_done, NULL, NULL);
++ gtk_main();
++
++ result = dbus_pending_call_steal_reply(call);
++ /* release the message */
++ dbus_message_unref (message);
++
++ /* release the connection */
++ dbus_connection_unref (dbus_connection);
++
++ if (G_UNLIKELY (dbus_set_error_from_message(&derror, result)))
++ {
++ /* try to translate the error appropriately */
++ if (strcmp (derror.name, "org.freedesktop.Hal.Device.Volume.PermissionDenied") == 0)
++ {
++ /* TRANSLATORS: The user tried to setup a crypto layer (LUKS-encrpyted volume) but got Permission denied. */
++ g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("You are not privileged to setup the crypto layer"));
++ }
++ else if (strcmp (derror.name, "org.freedesktop.Hal.Device.Volume.Crypto.SetupPasswordError") == 0)
++ {
++ /* TRANSLATORS: The user tried to setup a crypto layer (LUKS-encrpyted volume) and typed the wrong password. */
++ g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("Wrong password"));
++ *pass_error = TRUE;
++ }
++ else
++ {
++ /* no precise error message, use the HAL one */
++ dbus_set_g_error (error, &derror);
++ }
++
++ /* release the DBus error */
++ dbus_error_free (&derror);
++ dbus_message_unref (result);
++ plain_udi = NULL;
++ goto out;
++ }
++ else
++ {
++ dbus_message_unref (result);
++ plain_udi = libhal_volume_crypto_get_clear_volume_udi (context, volume);
++ }
++
++out:
++ g_source_remove(animator_id);
++ gtk_widget_destroy(window);
++ return plain_udi;
++}
++
++/**
++ * tvm_crypto_volume_setup:
++ * @preferences : a #TvmPreferences.
++ * @context : a #LibHalContext.
++ * @udi : the HAL volume UDI of the newly added crypto volume.
++ * @error : return location for errors or %NULL.
++ *
++ * Tries to setup the crypto layer for the volume with the
++ * specified @udi.
++ *
++ * Return value: %TRUE if handled, %FALSE if not handled or an
++ * unrecoverable error occurred.
++ */
++gboolean
++tvm_crypto_volume_setup (TvmPreferences *preferences,
++ LibHalContext *context,
++ const gchar *udi,
++ GError **error)
++{
++ gchar *password = NULL;
++ gboolean pass_error = FALSE;
++ gint num_tries = 0;
++ gchar *plain_udi = NULL;
++ LibHalVolume *volume = NULL;
++ gboolean result = FALSE;
++
++ g_return_val_if_fail (exo_hal_udi_validate (udi, -1, NULL), FALSE);
++ g_return_val_if_fail (TVM_IS_PREFERENCES (preferences), FALSE);
++ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
++ g_return_val_if_fail (context != NULL, FALSE);
++
++ volume = libhal_volume_from_udi (context, udi);
++ g_return_val_if_fail(volume != NULL, FALSE);
++ plain_udi = libhal_volume_crypto_get_clear_volume_udi (context, volume);
++ if (plain_udi != NULL) {
++ libhal_volume_free(volume);
++ libhal_free_string(plain_udi);
++ return TRUE;
++ }
++
++ for (num_tries = 0; num_tries < 3; num_tries++) {
++ gint response,len;
++ response = tvm_crypto_volume_ask_password (context, udi, "gtk-dialog-authentication", _("Encrypted volume"),
++ &password, FALSE, GTK_RESPONSE_OK,
++ pass_error? _("<span weight=\"bold\" size=\"larger\">Wrong password.</span>")
++ :_("<span weight=\"bold\" size=\"larger\">This volume is encrypted.</span>"),
++ _("Please enter your password to decrypt and mount the volume."),
++ _("Ig_nore"), GTK_RESPONSE_CANCEL,
++ _("_Mount"), GTK_RESPONSE_OK,
++ NULL);
++ if (response == GTK_RESPONSE_CANCEL || response == GTK_RESPONSE_DELETE_EVENT) {
++ g_clear_error(error);
++ num_tries = 3;
++ } else if (password) {
++ plain_udi = tvm_crypto_volume_mount_install_crypto_volume(context, udi, volume, password, &pass_error, error);
++ }
++ if (password) {
++ len = strlen(password);
++ memset(password, 0, len);
++ g_debug("zeroed password %p", password);
++ g_free(password);
++ }
++ if (*error != NULL && !pass_error) {
++ /* display an error message to the user (exo-mount won't do it as it won't see the clear device */
++ GtkWidget *message = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
++ GTK_MESSAGE_ERROR,
++ GTK_BUTTONS_CLOSE,
++ "%s.", _("Failed to setup the encrypted volume"));
++ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (message), "%s.", (*error)->message);
++ gtk_dialog_run (GTK_DIALOG (message));
++ gtk_widget_destroy (message);
++ break;
++ }
++ if (plain_udi != NULL) {
++ libhal_free_string(plain_udi);
++ result = TRUE;
++ break;
++ }
++ }
++ return result;
++}
++
++
+Index: thunar-volman/tvm-printer-device.h
+===================================================================
+--- thunar-volman/tvm-printer-device.h (revision 4898)
++++ thunar-volman/tvm-printer-device.h (working copy)
+@@ -22,7 +22,7 @@
+
+ #include <thunar-volman/tvm-device.h>
+
+-G_BEGIN_DECLS;
++G_BEGIN_DECLS
+
+ gboolean tvm_printer_device_added (TvmPreferences *preferences,
+ LibHalContext *context,
+@@ -30,6 +30,6 @@
+ const gchar *capability,
+ GError **error) G_GNUC_INTERNAL;
+
+-G_END_DECLS;
++G_END_DECLS
+
+ #endif /* !__TVM_PRINTER_DEVICE_H__ */
+Index: thunar-volman/tvm-crypto-volume.h
+===================================================================
+--- thunar-volman/tvm-crypto-volume.h (revision 0)
++++ thunar-volman/tvm-crypto-volume.h (revision 0)
+@@ -0,0 +1,35 @@
++/* $Id$ */
++/*-
++ * Copyright (c) 2008 Benedikt Meurer <benny at xfce.org>.
++ * Copyright (c) 2008 Colin Leroy <colin at colino.net>.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the Free
++ * Software Foundation; either version 2 of the License, or (at your option)
++ * any later version.
++ *
++ * This program 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 General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place, Suite 330, Boston, MA 02111-1307 USA
++ */
++
++#ifndef __TVM_CRYPTO_VOLUME_H__
++#define __TVM_CRYPTO_VOLUME_H__
++
++#include <thunar-volman/tvm-device.h>
++
++G_BEGIN_DECLS
++
++gboolean tvm_crypto_volume_setup (TvmPreferences *preferences,
++ LibHalContext *context,
++ const gchar *udi,
++ GError **error) G_GNUC_INTERNAL;
++
++G_END_DECLS
++
++#endif /* !__TVM_CRYPTO_VOLUME_H__ */
+Index: thunar-volman/xfce-titled-dialog.h
+===================================================================
+--- thunar-volman/xfce-titled-dialog.h (revision 4898)
++++ thunar-volman/xfce-titled-dialog.h (working copy)
+@@ -23,7 +23,7 @@
+
+ #include <gtk/gtk.h>
+
+-G_BEGIN_DECLS;
++G_BEGIN_DECLS
+
+ typedef struct _XfceTitledDialogPrivate XfceTitledDialogPrivate;
+ typedef struct _XfceTitledDialogClass XfceTitledDialogClass;
+@@ -70,6 +70,6 @@
+ void xfce_titled_dialog_set_subtitle (XfceTitledDialog *titled_dialog,
+ const gchar *subtitle);
+
+-G_END_DECLS;
++G_END_DECLS
+
+ #endif /* !__XFCE_TITLED_DIALOG_H__ */
+Index: thunar-volman/tvm-preferences.h
+===================================================================
+--- thunar-volman/tvm-preferences.h (revision 4898)
++++ thunar-volman/tvm-preferences.h (working copy)
+@@ -22,7 +22,7 @@
+
+ #include <exo/exo.h>
+
+-G_BEGIN_DECLS;
++G_BEGIN_DECLS
+
+ typedef struct _TvmPreferencesClass TvmPreferencesClass;
+ typedef struct _TvmPreferences TvmPreferences;
+@@ -38,6 +38,6 @@
+
+ TvmPreferences *tvm_preferences_get (void);
+
+-G_END_DECLS;
++G_END_DECLS
+
+ #endif /* !__TVM_PREFERENCES_H__ */
+Index: thunar-volman/tvm-pango-extensions.h
+===================================================================
+--- thunar-volman/tvm-pango-extensions.h (revision 4898)
++++ thunar-volman/tvm-pango-extensions.h (working copy)
+@@ -22,7 +22,7 @@
+
+ #include <pango/pango.h>
+
+-G_BEGIN_DECLS;
++G_BEGIN_DECLS
+
+ PangoAttrList *tvm_pango_attr_list_big (void) G_GNUC_CONST G_GNUC_INTERNAL;
+ PangoAttrList *tvm_pango_attr_list_big_bold (void) G_GNUC_CONST G_GNUC_INTERNAL;
+@@ -31,6 +31,6 @@
+ PangoAttrList *tvm_pango_attr_list_small_italic (void) G_GNUC_CONST G_GNUC_INTERNAL;
+ PangoAttrList *tvm_pango_attr_list_underline_single (void) G_GNUC_CONST G_GNUC_INTERNAL;
+
+-G_END_DECLS;
++G_END_DECLS
+
+ #endif /* !__TVM_PANGO_EXTENSIONS_H__ */
+Index: thunar-volman/tvm-run.h
+===================================================================
+--- thunar-volman/tvm-run.h (revision 4898)
++++ thunar-volman/tvm-run.h (working copy)
+@@ -22,7 +22,7 @@
+
+ #include <thunar-volman/tvm-device.h>
+
+-G_BEGIN_DECLS;
++G_BEGIN_DECLS
+
+ gboolean tvm_run_cdburner (TvmPreferences *preferences,
+ LibHalContext *context,
+@@ -41,6 +41,6 @@
+ const gchar *mount_point,
+ GError **error) G_GNUC_INTERNAL;
+
+-G_END_DECLS;
++G_END_DECLS
+
+ #endif /* !__TVM_RUN_H__ */
+Index: thunar-volman/Makefile.am
+===================================================================
+--- thunar-volman/Makefile.am (revision 4898)
++++ thunar-volman/Makefile.am (working copy)
+@@ -21,6 +21,8 @@
+ tvm-camera-device.h \
+ tvm-command-entry.c \
+ tvm-command-entry.h \
++ tvm-crypto-volume.c \
++ tvm-crypto-volume.h \
+ tvm-device.c \
+ tvm-device.h \
+ tvm-input-device.c \
+Index: thunar-volman/tvm-prompt.h
+===================================================================
+--- thunar-volman/tvm-prompt.h (revision 4898)
++++ thunar-volman/tvm-prompt.h (working copy)
+@@ -22,7 +22,7 @@
+
+ #include <thunar-volman/tvm-device.h>
+
+-G_BEGIN_DECLS;
++G_BEGIN_DECLS
+
+ enum
+ {
+@@ -46,6 +46,6 @@
+ const gchar *first_button_text,
+ ...) G_GNUC_INTERNAL G_GNUC_NULL_TERMINATED;
+
+-G_END_DECLS;
++G_END_DECLS
+
+ #endif /* !__TVM_PROMPT_H__ */
Index: thunar-volman/tvm-block-device.c
===================================================================
--- thunar-volman/tvm-block-device.c (revision 4898)
@@ -2,11 +837,129 @@
+++ thunar-volman/tvm-block-device.c (working copy)
-@@ -752,6 +752,9 @@
- /* make sure the volume has a mountable filesystem */
+@@ -1,6 +1,6 @@
+ /* $Id$ */
+ /*-
+- * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>.
++ * Copyright (c) 2007-2008 Benedikt Meurer <benny at xfce.org>.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+@@ -42,6 +42,7 @@
+ #include <dbus/dbus-glib-lowlevel.h>
+
+ #include <thunar-volman/tvm-block-device.h>
++#include <thunar-volman/tvm-crypto-volume.h>
+ #include <thunar-volman/tvm-prompt.h>
+ #include <thunar-volman/tvm-run.h>
+
+@@ -609,6 +610,7 @@
+ gboolean autoplay;
+ gboolean is_cdrom;
+ gboolean has_filesystem;
++ gboolean has_crypto;
+ gchar *storage_udi;
+ gchar *drive_type;
+ gchar *fsusage;
+@@ -749,20 +751,30 @@
+ libhal_free_string (storage_udi);
+ }
+
+- /* make sure the volume has a mountable filesystem */
++ /* determine the file system usage of the volume */
fsusage = libhal_device_get_property_string (context, udi, "volume.fsusage", NULL);
- has_filesystem = (G_LIKELY (fsusage && strcmp (fsusage, "filesystem") == 0));
-+ if (!has_filesystem) {
-+ has_filesystem = (G_LIKELY (fsusage && strcmp (fsusage, "crypto") == 0));
-+ }
+- has_filesystem = (G_LIKELY (fsusage && strcmp (fsusage, "filesystem") == 0));
++ has_crypto = (G_UNLIKELY (fsusage != NULL && strcmp (fsusage, "crypto") == 0));
++ has_filesystem = (G_LIKELY (fsusage != NULL && strcmp (fsusage, "filesystem") == 0));
libhal_free_string (fsusage);
- if (G_UNLIKELY (!has_filesystem))
- return FALSE;
+- if (G_UNLIKELY (!has_filesystem))
+- return FALSE;
+
+- /* check if we should automount drives, otherwise, we're done here */
+- g_object_get (G_OBJECT (preferences), "automount-drives", &automount, NULL);
+- if (G_UNLIKELY (!automount))
+- return FALSE;
++ /* check if we have a crypto volume to setup here */
++ if (G_UNLIKELY (has_crypto))
++ {
++ /* try to setup the crypto volume */
++ return tvm_crypto_volume_setup (preferences, context, udi, error);
++ }
++ else if (G_LIKELY (has_filesystem))
++ {
++ /* check if we should automount drives, otherwise, we're done here */
++ g_object_get (G_OBJECT (preferences), "automount-drives", &automount, NULL);
++ if (G_UNLIKELY (!automount))
++ return FALSE;
+
+- /* try to mount the block device */
+- return tvm_block_device_mount (preferences, context, udi, error);
++ /* try to mount the block device */
++ return tvm_block_device_mount (preferences, context, udi, error);
++ }
++
++ return FALSE;
+ }
+
+
+diff --git a/thunar-volman/Makefile.in b/thunar-volman/Makefile.in
+index 722921a..5107ef8 100644
+--- thunar-volman/Makefile.in
++++ thunar-volman/Makefile.in
+@@ -52,6 +52,7 @@ am_thunar_volman_OBJECTS = thunar_volman-main.$(OBJEXT) \
+ thunar_volman-tvm-block-device.$(OBJEXT) \
+ thunar_volman-tvm-camera-device.$(OBJEXT) \
+ thunar_volman-tvm-command-entry.$(OBJEXT) \
++ thunar_volman-tvm-crypto-volume.$(OBJEXT) \
+ thunar_volman-tvm-device.$(OBJEXT) \
+ thunar_volman-tvm-input-device.$(OBJEXT) \
+ thunar_volman-tvm-pango-extensions.$(OBJEXT) \
+@@ -282,6 +283,8 @@ thunar_volman_SOURCES = \
+ tvm-camera-device.h \
+ tvm-command-entry.c \
+ tvm-command-entry.h \
++ tvm-crypto-volume.c \
++ tvm-crypto-volume.h \
+ tvm-device.c \
+ tvm-device.h \
+ tvm-input-device.c \
+@@ -397,6 +400,7 @@ distclean-compile:
+ @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/thunar_volman-tvm-block-device.Po at am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/thunar_volman-tvm-camera-device.Po at am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/thunar_volman-tvm-command-entry.Po at am__quote@
++ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/thunar_volman-tvm-crypto-volume.Po at am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/thunar_volman-tvm-device.Po at am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/thunar_volman-tvm-input-device.Po at am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/thunar_volman-tvm-pango-extensions.Po at am__quote@
+@@ -486,6 +490,33 @@ thunar_volman-tvm-command-entry.obj: tvm-command-entry.c
+ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thunar_volman_CFLAGS) $(CFLAGS) -c -o thunar_volman-tvm-command-entry.obj `if test -f 'tvm-command-entry.c'; then $(CYGPATH_W) 'tvm-command-entry.c'; else $(CYGPATH_W) '$(srcdir)/tvm-command-entry.c'; fi`
+
++thunar_volman-tvm-crypto-volume.o: tvm-crypto-volume.c
++ at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thunar_volman_CFLAGS) $(CFLAGS) -MT thunar_volman-tvm-crypto-volume.o -MD -MP -MF $(DEPDIR)/thunar_volman-tvm-crypto-volume.Tpo -c -o thunar_volman-tvm-crypto-volume.o `test -f 'tvm-crypto-volume.c' || echo '$(srcdir)/'`tvm-crypto-volume.c
++ at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/thunar_volman-tvm-crypto-volume.Tpo $(DEPDIR)/thunar_volman-tvm-crypto-volume.Po
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvm-crypto-volume.c' object='thunar_volman-tvm-crypto-volume.o' libtool=no @AMDEPBACKSLASH@
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++ at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thunar_volman_CFLAGS) $(CFLAGS) -c -o thunar_volman-tvm-crypto-volume.o `test -f 'tvm-crypto-volume.c' || echo '$(srcdir)/'`tvm-crypto-volume.c
++
++thunar_volman-tvm-crypto-volume.obj: tvm-crypto-volume.c
++ at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thunar_volman_CFLAGS) $(CFLAGS) -MT thunar_volman-tvm-crypto-volume.obj -MD -MP -MF $(DEPDIR)/thunar_volman-tvm-crypto-volume.Tpo -c -o thunar_volman-tvm-crypto-volume.obj `if test -f 'tvm-crypto-volume.c'; then $(CYGPATH_W) 'tvm-crypto-volume.c'; else $(CYGPATH_W) '$(srcdir)/tvm-crypto-volume.c'; fi`
++ at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/thunar_volman-tvm-crypto-volume.Tpo $(DEPDIR)/thunar_volman-tvm-crypto-volume.Po
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvm-crypto-volume.c' object='thunar_volman-tvm-crypto-volume.obj' libtool=no @AMDEPBACKSLASH@
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++ at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thunar_volman_CFLAGS) $(CFLAGS) -c -o thunar_volman-tvm-crypto-volume.obj `if test -f 'tvm-crypto-volume.c'; then $(CYGPATH_W) 'tvm-crypto-volume.c'; else $(CYGPATH_W) '$(srcdir)/tvm-crypto-volume.c'; fi`
++thunar_volman-tvm-crypto-volume.o: tvm-crypto-volume.c
++ at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thunar_volman_CFLAGS) $(CFLAGS) -MT thunar_volman-tvm-crypto-volume.o -MD -MP -MF $(DEPDIR)/thunar_volman-tvm-crypto-volume.Tpo -c -o thunar_volman-tvm-crypto-volume.o `test -f 'tvm-crypto-volume.c' || echo '$(srcdir)/'`tvm-crypto-volume.c
++ at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/thunar_volman-tvm-crypto-volume.Tpo $(DEPDIR)/thunar_volman-tvm-crypto-volume.Po
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvm-crypto-volume.c' object='thunar_volman-tvm-crypto-volume.o' libtool=no @AMDEPBACKSLASH@
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++ at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thunar_volman_CFLAGS) $(CFLAGS) -c -o thunar_volman-tvm-crypto-volume.o `test -f 'tvm-crypto-volume.c' || echo '$(srcdir)/'`tvm-crypto-volume.c
++
++thunar_volman-tvm-crypto-volume.obj: tvm-crypto-volume.c
++ at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thunar_volman_CFLAGS) $(CFLAGS) -MT thunar_volman-tvm-crypto-volume.obj -MD -MP -MF $(DEPDIR)/thunar_volman-tvm-crypto-volume.Tpo -c -o thunar_volman-tvm-crypto-volume.obj `if test -f 'tvm-crypto-volume.c'; then $(CYGPATH_W) 'tvm-crypto-volume.c'; else $(CYGPATH_W) '$(srcdir)/tvm-crypto-volume.c'; fi`
++ at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/thunar_volman-tvm-crypto-volume.Tpo $(DEPDIR)/thunar_volman-tvm-crypto-volume.Po
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvm-crypto-volume.c' object='thunar_volman-tvm-crypto-volume.obj' libtool=no @AMDEPBACKSLASH@
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++ at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thunar_volman_CFLAGS) $(CFLAGS) -c -o thunar_volman-tvm-crypto-volume.obj `if test -f 'tvm-crypto-volume.c'; then $(CYGPATH_W) 'tvm-crypto-volume.c'; else $(CYGPATH_W) '$(srcdir)/tvm-crypto-volume.c'; fi`
++
+ thunar_volman-tvm-device.o: tvm-device.c
+ @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thunar_volman_CFLAGS) $(CFLAGS) -MT thunar_volman-tvm-device.o -MD -MP -MF $(DEPDIR)/thunar_volman-tvm-device.Tpo -c -o thunar_volman-tvm-device.o `test -f 'tvm-device.c' || echo '$(srcdir)/'`tvm-device.c
+ @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/thunar_volman-tvm-device.Tpo $(DEPDIR)/thunar_volman-tvm-device.Po
More information about the Pkg-xfce-commits
mailing list