cutelyst  4.9.0
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
validatoremail.h
1 /*
2  * SPDX-FileCopyrightText: (C) 2017-2023 Matthias Fehring <mf@huessenbergnetz.de>
3  * SPDX-License-Identifier: BSD-3-Clause
4  */
5 #ifndef CUTELYSTVALIDATOREMAIL_H
6 #define CUTELYSTVALIDATOREMAIL_H
7 
8 #include "validatorrule.h"
9 
10 namespace Cutelyst {
11 
12 class ValidatorEmailPrivate;
13 
46 class CUTELYST_PLUGIN_UTILS_VALIDATOR_EXPORT ValidatorEmail : public ValidatorRule
47 {
48  Q_GADGET
49 public:
53  enum Category : int {
54  Valid = 1,
55  DNSWarn = 7,
57  RFC5321 = 15,
60  CFWS = 31,
62  Deprecated = 63,
64  RFC5322 = 127,
67  Error = 255
68  };
69  Q_ENUM(Category)
70 
71 
74  enum Diagnose : int {
75  // Address is valid
76  ValidAddress =
77  0,
80  // Address is valid but a DNS check was not successful
81  DnsWarnNoMxRecord =
82  5,
83  DnsWarnNoRecord = 6,
84  // Address is valid for SMTP but has unusual Elements
85  RFC5321TLD = 9,
86  RFC5321TLDNumeric =
87  10,
88  RFC5321QuotedString = 11,
89  RFC5321AddressLiteral = 12,
90  RFC5321IPv6Deprecated =
91  13,
94  // Address is valid within the message but cannot be used unmodified for the envelope
95  CFWSComment = 17,
96  CFWSFWS = 18,
97  // Address contains deprecated elements but may still be valid in restricted contexts
98  DeprecatedLocalpart = 33,
99  DeprecatedFWS = 34,
100  DeprecatedQText = 35,
101  DeprecatedQP = 36,
102  DeprecatedComment = 37,
103  DeprecatedCText = 38,
104  DeprecatedCFWSNearAt =
105  49,
106  // The address in only valid according to the broad definition of RFC 5322. It is otherwise
107  // invalid
108  RFC5322Domain =
109  65,
111  RFC5322TooLong = 66,
112  RFC5322LocalTooLong = 67,
113  RFC5322DomainTooLong = 68,
114  RFC5322LabelTooLong = 69,
115  RFC5322DomainLiteral =
116  70,
118  RFC5322DomLitOBSDText = 71,
121  RFC5322IPv6GroupCount =
122  72,
123  RFC5322IPv62x2xColon = 73,
124  RFC5322IPv6BadChar = 74,
125  RFC5322IPv6MaxGroups = 75,
126  RFC5322IPv6ColonStart = 76,
127  RFC5322IPv6ColonEnd = 77,
128  // Address is invalid for any purpose
129  ErrorExpectingDText =
130  129,
131  ErrorNoLocalPart = 130,
132  ErrorNoDomain = 131,
133  ErrorConsecutiveDots = 132,
134  ErrorATextAfterCFWS =
135  133,
136  ErrorATextAfterQS = 134,
137  ErrorATextAfterDomLit =
138  135,
139  ErrorExpectingQpair =
140  136,
141  ErrorExpectingAText = 137,
142  ErrorExpectingQText = 138,
143  ErrorExpectingCText = 139,
144  ErrorBackslashEnd = 140,
145  ErrorDotStart = 141,
146  ErrorDotEnd = 142,
147  ErrorDomainHyphenStart = 143,
148  ErrorDomainHyphenEnd = 144,
149  ErrorUnclosedQuotedStr = 145,
150  ErrorUnclosedComment = 146,
151  ErrorUnclosedDomLiteral = 147,
152  ErrorFWSCRLFx2 = 148,
153  ErrorFWSCRLFEnd = 149,
154  ErrorCRnoLF =
155  150,
156  ErrorFatal = 254
157  };
158  Q_ENUM(Diagnose)
159 
160  enum Option : quint8 {
161  NoOption = 0,
162  CheckDNS =
163  1,
164  UTF8Local = 2,
165  AllowIDN = 4,
166  AllowUTF8 = UTF8Local | AllowIDN
168  };
169  Q_DECLARE_FLAGS(Options, Option)
170 
171 
180  ValidatorEmail(const QString &field,
181  Category threshold = RFC5321,
182  Options options = NoOption,
183  const ValidatorMessages &messages = ValidatorMessages(),
184  const QString &defValKey = QString());
185 
189  ~ValidatorEmail() override;
190 
198  static QString diagnoseString(Context *c, Diagnose diagnose, const QString &label = {});
199 
207  static QString categoryString(Context *c, Category category, const QString &label = {});
208 
214  static Category category(Diagnose diagnose);
215 
224  static QString categoryString(Context *c, Diagnose diagnose, const QString &label = {});
225 
239  static bool validate(const QString &email,
240  Category threshold = RFC5321,
241  Options options = NoOption,
242  QList<Diagnose> *diagnoses = nullptr);
243 
244 protected:
253  ValidatorReturnType validate(Context *c, const ParamsMultiMap &params) const override;
254 
258  QString genericValidationError(Context *c,
259  const QVariant &errorData = QVariant()) const override;
260 
261 private:
262  Q_DECLARE_PRIVATE(ValidatorEmail) // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
263  Q_DISABLE_COPY(ValidatorEmail)
264 };
265 
266 } // namespace Cutelyst
267 
268 Q_DECLARE_OPERATORS_FOR_FLAGS(Cutelyst::ValidatorEmail::Options)
269 
270 #endif // CUTELYSTVALIDATOREMAIL_H
Stores custom error messages and the input field label.
The Cutelyst Context.
Definition: context.h:42
Checks if the value is a valid email address according to specific RFCs.
The Cutelyst namespace holds all public Cutelyst API.
Base class for all validator rules.
QMultiMap< QString, QString > ParamsMultiMap
Category
Validation category, used as threshold to define valid addresses.
Diagnose
Single diagnose values that show why an address is not valid.