]> cloud.milkyroute.net Git - dolphin.git/blob - src/admin/workerintegration.cpp
Merge branch 'work/zakharafoniam/useful-groups' of https://invent.kde.org/zakharafoni...
[dolphin.git] / src / admin / workerintegration.cpp
1 /*
2 This file is part of the KDE project
3 SPDX-FileCopyrightText: 2022 Felix Ernst <felixernst@kde.org>
4
5 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
6 */
7
8 #include "workerintegration.h"
9
10 #include "dolphinmainwindow.h"
11 #include "dolphinviewcontainer.h"
12
13 #include <KActionCollection>
14 #include <KLocalizedString>
15 #include <KMessageBox>
16 #include <KMessageDialog>
17 #include <KProtocolInfo>
18
19 #include <QAction>
20
21 using namespace Admin;
22
23 QString Admin::warningMessage()
24 {
25 return xi18nc(
26 "@info",
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>");
32 }
33
34 namespace
35 {
36 /** The only WorkerIntegration object that is ever constructed. It is only ever accessed directly from within this file. */
37 WorkerIntegration *instance = nullptr;
38 }
39
40 WorkerIntegration::WorkerIntegration(DolphinMainWindow *parent, QAction *actAsAdminAction)
41 : QObject{parent}
42 , m_actAsAdminAction{actAsAdminAction}
43 {
44 Q_CHECK_PTR(parent);
45 Q_CHECK_PTR(actAsAdminAction);
46
47 connect(parent, &DolphinMainWindow::urlChanged, this, &WorkerIntegration::updateActAsAdminAction);
48
49 connect(actAsAdminAction, &QAction::triggered, this, &WorkerIntegration::toggleActAsAdmin);
50 }
51
52 void WorkerIntegration::createActAsAdminAction(KActionCollection *actionCollection, DolphinMainWindow *dolphinMainWindow)
53 {
54 Q_ASSERT(!instance);
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);
61
62 instance = new WorkerIntegration(dolphinMainWindow, actAsAdminAction);
63 }
64 }
65
66 void WorkerIntegration::exitAdminMode()
67 {
68 if (instance->m_actAsAdminAction->isChecked()) {
69 instance->m_actAsAdminAction->trigger();
70 }
71 }
72
73 void WorkerIntegration::toggleActAsAdmin()
74 {
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);
79
80 if (!risksAccepted) {
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"));
87
88 risksAccepted = warningDialog.exec() != 4 /* Cancel */;
89 if (warningDialog.isDontAskAgainChecked()) {
90 KMessageBox::saveDontShowAgainContinue(warningDontShowAgainName);
91 }
92
93 if (!risksAccepted) {
94 updateActAsAdminAction(); // Uncheck the action
95 return;
96 }
97 }
98
99 url.setScheme(QStringLiteral("admin"));
100 } else if (url.scheme() == QStringLiteral("admin")) {
101 url.setScheme(QStringLiteral("file"));
102 }
103 dolphinMainWindow->changeUrl(url);
104 }
105
106 void WorkerIntegration::updateActAsAdminAction()
107 {
108 if (instance) {
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);
116 } else {
117 instance->m_actAsAdminAction->setEnabled(false);
118 }
119 }
120 }