diff --git a/src/utils/validation.cpp b/src/utils/validation.cpp index 71e25d6e5..7c954fef9 100644 --- a/src/utils/validation.cpp +++ b/src/utils/validation.cpp @@ -1,77 +1,113 @@ /* -*- mode: c++; c-basic-offset:4 -*- utils/validation.cpp This file is part of Kleopatra, the KDE keymanager SPDX-FileCopyrightText: 2008 Klarälvdalens Datakonsult AB SPDX-License-Identifier: GPL-2.0-or-later */ #include #include "validation.h" #include #include #include "kleopatra_debug.h" #include using namespace Kleo; namespace { +template +class EmptyIsAcceptableValidator : public Validator +{ +public: + using Validator::Validator; + + QValidator::State validate(QString &str, int &pos) const override + { + if (str.trimmed().isEmpty()) { + return QValidator::Acceptable; + } + return Validator::validate(str, pos); + } +}; + class EMailValidator : public QValidator { public: explicit EMailValidator(QObject *parent = nullptr) : QValidator(parent) {} State validate(QString &str, int &pos) const override { Q_UNUSED(pos) if (KEmailAddress::isValidSimpleAddress(str)) { return Acceptable; } return Intermediate; } }; +QValidator *regularExpressionValidator(Validation::Flags flags, const QString ®exp, QObject *parent) +{ + if (flags & Validation::Required) { + return new QRegularExpressionValidator{QRegularExpression{regexp}, parent}; + } else { + return new EmptyIsAcceptableValidator{QRegularExpression{regexp}, parent}; + } +} + } -QValidator *Validation::email(QObject *parent) +QValidator *Validation::email(Flags flags, QObject *parent) { - return new EMailValidator(parent); + if (flags & Required) { + return new EMailValidator{parent}; + } else { + return new EmptyIsAcceptableValidator{parent}; + } } -QValidator *Validation::email(const QString &addRX, QObject *parent) +QValidator *Validation::email(const QString &addRX, Flags flags, QObject *parent) { - return new MultiValidator{email(), new QRegularExpressionValidator{QRegularExpression{addRX}, nullptr}, parent}; + return new MultiValidator{email(flags), regularExpressionValidator(flags, addRX, nullptr), parent}; } -QValidator *Validation::pgpName(QObject *parent) +QValidator *Validation::pgpName(Flags flags, QObject *parent) { // this regular expression is modeled after gnupg/g10/keygen.c:ask_user_id: static const auto name_rx = QRegularExpression{QStringLiteral("[^0-9<>][^<>@]{3,}")}; - return new QRegularExpressionValidator{name_rx, parent}; + if (flags & Required) { + return new QRegularExpressionValidator{name_rx, parent}; + } else { + return new EmptyIsAcceptableValidator{name_rx, parent}; + } } -QValidator *Validation::pgpName(const QString &addRX, QObject *parent) +QValidator *Validation::pgpName(const QString &addRX, Flags flags, QObject *parent) { - return new MultiValidator{pgpName(), new QRegularExpressionValidator{QRegularExpression{addRX}, nullptr}, parent}; + return new MultiValidator{pgpName(flags), regularExpressionValidator(flags, addRX, nullptr), parent}; } -QValidator *Validation::pgpComment(QObject *parent) +QValidator *Validation::pgpComment(Flags flags, QObject *parent) { // this regular expression is modeled after gnupg/g10/keygen.c:ask_user_id: static const auto comment_rx = QRegularExpression{QStringLiteral("[^()]*")}; - return new QRegularExpressionValidator{comment_rx, parent}; + if (flags & Required) { + return new QRegularExpressionValidator{comment_rx, parent}; + } else { + return new EmptyIsAcceptableValidator{comment_rx, parent}; + } } -QValidator *Validation::pgpComment(const QString &addRX, QObject *parent) +QValidator *Validation::pgpComment(const QString &addRX, Flags flags, QObject *parent) { - return new MultiValidator{pgpComment(), new QRegularExpressionValidator{QRegularExpression{addRX}, nullptr}, parent}; + return new MultiValidator{pgpComment(flags), regularExpressionValidator(flags, addRX, nullptr), parent}; } diff --git a/src/utils/validation.h b/src/utils/validation.h index afc92d01d..3b76abc60 100644 --- a/src/utils/validation.h +++ b/src/utils/validation.h @@ -1,31 +1,35 @@ /* -*- mode: c++; c-basic-offset:4 -*- utils/validation.h This file is part of Kleopatra, the KDE keymanager SPDX-FileCopyrightText: 2008 Klarälvdalens Datakonsult AB SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once class QObject; class QString; class QValidator; namespace Kleo { namespace Validation { -QValidator *email(QObject *parent = nullptr); -QValidator *pgpName(QObject *parent = nullptr); -QValidator *pgpComment(QObject *parent = nullptr); +enum Flags { + Optional, + Required +}; -QValidator *email(const QString &additionalRegExp, QObject *parent = nullptr); -QValidator *pgpName(const QString &additionalRegExp, QObject *parent = nullptr); -QValidator *pgpComment(const QString &additionalRegExp, QObject *parent = nullptr); +QValidator *email(Flags flags = Required, QObject *parent = nullptr); +QValidator *pgpName(Flags flags = Required, QObject *parent = nullptr); +QValidator *pgpComment(Flags flags = Required, QObject *parent = nullptr); + +QValidator *email(const QString &additionalRegExp, Flags flags = Required, QObject *parent = nullptr); +QValidator *pgpName(const QString &additionalRegExp, Flags flags = Required, QObject *parent = nullptr); +QValidator *pgpComment(const QString &additionalRegExp, Flags flags = Required, QObject *parent = nullptr); } } -