Suspend Plasma removable device automounting.

Before doing operations, we connect to DBus session of the original user
and stop kded module for device automounting.

BUG: 368175
This commit is contained in:
Andrius Štikonas 2017-06-07 19:21:59 +02:00
parent 3228fa081a
commit 63b5c8c34c
3 changed files with 26 additions and 3 deletions

View File

@ -47,6 +47,7 @@ ecm_setup_version(${VERSION} VARIABLE_PREFIX KPMCORE
find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS
Core Core
DBus
Gui Gui
Widgets Widgets
) )

View File

@ -43,6 +43,7 @@ target_link_libraries( kpmcore
${UUID_LIBRARIES} ${UUID_LIBRARIES}
${BLKID_LIBRARIES} ${BLKID_LIBRARIES}
${LIBATASMART_LIBRARIES} ${LIBATASMART_LIBRARIES}
Qt5::DBus
KF5::I18n KF5::I18n
KF5::IconThemes KF5::IconThemes
KF5::KIOCore KF5::KIOCore

View File

@ -17,15 +17,17 @@
*************************************************************************/ *************************************************************************/
#include "core/operationrunner.h" #include "core/operationrunner.h"
#include "core/operationstack.h" #include "core/operationstack.h"
#include "ops/operation.h" #include "ops/operation.h"
#include "util/report.h" #include "util/report.h"
#include <QDBusInterface>
#include <QDBusReply>
#include <QMutex> #include <QMutex>
#include <pwd.h>
#include <unistd.h>
/** Constructs an OperationRunner. /** Constructs an OperationRunner.
@param ostack the OperationStack to act on @param ostack the OperationStack to act on
*/ */
@ -47,6 +49,22 @@ void OperationRunner::run()
bool status = true; bool status = true;
// Disable Plasma removable device automounting
unsigned int currentUid = getuid(); // 0 if running as root
unsigned int userId = getpwnam(getlogin())->pw_uid; // uid of original user before sudo
setuid(userId);
QStringList modules;
QDBusConnection bus = QDBusConnection::connectToBus(QDBusConnection::SessionBus, QStringLiteral("sessionBus"));
QDBusInterface kdedInterface( QStringLiteral("org.kde.kded5"), QStringLiteral("/kded"), QStringLiteral("org.kde.kded5"), bus );
QDBusReply<QStringList> reply = kdedInterface.call( QStringLiteral("loadedModules") );
if ( reply.isValid() )
modules = reply.value();
QString automounterService = QStringLiteral("device_automounter");
bool automounter = modules.contains(automounterService);
if (automounter)
kdedInterface.call( QStringLiteral("unloadModule"), automounterService );
setuid(currentUid);
for (int i = 0; i < numOperations(); i++) { for (int i = 0; i < numOperations(); i++) {
suspendMutex().lock(); suspendMutex().lock();
@ -77,6 +95,9 @@ void OperationRunner::run()
msleep(5); msleep(5);
} }
if (automounter)
kdedInterface.call( QStringLiteral("loadModule"), automounterService );
if (!status) if (!status)
emit error(); emit error();
else if (isCancelling()) else if (isCancelling())