Added udisks2 support for unlocking/locking of encrypted disks.

Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
pull/111/head
Michele Calgaro 5 years ago
parent 0143945756
commit fe08361f7e
Signed by: MicheleC
GPG Key ID: 2A75B7CA8ADED5CF

@ -17,10 +17,6 @@
Boston, MA 02110-1301, USA. Boston, MA 02110-1301, USA.
*/ */
#include "disksHelper.h"
#include "tdelocale.h"
#include "tdestoragedevice.h"
#if defined(WITH_UDISKS) || defined(WITH_UDISKS2) #if defined(WITH_UDISKS) || defined(WITH_UDISKS2)
#include <tqdbusdata.h> #include <tqdbusdata.h>
#include <tqdbusmessage.h> #include <tqdbusmessage.h>
@ -31,6 +27,11 @@
#include <tqdbusdatamap.h> #include <tqdbusdatamap.h>
#include <tqdbusobjectpath.h> #include <tqdbusobjectpath.h>
#include "tqdbusdatalist.h" #include "tqdbusdatalist.h"
#include "tqstring.h"
#include "tdelocale.h"
#include "tdestoragedevice.h"
#include "disksHelper.h"
#endif #endif
@ -38,7 +39,7 @@
//------------------------------- //-------------------------------
// UDisks // UDisks
//------------------------------- //-------------------------------
TQStringVariantMap UDisksEjectDrive(TDEStorageDevice *sdevice) { TQStringVariantMap udisksEjectDrive(TDEStorageDevice *sdevice) {
TQStringVariantMap result; TQStringVariantMap result;
result["result"] = false; result["result"] = false;
@ -71,7 +72,7 @@ TQStringVariantMap UDisksEjectDrive(TDEStorageDevice *sdevice) {
return result; return result;
} }
TQStringVariantMap UDisksMountDrive(TQString deviceNode, TQString fileSystemType, TQStringList mountOptions) { TQStringVariantMap udisksMountDrive(const TQString &deviceNode, const TQString &fileSystemType, TQStringList mountOptions) {
TQStringVariantMap result; TQStringVariantMap result;
result["result"] = false; result["result"] = false;
result["retcode"] = -2; result["retcode"] = -2;
@ -113,7 +114,7 @@ TQStringVariantMap UDisksMountDrive(TQString deviceNode, TQString fileSystemType
return result; return result;
} }
TQStringVariantMap UDisksUnmountDrive(TQString deviceNode, TQStringList unmountOptions) { TQStringVariantMap udisksUnmountDrive(const TQString &deviceNode, TQStringList unmountOptions) {
TQStringVariantMap result; TQStringVariantMap result;
result["result"] = false; result["result"] = false;
result["retcode"] = -2; result["retcode"] = -2;
@ -160,7 +161,7 @@ TQStringVariantMap UDisksUnmountDrive(TQString deviceNode, TQStringList unmountO
//------------------------------- //-------------------------------
// UDisks2 // UDisks2
//------------------------------- //-------------------------------
TQStringVariantMap UDisks2EjectDrive(TDEStorageDevice *sdevice) { TQStringVariantMap udisks2EjectDrive(TDEStorageDevice *sdevice) {
TQStringVariantMap result; TQStringVariantMap result;
result["result"] = false; result["result"] = false;
@ -230,7 +231,7 @@ TQStringVariantMap UDisks2EjectDrive(TDEStorageDevice *sdevice) {
return result; return result;
} }
TQStringVariantMap UDisks2MountDrive(TQString deviceNode, TQString fileSystemType, TQString mountOptions) { TQStringVariantMap udisks2MountDrive(const TQString &deviceNode, const TQString &fileSystemType, const TQString &mountOptions) {
TQStringVariantMap result; TQStringVariantMap result;
result["result"] = false; result["result"] = false;
result["retcode"] = -2; result["retcode"] = -2;
@ -276,7 +277,7 @@ TQStringVariantMap UDisks2MountDrive(TQString deviceNode, TQString fileSystemTyp
return result; return result;
} }
TQStringVariantMap UDisks2UnmountDrive(TQString deviceNode, TQString unmountOptions) { TQStringVariantMap udisks2UnmountDrive(const TQString &deviceNode, const TQString &unmountOptions) {
TQStringVariantMap result; TQStringVariantMap result;
result["result"] = false; result["result"] = false;
result["retcode"] = -2; result["retcode"] = -2;
@ -318,4 +319,98 @@ TQStringVariantMap UDisks2UnmountDrive(TQString deviceNode, TQString unmountOpti
} }
return result; 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 #endif

@ -20,22 +20,32 @@
#ifndef _DISKS_HELPER_H #ifndef _DISKS_HELPER_H
#define _DISKS_HELPER_H #define _DISKS_HELPER_H
#include <stdlib.h> #if defined(WITH_UDISKS) || defined(WITH_UDISKS2)
#include "tdestoragedevice.h" #include "tqstringlist.h"
#include "tqvariant.h"
class TQString;
class TDEStorageDevice;
#endif
#ifdef WITH_UDISKS
//------------------------------- //-------------------------------
// UDisks // UDisks
//------------------------------- //-------------------------------
TQStringVariantMap UDisksEjectDrive(TDEStorageDevice *sdevice); TQStringVariantMap udisksEjectDrive(TDEStorageDevice *sdevice);
TQStringVariantMap UDisksMountDrive(TQString deviceNode, TQString fileSystemType, TQStringList mountOptions); TQStringVariantMap udisksMountDrive(const TQString &deviceNode, const TQString &fileSystemType, TQStringList mountOptions);
TQStringVariantMap UDisksUnmountDrive(TQString deviceNode, TQStringList unmountOptions); TQStringVariantMap udisksUnmountDrive(const TQString &deviceNode, TQStringList unmountOptions);
#endif
#ifdef WITH_UDISKS2
//------------------------------- //-------------------------------
// UDisks2 // UDisks2
//------------------------------- //-------------------------------
TQStringVariantMap UDisks2EjectDrive(TDEStorageDevice *sdevice); TQStringVariantMap udisks2EjectDrive(TDEStorageDevice *sdevice);
TQStringVariantMap UDisks2MountDrive(TQString deviceNode, TQString fileSystemType, TQString mountOptions); TQStringVariantMap udisks2MountDrive(const TQString &deviceNode, const TQString &fileSystemType, const TQString &mountOptions);
TQStringVariantMap UDisks2UnmountDrive(TQString deviceNode, TQString unmountOptions); TQStringVariantMap udisks2UnmountDrive(const TQString &deviceNode, const TQString &unmountOptions);
TQStringVariantMap udisks2UnlockDrive(const TQString &deviceNode, const TQString &passphrase);
TQStringVariantMap udisks2LockDrive(const TQString &deviceNode);
#endif
#endif #endif

@ -310,7 +310,7 @@ bool TDEStorageDevice::lockDriveMedia(bool lock) {
bool TDEStorageDevice::ejectDrive() { bool TDEStorageDevice::ejectDrive() {
#ifdef WITH_UDISKS2 #ifdef WITH_UDISKS2
if (!(TDEGlobal::dirs()->findExe("udisksctl").isEmpty())) { if (!(TDEGlobal::dirs()->findExe("udisksctl").isEmpty())) {
TQStringVariantMap ejectResult = UDisks2EjectDrive(this); TQStringVariantMap ejectResult = udisks2EjectDrive(this);
if (ejectResult["result"].toBool()) { if (ejectResult["result"].toBool()) {
return true; return true;
} }
@ -322,7 +322,7 @@ bool TDEStorageDevice::ejectDrive() {
#endif #endif
#ifdef WITH_UDISKS #ifdef WITH_UDISKS
if (!(TDEGlobal::dirs()->findExe("udisks").isEmpty())) { if (!(TDEGlobal::dirs()->findExe("udisks").isEmpty())) {
TQStringVariantMap ejectResult = UDisksEjectDrive(this); TQStringVariantMap ejectResult = udisksEjectDrive(this);
if (ejectResult["result"].toBool()) { if (ejectResult["result"].toBool()) {
return true; return true;
} }
@ -786,7 +786,7 @@ TQStringVariantMap TDEStorageDevice::mountDevice(TQString mediaName, TDEStorageM
#if defined(WITH_UDISKS2) #if defined(WITH_UDISKS2)
// Try to use UDISKS v2 via DBUS, if available // Try to use UDISKS v2 via DBUS, if available
mountResult = UDisks2MountDrive(devNode, fileSystemType, optionString); mountResult = udisks2MountDrive(devNode, fileSystemType, optionString);
if (mountResult["result"].toBool()) { if (mountResult["result"].toBool()) {
// Update internal mount data // Update internal mount data
TDEGlobal::hardwareDevices()->processModifiedMounts(); TDEGlobal::hardwareDevices()->processModifiedMounts();
@ -806,7 +806,7 @@ TQStringVariantMap TDEStorageDevice::mountDevice(TQString mediaName, TDEStorageM
#if defined(WITH_UDISKS) #if defined(WITH_UDISKS)
// The UDISKS v2 DBUS service was either not available or was unusable // The UDISKS v2 DBUS service was either not available or was unusable
// Try to use UDISKS v1 via DBUS, if available // Try to use UDISKS v1 via DBUS, if available
mountResult = UDisksMountDrive(devNode, fileSystemType, udisksOptions); mountResult = udisksMountDrive(devNode, fileSystemType, udisksOptions);
if (mountResult["result"].toBool()) { if (mountResult["result"].toBool()) {
// Update internal mount data // Update internal mount data
TDEGlobal::hardwareDevices()->processModifiedMounts(); TDEGlobal::hardwareDevices()->processModifiedMounts();
@ -1009,7 +1009,7 @@ TQStringVariantMap TDEStorageDevice::unmountDevice() {
#if defined(WITH_UDISKS2) #if defined(WITH_UDISKS2)
// Try to use UDISKS v2 via DBUS, if available // Try to use UDISKS v2 via DBUS, if available
unmountResult = UDisks2UnmountDrive(devNode, TQString::null); unmountResult = udisks2UnmountDrive(devNode, TQString::null);
if (unmountResult["result"].toBool()) { if (unmountResult["result"].toBool()) {
// Update internal mount data // Update internal mount data
TDEGlobal::hardwareDevices()->processModifiedMounts(); TDEGlobal::hardwareDevices()->processModifiedMounts();
@ -1028,7 +1028,7 @@ TQStringVariantMap TDEStorageDevice::unmountDevice() {
#if defined(WITH_UDISKS) #if defined(WITH_UDISKS)
// The UDISKS v2 DBUS service was either not available or was unusable // The UDISKS v2 DBUS service was either not available or was unusable
// Try to use UDISKS v1 via DBUS, if available // Try to use UDISKS v1 via DBUS, if available
unmountResult = UDisksUnmountDrive(devNode, TQStringList()); unmountResult = udisksUnmountDrive(devNode, TQStringList());
if (unmountResult["result"].toBool()) { if (unmountResult["result"].toBool()) {
// Update internal mount data // Update internal mount data
TDEGlobal::hardwareDevices()->processModifiedMounts(); TDEGlobal::hardwareDevices()->processModifiedMounts();
@ -1087,6 +1087,89 @@ TQStringVariantMap TDEStorageDevice::unmountDevice() {
return result; 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) { TQString TDEStorageDevice::determineFileSystemType(TQString path) {
TQStringList mountTable; TQStringList mountTable;
TQString prevPath = path; TQString prevPath = path;

@ -258,6 +258,22 @@ class TDECORE_EXPORT TDEStorageDevice : public TDEGenericDevice
*/ */
TQStringVariantMap unmountDevice(); 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 * @return a TQString with the mount path, if mounted
*/ */

Loading…
Cancel
Save