tdeioslave media: fixed displaying of encrypted disks.

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

@ -49,7 +49,6 @@
TDEBackend::TDEBackend(MediaList &list, TQObject* parent) TDEBackend::TDEBackend(MediaList &list, TQObject* parent)
: TQObject() : TQObject()
, BackendBase(list) , BackendBase(list)
, m_unlockDialog(0)
, m_parent(parent) , m_parent(parent)
{ {
// Initialize the TDE device manager // Initialize the TDE device manager
@ -146,22 +145,23 @@ void TDEBackend::AddDevice(TDEStorageDevice * sdevice, bool allowNotification)
// Add volume block devices // Add volume block devices
if (sdevice->isDiskOfType(TDEDiskDeviceType::HDD)) { if (sdevice->isDiskOfType(TDEDiskDeviceType::HDD)) {
/* We only list volumes that... /* We only list volumes that...
* - are encrypted with LUKS or * - are encrypted or
* - have a filesystem or * - have a filesystem or
* - have an audio track * - have an audio track
*/ */
if (!(sdevice->isDiskOfType(TDEDiskDeviceType::LUKS)) if (!sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) &&
&& !(sdevice->checkDiskStatus(TDEDiskDeviceStatus::ContainsFilesystem)) !sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted) &&
&& !(sdevice->isDiskOfType(TDEDiskDeviceType::CDAudio)) !sdevice->checkDiskStatus(TDEDiskDeviceStatus::ContainsFilesystem) &&
&& !(sdevice->checkDiskStatus(TDEDiskDeviceStatus::Blank)) !sdevice->isDiskOfType(TDEDiskDeviceType::CDAudio) &&
!sdevice->checkDiskStatus(TDEDiskDeviceStatus::Blank)
) { ) {
// //
} }
/* We also don't display devices that underlie other devices; // We also don't display devices that underlie other devices, unless they are encrypted devices
* e.g. the raw partition of a device mapper volume else if ((sdevice->checkDiskStatus(TDEDiskDeviceStatus::UsedByDevice) &&
*/ !sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) &&
else if (sdevice->checkDiskStatus(TDEDiskDeviceStatus::UsedByDevice) !sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted)) ||
|| (sdevice->fileSystemUsage().upper() == "RAID")) { sdevice->fileSystemUsage().upper() == "RAID") {
// //
} }
else { else {
@ -169,16 +169,6 @@ void TDEBackend::AddDevice(TDEStorageDevice * sdevice, bool allowNotification)
Medium* medium = new Medium(sdevice->uniqueID(), driveUDIFromDeviceUID(sdevice->uniqueID()), ""); Medium* medium = new Medium(sdevice->uniqueID(), driveUDIFromDeviceUID(sdevice->uniqueID()), "");
setVolumeProperties(medium); setVolumeProperties(medium);
// Do not list the LUKS backend device if it has been unlocked elsewhere
if (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS)) {
if (sdevice->holdingDevices().count() > 0) {
medium->setHidden(true);
}
else {
medium->setHidden(false);
}
}
// Hide udev hidden devices by default but allow the user to override if desired via Show Hidden Files // Hide udev hidden devices by default but allow the user to override if desired via Show Hidden Files
if (sdevice->checkDiskStatus(TDEDiskDeviceStatus::Hidden)) { if (sdevice->checkDiskStatus(TDEDiskDeviceStatus::Hidden)) {
medium->setSoftHidden(true); medium->setSoftHidden(true);
@ -266,33 +256,29 @@ void TDEBackend::AddDevice(TDEStorageDevice * sdevice, bool allowNotification)
} }
/* We only list volumes that... /* We only list volumes that...
* - are encrypted with LUKS or * - are encrypted or
* - have a filesystem or * - have a filesystem or
* - are a floppy disk * - have an audio track
*/ */
if (!(sdevice->isDiskOfType(TDEDiskDeviceType::LUKS)) if (!sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) &&
&& !(sdevice->checkDiskStatus(TDEDiskDeviceStatus::ContainsFilesystem)) !sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted) &&
&& !(sdevice->isDiskOfType(TDEDiskDeviceType::Floppy)) !sdevice->checkDiskStatus(TDEDiskDeviceStatus::ContainsFilesystem) &&
&& !(sdevice->checkDiskStatus(TDEDiskDeviceStatus::Blank)) !sdevice->isDiskOfType(TDEDiskDeviceType::CDAudio) &&
!sdevice->checkDiskStatus(TDEDiskDeviceStatus::Blank)
) { ) {
// //
} }
// We also don't display devices that underlie other devices, unless they are encrypted devices
else if ((sdevice->checkDiskStatus(TDEDiskDeviceStatus::UsedByDevice) &&
!sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) &&
!sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted)) ||
sdevice->fileSystemUsage().upper() == "RAID") {
//
}
else { else {
// Create medium // Create medium
Medium* medium = new Medium(sdevice->uniqueID(), driveUDIFromDeviceUID(sdevice->uniqueID()), ""); Medium* medium = new Medium(sdevice->uniqueID(), driveUDIFromDeviceUID(sdevice->uniqueID()), "");
setFloppyProperties(medium); setFloppyProperties(medium);
// Do not list the LUKS backend device if it has been unlocked elsewhere
if (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS)) {
if (sdevice->holdingDevices().count() > 0) {
medium->setHidden(true);
}
else {
medium->setHidden(false);
}
}
m_mediaList.addMedium(medium, allowDialogNotification); m_mediaList.addMedium(medium, allowDialogNotification);
kdDebug(1219) << "TDEBackend::AddDevice inserted floppy medium for " << sdevice->uniqueID() << endl; kdDebug(1219) << "TDEBackend::AddDevice inserted floppy medium for " << sdevice->uniqueID() << endl;
@ -359,24 +345,28 @@ void TDEBackend::ResetProperties(TDEStorageDevice * sdevice, bool allowNotificat
Medium* m = new Medium(sdevice->uniqueID(), driveUDIFromDeviceUID(sdevice->uniqueID()), ""); Medium* m = new Medium(sdevice->uniqueID(), driveUDIFromDeviceUID(sdevice->uniqueID()), "");
// Keep these conditions in sync with ::AddDevice above, OR ELSE!!! // Keep these conditions in sync with ::AddDevice above, OR ELSE!!!
// BEGIN
if (sdevice->isDiskOfType(TDEDiskDeviceType::HDD)) { if (sdevice->isDiskOfType(TDEDiskDeviceType::HDD)) {
if (!(sdevice->isDiskOfType(TDEDiskDeviceType::LUKS)) /* We only list volumes that...
&& !(sdevice->checkDiskStatus(TDEDiskDeviceStatus::ContainsFilesystem)) * - are encrypted or
&& !(sdevice->isDiskOfType(TDEDiskDeviceType::CDAudio)) * - have a filesystem or
&& !(sdevice->checkDiskStatus(TDEDiskDeviceStatus::Blank)) * - have an audio track
*/
if (!sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) &&
!sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted) &&
!sdevice->checkDiskStatus(TDEDiskDeviceStatus::ContainsFilesystem) &&
!sdevice->isDiskOfType(TDEDiskDeviceType::CDAudio) &&
!sdevice->checkDiskStatus(TDEDiskDeviceStatus::Blank)
) { ) {
//
}
// We also don't display devices that underlie other devices, unless they are encrypted devices
else if ((sdevice->checkDiskStatus(TDEDiskDeviceStatus::UsedByDevice) &&
!sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) &&
!sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted)) ||
sdevice->fileSystemUsage().upper() == "RAID") {
//
} }
else { else {
// Do not list the LUKS backend device if it has been unlocked elsewhere
if (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS)) {
if (sdevice->holdingDevices().count() > 0) {
m->setHidden(true);
}
else {
m->setHidden(false);
}
}
setVolumeProperties(m); setVolumeProperties(m);
} }
} }
@ -416,25 +406,27 @@ void TDEBackend::ResetProperties(TDEStorageDevice * sdevice, bool allowNotificat
(sdevice->isDiskOfType(TDEDiskDeviceType::Zip)) || (sdevice->isDiskOfType(TDEDiskDeviceType::Zip)) ||
(sdevice->isDiskOfType(TDEDiskDeviceType::Jaz)) (sdevice->isDiskOfType(TDEDiskDeviceType::Jaz))
) { ) {
/* We only list volumes that...
if (!(sdevice->isDiskOfType(TDEDiskDeviceType::LUKS)) * - are encrypted or
&& !(sdevice->checkDiskStatus(TDEDiskDeviceStatus::ContainsFilesystem)) * - have a filesystem or
&& !(sdevice->isDiskOfType(TDEDiskDeviceType::Floppy)) * - have an audio track
&& !(sdevice->checkDiskStatus(TDEDiskDeviceStatus::Blank)) */
if (!sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) &&
!sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted) &&
!sdevice->checkDiskStatus(TDEDiskDeviceStatus::ContainsFilesystem) &&
!sdevice->isDiskOfType(TDEDiskDeviceType::CDAudio) &&
!sdevice->checkDiskStatus(TDEDiskDeviceStatus::Blank)
) { ) {
// //
} }
// We also don't display devices that underlie other devices, unless they are encrypted devices
else if ((sdevice->checkDiskStatus(TDEDiskDeviceStatus::UsedByDevice) &&
!sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) &&
!sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted)) ||
sdevice->fileSystemUsage().upper() == "RAID") {
//
}
else { else {
// Do not list the LUKS backend device if it has been unlocked elsewhere
if (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS)) {
if (sdevice->holdingDevices().count() > 0) {
m->setHidden(true);
}
else {
m->setHidden(false);
}
}
setFloppyProperties(m); setFloppyProperties(m);
} }
} }
@ -443,8 +435,6 @@ void TDEBackend::ResetProperties(TDEStorageDevice * sdevice, bool allowNotificat
setCameraProperties(m); setCameraProperties(m);
} }
// END
if ((sdevice->checkDiskStatus(TDEDiskDeviceStatus::Removable)) && (!(sdevice->checkDiskStatus(TDEDiskDeviceStatus::Inserted)))) { if ((sdevice->checkDiskStatus(TDEDiskDeviceStatus::Removable)) && (!(sdevice->checkDiskStatus(TDEDiskDeviceStatus::Inserted)))) {
kdDebug(1219) << "TDEBackend::ResetProperties for " << sdevice->uniqueID() << " device was removed from system" << endl; kdDebug(1219) << "TDEBackend::ResetProperties for " << sdevice->uniqueID() << " device was removed from system" << endl;
RemoveDevice(sdevice); RemoveDevice(sdevice);
@ -468,7 +458,7 @@ void TDEBackend::setVolumeProperties(Medium* medium)
} }
medium->setName(generateName(sdevice->deviceNode())); medium->setName(generateName(sdevice->deviceNode()));
if ((sdevice->isDiskOfType(TDEDiskDeviceType::LUKS)) || (sdevice->isDiskOfType(TDEDiskDeviceType::UnlockedCrypt))) { if (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) || sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted)) {
medium->setEncrypted(true); medium->setEncrypted(true);
} }
else { else {
@ -782,15 +772,6 @@ void TDEBackend::setVolumeProperties(Medium* medium)
} }
} }
if (!medium->needMounting()) {
if (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS)) {
if (sdevice->checkDiskStatus(TDEDiskDeviceStatus::UsedByDevice)) {
// Encrypted base devices must be set to this mimetype or they won't open when the base device node is passed to the tdeioslave
mimeType = "media/removable_mounted";
}
}
}
medium->setLabel(diskLabel); medium->setLabel(diskLabel);
medium->setMimeType(mimeType); medium->setMimeType(mimeType);
} }
@ -813,7 +794,7 @@ bool TDEBackend::setFloppyProperties(Medium* medium)
// Any more? // Any more?
if ((sdevice->isDiskOfType(TDEDiskDeviceType::Zip)) || (sdevice->isDiskOfType(TDEDiskDeviceType::Jaz))) { if ((sdevice->isDiskOfType(TDEDiskDeviceType::Zip)) || (sdevice->isDiskOfType(TDEDiskDeviceType::Jaz))) {
medium->setName(generateName(sdevice->deviceNode())); medium->setName(generateName(sdevice->deviceNode()));
if ((sdevice->isDiskOfType(TDEDiskDeviceType::LUKS)) || (sdevice->isDiskOfType(TDEDiskDeviceType::UnlockedCrypt))) { if (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) || sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted)) {
medium->setEncrypted(true); medium->setEncrypted(true);
} }
else { else {
@ -1173,16 +1154,6 @@ bool TDEBackend::setMountoptions(const TQString &name, const TQStringList &optio
return true; return true;
} }
void TDEBackend::slotPasswordReady() {
m_decryptionPassword = m_unlockDialog->getPassword();
m_decryptPasswordValid = true;
}
void TDEBackend::slotPasswordCancel() {
m_decryptionPassword = TQString::null;
m_decryptPasswordValid = true;
}
TQStringVariantMap TDEBackend::mount(const Medium *medium) TQStringVariantMap TDEBackend::mount(const Medium *medium)
{ {
kdDebug(1219) << "TDEBackend::mount for medium " << medium->name() << endl; kdDebug(1219) << "TDEBackend::mount for medium " << medium->name() << endl;
@ -1255,87 +1226,7 @@ TQStringVariantMap TDEBackend::mount(const Medium *medium)
} }
} }
else { else {
TQString iconName = medium->iconName(); qerror = i18n("Unable to mount an encrypted device.");
if (iconName.isEmpty())
{
TQString mime = medium->mimeType();
iconName = KMimeType::mimeType(mime)->icon(mime, false);
}
bool continue_trying_to_decrypt = true;
while (continue_trying_to_decrypt == true) {
m_decryptPasswordValid = false;
m_unlockDialog = new Dialog(sdevice->deviceNode(), iconName);
m_unlockDialog->show();
connect(m_unlockDialog, TQT_SIGNAL (user1Clicked()), this, TQT_SLOT (slotPasswordReady()));
connect(m_unlockDialog, TQT_SIGNAL (cancelClicked()), this, TQT_SLOT (slotPasswordCancel()));
connect(this, TQT_SIGNAL (signalDecryptionPasswordError(TQString)), m_unlockDialog, TQT_SLOT (slotDialogError(TQString)));
while (m_decryptPasswordValid == false) {
tqApp->processEvents();
}
m_unlockDialog->setEnabled(false);
tqApp->processEvents();
if (m_decryptionPassword.isNull()) {
delete m_unlockDialog;
result["errStr"] = i18n("Decryption aborted");
result["result"] = false;
return result;
}
else {
// Just for some added fun, if udev emits a medium change event, which I then forward, with mounted==0, it stops the MediaProtocol::listDir method dead in its tracks,
// and therefore the media:/ tdeioslave won't refresh after the encrypted device mount
// Therefore, I need to ignore all change events on this device during the mount process and hope nothing bad happens as a result!
if (!m_ignoreDeviceChangeEvents.contains(sdevice->uniqueID())) {
m_ignoreDeviceChangeEvents.append(sdevice->uniqueID());
}
// mount encrypted volume with password
TQStringVariantMap mountResult = sdevice->mountEncryptedDevice(m_decryptionPassword, diskLabel, valids);
TQString mountedPath = mountResult.contains("mountPath") ? mountResult["mountPath"].toString() : TQString::null;
if (mountedPath.isEmpty()) {
if (mountResult.contains("retCode") && mountResult["retCode"].toInt() == 0) {
// Mounting was successful
// Because the TDE hardware backend is event driven it might take a little while for the new enlock mapped device to show up
// Wait up to 30 seconds for it to appear...
for (int i=0;i<300;i++) {
mountedPath = sdevice->mountPath();
if (!mountedPath.isEmpty()) {
break;
}
tqApp->processEvents(50);
usleep(50000);
}
}
}
if (mountedPath.isEmpty()) {
if (mountResult.contains("retCode") && mountResult["retCode"].toInt() == 25600) {
// Probable LUKS failure
// Retry
m_unlockDialog->setEnabled(true);
continue_trying_to_decrypt = true;
}
else {
qerror = i18n("Cannot mount encrypted locked drives!");
qerror = i18n("Unable to mount this device.");
TQString errStr = mountResult.contains("errStr") ? mountResult["errStr"].toString() : TQString::null;
if (!errStr.isEmpty()) {
qerror.append(i18n("<p>Technical details:<br>").append(errStr));
}
continue_trying_to_decrypt = false;
}
}
else {
continue_trying_to_decrypt = false;
}
delete m_unlockDialog;
}
}
} }
if (!qerror.isEmpty()) { if (!qerror.isEmpty()) {

@ -103,9 +103,6 @@ private slots:
void RemoveDeviceHandler(TDEGenericDevice* device); void RemoveDeviceHandler(TDEGenericDevice* device);
void ModifyDeviceHandler(TDEGenericDevice* device); void ModifyDeviceHandler(TDEGenericDevice* device);
void slotPasswordReady();
void slotPasswordCancel();
signals: signals:
void signalDecryptionPasswordError(TQString); void signalDecryptionPasswordError(TQString);
@ -137,11 +134,6 @@ private:
TQString driveUDIFromDeviceUID(TQString uuid); TQString driveUDIFromDeviceUID(TQString uuid);
// Decryption
Dialog* m_unlockDialog;
TQString m_decryptionPassword;
bool m_decryptPasswordValid;
private slots: private slots:
void slotResult(TDEIO::Job *job); void slotResult(TDEIO::Job *job);

@ -1,5 +1,5 @@
[Desktop Entry] [Desktop Entry]
X-TDE-ServiceTypes=media/bluray_mounted,media/bluray_unmounted,media/bluray_encrypted_unlocked,media/bluray_encrypted_locked,media/cdrom_mounted,media/cdrom_unmounted,media/cdrom_encrypted_unlocked,media/cdrom_encrypted_locked,media/cd-r_mounted,media/cd-r_unmounted,media/cd-r_encrypted_unlocked,media/cd-r_encrypted_locked,media/cd-rw_mounted,media/cd-rw_unmounted,media/cd-rw_encrypted_unlocked,media/cd-rw_encrypted_locked,media/dvd_mounted,media/dvd_unmounted,media/dvd_encrypted_unlocked,media/dvd_encrypted_locked,media/audiocd,media/blankbluray,media/blankcd,media/blankdvd,media/blurayvideo,media/dvdvideo,media/svcd,media/vcd X-TDE-ServiceTypes=media/bluray_mounted,media/bluray_unmounted,media/bluray_encrypted_locked,media/cdrom_mounted,media/cdrom_unmounted,media/cdrom_encrypted_locked,media/cd-r_mounted,media/cd-r_unmounted,media/cd-r_encrypted_locked,media/cd-rw_mounted,media/cd-rw_unmounted,media/cd-rw_encrypted_locked,media/dvd_mounted,media/dvd_unmounted,media/dvd_encrypted_locked,media/audiocd,media/blankcd,media/blankdvd,media/dvdvideo,media/svcd,media/vcd
Actions=MediaEject; Actions=MediaEject;
X-TDE-Priority=TopLevel X-TDE-Priority=TopLevel
X-TDE-MediaNotifierHide=true X-TDE-MediaNotifierHide=true

@ -1,5 +1,5 @@
[Desktop Entry] [Desktop Entry]
X-TDE-ServiceTypes=media/bluray_unmounted,media/bluray_encrypted_unlocked,media/cdrom_unmounted,media/cdrom_encrypted_unlocked,media/cd-r_unmounted,media/cd-r_encrypted_unlocked,media/cd-rw_unmounted,media/cd-rw_encrypted_unlocked,media/dvd_unmounted,media/dvd_encrypted_unlocked,media/floppy5_unmounted,media/floppy_unmounted,media/hdd_unmounted,media/hdd_encrypted_unlocked,media/nfs_unmounted,media/removable_unmounted,media/removable_encrypted_unlocked,media/smb_unmounted,media/zip_unmounted,media/camera_unmounted X-TDE-ServiceTypes=media/bluray_unmounted,media/cdrom_unmounted,media/cd-r_unmounted,media/cd-rw_unmounted,media/dvd_unmounted,media/floppy5_unmounted,media/floppy_unmounted,media/hdd_unmounted,media/nfs_unmounted,media/removable_unmounted,media/smb_unmounted,media/zip_unmounted,media/camera_unmounted
Actions=MediaMount; Actions=MediaMount;
X-TDE-Priority=TopLevel X-TDE-Priority=TopLevel
X-TDE-MediaNotifierHide=true X-TDE-MediaNotifierHide=true

@ -1,5 +1,5 @@
[Desktop Entry] [Desktop Entry]
X-TDE-ServiceTypes=media/removable_mounted,media/removable_unmounted,media/removable_encrypted_unlocked,media/camera_mounted,media/camera_unmounted X-TDE-ServiceTypes=media/removable_mounted,media/removable_unmounted,media/camera_mounted,media/camera_unmounted
Actions=MediaSafelyRemove; Actions=MediaSafelyRemove;
X-TDE-Priority=TopLevel X-TDE-Priority=TopLevel
X-TDE-MediaNotifierHide=true X-TDE-MediaNotifierHide=true

Loading…
Cancel
Save