File indexing completed on 2024-05-05 17:43:13

0001 /*
0002  *   SPDX-FileCopyrightText: 2017 Kees vd Broek <cryptodude@libertymail.net>
0003  *
0004  *   SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 #include "mountdialog.h"
0007 
0008 #include <QAction>
0009 #include <QCloseEvent>
0010 #include <QMessageBox>
0011 #include <QStyle>
0012 #include <QStyleOption>
0013 
0014 #include <KMessageWidget>
0015 
0016 MountDialog::MountDialog(PlasmaVault::Vault *vault)
0017     : m_vault(vault)
0018 {
0019     m_ui.setupUi(this);
0020     setWindowTitle(i18nc("%1 is the name of the Plasma Vault to open", "Open '%1' Plasma Vault", vault->name()));
0021 
0022     m_errorLabel = new KMessageWidget(this);
0023     m_errorLabel->setMessageType(KMessageWidget::Error);
0024     m_errorLabel->setCloseButtonVisible(false);
0025     m_errorLabel->setIcon(QIcon::fromTheme("dialog-error"));
0026     m_errorLabel->setVisible(false);
0027 
0028     m_detailsAction = new QAction(this);
0029     m_detailsAction->setToolTip(i18n("Details…"));
0030     m_detailsAction->setIcon(QIcon::fromTheme("view-list-details"));
0031 
0032     connect(m_detailsAction, &QAction::triggered, this, [this] {
0033         QString message;
0034         const auto out = m_lastError.out().trimmed();
0035         const auto err = m_lastError.err().trimmed();
0036 
0037         if (!out.isEmpty() && !err.isEmpty()) {
0038             message = i18n("Command output:\n%1\n\nError output: %2", m_lastError.out(), m_lastError.err());
0039         } else {
0040             message = out + err;
0041         }
0042 
0043         auto messageBox = new QMessageBox(QMessageBox::Critical, i18n("Error details"), message, QMessageBox::Ok, this);
0044         messageBox->setAttribute(Qt::WA_DeleteOnClose);
0045         messageBox->show();
0046     });
0047 
0048     auto errorLabelSizePolicy = m_errorLabel->sizePolicy();
0049     errorLabelSizePolicy.setHorizontalPolicy(QSizePolicy::Expanding);
0050     m_errorLabel->setSizePolicy(errorLabelSizePolicy);
0051     m_errorLabel->setVisible(false);
0052     m_ui.formLayout->addRow(QString(), m_errorLabel);
0053     m_ui.vaultName->setText(vault->name());
0054 
0055     QStyleOption option;
0056     option.initFrom(this);
0057     const int iconSize = style()->pixelMetric(QStyle::PM_MessageBoxIconSize, &option, this);
0058     m_ui.icon->setPixmap(QIcon::fromTheme(QStringLiteral("dialog-password")).pixmap(iconSize));
0059 }
0060 
0061 void MountDialog::accept()
0062 {
0063     setCursor(Qt::WaitCursor);
0064     m_errorLabel->setVisible(false);
0065     setEnabled(false);
0066 
0067     m_ui.password->lineEdit()->setEchoMode(QLineEdit::Password);
0068     m_ui.password->lineEdit()->setCursor(Qt::WaitCursor);
0069     QString pwd = m_ui.password->password();
0070     auto future = m_vault->open({{KEY_PASSWORD, pwd}});
0071     const auto result = AsynQt::await(future);
0072 
0073     unsetCursor();
0074     setEnabled(true);
0075     m_ui.password->lineEdit()->unsetCursor();
0076 
0077     if (result) {
0078         QDialog::accept();
0079     } else {
0080         m_lastError = result.error();
0081         m_ui.password->lineEdit()->setText({});
0082 
0083         m_errorLabel->setText(i18n("Failed to open: %1", m_lastError.message()));
0084         m_errorLabel->setVisible(true);
0085 
0086         if (!m_lastError.out().isEmpty() || !m_lastError.err().isEmpty()) {
0087             m_errorLabel->addAction(m_detailsAction);
0088 
0089         } else {
0090             m_errorLabel->removeAction(m_detailsAction);
0091         }
0092     }
0093 }