From fe08361f7e4227def5699ee7c911a61b84f5a77b Mon Sep 17 00:00:00 2001 From: Michele Calgaro Date: Sat, 10 Oct 2020 14:03:03 +0800 Subject: Added udisks2 support for unlocking/locking of encrypted disks. Signed-off-by: Michele Calgaro --- tdecore/tdehw/disksHelper.cpp | 115 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 105 insertions(+), 10 deletions(-) (limited to 'tdecore/tdehw/disksHelper.cpp') diff --git a/tdecore/tdehw/disksHelper.cpp b/tdecore/tdehw/disksHelper.cpp index 2589e5053..4eb3709ca 100644 --- a/tdecore/tdehw/disksHelper.cpp +++ b/tdecore/tdehw/disksHelper.cpp @@ -17,10 +17,6 @@ Boston, MA 02110-1301, USA. */ -#include "disksHelper.h" -#include "tdelocale.h" -#include "tdestoragedevice.h" - #if defined(WITH_UDISKS) || defined(WITH_UDISKS2) #include #include @@ -31,6 +27,11 @@ #include #include #include "tqdbusdatalist.h" + #include "tqstring.h" + + #include "tdelocale.h" + #include "tdestoragedevice.h" + #include "disksHelper.h" #endif @@ -38,7 +39,7 @@ //------------------------------- // UDisks //------------------------------- -TQStringVariantMap UDisksEjectDrive(TDEStorageDevice *sdevice) { +TQStringVariantMap udisksEjectDrive(TDEStorageDevice *sdevice) { TQStringVariantMap result; result["result"] = false; @@ -71,7 +72,7 @@ TQStringVariantMap UDisksEjectDrive(TDEStorageDevice *sdevice) { return result; } -TQStringVariantMap UDisksMountDrive(TQString deviceNode, TQString fileSystemType, TQStringList mountOptions) { +TQStringVariantMap udisksMountDrive(const TQString &deviceNode, const TQString &fileSystemType, TQStringList mountOptions) { TQStringVariantMap result; result["result"] = false; result["retcode"] = -2; @@ -113,7 +114,7 @@ TQStringVariantMap UDisksMountDrive(TQString deviceNode, TQString fileSystemType return result; } -TQStringVariantMap UDisksUnmountDrive(TQString deviceNode, TQStringList unmountOptions) { +TQStringVariantMap udisksUnmountDrive(const TQString &deviceNode, TQStringList unmountOptions) { TQStringVariantMap result; result["result"] = false; result["retcode"] = -2; @@ -160,7 +161,7 @@ TQStringVariantMap UDisksUnmountDrive(TQString deviceNode, TQStringList unmountO //------------------------------- // UDisks2 //------------------------------- -TQStringVariantMap UDisks2EjectDrive(TDEStorageDevice *sdevice) { +TQStringVariantMap udisks2EjectDrive(TDEStorageDevice *sdevice) { TQStringVariantMap result; result["result"] = false; @@ -230,7 +231,7 @@ TQStringVariantMap UDisks2EjectDrive(TDEStorageDevice *sdevice) { return result; } -TQStringVariantMap UDisks2MountDrive(TQString deviceNode, TQString fileSystemType, TQString mountOptions) { +TQStringVariantMap udisks2MountDrive(const TQString &deviceNode, const TQString &fileSystemType, const TQString &mountOptions) { TQStringVariantMap result; result["result"] = false; result["retcode"] = -2; @@ -276,7 +277,7 @@ TQStringVariantMap UDisks2MountDrive(TQString deviceNode, TQString fileSystemTyp return result; } -TQStringVariantMap UDisks2UnmountDrive(TQString deviceNode, TQString unmountOptions) { +TQStringVariantMap udisks2UnmountDrive(const TQString &deviceNode, const TQString &unmountOptions) { TQStringVariantMap result; result["result"] = false; result["retcode"] = -2; @@ -318,4 +319,98 @@ TQStringVariantMap UDisks2UnmountDrive(TQString deviceNode, TQString unmountOpti } return result; } + +TQStringVariantMap udisks2UnlockDrive(const TQString &deviceNode, const TQString &passphrase) { + TQStringVariantMap result; + result["result"] = false; + result["retcode"] = -2; + + TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); + if (dbusConn.isConnected()) { + TQString blockDeviceString = deviceNode; + blockDeviceString.replace("/dev/", ""); + blockDeviceString.replace("-", "_2d"); + blockDeviceString = "/org/freedesktop/UDisks2/block_devices/" + blockDeviceString; + + // Unlock/decrypt the drive! + TQT_DBusError error; + TQT_DBusProxy driveControl("org.freedesktop.UDisks2", blockDeviceString, "org.freedesktop.UDisks2.Encrypted", dbusConn); + if (driveControl.canSend()) { + TQValueList params; + params << TQT_DBusData::fromString(passphrase); + TQMap optionsMap; + params << TQT_DBusData::fromStringKeyMap(TQT_DBusDataMap(optionsMap)); + TQT_DBusMessage reply = driveControl.sendWithReply("Unlock", params, &error); + if (!error.isValid()) { + if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) { + TQT_DBusObjectPath deviceObjectPath = reply[0].toObjectPath(); + if (deviceObjectPath.isValid()) { + // Success + result["unlockedDevice"] = deviceObjectPath; + result["retcode"] = 0; + result["result"] = true; + return result; + } + } + result["errStr"] = i18n("Unknown error during unlocking operation."); + result["retcode"] = -1; + return result; + } + else { + // Error! + if (error.name() == "org.freedesktop.DBus.Error.ServiceUnknown") { + return result; // Service not installed or unavailable + } + else { + result["errStr"] = error.name() + ": " + error.message(); + result["retcode"] = -1; + return result; + } + } + } + } + return result; +} + +TQStringVariantMap udisks2LockDrive(const TQString &deviceNode) { + TQStringVariantMap result; + result["result"] = false; + result["retcode"] = -2; + + TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus); + if (dbusConn.isConnected()) { + TQString blockDeviceString = deviceNode; + blockDeviceString.replace("/dev/", ""); + blockDeviceString.replace("-", "_2d"); + blockDeviceString = "/org/freedesktop/UDisks2/block_devices/" + blockDeviceString; + + // Lock/encrypt the drive! + TQT_DBusError error; + TQT_DBusProxy driveControl("org.freedesktop.UDisks2", blockDeviceString, "org.freedesktop.UDisks2.Encrypted", dbusConn); + if (driveControl.canSend()) { + TQValueList params; + TQMap optionsMap; + params << TQT_DBusData::fromStringKeyMap(TQT_DBusDataMap(optionsMap)); + TQT_DBusMessage reply = driveControl.sendWithReply("Lock", params, &error); + if (!error.isValid()) { + // Success + result["retcode"] = 0; + result["result"] = true; + return result; + } + else { + // Error! + if (error.name() == "org.freedesktop.DBus.Error.ServiceUnknown") { + return result; // Service not installed or unavailable + } + else { + result["errStr"] = error.name() + ": " + error.message(); + result["retcode"] = -1; + return result; + } + } + } + } + return result; +} #endif -- cgit v1.2.1