summaryrefslogtreecommitdiffstats
path: root/opensuse/tdebase/media-teardown_crypto.diff
diff options
context:
space:
mode:
Diffstat (limited to 'opensuse/tdebase/media-teardown_crypto.diff')
-rw-r--r--opensuse/tdebase/media-teardown_crypto.diff175
1 files changed, 175 insertions, 0 deletions
diff --git a/opensuse/tdebase/media-teardown_crypto.diff b/opensuse/tdebase/media-teardown_crypto.diff
new file mode 100644
index 000000000..f713cffc7
--- /dev/null
+++ b/opensuse/tdebase/media-teardown_crypto.diff
@@ -0,0 +1,175 @@
+Index: kioslave/media/mediamanager/halbackend.cpp
+===================================================================
+--- kioslave/media/mediamanager/halbackend.cpp.orig 2011-05-31 13:41:55.000000000 +0200
++++ kioslave/media/mediamanager/halbackend.cpp 2011-05-31 13:42:48.317334543 +0200
+@@ -1379,4 +1379,54 @@ QString HALBackend::unmount(const QStrin
+ return QString();
+ }
+
++bool HALBackend::teardown(const QString &_udi)
++{
++ const char* dm_udi = _udi.latin1();
++ const QString blockudi = libhal_device_get_property_QString(m_halContext, dm_udi, "volume.crypto_luks.clear.backing_volume");
++ if (!blockudi.isEmpty()) {
++ const char* udi = blockudi.latin1();
++ DBusMessage *dmesg, *reply;
++ DBusError error;
++ const char *options[2];
++
++ kdDebug() << "tearDown " << udi << "..." << endl;
++
++ dbus_error_init(&error);
++ DBusConnection *dbus_connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
++ if (dbus_error_is_set(&error))
++ {
++ dbus_error_free(&error);
++ return false;
++ }
++
++ if (!(dmesg = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
++ "org.freedesktop.Hal.Device.Volume.Crypto",
++ "Teardown"))) {
++ kdDebug() << "teardown failed for " << udi << ": could not create dbus message\n";
++ return false;
++ }
++
++ dbus_error_init (&error);
++ if (!(reply = dbus_connection_send_with_reply_and_block (dbus_connection, dmesg, -1, &error)))
++ {
++ QString qerror;
++
++ kdDebug() << "teardown failed for " << udi << ": " << error.name << " " << error.message << endl;
++ qerror = QString("teardown failed for %1 because: %2").arg(udi).arg(error.name);
++ dbus_message_unref (dmesg);
++ dbus_error_free (&error);
++ return false;
++ }
++
++ kdDebug() << "teardown queued for " << udi << endl;
++
++ dbus_message_unref (dmesg);
++ dbus_message_unref (reply);
++ return true;
++ }
++
++ return false;
++}
++
++
+ #include "halbackend.moc"
+Index: kioslave/media/mediamanager/halbackend.h
+===================================================================
+--- kioslave/media/mediamanager/halbackend.h.orig 2011-05-31 13:39:05.000000000 +0200
++++ kioslave/media/mediamanager/halbackend.h 2011-05-31 13:42:48.317334543 +0200
+@@ -85,6 +85,7 @@ public:
+ QString mount(const QString &id);
+ QString mount(const Medium *medium);
+ QString unmount(const QString &id);
++ bool teardown(const QString &_udi);
+
+ static bool isHotplug( const QString & id );
+
+Index: kioslave/media/mediamanager/mediamanager.cpp
+===================================================================
+--- kioslave/media/mediamanager/mediamanager.cpp.orig 2011-05-31 13:39:05.000000000 +0200
++++ kioslave/media/mediamanager/mediamanager.cpp 2011-05-31 13:43:07.916484054 +0200
+@@ -232,6 +232,17 @@ QString MediaManager::unmount(const QStr
+ #endif
+ }
+
++bool MediaManager::teardown(const QString &name)
++{
++#ifdef COMPILE_HALBACKEND
++ if (!m_halbackend)
++ return false;
++ return m_halbackend->teardown(name);
++#else
++ return false;
++#endif
++}
++
+ QString MediaManager::nameForLabel(const QString &label)
+ {
+ const QPtrList<Medium> media = m_mediaList.list();
+Index: kioslave/media/mediamanager/mediamanager.h
+===================================================================
+--- kioslave/media/mediamanager/mediamanager.h.orig 2011-05-31 13:39:05.000000000 +0200
++++ kioslave/media/mediamanager/mediamanager.h 2011-05-31 13:42:48.318334448 +0200
+@@ -47,6 +47,7 @@ k_dcop:
+
+ QString mount(const QString &uid);
+ QString unmount(const QString &uid);
++ bool teardown(const QString &uid);
+
+ QString nameForLabel(const QString &label);
+ ASYNC setUserLabel(const QString &name, const QString &label);
+Index: kioslave/media/mounthelper/kio_media_mounthelper.h
+===================================================================
+--- kioslave/media/mounthelper/kio_media_mounthelper.h.orig 2007-01-15 12:31:31.000000000 +0100
++++ kioslave/media/mounthelper/kio_media_mounthelper.h 2011-05-31 13:42:48.318334448 +0200
+@@ -40,6 +40,8 @@ private:
+ QString m_errorStr;
+ QString m_device;
+ bool m_isCdrom;
++ bool isCryptMedia(QString);
++ bool teardown(QString);
+
+ private slots:
+ void ejectFinished(KProcess* proc);
+Index: kioslave/media/mounthelper/kio_media_mounthelper.cpp
+===================================================================
+--- kioslave/media/mounthelper/kio_media_mounthelper.cpp.orig 2007-05-14 09:55:40.000000000 +0200
++++ kioslave/media/mounthelper/kio_media_mounthelper.cpp 2011-05-31 13:42:48.319334353 +0200
+@@ -27,6 +27,7 @@
+ #include <dcopclient.h>
+ #include <dcopref.h>
+ #include <qtimer.h>
++#include <qregexp.h>
+ #include <stdlib.h>
+ #include <kdebug.h>
+ #include <kglobal.h>
+@@ -117,14 +118,17 @@ MountHelper::MountHelper() : KApplicatio
+ DCOPRef mediamanager("kded", "mediamanager");
+ DCOPReply reply = mediamanager.call( "unmount", medium.id());
+ if (reply.isValid())
+- reply.get(m_errorStr);
+- if (m_errorStr.isNull())
+- invokeEject(device, true);
+- else
+- error();
++ reply.get(m_errorStr);
++ if (m_errorStr.isNull()) {
++ if (!teardown(medium.id()))
++ invokeEject(device, true);
++ } else
++ error();
+ m_device = device;
+- } else
+- invokeEject(device, true);
++ } else {
++ if (!teardown(medium.id()))
++ invokeEject(device, true);
++ }
+ }
+ else
+ {
+@@ -139,6 +143,19 @@ MountHelper::MountHelper() : KApplicatio
+ }
+ }
+
++bool MountHelper::teardown(QString id)
++{
++ DCOPRef mediamanager("kded", "mediamanager");
++ DCOPReply reply = mediamanager.call( "teardown", id);
++ if (reply.isValid()) {
++ bool rep;
++ reply.get(rep);
++ kdDebug() << "reply from teardown: " << rep << endl;
++ return rep;
++ }
++ return false;
++}
++
+ void MountHelper::invokeEject(const QString &device, bool quiet)
+ {
+ KProcess *proc = new KProcess(this);