From 0338fbeca24517d6f94723dcd6189d403ac96f32 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Sat, 7 May 2022 19:29:20 +0300 Subject: [PATCH] soliduiserver: implement network share mounting Signed-off-by: Ivailo Monev --- soliduiserver/soliduiserver.cpp | 60 ++++++++++++++++++++++++++++++++-- soliduiserver/soliduiserver_helper.cpp | 1 + 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/soliduiserver/soliduiserver.cpp b/soliduiserver/soliduiserver.cpp index 480a407e..917593c4 100644 --- a/soliduiserver/soliduiserver.cpp +++ b/soliduiserver/soliduiserver.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include "deviceactionsdialog.h" @@ -40,7 +41,6 @@ #include "deviceserviceaction.h" #include "devicenothingaction.h" -#include #include K_PLUGIN_FACTORY(SolidUiServerFactory, @@ -125,6 +125,63 @@ void SolidUiServer::onActionDialogFinished() int SolidUiServer::mountDevice(const QString &udi) { Solid::Device device(udi); + + Solid::NetworkShare *networkshare = device.as(); + if (networkshare) { + // qDebug() << Q_FUNC_INFO << udi << networkshare->url(); + + QString devicenode; + QString devicefstype; + switch (networkshare->type()) { + case Solid::NetworkShare::Unknown: { + return int(Solid::ErrorType::MissingDriver); + } + case Solid::NetworkShare::Nfs: { + devicenode = QString::fromLatin1("%1:%2").arg(device.product()).arg(device.vendor()); + devicefstype = QString::fromLatin1("nfs"); + break; + } + case Solid::NetworkShare::Cifs: { + devicenode = QString::fromLatin1("//%1/%2").arg(device.product()).arg(device.vendor()); + devicefstype = QString::fromLatin1("cifs"); + break; + } + default: { + kWarning() << "invalid network share type" << networkshare->type(); + return int(Solid::ErrorType::InvalidOption); + } + } + const QString deviceuuid = device.product(); + + // permission denied on /run/mount so.. using base directory that is writable + const QString mountbase = KGlobal::dirs()->saveLocation("tmp"); + const QString mountpoint = mountbase + QLatin1Char('/') + deviceuuid; + QDir mountdir(mountbase); + if (!mountdir.exists(deviceuuid) && !mountdir.mkdir(deviceuuid)) { + kWarning() << "could not create" << mountpoint; + return int(Solid::ErrorType::OperationFailed); + } + + KAuth::Action mountaction("org.kde.soliduiserver.mountunmounthelper.mount"); + mountaction.setHelperID("org.kde.soliduiserver.mountunmounthelper"); + mountaction.addArgument("device", devicenode); + mountaction.addArgument("mountpoint", mountpoint); + mountaction.addArgument("fstype", devicefstype); + KAuth::ActionReply mountreply = mountaction.execute(); + // qDebug() << "mount" << mountreply.errorCode() << mountreply.errorDescription(); + + if (mountreply == KAuth::ActionReply::SuccessReply) { + return int(Solid::ErrorType::NoError); + } + + if (mountreply == KAuth::ActionReply::UserCancelled) { + return int(Solid::ErrorType::UserCanceled); + } else if (mountreply == KAuth::ActionReply::AuthorizationDenied) { + return int(Solid::ErrorType::UnauthorizedOperation); + } + return int(Solid::ErrorType::OperationFailed); + } + Solid::StorageVolume *storagevolume = device.as(); Solid::Block *block = device.as(); if (!storagevolume || !block) { @@ -190,7 +247,6 @@ int SolidUiServer::mountDevice(const QString &udi) mountaction.addArgument("mountpoint", mountpoint); mountaction.addArgument("fstype", storagevolume->fsType()); KAuth::ActionReply mountreply = mountaction.execute(); - // qDebug() << "mount" << mountreply.errorCode() << mountreply.errorDescription(); if (mountreply == KAuth::ActionReply::SuccessReply) { diff --git a/soliduiserver/soliduiserver_helper.cpp b/soliduiserver/soliduiserver_helper.cpp index 7cd5060f..4b14304a 100644 --- a/soliduiserver/soliduiserver_helper.cpp +++ b/soliduiserver/soliduiserver_helper.cpp @@ -113,6 +113,7 @@ KAuth::ActionReply SolidUiServerHelper::mount(const QVariantMap ¶meters) const QString device = parameters.value("device").toString(); const QString mountpoint = parameters.value("mountpoint").toString(); const QString fstype = parameters.value("fstype").toString(); + // qDebug() << Q_FUNC_INFO << device << mountpoint << fstype; #ifdef Q_OS_LINUX // NOTE: if the filesystem is not listed in /proc/filesystems then mount() will fail -- 2.11.0