You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tde-packaging/opensuse/tdebase/media-teardown_crypto.diff

176 lines
5.7 KiB

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);