X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/6c60655ce246a91758f4b9035edf318cb1197a2c..5433fb3b87cda9052af084cd47f6fbb393767d48:/src/admin/bar.cpp diff --git a/src/admin/bar.cpp b/src/admin/bar.cpp index 2b65127f6..e01ef81a5 100644 --- a/src/admin/bar.cpp +++ b/src/admin/bar.cpp @@ -7,16 +7,20 @@ #include "bar.h" +#include "dolphinviewcontainer.h" #include "workerintegration.h" #include #include +#include +#include #include #include #include #include #include +#include #include #include #include @@ -24,15 +28,21 @@ using namespace Admin; -Bar::Bar(QWidget *parent) - : AnimatedHeightWidget{parent} +namespace +{ +QPointer waitingForExpirationOfAuthorization; +} + +Bar::Bar(DolphinViewContainer *parentViewContainer) + : AnimatedHeightWidget{parentViewContainer} + , m_parentViewContainer{parentViewContainer} { setAutoFillBackground(true); updateColors(); QWidget *contenntsContainer = prepareContentsContainer(); - m_fullLabelString = i18nc("@info label above the view explaining the state", "Acting as an Administrator – Be careful!"); + m_fullLabelString = i18nc("@info label above the view explaining the state", "Acting as an Administrator — Be careful!"); m_shortLabelString = i18nc("@info label above the view explaining the state, keep short", "Acting as Admin"); m_label = new QLabel(contenntsContainer); m_label->setMinimumWidth(0); @@ -41,11 +51,24 @@ Bar::Bar(QWidget *parent) m_warningButton = new KContextualHelpButton(warningMessage(), nullptr, contenntsContainer); m_warningButton->setIcon(QIcon::fromTheme(QStringLiteral("emblem-warning"))); - m_closeButton = new QPushButton(QIcon::fromTheme(QStringLiteral("window-close-symbolic")), "", contenntsContainer); - m_closeButton->setToolTip(i18nc("@action:button", "Stop Acting as an Administrator")); + m_closeButton = new QPushButton(QIcon::fromTheme(QStringLiteral("window-close-symbolic")), + i18nc("@action:button Finish/Stop/Done acting as an admin", "Finish"), + contenntsContainer); + m_closeButton->setToolTip(i18nc("@info:tooltip", "Finish acting as an administrator")); m_closeButton->setFlat(true); - connect(m_closeButton, &QAbstractButton::clicked, this, &Bar::activated); // Make sure the view connected to this bar is active before exiting admin mode. - connect(m_closeButton, &QAbstractButton::clicked, this, &WorkerIntegration::exitAdminMode); + connect(m_closeButton, &QAbstractButton::clicked, m_parentViewContainer, [this]() { + m_parentViewContainer->setActive(true); // Make sure the view connected to this bar is active before exiting admin mode. + QAction *actAsAdminAction = WorkerIntegration::FriendAccess::actAsAdminAction(); + if (actAsAdminAction->isChecked()) { + actAsAdminAction->trigger(); + } + }); + connect(m_parentViewContainer->view(), &DolphinView::urlChanged, this, [this](const QUrl &url) { + // The bar is closely related to administrative rights, so we want to hide it instantly when we are no longer using the admin protocol. + if (url.scheme() != QStringLiteral("admin")) { + setVisible(false, WithAnimation); + } + }); QHBoxLayout *layout = new QHBoxLayout(contenntsContainer); auto contentsMargins = layout->contentsMargins(); @@ -63,8 +86,15 @@ Bar::Bar(QWidget *parent) bool Bar::event(QEvent *event) { - if (event->type() == QEvent::PaletteChange) { + switch (event->type()) { + case QEvent::PaletteChange: updateColors(); + break; + case QEvent::Show: + hideTheNextTimeAuthorizationExpires(); + break; + default: + break; } return AnimatedHeightWidget::event(event); } @@ -75,6 +105,52 @@ void Bar::resizeEvent(QResizeEvent *resizeEvent) return QWidget::resizeEvent(resizeEvent); } +void Bar::hideTheNextTimeAuthorizationExpires() +{ + if (waitingForExpirationOfAuthorization.isNull()) { + QByteArray packedArgs; + QDataStream stream(&packedArgs, QIODevice::WriteOnly); + stream << (int)1; + waitingForExpirationOfAuthorization = KIO::special(QUrl(QStringLiteral("admin:/")), packedArgs, KIO::HideProgressInfo); + waitingForExpirationOfAuthorization->setUiDelegate(KIO::createDefaultJobUiDelegate(KJobUiDelegate::AutoWarningHandlingEnabled, m_parentViewContainer)); + + connect(waitingForExpirationOfAuthorization, &KJob::finished, this, [](KJob *job) { + if (job->error()) { + job->uiDelegate()->showErrorMessage(); + } + }); + } + + connect(waitingForExpirationOfAuthorization, &KJob::finished, this, [this](KJob *job) { + if (job->error()) { + return; + } + // We exit admin mode now to avoid random password prompts popping up. + QUrl viewContainerUrl = m_parentViewContainer->url(); + if (viewContainerUrl.scheme() != QStringLiteral("admin")) { + return; + } + viewContainerUrl.setScheme("file"); + m_parentViewContainer->setUrl(viewContainerUrl); + + // Explain to users that their admin authorization expired. + if (!m_reenableActAsAdminAction) { // This code is similar to parts of DolphinViewContainer::slotViewErrorMessage(). + auto actAsAdminAction = WorkerIntegration::FriendAccess::actAsAdminAction(); + m_reenableActAsAdminAction = + new QAction{actAsAdminAction->icon(), i18nc("@action:button shown after acting as admin ended", "Act as Administrator Again"), this}; + m_reenableActAsAdminAction->setToolTip(actAsAdminAction->toolTip()); + m_reenableActAsAdminAction->setWhatsThis(actAsAdminAction->whatsThis()); + connect(m_reenableActAsAdminAction, &QAction::triggered, this, [this, actAsAdminAction]() { + m_parentViewContainer->setActive(true); + actAsAdminAction->trigger(); + }); + } + m_parentViewContainer->showMessage(i18nc("@info", "Administrator authorization has expired."), + KMessageWidget::Information, + {m_reenableActAsAdminAction}); + }); +} + void Bar::updateColors() { QPalette palette = parentWidget()->palette();