2 This file is part of the KDE project
3 SPDX-FileCopyrightText: 2022 Felix Ernst <felixernst@kde.org>
5 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
8 #include "workerintegration.h"
10 #include "dolphinmainwindow.h"
11 #include "dolphinviewcontainer.h"
13 #include <KActionCollection>
14 #include <KLocalizedString>
15 #include <KMessageBox>
16 #include <KMessageDialog>
17 #include <KProtocolInfo>
21 using namespace Admin
;
23 QString
Admin::warningMessage()
27 "<para>You are about to use administrator privileges. While acting as an administrator you can change or replace any file or folder on this system. "
28 "This includes items which are critical for this system to function.</para><para>You are able to <emphasis>delete every users' data</emphasis> on this "
29 "computer and to <emphasis>break this installation beyond repair.</emphasis> Adding just one letter in a folder or file name or its contents can "
30 "render a system <emphasis>unbootable.</emphasis></para><para>There is probably not going to be another warning even if you are about to break this "
31 "system.</para><para>You might want to <emphasis>backup files and folders</emphasis> before proceeding.</para>");
36 /** The only WorkerIntegration object that is ever constructed. It is only ever accessed directly from within this file. */
37 WorkerIntegration
*instance
= nullptr;
40 WorkerIntegration::WorkerIntegration(DolphinMainWindow
*parent
, QAction
*actAsAdminAction
)
42 , m_actAsAdminAction
{actAsAdminAction
}
45 Q_CHECK_PTR(actAsAdminAction
);
47 connect(parent
, &DolphinMainWindow::urlChanged
, this, &WorkerIntegration::updateActAsAdminAction
);
49 connect(actAsAdminAction
, &QAction::triggered
, this, &WorkerIntegration::toggleActAsAdmin
);
52 void WorkerIntegration::createActAsAdminAction(KActionCollection
*actionCollection
, DolphinMainWindow
*dolphinMainWindow
)
55 if (KProtocolInfo::isKnownProtocol(QStringLiteral("admin"))) {
56 QAction
*actAsAdminAction
= actionCollection
->addAction(QStringLiteral("act_as_admin"));
57 actAsAdminAction
->setText(i18nc("@action:inmenu", "Act as Administrator"));
58 actAsAdminAction
->setIcon(QIcon::fromTheme(QStringLiteral("system-switch-user")));
59 actAsAdminAction
->setCheckable(true);
60 actionCollection
->setDefaultShortcut(actAsAdminAction
, Qt::CTRL
| Qt::SHIFT
| Qt::ALT
| Qt::Key_A
);
62 instance
= new WorkerIntegration(dolphinMainWindow
, actAsAdminAction
);
66 void WorkerIntegration::exitAdminMode()
68 if (instance
->m_actAsAdminAction
->isChecked()) {
69 instance
->m_actAsAdminAction
->trigger();
73 void WorkerIntegration::toggleActAsAdmin()
75 auto dolphinMainWindow
= static_cast<DolphinMainWindow
*>(parent());
76 QUrl url
= dolphinMainWindow
->activeViewContainer()->urlNavigator()->locationUrl();
77 if (url
.scheme() == QStringLiteral("file")) {
78 bool risksAccepted
= !KMessageBox::shouldBeShownContinue(warningDontShowAgainName
);
81 KMessageDialog warningDialog
{KMessageDialog::QuestionTwoActions
, warningMessage(), dolphinMainWindow
};
82 warningDialog
.setCaption(i18nc("@title:window", "Risks of Acting as an Administrator"));
83 warningDialog
.setIcon(QIcon::fromTheme(QStringLiteral("security-low")));
84 warningDialog
.setButtons(KGuiItem
{i18nc("@action:button", "I Understand and Accept These Risks"), QStringLiteral("data-warning")},
85 KStandardGuiItem::cancel());
86 warningDialog
.setDontAskAgainText(i18nc("@option:check", "Do not warn me about these risks again"));
88 risksAccepted
= warningDialog
.exec() != 4 /* Cancel */;
89 if (warningDialog
.isDontAskAgainChecked()) {
90 KMessageBox::saveDontShowAgainContinue(warningDontShowAgainName
);
94 updateActAsAdminAction(); // Uncheck the action
99 url
.setScheme(QStringLiteral("admin"));
100 } else if (url
.scheme() == QStringLiteral("admin")) {
101 url
.setScheme(QStringLiteral("file"));
103 dolphinMainWindow
->changeUrl(url
);
106 void WorkerIntegration::updateActAsAdminAction()
109 const QString currentUrlScheme
= static_cast<DolphinMainWindow
*>(instance
->parent())->activeViewContainer()->url().scheme();
110 if (currentUrlScheme
== QStringLiteral("file")) {
111 instance
->m_actAsAdminAction
->setEnabled(true);
112 instance
->m_actAsAdminAction
->setChecked(false);
113 } else if (currentUrlScheme
== QStringLiteral("admin")) {
114 instance
->m_actAsAdminAction
->setEnabled(true);
115 instance
->m_actAsAdminAction
->setChecked(true);
117 instance
->m_actAsAdminAction
->setEnabled(false);