From b54fcda719b94c629c11e9b3462f2c9a2c5a9666 Mon Sep 17 00:00:00 2001 From: Michele Calgaro Date: Sun, 25 Aug 2019 11:21:21 +0900 Subject: tdeioslave media: fixed handling of mountable state for encrypted devices. Signed-off-by: Michele Calgaro --- tdeioslave/media/libmediacommon/medium.cpp | 18 +++++++++++++++-- tdeioslave/media/mediaimpl.cpp | 9 +++++++-- tdeioslave/media/mediamanager/halbackend.cpp | 8 +++----- tdeioslave/media/mediamanager/medialist.cpp | 10 +++++++--- .../media/mediamanager/tdehardwarebackend.cpp | 23 ++++++++++++++++++---- .../media/mounthelper/tdeio_media_mounthelper.cpp | 4 ++-- 6 files changed, 54 insertions(+), 18 deletions(-) diff --git a/tdeioslave/media/libmediacommon/medium.cpp b/tdeioslave/media/libmediacommon/medium.cpp index 7ded6f0f1..c185a8c9f 100644 --- a/tdeioslave/media/libmediacommon/medium.cpp +++ b/tdeioslave/media/libmediacommon/medium.cpp @@ -179,7 +179,14 @@ void Medium::setDeviceNode(const TQString &deviceNode) void Medium::setMountPoint(const TQString &mountPoint) { - m_properties[MOUNT_POINT] = mountPoint; + if (isMountable()) + { + m_properties[MOUNT_POINT] = mountPoint; + } + else + { + m_properties[MOUNT_POINT] = TQString::null; + } } void Medium::setFsType(const TQString &fsType) @@ -189,7 +196,14 @@ void Medium::setFsType(const TQString &fsType) void Medium::setMounted(bool mounted) { - m_properties[MOUNTED] = mounted ? "true" : "false"; + if (isMountable()) + { + m_properties[MOUNTED] = mounted ? "true" : "false"; + } + else + { + m_properties[MOUNTED] = "false"; + } } void Medium::setBaseURL(const TQString &baseURL) diff --git a/tdeioslave/media/mediaimpl.cpp b/tdeioslave/media/mediaimpl.cpp index dc839c4a0..ff66375aa 100644 --- a/tdeioslave/media/mediaimpl.cpp +++ b/tdeioslave/media/mediaimpl.cpp @@ -148,7 +148,7 @@ bool MediaImpl::listMedia(TQValueList &list) Medium::MList::const_iterator it = media.begin(); Medium::MList::const_iterator end = media.end(); - for(; it!=end; ++it) + for(; it != end; ++it) { if (!(*it).hidden()) { entry.clear(); @@ -365,6 +365,11 @@ void MediaImpl::slotStatResult(TDEIO::Job *job) TDEIO::UDSEntry MediaImpl::extractUrlInfos(const KURL &url) { + if (url.isEmpty()) + { + return TDEIO::UDSEntry(); + } + m_entryBuffer.clear(); TDEIO::StatJob *job = TDEIO::stat(url, false); @@ -448,7 +453,7 @@ void MediaImpl::createMediumEntry(TDEIO::UDSEntry& entry, else { KURL url = medium.prettyBaseURL(); - entry+= extractUrlInfos(url); + entry += extractUrlInfos(url); } } diff --git a/tdeioslave/media/mediamanager/halbackend.cpp b/tdeioslave/media/mediamanager/halbackend.cpp index e05b5c3e8..6badc33c3 100644 --- a/tdeioslave/media/mediamanager/halbackend.cpp +++ b/tdeioslave/media/mediamanager/halbackend.cpp @@ -506,13 +506,13 @@ void HALBackend::setVolumeProperties(Medium* medium) medium->setEncrypted(true); char* clearUdi = libhal_volume_crypto_get_clear_volume_udi(m_halContext, halVolume); - TQString clearUdiString; + TQString clearUdiString; if (clearUdi != NULL) { kdDebug(1219) << "HALBackend::setVolumeProperties : crypto clear volume avail - " << clearUdi << endl; halClearVolume = libhal_volume_from_udi(m_halContext, clearUdi); // ignore if halClearVolume is NULL -> just not unlocked in this case - clearUdiString = clearUdi; - libhal_free_string(clearUdi); + clearUdiString = clearUdi; + libhal_free_string(clearUdi); } if (halClearVolume) @@ -660,8 +660,6 @@ void HALBackend::setVolumeProperties(Medium* medium) case LIBHAL_DRIVE_TYPE_PORTABLE_AUDIO_PLAYER: { medium->setIconName("ipod" + MOUNTED_ICON_SUFFIX); - medium->setMountable(false); - if (libhal_device_get_property_QString(m_halContext, driveUdi.latin1(), "info.product") == "iPod" && KProtocolInfo::isKnownProtocol( TQString("ipod") ) ) { diff --git a/tdeioslave/media/mediamanager/medialist.cpp b/tdeioslave/media/mediamanager/medialist.cpp index dc0a108d6..b2dd84c60 100644 --- a/tdeioslave/media/mediamanager/medialist.cpp +++ b/tdeioslave/media/mediamanager/medialist.cpp @@ -135,7 +135,6 @@ bool MediaList::changeMediumState(const Medium &medium, bool allowNotification) m->setMountable(medium.isMountable()); if (medium.isMountable()) { - m->setMountable(true); m->setDeviceNode(medium.deviceNode()); m->setClearDeviceUdi(medium.clearDeviceUdi()); m->setMountPoint(medium.mountPoint()); @@ -226,6 +225,11 @@ bool MediaList::changeMediumState(const TQString &id, Medium *medium = m_idMap[id]; + if (medium->deviceNode().isEmpty() || !medium->isMountable()) + { + return false; + } + medium->setMountable(true); medium->setDeviceNode(deviceNode); medium->setMountPoint(mountPoint); @@ -267,13 +271,13 @@ bool MediaList::changeMediumState(const TQString &id, bool mounted, Medium *medium = m_idMap[id]; - medium->setMountable(true); - medium->setMounted(mounted); if (medium->deviceNode().isEmpty() || !medium->isMountable()) { return false; } + medium->setMounted(mounted); + if (!mimeType.isEmpty()) { medium->setMimeType( mimeType ); diff --git a/tdeioslave/media/mediamanager/tdehardwarebackend.cpp b/tdeioslave/media/mediamanager/tdehardwarebackend.cpp index dc780d455..74180ca9a 100644 --- a/tdeioslave/media/mediamanager/tdehardwarebackend.cpp +++ b/tdeioslave/media/mediamanager/tdehardwarebackend.cpp @@ -452,7 +452,7 @@ void TDEBackend::setVolumeProperties(Medium* medium) TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices(); - TDEStorageDevice * sdevice = hwdevices->findDiskByUID(medium->id()); + TDEStorageDevice *sdevice = hwdevices->findDiskByUID(medium->id()); if (!sdevice) { return; } @@ -465,7 +465,15 @@ void TDEBackend::setVolumeProperties(Medium* medium) medium->setEncrypted(false); } - medium->setMountable(true); + if (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) || sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted) || + sdevice->fileSystemUsage().upper() == "RAID") { + // Encrypted disks or device underlying other devices are not mountable + medium->setMountable(false); + } + else { + medium->setMountable(true); + } + medium->setDeviceNode(sdevice->deviceNode()); medium->setMountPoint(sdevice->mountPath()); medium->setFsType(sdevice->fileSystemName()); @@ -785,7 +793,6 @@ void TDEBackend::setVolumeProperties(Medium* medium) } if (sdevice->isDiskOfType(TDEDiskDeviceType::MediaDevice)) { medium->setIconName("ipod" + MOUNTED_ICON_SUFFIX); - medium->setMountable(false); if (sdevice->vendorModel().upper().contains("IPOD") && KProtocolInfo::isKnownProtocol(TQString("ipod"))) { medium->setBaseURL("ipod:/"); medium->setMountable(true); @@ -829,7 +836,15 @@ bool TDEBackend::setFloppyProperties(Medium* medium) medium->setEncrypted(false); } - medium->setMountable(true); + if (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) || sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted) || + sdevice->fileSystemUsage().upper() == "RAID") { + // Encrypted disks or device underlying other devices are not mountable + medium->setMountable(false); + } + else { + medium->setMountable(true); + } + medium->setDeviceNode(sdevice->deviceNode()); medium->setMountPoint(sdevice->mountPath()); medium->setFsType(sdevice->fileSystemName()); diff --git a/tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp b/tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp index f02c93c84..d3fb4ac35 100644 --- a/tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp +++ b/tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp @@ -81,9 +81,9 @@ MountHelper::MountHelper() : TDEApplication() return; } - if (!medium.isMountable() && !args->isSet("e") && !args->isSet("s")) + if (!medium.isMountable() && !medium.isEncrypted() && !args->isSet("e") && !args->isSet("s")) { - m_errorStr = i18n("%1 is not a mountable media.").arg(url.prettyURL()); + m_errorStr = i18n("%1 is not a mountable or encrypted media.").arg(url.prettyURL()); TQTimer::singleShot(0, this, TQT_SLOT(error())); return; } -- cgit v1.2.1