summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichele Calgaro <michele.calgaro@yahoo.it>2020-10-10 14:03:03 +0800
committerMichele Calgaro <michele.calgaro@yahoo.it>2020-10-10 14:03:03 +0800
commitfe08361f7e4227def5699ee7c911a61b84f5a77b (patch)
tree56db7658cb70e17e532a55412bc7a93ca51165a2
parent014394575603f2c6afe85b17d8f80e1184062951 (diff)
downloadtdelibs-fe08361f.tar.gz
tdelibs-fe08361f.zip
Added udisks2 support for unlocking/locking of encrypted disks.
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
-rw-r--r--tdecore/tdehw/disksHelper.cpp115
-rw-r--r--tdecore/tdehw/disksHelper.h26
-rw-r--r--tdecore/tdehw/tdestoragedevice.cpp95
-rw-r--r--tdecore/tdehw/tdestoragedevice.h16
4 files changed, 228 insertions, 24 deletions
diff --git a/tdecore/tdehw/disksHelper.cpp b/tdecore/tdehw/disksHelper.cpp
index 2589e505..4eb3709c 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 <tqdbusdata.h>
#include <tqdbusmessage.h>
@@ -31,6 +27,11 @@
#include <tqdbusdatamap.h>
#include <tqdbusobjectpath.h>
#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<TQT_DBusData> params;
+ params << TQT_DBusData::fromString(passphrase);
+ TQMap<TQString, TQT_DBusVariant> optionsMap;
+ params << TQT_DBusData::fromStringKeyMap(TQT_DBusDataMap<TQString>(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<TQT_DBusData> params;
+ TQMap<TQString, TQT_DBusVariant> optionsMap;
+ params << TQT_DBusData::fromStringKeyMap(TQT_DBusDataMap<TQString>(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 665de822..560d3cd9 100644
--- a/tdecore/tdehw/disksHelper.h
+++ b/tdecore/tdehw/disksHelper.h
@@ -20,22 +20,32 @@
#ifndef _DISKS_HELPER_H
#define _DISKS_HELPER_H
-#include <stdlib.h>
-#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 bff09e31..a995e49f 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 6bd39353..79223d18 100644
--- a/tdecore/tdehw/tdestoragedevice.h
+++ b/tdecore/tdehw/tdestoragedevice.h
@@ -259,6 +259,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
*/
TQString mountPath();