File indexing completed on 2024-06-23 05:14:01
0001 /* -*- mode: c++; c-basic-offset:4 -*- 0002 dialogs/adduseriddialog.cpp 0003 0004 This file is part of Kleopatra, the KDE keymanager 0005 SPDX-FileCopyrightText: 2008 Klarälvdalens Datakonsult AB 0006 SPDX-FileCopyrightText: 2022 g10 Code GmbH 0007 SPDX-FileContributor: Ingo Klöcker <dev@ingo-kloecker.de> 0008 0009 SPDX-License-Identifier: GPL-2.0-or-later 0010 */ 0011 0012 #include <config-kleopatra.h> 0013 0014 #include "adduseriddialog.h" 0015 0016 #include "nameandemailwidget.h" 0017 0018 #include "utils/accessibility.h" 0019 #include "utils/scrollarea.h" 0020 #include "view/htmllabel.h" 0021 0022 #include <KConfigGroup> 0023 #include <KLocalizedString> 0024 #include <KMessageBox> 0025 #include <KSeparator> 0026 #include <KSharedConfig> 0027 0028 #include <QDialogButtonBox> 0029 #include <QLabel> 0030 #include <QVBoxLayout> 0031 0032 #include "kleopatra_debug.h" 0033 0034 using namespace Kleo; 0035 0036 class AddUserIDDialog::Private 0037 { 0038 friend class ::Kleo::AddUserIDDialog; 0039 AddUserIDDialog *const q; 0040 0041 struct { 0042 ScrollArea *scrollArea; 0043 NameAndEmailWidget *nameAndEmail; 0044 HtmlLabel *resultLabel; 0045 QDialogButtonBox *buttonBox; 0046 } ui; 0047 0048 LabelHelper labelHelper; 0049 0050 public: 0051 explicit Private(AddUserIDDialog *qq) 0052 : q{qq} 0053 { 0054 q->setWindowTitle(i18nc("title:window", "Add User ID")); 0055 0056 const KConfigGroup config{KSharedConfig::openConfig(), QLatin1StringView("CertificateCreationWizard")}; 0057 const auto attrOrder = config.readEntry("OpenPGPAttributeOrder", QStringList{}); 0058 const auto nameIsRequired = attrOrder.contains(QLatin1StringView{"NAME!"}, Qt::CaseInsensitive); 0059 const auto emailIsRequired = attrOrder.contains(QLatin1StringView{"EMAIL!"}, Qt::CaseInsensitive); 0060 0061 auto mainLayout = new QVBoxLayout{q}; 0062 0063 { 0064 const auto infoText = nameIsRequired || emailIsRequired // 0065 ? i18n("Enter a name and an email address to use for the user ID.") 0066 : i18n("Enter a name and/or an email address to use for the user ID."); 0067 auto label = new QLabel{infoText, q}; 0068 label->setWordWrap(true); 0069 mainLayout->addWidget(label); 0070 } 0071 0072 mainLayout->addWidget(new KSeparator{Qt::Horizontal, q}); 0073 0074 ui.scrollArea = new ScrollArea{q}; 0075 ui.scrollArea->setFocusPolicy(Qt::NoFocus); 0076 ui.scrollArea->setFrameStyle(QFrame::NoFrame); 0077 ui.scrollArea->setBackgroundRole(q->backgroundRole()); 0078 ui.scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 0079 ui.scrollArea->setSizeAdjustPolicy(QScrollArea::AdjustToContents); 0080 auto scrollAreaLayout = qobject_cast<QBoxLayout *>(ui.scrollArea->widget()->layout()); 0081 scrollAreaLayout->setContentsMargins(0, 0, 0, 0); 0082 0083 ui.nameAndEmail = new NameAndEmailWidget{q}; 0084 ui.nameAndEmail->layout()->setContentsMargins(0, 0, 0, 0); 0085 ui.nameAndEmail->setNameIsRequired(nameIsRequired); 0086 ui.nameAndEmail->setNameLabel(config.readEntry("NAME_label")); 0087 ui.nameAndEmail->setNameHint(config.readEntry("NAME_hint", config.readEntry("NAME_placeholder"))); 0088 ui.nameAndEmail->setNamePattern(config.readEntry("NAME_regex")); 0089 ui.nameAndEmail->setEmailIsRequired(emailIsRequired); 0090 ui.nameAndEmail->setEmailLabel(config.readEntry("EMAIL_label")); 0091 ui.nameAndEmail->setEmailHint(config.readEntry("EMAIL_hint", config.readEntry("EMAIL_placeholder"))); 0092 ui.nameAndEmail->setEmailPattern(config.readEntry("EMAIL_regex")); 0093 scrollAreaLayout->addWidget(ui.nameAndEmail); 0094 0095 scrollAreaLayout->addWidget(new KSeparator{Qt::Horizontal, q}); 0096 0097 { 0098 ui.resultLabel = new HtmlLabel{q}; 0099 ui.resultLabel->setWordWrap(true); 0100 ui.resultLabel->setFocusPolicy(Qt::ClickFocus); 0101 labelHelper.addLabel(ui.resultLabel); 0102 scrollAreaLayout->addWidget(ui.resultLabel); 0103 } 0104 0105 scrollAreaLayout->addStretch(1); 0106 0107 mainLayout->addWidget(ui.scrollArea); 0108 0109 mainLayout->addWidget(new KSeparator{Qt::Horizontal, q}); 0110 0111 ui.buttonBox = new QDialogButtonBox{QDialogButtonBox::Ok | QDialogButtonBox::Cancel, q}; 0112 0113 mainLayout->addWidget(ui.buttonBox); 0114 0115 connect(ui.nameAndEmail, &NameAndEmailWidget::userIDChanged, q, [this]() { 0116 updateResultLabel(); 0117 }); 0118 connect(ui.buttonBox, &QDialogButtonBox::accepted, q, [this]() { 0119 checkAccept(); 0120 }); 0121 connect(ui.buttonBox, &QDialogButtonBox::rejected, q, &QDialog::reject); 0122 0123 updateResultLabel(); 0124 } 0125 0126 private: 0127 void checkAccept() 0128 { 0129 QStringList errors; 0130 if (ui.nameAndEmail->userID().isEmpty() && !ui.nameAndEmail->nameIsRequired() && !ui.nameAndEmail->emailIsRequired()) { 0131 errors.push_back(i18n("Enter a name or an email address.")); 0132 } 0133 const auto nameError = ui.nameAndEmail->nameError(); 0134 if (!nameError.isEmpty()) { 0135 errors.push_back(nameError); 0136 } 0137 const auto emailError = ui.nameAndEmail->emailError(); 0138 if (!emailError.isEmpty()) { 0139 errors.push_back(emailError); 0140 } 0141 if (errors.size() > 1) { 0142 KMessageBox::errorList(q, i18n("There is a problem."), errors); 0143 } else if (!errors.empty()) { 0144 KMessageBox::error(q, errors.first()); 0145 } else { 0146 q->accept(); 0147 } 0148 } 0149 0150 void updateResultLabel() 0151 { 0152 ui.resultLabel->setHtml(i18nc("@info", 0153 "<div>This is how the new user ID will be stored in the certificate:</div>" 0154 "<center><strong>%1</strong></center>", 0155 ui.nameAndEmail->userID().toHtmlEscaped())); 0156 } 0157 }; 0158 0159 AddUserIDDialog::AddUserIDDialog(QWidget *parent, Qt::WindowFlags f) 0160 : QDialog{parent, f} 0161 , d(new Private{this}) 0162 { 0163 } 0164 0165 AddUserIDDialog::~AddUserIDDialog() = default; 0166 0167 void AddUserIDDialog::setName(const QString &name) 0168 { 0169 d->ui.nameAndEmail->setName(name); 0170 } 0171 0172 QString AddUserIDDialog::name() const 0173 { 0174 return d->ui.nameAndEmail->name(); 0175 } 0176 0177 void AddUserIDDialog::setEmail(const QString &email) 0178 { 0179 d->ui.nameAndEmail->setEmail(email); 0180 } 0181 0182 QString AddUserIDDialog::email() const 0183 { 0184 return d->ui.nameAndEmail->email(); 0185 } 0186 0187 QString AddUserIDDialog::userID() const 0188 { 0189 return d->ui.nameAndEmail->userID(); 0190 } 0191 0192 #include "moc_adduseriddialog.cpp"