File indexing completed on 2024-06-23 05:13:49

0001 /* -*- mode: c++; c-basic-offset:4 -*-
0002     crypto/gui/decryptverifyoperationwidget.cpp
0003 
0004     This file is part of Kleopatra, the KDE keymanager
0005     SPDX-FileCopyrightText: 2007 Klarälvdalens Datakonsult AB
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #include <config-kleopatra.h>
0011 
0012 #include "decryptverifyoperationwidget.h"
0013 
0014 #include <utils/archivedefinition.h>
0015 
0016 #include <Libkleo/FileNameRequester>
0017 
0018 #include <KLocalizedString>
0019 
0020 #include <QCheckBox>
0021 #include <QComboBox>
0022 #include <QLabel>
0023 #include <QStackedLayout>
0024 
0025 using namespace Kleo;
0026 using namespace Kleo::Crypto::Gui;
0027 
0028 class DecryptVerifyOperationWidget::Private
0029 {
0030     friend class ::Kleo::Crypto::Gui::DecryptVerifyOperationWidget;
0031     DecryptVerifyOperationWidget *const q;
0032 
0033 public:
0034     explicit Private(DecryptVerifyOperationWidget *qq);
0035     ~Private();
0036 
0037     void enableDisableWidgets()
0038     {
0039         const bool detached = ui.verifyDetachedCB.isChecked();
0040         const bool archive = ui.archiveCB.isChecked();
0041         ui.archiveCB.setEnabled(!detached);
0042         ui.archivesCB.setEnabled(archive && !detached);
0043     }
0044 
0045 private:
0046     struct UI {
0047         QGridLayout glay;
0048         QLabel inputLB;
0049         QStackedLayout inputStack;
0050         QLabel inputFileNameLB;
0051         FileNameRequester inputFileNameRQ;
0052         //------
0053         QCheckBox verifyDetachedCB;
0054         //------
0055         QLabel signedDataLB;
0056         QStackedLayout signedDataStack;
0057         QLabel signedDataFileNameLB;
0058         FileNameRequester signedDataFileNameRQ;
0059         //------
0060         QHBoxLayout hlay;
0061         QCheckBox archiveCB;
0062         QComboBox archivesCB;
0063 
0064         explicit UI(DecryptVerifyOperationWidget *q);
0065     } ui;
0066 };
0067 
0068 DecryptVerifyOperationWidget::Private::UI::UI(DecryptVerifyOperationWidget *q)
0069     : glay(q)
0070     , inputLB(i18n("Input file:"), q)
0071     , inputStack()
0072     , inputFileNameLB(q)
0073     , inputFileNameRQ(q)
0074     , verifyDetachedCB(i18n("&Input file is a detached signature"), q)
0075     , signedDataLB(i18n("&Signed data:"), q)
0076     , signedDataStack()
0077     , signedDataFileNameLB(q)
0078     , signedDataFileNameRQ(q)
0079     , hlay()
0080     , archiveCB(i18n("&Input file is an archive; unpack with:"), q)
0081     , archivesCB(q)
0082 {
0083     KDAB_SET_OBJECT_NAME(glay);
0084     KDAB_SET_OBJECT_NAME(inputLB);
0085     KDAB_SET_OBJECT_NAME(inputStack);
0086     KDAB_SET_OBJECT_NAME(inputFileNameLB);
0087     KDAB_SET_OBJECT_NAME(inputFileNameRQ);
0088     KDAB_SET_OBJECT_NAME(verifyDetachedCB);
0089     KDAB_SET_OBJECT_NAME(signedDataLB);
0090     KDAB_SET_OBJECT_NAME(signedDataStack);
0091     KDAB_SET_OBJECT_NAME(signedDataFileNameLB);
0092     KDAB_SET_OBJECT_NAME(signedDataFileNameRQ);
0093     KDAB_SET_OBJECT_NAME(hlay);
0094     KDAB_SET_OBJECT_NAME(archiveCB);
0095     KDAB_SET_OBJECT_NAME(archivesCB);
0096 
0097     inputStack.setContentsMargins(0, 0, 0, 0);
0098     signedDataStack.setContentsMargins(0, 0, 0, 0);
0099 
0100     signedDataLB.setEnabled(false);
0101     signedDataFileNameLB.setEnabled(false);
0102     signedDataFileNameRQ.setEnabled(false);
0103     archivesCB.setEnabled(false);
0104 
0105     glay.setContentsMargins(0, 0, 0, 0);
0106     glay.addWidget(&inputLB, 0, 0);
0107     glay.addLayout(&inputStack, 0, 1);
0108     inputStack.addWidget(&inputFileNameLB);
0109     inputStack.addWidget(&inputFileNameRQ);
0110 
0111     glay.addWidget(&verifyDetachedCB, 1, 0, 1, 2);
0112 
0113     glay.addWidget(&signedDataLB, 2, 0);
0114     glay.addLayout(&signedDataStack, 2, 1);
0115     signedDataStack.addWidget(&signedDataFileNameLB);
0116     signedDataStack.addWidget(&signedDataFileNameRQ);
0117 
0118     glay.addLayout(&hlay, 3, 0, 1, 2);
0119     hlay.addWidget(&archiveCB);
0120     hlay.addWidget(&archivesCB, 1);
0121 
0122     connect(&verifyDetachedCB, &QCheckBox::toggled, &signedDataLB, &QLabel::setEnabled);
0123     connect(&verifyDetachedCB, &QCheckBox::toggled, &signedDataFileNameLB, &QLabel::setEnabled);
0124     connect(&verifyDetachedCB, &QCheckBox::toggled, &signedDataFileNameRQ, &FileNameRequester::setEnabled);
0125     connect(&verifyDetachedCB, SIGNAL(toggled(bool)), q, SLOT(enableDisableWidgets()));
0126     connect(&archiveCB, SIGNAL(toggled(bool)), q, SLOT(enableDisableWidgets()));
0127 
0128     connect(&verifyDetachedCB, &QCheckBox::toggled, q, &DecryptVerifyOperationWidget::changed);
0129     connect(&inputFileNameRQ, &FileNameRequester::fileNameChanged, q, &DecryptVerifyOperationWidget::changed);
0130     connect(&signedDataFileNameRQ, &FileNameRequester::fileNameChanged, q, &DecryptVerifyOperationWidget::changed);
0131 }
0132 
0133 DecryptVerifyOperationWidget::Private::Private(DecryptVerifyOperationWidget *qq)
0134     : q(qq)
0135     , ui(q)
0136 {
0137 }
0138 
0139 DecryptVerifyOperationWidget::Private::~Private()
0140 {
0141 }
0142 
0143 DecryptVerifyOperationWidget::DecryptVerifyOperationWidget(QWidget *p)
0144     : QWidget(p)
0145     , d(new Private(this))
0146 {
0147     setMode(DecryptVerifyOpaque);
0148 }
0149 
0150 DecryptVerifyOperationWidget::~DecryptVerifyOperationWidget()
0151 {
0152 }
0153 
0154 void DecryptVerifyOperationWidget::setArchiveDefinitions(const std::vector<std::shared_ptr<ArchiveDefinition>> &archiveDefinitions)
0155 {
0156     d->ui.archivesCB.clear();
0157     for (const std::shared_ptr<ArchiveDefinition> &ad : archiveDefinitions) {
0158         d->ui.archivesCB.addItem(ad->label(), QVariant::fromValue(ad));
0159     }
0160 }
0161 
0162 void DecryptVerifyOperationWidget::setMode(Mode mode)
0163 {
0164     setMode(mode, std::shared_ptr<ArchiveDefinition>());
0165 }
0166 
0167 void DecryptVerifyOperationWidget::setMode(Mode mode, const std::shared_ptr<ArchiveDefinition> &ad)
0168 {
0169     d->ui.verifyDetachedCB.setChecked(mode != DecryptVerifyOpaque);
0170 
0171     QWidget *inputWidget;
0172     QWidget *signedDataWidget;
0173     if (mode == VerifyDetachedWithSignedData) {
0174         inputWidget = &d->ui.inputFileNameRQ;
0175         signedDataWidget = &d->ui.signedDataFileNameLB;
0176     } else {
0177         inputWidget = &d->ui.inputFileNameLB;
0178         signedDataWidget = &d->ui.signedDataFileNameRQ;
0179     }
0180 
0181     d->ui.inputStack.setCurrentWidget(inputWidget);
0182     d->ui.signedDataStack.setCurrentWidget(signedDataWidget);
0183 
0184     d->ui.inputLB.setBuddy(inputWidget);
0185     d->ui.signedDataLB.setBuddy(signedDataWidget);
0186 
0187     d->ui.archiveCB.setChecked(ad.get() != nullptr);
0188     for (int i = 0, end = d->ui.archivesCB.count(); i != end; ++i) {
0189         if (ad == d->ui.archivesCB.itemData(i).value<std::shared_ptr<ArchiveDefinition>>()) {
0190             d->ui.archivesCB.setCurrentIndex(i);
0191             return;
0192         }
0193     }
0194     Q_EMIT changed();
0195 }
0196 
0197 DecryptVerifyOperationWidget::Mode DecryptVerifyOperationWidget::mode() const
0198 {
0199     if (d->ui.verifyDetachedCB.isChecked())
0200         if (d->ui.inputStack.currentIndex() == 0) {
0201             return VerifyDetachedWithSignature;
0202         } else {
0203             return VerifyDetachedWithSignedData;
0204         }
0205     else {
0206         return DecryptVerifyOpaque;
0207     }
0208 }
0209 
0210 void DecryptVerifyOperationWidget::setInputFileName(const QString &name)
0211 {
0212     d->ui.inputFileNameLB.setText(name);
0213     d->ui.inputFileNameRQ.setFileName(name);
0214 }
0215 
0216 QString DecryptVerifyOperationWidget::inputFileName() const
0217 {
0218     if (d->ui.inputStack.currentIndex() == 0) {
0219         return d->ui.inputFileNameLB.text();
0220     } else {
0221         return d->ui.inputFileNameRQ.fileName();
0222     }
0223 }
0224 
0225 void DecryptVerifyOperationWidget::setSignedDataFileName(const QString &name)
0226 {
0227     d->ui.signedDataFileNameLB.setText(name);
0228     d->ui.signedDataFileNameRQ.setFileName(name);
0229 }
0230 
0231 QString DecryptVerifyOperationWidget::signedDataFileName() const
0232 {
0233     if (d->ui.signedDataStack.currentIndex() == 0) {
0234         return d->ui.signedDataFileNameLB.text();
0235     } else {
0236         return d->ui.signedDataFileNameRQ.fileName();
0237     }
0238 }
0239 
0240 std::shared_ptr<ArchiveDefinition> DecryptVerifyOperationWidget::selectedArchiveDefinition() const
0241 {
0242     if (mode() == DecryptVerifyOpaque && d->ui.archiveCB.isChecked()) {
0243         return d->ui.archivesCB.itemData(d->ui.archivesCB.currentIndex()).value<std::shared_ptr<ArchiveDefinition>>();
0244     } else {
0245         return std::shared_ptr<ArchiveDefinition>();
0246     }
0247 }
0248 
0249 #include "moc_decryptverifyoperationwidget.cpp"