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"