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"