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 }