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 +++++++++++++++++++++++++++++++++---- tdecore/tdehw/disksHelper.h | 26 ++++++--- tdecore/tdehw/tdestoragedevice.cpp | 95 ++++++++++++++++++++++++++++-- tdecore/tdehw/tdestoragedevice.h | 16 ++++++ 4 files changed, 228 insertions(+), 24 deletions(-) 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 diff --git a/tdecore/tdehw/disksHelper.h b/tdecore/tdehw/disksHelper.h index 665de8223..560d3cd9a 100644 --- a/tdecore/tdehw/disksHelper.h +++ b/tdecore/tdehw/disksHelper.h @@ -20,22 +20,32 @@ #ifndef _DISKS_HELPER_H #define _DISKS_HELPER_H -#include -#include "tdestoragedevice.h" +#if defined(WITH_UDISKS) || defined(WITH_UDISKS2) + #include "tqstringlist.h" + #include "tqvariant.h" + class TQString; + class TDEStorageDevice; +#endif +#ifdef WITH_UDISKS //------------------------------- // UDisks //------------------------------- -TQStringVariantMap UDisksEjectDrive(TDEStorageDevice *sdevice); -TQStringVariantMap UDisksMountDrive(TQString deviceNode, TQString fileSystemType, TQStringList mountOptions); -TQStringVariantMap UDisksUnmountDrive(TQString deviceNode, TQStringList unmountOptions); +TQStringVariantMap udisksEjectDrive(TDEStorageDevice *sdevice); +TQStringVariantMap udisksMountDrive(const TQString &deviceNode, const TQString &fileSystemType, TQStringList mountOptions); +TQStringVariantMap udisksUnmountDrive(const TQString &deviceNode, TQStringList unmountOptions); +#endif +#ifdef WITH_UDISKS2 //------------------------------- // UDisks2 //------------------------------- -TQStringVariantMap UDisks2EjectDrive(TDEStorageDevice *sdevice); -TQStringVariantMap UDisks2MountDrive(TQString deviceNode, TQString fileSystemType, TQString mountOptions); -TQStringVariantMap UDisks2UnmountDrive(TQString deviceNode, TQString unmountOptions); +TQStringVariantMap udisks2EjectDrive(TDEStorageDevice *sdevice); +TQStringVariantMap udisks2MountDrive(const TQString &deviceNode, const TQString &fileSystemType, const TQString &mountOptions); +TQStringVariantMap udisks2UnmountDrive(const TQString &deviceNode, const TQString &unmountOptions); +TQStringVariantMap udisks2UnlockDrive(const TQString &deviceNode, const TQString &passphrase); +TQStringVariantMap udisks2LockDrive(const TQString &deviceNode); +#endif #endif diff --git a/tdecore/tdehw/tdestoragedevice.cpp b/tdecore/tdehw/tdestoragedevice.cpp index bff09e319..a995e49fa 100644 --- a/tdecore/tdehw/tdestoragedevice.cpp +++ b/tdecore/tdehw/tdestoragedevice.cpp @@ -310,7 +310,7 @@ bool TDEStorageDevice::lockDriveMedia(bool lock) { bool TDEStorageDevice::ejectDrive() { #ifdef WITH_UDISKS2 if (!(TDEGlobal::dirs()->findExe("udisksctl").isEmpty())) { - TQStringVariantMap ejectResult = UDisks2EjectDrive(this); + TQStringVariantMap ejectResult = udisks2EjectDrive(this); if (ejectResult["result"].toBool()) { return true; } @@ -322,7 +322,7 @@ bool TDEStorageDevice::ejectDrive() { #endif #ifdef WITH_UDISKS if (!(TDEGlobal::dirs()->findExe("udisks").isEmpty())) { - TQStringVariantMap ejectResult = UDisksEjectDrive(this); + TQStringVariantMap ejectResult = udisksEjectDrive(this); if (ejectResult["result"].toBool()) { return true; } @@ -786,7 +786,7 @@ TQStringVariantMap TDEStorageDevice::mountDevice(TQString mediaName, TDEStorageM #if defined(WITH_UDISKS2) // Try to use UDISKS v2 via DBUS, if available - mountResult = UDisks2MountDrive(devNode, fileSystemType, optionString); + mountResult = udisks2MountDrive(devNode, fileSystemType, optionString); if (mountResult["result"].toBool()) { // Update internal mount data TDEGlobal::hardwareDevices()->processModifiedMounts(); @@ -806,7 +806,7 @@ TQStringVariantMap TDEStorageDevice::mountDevice(TQString mediaName, TDEStorageM #if defined(WITH_UDISKS) // The UDISKS v2 DBUS service was either not available or was unusable // Try to use UDISKS v1 via DBUS, if available - mountResult = UDisksMountDrive(devNode, fileSystemType, udisksOptions); + mountResult = udisksMountDrive(devNode, fileSystemType, udisksOptions); if (mountResult["result"].toBool()) { // Update internal mount data TDEGlobal::hardwareDevices()->processModifiedMounts(); @@ -1009,7 +1009,7 @@ TQStringVariantMap TDEStorageDevice::unmountDevice() { #if defined(WITH_UDISKS2) // Try to use UDISKS v2 via DBUS, if available - unmountResult = UDisks2UnmountDrive(devNode, TQString::null); + unmountResult = udisks2UnmountDrive(devNode, TQString::null); if (unmountResult["result"].toBool()) { // Update internal mount data TDEGlobal::hardwareDevices()->processModifiedMounts(); @@ -1028,7 +1028,7 @@ TQStringVariantMap TDEStorageDevice::unmountDevice() { #if defined(WITH_UDISKS) // The UDISKS v2 DBUS service was either not available or was unusable // Try to use UDISKS v1 via DBUS, if available - unmountResult = UDisksUnmountDrive(devNode, TQStringList()); + unmountResult = udisksUnmountDrive(devNode, TQStringList()); if (unmountResult["result"].toBool()) { // Update internal mount data TDEGlobal::hardwareDevices()->processModifiedMounts(); @@ -1087,6 +1087,89 @@ TQStringVariantMap TDEStorageDevice::unmountDevice() { return result; } +TQStringVariantMap TDEStorageDevice::unlockDevice(const TQString &passphrase) +{ + TQStringVariantMap result; + + // Check if device is already mounted + TQString mountpath = mountPath(); + if (!mountpath.isEmpty()) { + result["unlockedDevice"] = mountpath; + result["result"] = true; + return result; + } + + TQString devNode = deviceNode(); + devNode.replace("'", "'\\''"); + + TQStringVariantMap unlockResult; + +#if defined(WITH_UDISKS2) + // Try to use UDISKS v2 via DBUS, if available + unlockResult = udisks2UnlockDrive(devNode, passphrase); + if (unlockResult["result"].toBool()) { + // Update internal mount data + TDEGlobal::hardwareDevices()->processModifiedMounts(); + result["unlockedDevice"] = unlockResult["unlockedDevice"]; + result["result"] = true; + return result; + } + else if (unlockResult["retcode"].toInt() == -1) { + // Update internal mount data + TDEGlobal::hardwareDevices()->processModifiedMounts(); + result["errStr"] = unlockResult["errStr"]; + result["result"] = false; + return result; + } +#endif + + // No supported methods found for unlocking the device + result["errStr"] = i18n("No supported unlocking methods were detected on your system."); + result["result"] = false; + return result; +} + +TQStringVariantMap TDEStorageDevice::lockDevice() +{ + TQStringVariantMap result; + + // Check if device is mounted + TQString mountpath = mountPath(); + if (!mountpath.isEmpty()) { + result["errStr"] = i18n("The device is currently mounted and cannot be locked."); + result["result"] = false; + return result; + } + + TQString devNode = deviceNode(); + devNode.replace("'", "'\\''"); + + TQStringVariantMap lockResult; + +#if defined(WITH_UDISKS2) + // Try to use UDISKS v2 via DBUS, if available + lockResult = udisks2LockDrive(devNode); + if (lockResult["result"].toBool()) { + // Update internal mount data + TDEGlobal::hardwareDevices()->processModifiedMounts(); + result["result"] = true; + return result; + } + else if (lockResult["retcode"].toInt() == -1) { + // Update internal mount data + TDEGlobal::hardwareDevices()->processModifiedMounts(); + result["errStr"] = lockResult["errStr"]; + result["result"] = false; + return result; + } +#endif + + // No supported methods found for locking the device + result["errStr"] = i18n("No supported locking methods were detected on your system."); + result["result"] = false; + return result; +} + TQString TDEStorageDevice::determineFileSystemType(TQString path) { TQStringList mountTable; TQString prevPath = path; diff --git a/tdecore/tdehw/tdestoragedevice.h b/tdecore/tdehw/tdestoragedevice.h index 6bd39353b..79223d185 100644 --- a/tdecore/tdehw/tdestoragedevice.h +++ b/tdecore/tdehw/tdestoragedevice.h @@ -258,6 +258,22 @@ class TDECORE_EXPORT TDEStorageDevice : public TDEGenericDevice */ TQStringVariantMap unmountDevice(); + /** + * Unlock/decrypt an encrypted storage device + * + * @param a TQString containing the passphrase + * + * @return a TQStringVariantMap object containing information about the operation outcome + */ + TQStringVariantMap unlockDevice(const TQString &passphrase); + + /** + * Lock/encrypt an encrypted storage device + * + * @return a TQStringVariantMap object containing information about the operation outcome + */ + TQStringVariantMap lockDevice(); + /** * @return a TQString with the mount path, if mounted */ -- cgit v1.2.1