X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/6c60655ce246a91758f4b9035edf318cb1197a2c..5335cfedbc94f7007bda36c3aad20665487c029a:/src/admin/workerintegration.cpp diff --git a/src/admin/workerintegration.cpp b/src/admin/workerintegration.cpp index f9b587391..0bf6b2890 100644 --- a/src/admin/workerintegration.cpp +++ b/src/admin/workerintegration.cpp @@ -7,7 +7,9 @@ #include "workerintegration.h" +#include "config-dolphin.h" #include "dolphinmainwindow.h" +#include "dolphinpackageinstaller.h" #include "dolphinviewcontainer.h" #include @@ -18,8 +20,77 @@ #include +#include + using namespace Admin; +/** Free file-local functions */ +namespace +{ +/** @returns the translated name of the actAsAdminAction. */ +QString actionName() +{ + return i18nc("@action:inmenu", "Act as Administrator"); +}; + +/** @returns the default keyboard shortcut of the actAsAdminAction. */ +QKeySequence actionDefaultShortcut() +{ + return Qt::CTRL | Qt::SHIFT | Qt::ALT | Qt::Key_A; +}; + +/** @returns whether any worker for the protocol "admin" is available. */ +bool isWorkerInstalled() +{ + return KProtocolInfo::isKnownProtocol(QStringLiteral("admin")); +} +} + +void Admin::guideUserTowardsInstallingAdminWorker() +{ + if (!isWorkerInstalled()) { + std::cout << qPrintable( + xi18nc("@info:shell", + "Dolphin requires %1 to manage system-controlled files, but it is not installed." + "Press %2 to install %1 or %3 to cancel.", + ADMIN_WORKER_PACKAGE_NAME, + QKeySequence{Qt::Key_Enter}.toString(QKeySequence::NativeText), + QKeySequence{Qt::CTRL | Qt::Key_C}.toString(QKeySequence::NativeText))); + std::cin.ignore(); + + /// Installing admin worker + DolphinPackageInstaller adminWorkerInstaller{ADMIN_WORKER_PACKAGE_NAME, QUrl(QStringLiteral("appstream://org.kde.kio.admin")), isWorkerInstalled}; + QObject::connect(&adminWorkerInstaller, &KJob::result, [](KJob *job) { + if (job->error()) { + std::cout << qPrintable(job->errorString()) << std::endl; + exit(1); + } + }); + adminWorkerInstaller.exec(); + } +} + +void Admin::guideUserTowardsUsingAdminWorker() +{ + KuitSetup *kuitSetup = &Kuit::setupForDomain("dolphin"); + kuitSetup->setTagPattern(QStringLiteral("numberedlist"), QStringList{}, Kuit::RichText, ki18nc("tag-format-pattern rich", "
    %1
")); + kuitSetup->setTagPattern(QStringLiteral("numbereditem"), QStringList{}, Kuit::RichText, ki18nc("tag-format-pattern rich", "
  • %1
  • ")); + + KMessageBox::information( + nullptr, + xi18nc("@info", + "Make use of your administrator rights in Dolphin:" + "Navigate to the file or folder you want to change." + "Activate the \"%1\" action either under Open Menu|More|View or Menu Bar|View." + "Default shortcut: %2" + "After authorization you can manage files as an administrator.", + actionName(), + actionDefaultShortcut().toString(QKeySequence::NativeText)), + i18nc("@title:window", "How to Administrate"), + "", + KMessageBox::WindowModal); +} + QString Admin::warningMessage() { return xi18nc( @@ -51,55 +122,60 @@ WorkerIntegration::WorkerIntegration(DolphinMainWindow *parent, QAction *actAsAd void WorkerIntegration::createActAsAdminAction(KActionCollection *actionCollection, DolphinMainWindow *dolphinMainWindow) { - Q_ASSERT(!instance); - if (KProtocolInfo::isKnownProtocol(QStringLiteral("admin"))) { + Q_ASSERT(!instance /* We never want to construct more than one instance, + however in automatic testing sometimes multiple DolphinMainWindows are created, so this assert is diluted to accommodate for that: */ + || instance->parent() != dolphinMainWindow); + if (isWorkerInstalled()) { QAction *actAsAdminAction = actionCollection->addAction(QStringLiteral("act_as_admin")); - actAsAdminAction->setText(i18nc("@action:inmenu", "Act as Administrator")); + actAsAdminAction->setText(actionName()); actAsAdminAction->setIcon(QIcon::fromTheme(QStringLiteral("system-switch-user"))); actAsAdminAction->setCheckable(true); - actionCollection->setDefaultShortcut(actAsAdminAction, Qt::CTRL | Qt::SHIFT | Qt::ALT | Qt::Key_A); + actionCollection->setDefaultShortcut(actAsAdminAction, actionDefaultShortcut()); instance = new WorkerIntegration(dolphinMainWindow, actAsAdminAction); } } -void WorkerIntegration::exitAdminMode() +QAction *WorkerIntegration::FriendAccess::actAsAdminAction() { - if (instance->m_actAsAdminAction->isChecked()) { - instance->m_actAsAdminAction->trigger(); - } + return instance->m_actAsAdminAction; } void WorkerIntegration::toggleActAsAdmin() { auto dolphinMainWindow = static_cast(parent()); QUrl url = dolphinMainWindow->activeViewContainer()->urlNavigator()->locationUrl(); - if (url.scheme() == QStringLiteral("file")) { - bool risksAccepted = !KMessageBox::shouldBeShownContinue(warningDontShowAgainName); - if (!risksAccepted) { - KMessageDialog warningDialog{KMessageDialog::QuestionTwoActions, warningMessage(), dolphinMainWindow}; - warningDialog.setCaption(i18nc("@title:window", "Risks of Acting as an Administrator")); - warningDialog.setIcon(QIcon::fromTheme(QStringLiteral("security-low"))); - warningDialog.setButtons(KGuiItem{i18nc("@action:button", "I Understand and Accept These Risks"), QStringLiteral("data-warning")}, - KStandardGuiItem::cancel()); - warningDialog.setDontAskAgainText(i18nc("@option:check", "Do not warn me about these risks again")); - - risksAccepted = warningDialog.exec() != 4 /* Cancel */; - if (warningDialog.isDontAskAgainChecked()) { - KMessageBox::saveDontShowAgainContinue(warningDontShowAgainName); - } + if (url.scheme() == QStringLiteral("admin")) { + url.setScheme(QStringLiteral("file")); + dolphinMainWindow->changeUrl(url); + return; + } else if (url.scheme() != QStringLiteral("file")) { + return; + } - if (!risksAccepted) { - updateActAsAdminAction(); // Uncheck the action - return; - } + bool risksAccepted = !KMessageBox::shouldBeShownContinue(warningDontShowAgainName); + + if (!risksAccepted) { + KMessageDialog warningDialog{KMessageDialog::QuestionTwoActions, warningMessage(), dolphinMainWindow}; + warningDialog.setCaption(i18nc("@title:window", "Risks of Acting as an Administrator")); + warningDialog.setIcon(QIcon::fromTheme(QStringLiteral("security-low"))); + warningDialog.setButtons(KGuiItem{i18nc("@action:button", "I Understand and Accept These Risks"), QStringLiteral("data-warning")}, + KStandardGuiItem::cancel()); + warningDialog.setDontAskAgainText(i18nc("@option:check", "Do not warn me about these risks again")); + + risksAccepted = warningDialog.exec() != 4 /* Cancel */; + if (warningDialog.isDontAskAgainChecked()) { + KMessageBox::saveDontShowAgainContinue(warningDontShowAgainName); } - url.setScheme(QStringLiteral("admin")); - } else if (url.scheme() == QStringLiteral("admin")) { - url.setScheme(QStringLiteral("file")); + if (!risksAccepted) { + updateActAsAdminAction(); // Uncheck the action + return; + } } + + url.setScheme(QStringLiteral("admin")); dolphinMainWindow->changeUrl(url); } @@ -118,3 +194,5 @@ void WorkerIntegration::updateActAsAdminAction() } } } + +#include "moc_workerintegration.cpp"