diff --git a/src/core/job.cpp b/src/core/job.cpp --- a/src/core/job.cpp +++ b/src/core/job.cpp @@ -33,7 +33,6 @@ #include #include "slave.h" #include "scheduler.h" -#include "slavebase.h" using namespace KIO; @@ -263,97 +262,73 @@ return d_func()->m_outgoingMetaData; } -PrivilegeOperationStatus JobPrivate::tryAskPrivilegeOpConfirmation() +QByteArray JobPrivate::privilegeOperationData() { - if (m_confirmationAsked) { - return OperationAllowed; - } + PrivilegeOperationStatus status = OperationNotAllowed; if (m_parentJob) { - if (!m_parentJob->d_func()->m_privilegeExecutionEnabled) { - return OperationNotAllowed; - } + QByteArray jobData = m_parentJob->d_func()->privilegeOperationData(); + // Copy meta-data from parent job + m_incomingMetaData.insert(QStringLiteral("TestData"), m_parentJob->queryMetaData(QStringLiteral("TestData"))); + return jobData; + } else { + if (m_privilegeExecutionEnabled) { + status = OperationAllowed; + switch (m_operationType) { + case ChangeAttr: + m_caption = i18n("Change Attribute"); + m_message = i18n("Root privileges are required to change file attributes. " + "Do you want to continue?"); + break; + case Copy: + m_caption = i18n("Copy Files"); + m_message = i18n("Root privileges are required to complete the copy operation. " + "Do you want to continue?"); + break; + case Delete: + m_caption = i18n("Delete Files"); + m_message = i18n("Root privileges are required to complete the delete operation. " + "However, doing so may damage your system. Do you want to continue?"); + break; + case MkDir: + m_caption = i18n("Create Folder"); + m_message = i18n("Root privileges are required to create this folder. " + "Do you want to continue?"); + break; + case Move: + m_caption = i18n("Move Items"); + m_message = i18n("Root privileges are required to complete the move operation. " + "Do you want to continue?"); + break; + case Rename: + m_caption = i18n("Rename"); + m_message = i18n("Root privileges are required to complete renaming. " + "Do you want to continue?"); + break; + case Symlink: + m_caption = i18n("Create Symlink"); + m_message = i18n("Root privileges are required to create a symlink. " + "Do you want to continue?"); + break; + case Transfer: + m_caption = i18n("Transfer data"); + m_message = i18n("Root privileges are required to complete transferring data. " + "Do you want to continue?"); + default: + break; + } - if (!m_parentJob->d_func()->m_confirmationAsked) { - PrivilegeOperationStatus opStatus = m_parentJob->d_func()->tryAskPrivilegeOpConfirmation(); - if (opStatus == OperationAllowed) { - // Copy meta-data from parent job - m_incomingMetaData.insert(QStringLiteral("TestData"), m_parentJob->queryMetaData(QStringLiteral("TestData"))); - m_confirmationAsked = true; + if (m_outgoingMetaData.value(QStringLiteral("UnitTesting")) == QLatin1String("true")) { + // Set meta-data for the top-level job + m_incomingMetaData.insert(QStringLiteral("TestData"), QStringLiteral("PrivilegeOperationAllowed")); } - return opStatus; - } else { - return OperationAllowed; } - } else { - // In case of SimpleJob like chmod, chown, etc. which don't accept JobFlags - if (!m_privilegeExecutionEnabled) { - return OperationNotAllowed; - } - } - - switch (m_operationType) { - case ChangeAttr: - m_caption = i18n("Change Attribute"); - m_message = i18n("Root privileges are required to change file attributes. " - "Do you want to continue?"); - break; - case Copy: - m_caption = i18n("Copy Files"); - m_message = i18n("Root privileges are required to complete the copy operation. " - "Do you want to continue?"); - break; - case Delete: - m_caption = i18n("Delete Files"); - m_message = i18n("Root privileges are required to complete the delete operation. " - "However, doing so may damage your system. Do you want to continue?"); - break; - case MkDir: - m_caption = i18n("Create Folder"); - m_message = i18n("Root privileges are required to create this folder. " - "Do you want to continue?"); - break; - case Move: - m_caption = i18n("Move Items"); - m_message = i18n("Root privileges are required to complete the move operation. " - "Do you want to continue?"); - break; - case Rename: - m_caption = i18n("Rename"); - m_message = i18n("Root privileges are required to complete renaming. " - "Do you want to continue?"); - break; - case Symlink: - m_caption = i18n("Create Symlink"); - m_message = i18n("Root privileges are required to create a symlink. " - "Do you want to continue?"); - break; - case Transfer: - m_caption = i18n("Transfer data"); - m_message = i18n("Root privileges are required to complete transferring data. " - "Do you want to continue?"); - default: - break; - } - - if (m_outgoingMetaData.value(QStringLiteral("UnitTesting")) == QLatin1String("true")) { - // Set meta-data for the top-level job - m_incomingMetaData.insert(QStringLiteral("TestData"), QStringLiteral("PrivilegeOperationAllowed")); - return OperationAllowed; } - if (!m_uiDelegateExtension) { - return OperationNotAllowed; - } - - int status = m_uiDelegateExtension->requestMessageBox(JobUiDelegateExtension::WarningContinueCancel, - m_message, m_caption, i18n("Continue"), i18n("Cancel")); - m_confirmationAsked = true; - - if (status == SlaveBase::Cancel) { - return OperationCanceled; - } - return OperationAllowed; + QByteArray parentJobData; + QDataStream ds(&parentJobData, QIODevice::WriteOnly); + ds << status << m_caption << m_message; + return parentJobData; } ////////////////////////// diff --git a/src/core/job_p.h b/src/core/job_p.h --- a/src/core/job_p.h +++ b/src/core/job_p.h @@ -49,7 +49,7 @@ JobPrivate() : m_parentJob(nullptr), m_extraFlags(0), m_uiDelegateExtension(KIO::defaultJobUiDelegateExtension()), - m_privilegeExecutionEnabled(false), m_confirmationAsked(false) + m_privilegeExecutionEnabled(false) { } @@ -89,11 +89,10 @@ Job *q_ptr; // For privilege operation bool m_privilegeExecutionEnabled; - bool m_confirmationAsked; QString m_caption, m_message; FileOperationType m_operationType; - PrivilegeOperationStatus tryAskPrivilegeOpConfirmation(); + QByteArray privilegeOperationData(); void slotSpeed(KJob *job, unsigned long speed); static void emitMoving(KIO::Job *, const QUrl &src, const QUrl &dest); diff --git a/src/core/simplejob.cpp b/src/core/simplejob.cpp --- a/src/core/simplejob.cpp +++ b/src/core/simplejob.cpp @@ -338,7 +338,7 @@ void SimpleJobPrivate::slotPrivilegeOperationRequested() { - m_slave->send(MSG_PRIVILEGE_EXEC, QByteArray::number(tryAskPrivilegeOpConfirmation())); + m_slave->send(MSG_PRIVILEGE_EXEC, privilegeOperationData()); } ////////// diff --git a/src/core/slavebase.cpp b/src/core/slavebase.cpp --- a/src/core/slavebase.cpp +++ b/src/core/slavebase.cpp @@ -80,7 +80,8 @@ { public: SlaveBase *q; - SlaveBasePrivate(SlaveBase *owner): q(owner), nextTimeoutMsecs(0), m_passwdServerClient(nullptr) + SlaveBasePrivate(SlaveBase *owner): q(owner), nextTimeoutMsecs(0), m_passwdServerClient(nullptr), + m_privilegeOperationStatus(OperationNotAllowed) { if (!qEnvironmentVariableIsEmpty("KIOSLAVE_ENABLE_TESTMODE")) { QStandardPaths::enableTestMode(true); @@ -121,6 +122,8 @@ KPasswdServerClient *m_passwdServerClient; bool m_rootEntryListed = false; + int m_privilegeOperationStatus; + // Reconstructs configGroup from configData and mIncomingMetaData void rebuildConfig() { @@ -452,6 +455,7 @@ //reset d->totalSize = 0; d->inOpenLoop = false; + d->m_privilegeOperationStatus = OperationNotAllowed; } void SlaveBase::connected() @@ -494,6 +498,7 @@ d->totalSize = 0; d->inOpenLoop = false; d->m_rootEntryListed = false; + d->m_privilegeOperationStatus = OperationNotAllowed; } void SlaveBase::needSubUrlData() @@ -1461,8 +1466,13 @@ PrivilegeOperationStatus SlaveBase::requestPrivilegeOperation() { - QByteArray buffer; - send(MSG_PRIVILEGE_EXEC); - waitForAnswer(MSG_PRIVILEGE_EXEC, 0, buffer); - return KIO::PrivilegeOperationStatus(buffer.toInt()); + if (d->m_privilegeOperationStatus == OperationNotAllowed) { + QByteArray buffer; + send(MSG_PRIVILEGE_EXEC); + waitForAnswer(MSG_PRIVILEGE_EXEC, 0, buffer); + QDataStream ds(buffer); + ds >> d->m_privilegeOperationStatus; + } + + return KIO::PrivilegeOperationStatus(d->m_privilegeOperationStatus); }