6#include "validatoremail_p.h"
17using namespace Qt::Literals::StringLiterals;
19const QRegularExpression ValidatorEmailPrivate::ipv4Regex{
20 u
"\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25["
21 "0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"_s};
22const QRegularExpression ValidatorEmailPrivate::ipv6PartRegex{u
"^[0-9A-Fa-f]{0,4}$"_s};
23const QString ValidatorEmailPrivate::stringSpecials{u
"()<>[]:;@\\,.\""_s};
29 const QString &defValKey)
30 :
ValidatorRule(*new ValidatorEmailPrivate(field, threshold, options, messages, defValKey))
40 const QString v =
value(params);
70 ValidatorEmailDiagnoseStruct diag;
72 if (ValidatorEmailPrivate::checkEmail(v, d->options, d->threshold, &diag)) {
73 if (!diag.literal.isEmpty()) {
74 result.
value.setValue<QString>(diag.localpart + QLatin1Char(
'@') + diag.literal);
76 result.
value.setValue<QString>(diag.localpart + QLatin1Char(
'@') + diag.domain);
83 result.
extra = QVariant::fromValue<QList<Diagnose>>(diag.returnStatus);
101bool ValidatorEmailPrivate::checkEmail(
const QString &address,
102 ValidatorEmail::Options options,
104 ValidatorEmailDiagnoseStruct *diagnoseStruct)
108 EmailPart context = ComponentLocalpart;
109 QList<EmailPart> contextStack{context};
110 EmailPart contextPrior = ComponentLocalpart;
115 QString parseLocalPart;
117 QString parseLiteral;
118 QMap<int, QString> atomListLocalPart;
119 QMap<int, QString> atomListDomain;
120 int elementCount = 0;
122 bool hypenFlag =
false;
123 bool endOrDie =
false;
131 const qsizetype atPos = address.lastIndexOf(QLatin1Char(
'@'));
134 const QString local = address.left(atPos);
135 const QString domain = address.mid(atPos + 1);
136 bool asciiDomain =
true;
137 for (
const QChar &ch : domain) {
138 const ushort &uc = ch.unicode();
139 if (uc > ValidatorEmailPrivate::asciiEnd) {
148 email = local + QLatin1Char(
'@') + QString::fromLatin1(QUrl::toAce(domain));
157 const qsizetype rawLength = email.length();
159 for (
int i = 0; i < rawLength; i++) {
166 case ComponentLocalpart:
185 if (token == QLatin1Char(
'(')) {
186 if (elementLen == 0) {
196 contextStack.push_back(context);
197 context = ContextComment;
198 }
else if (token == QLatin1Char(
'.')) {
199 if (elementLen == 0) {
201 returnStatus.push_back((elementCount == 0)
216 parseLocalPart += token;
217 atomListLocalPart[elementCount] = QString();
218 }
else if (token == QLatin1Char(
'"')) {
219 if (elementLen == 0) {
222 returnStatus.push_back((elementCount == 0)
226 parseLocalPart += token;
227 atomListLocalPart[elementCount] += token;
230 contextStack.push_back(context);
231 context = ContextQuotedString;
235 }
else if ((token == QChar(QChar::CarriageReturn)) || (token == QChar(QChar::Space)) ||
236 (token == QChar(QChar::Tabulation))) {
237 if ((token == QChar(QChar::CarriageReturn)) &&
238 ((++i == rawLength) || (email[i] != QChar(QChar::LineFeed)))) {
243 if (elementLen == 0) {
251 contextStack.push_back(context);
252 context = ContextFWS;
254 }
else if (token == QLatin1Char(
'@')) {
256 if (contextStack.size() != 1) {
258 qCCritical(C_VALIDATOR) <<
"ValidatorEmail: Unexpected item on context stack";
262 if (parseLocalPart.isEmpty()) {
264 }
else if (elementLen == 0) {
266 }
else if (parseLocalPart.size() > ValidatorEmailPrivate::maxLocalPartLength) {
271 }
else if ((contextPrior == ContextComment) || (contextPrior == ContextFWS)) {
285 context = ComponentDomain;
286 contextStack.clear();
287 contextStack.push_back(context);
306 switch (contextPrior) {
311 case ContextQuotedString:
316 qCCritical(C_VALIDATOR)
317 <<
"ValidatorEmail: More atext found where none is allowed, "
318 "but unrecognizes prior context";
322 contextPrior = context;
323 const char16_t uni = token.unicode();
325 if (!allowUtf8Local) {
326 if ((uni < ValidatorEmailPrivate::asciiExclamationMark) ||
327 (uni > ValidatorEmailPrivate::asciiTilde) ||
328 ValidatorEmailPrivate::stringSpecials.contains(token)) {
329 returnStatus.push_back(
333 if (!token.isLetterOrNumber()) {
334 if ((uni < ValidatorEmailPrivate::asciiExclamationMark) ||
335 (uni > ValidatorEmailPrivate::asciiTilde) ||
336 ValidatorEmailPrivate::stringSpecials.contains(token)) {
337 returnStatus.push_back(
343 parseLocalPart += token;
344 atomListLocalPart[elementCount] += token;
352 case ComponentDomain:
392 if (token == QLatin1Char(
'(')) {
393 if (elementLen == 0) {
397 returnStatus.push_back((elementCount == 0)
406 contextStack.push_back(context);
407 context = ContextComment;
408 }
else if (token == QLatin1Char(
'.')) {
409 if (elementLen == 0) {
411 returnStatus.push_back((elementCount == 0)
414 }
else if (hypenFlag) {
430 if (elementLen > ValidatorEmailPrivate::maxDnsLabelLength) {
439 atomListDomain[elementCount] = QString();
440 parseDomain += token;
442 }
else if (token == QLatin1Char(
'[')) {
443 if (parseDomain.isEmpty()) {
446 contextStack.push_back(context);
447 context = ComponentLiteral;
448 parseDomain += token;
449 atomListDomain[elementCount] += token;
450 parseLiteral = QString();
454 }
else if ((token == QChar(QChar::CarriageReturn)) || (token == QChar(QChar::Space)) ||
455 (token == QChar(QChar::Tabulation))) {
456 if ((token == QChar(QChar::CarriageReturn)) &&
457 ((++i == rawLength) || email[i] != QChar(QChar::LineFeed))) {
462 if (elementLen == 0) {
463 returnStatus.push_back((elementCount == 0)
472 contextStack.push_back(context);
473 context = ContextFWS;
501 switch (contextPrior) {
506 case ComponentLiteral:
511 qCCritical(C_VALIDATOR)
512 <<
"ValidatorEmail: More atext found where none is allowed, but"
513 <<
"unrecognised prior context.";
518 const char16_t uni = token.unicode();
521 if ((uni < ValidatorEmailPrivate::asciiExclamationMark) ||
522 (uni > ValidatorEmailPrivate::asciiTilde) ||
523 ValidatorEmailPrivate::stringSpecials.contains(token)) {
525 }
else if (token == QLatin1Char(
'-')) {
526 if (elementLen == 0) {
528 returnStatus.push_back(
532 }
else if (!(((uni >= ValidatorRulePrivate::ascii_0) &&
533 (uni <= ValidatorRulePrivate::ascii_9)) ||
534 ((uni >= ValidatorRulePrivate::ascii_A) &&
535 (uni <= ValidatorRulePrivate::ascii_Z)) ||
536 ((uni >= ValidatorRulePrivate::ascii_a) &&
537 (uni <= ValidatorRulePrivate::ascii_z)))) {
542 parseDomain += token;
543 atomListDomain[elementCount] += token;
550 case ComponentLiteral:
560 if (token == QLatin1Char(
']')) {
561 if (
static_cast<int>(
562 *std::max_element(returnStatus.constBegin(), returnStatus.constEnd())) <
618 qsizetype index = -1;
619 QString addressLiteral = parseLiteral;
621 const QRegularExpressionMatch ipv4Match =
622 ValidatorEmailPrivate::ipv4Regex.match(addressLiteral);
623 if (ipv4Match.hasMatch()) {
624 index = addressLiteral.lastIndexOf(ipv4Match.captured());
627 addressLiteral.mid(0, index) +
636 }
else if (QString::compare(
637 addressLiteral.left(5),
643 const QString ipv6 = addressLiteral.mid(5);
644 const QStringList matchesIP = ipv6.split(QLatin1Char(
':'));
645 qsizetype groupCount = matchesIP.size();
646 index = ipv6.indexOf(QLatin1String(
"::"));
650 if (groupCount != maxGroups) {
654 if (index != ipv6.lastIndexOf(QLatin1String(
"::"))) {
657 if ((index == 0) || (index == (ipv6.length() - 2))) {
661 if (groupCount > maxGroups) {
663 }
else if (groupCount == maxGroups) {
664 returnStatus.push_back(
671 if ((ipv6.size() == 1 && ipv6[0] == QLatin1Char(
':')) ||
672 (ipv6[0] == QLatin1Char(
':') && ipv6[1] != QLatin1Char(
':'))) {
673 returnStatus.push_back(
676 }
else if (ipv6.right(2).at(1) == QLatin1Char(
':') &&
677 ipv6.right(2).at(0) != QLatin1Char(
':')) {
678 returnStatus.push_back(
682 int unmatchedChars = 0;
683 for (
const QString &ip : matchesIP) {
684 if (!ip.contains(ValidatorEmailPrivate::ipv6PartRegex)) {
688 if (unmatchedChars != 0) {
700 parseDomain += token;
701 atomListDomain[elementCount] += token;
703 contextPrior = context;
704 context = contextStack.takeLast();
705 }
else if (token == QLatin1Char(
'\\')) {
707 contextStack.push_back(context);
708 context = ContextQuotedPair;
709 }
else if ((token == QChar(QChar::CarriageReturn)) || (token == QChar(QChar::Space)) ||
710 (token == QChar(QChar::Tabulation))) {
711 if ((token == QChar(QChar::CarriageReturn)) &&
712 ((++i == rawLength) || (email[i] != QChar(QChar::LineFeed)))) {
718 contextStack.push_back(context);
719 context = ContextFWS;
735 const char16_t uni = token.unicode();
738 if ((uni > ValidatorEmailPrivate::asciiEnd) || (uni == 0) ||
739 (uni == QLatin1Char(
'[').unicode())) {
742 }
else if ((uni < ValidatorEmailPrivate::asciiExclamationMark) ||
743 (uni == ValidatorEmailPrivate::asciiEnd)) {
747 parseLiteral += token;
748 parseDomain += token;
749 atomListDomain[elementCount] += token;
756 case ContextQuotedString:
764 if (token == QLatin1Char(
'\\')) {
765 contextStack.push_back(context);
766 context = ContextQuotedPair;
767 }
else if ((token == QChar(QChar::CarriageReturn)) ||
768 (token == QChar(QChar::Tabulation))) {
771 if ((token == QChar(QChar::CarriageReturn)) &&
772 ((++i == rawLength) || (email[i] != QChar(QChar::LineFeed)))) {
786 parseLocalPart += QChar(QChar::Space);
787 atomListLocalPart[elementCount] += QChar(QChar::Space);
791 contextStack.push_back(context);
792 context = ContextFWS;
794 }
else if (token == QLatin1Char(
'"')) {
795 parseLocalPart += token;
796 atomListLocalPart[elementCount] += token;
798 contextPrior = context;
799 context = contextStack.takeLast();
814 const char16_t uni = token.unicode();
816 if (!allowUtf8Local) {
817 if ((uni > ValidatorEmailPrivate::asciiEnd) || (uni == 0) ||
818 (uni == ValidatorEmailPrivate::asciiLF)) {
820 }
else if ((uni < ValidatorRulePrivate::asciiSpace) ||
821 (uni == ValidatorEmailPrivate::asciiEnd)) {
825 if (!token.isLetterOrNumber()) {
826 if ((uni > ValidatorEmailPrivate::asciiEnd) || (uni == 0) ||
827 (uni == ValidatorEmailPrivate::asciiLF)) {
828 returnStatus.push_back(
830 }
else if ((uni < ValidatorRulePrivate::asciiSpace) ||
831 (uni == ValidatorEmailPrivate::asciiEnd)) {
837 parseLocalPart += token;
838 atomListLocalPart[elementCount] += token;
853 case ContextQuotedPair:
871 const char16_t uni = token.unicode();
873 if (uni > ValidatorEmailPrivate::asciiEnd) {
875 }
else if (((uni < ValidatorEmailPrivate::asciiUS) &&
876 (uni != ValidatorRulePrivate::asciiTab)) ||
877 (uni == ValidatorEmailPrivate::asciiEnd)) {
888 contextPrior = context;
889 context = contextStack.takeLast();
894 case ContextQuotedString:
895 parseLocalPart += QLatin1Char(
'\\');
896 parseLocalPart += token;
897 atomListLocalPart[elementCount] += QLatin1Char(
'\\');
898 atomListLocalPart[elementCount] += token;
902 case ComponentLiteral:
903 parseDomain += QLatin1Char(
'\\');
904 parseDomain += token;
905 atomListDomain[elementCount] += QLatin1Char(
'\\');
906 atomListDomain[elementCount] += token;
912 qCCritical(C_VALIDATOR)
913 <<
"ValidatorEmail: Quoted pair logic invoked in an invalid context.";
926 if (token == QLatin1Char(
'(')) {
928 contextStack.push_back(context);
929 context = ContextComment;
930 }
else if (token == QLatin1Char(
')')) {
931 contextPrior = context;
932 context = contextStack.takeLast();
950 }
else if (token == QLatin1Char(
'\\')) {
951 contextStack.push_back(context);
952 context = ContextQuotedPair;
953 }
else if ((token == QChar(QChar::CarriageReturn)) || (token == QChar(QChar::Space)) ||
954 (token == QChar(QChar::Tabulation))) {
955 if ((token == QChar(QChar::CarriageReturn)) &&
956 ((++i == rawLength) || (email[i] != QChar(QChar::LineFeed)))) {
962 contextStack.push_back(context);
963 context = ContextFWS;
980 const ushort uni = token.unicode();
982 if ((uni > ValidatorEmailPrivate::asciiEnd) || (uni == 0) ||
983 (uni == ValidatorEmailPrivate::asciiLF)) {
986 }
else if ((uni < ValidatorRulePrivate::asciiSpace) ||
987 (uni == ValidatorEmailPrivate::asciiEnd)) {
1009 if (tokenPrior == QChar(QChar::CarriageReturn)) {
1010 if (token == QChar(QChar::CarriageReturn)) {
1015 if (crlf_count > 0) {
1016 if (++crlf_count > 1) {
1017 returnStatus.push_back(
1025 if (token == QChar(QChar::CarriageReturn)) {
1026 if ((++i == rawLength) || (email[i] != QChar(QChar::LineFeed))) {
1030 }
else if ((token != QChar(QChar::Space)) && (token != QChar(QChar::Tabulation))) {
1031 if (tokenPrior == QChar(QChar::CarriageReturn)) {
1036 if (crlf_count > 0) {
1040 contextPrior = context;
1041 context = contextStack.takeLast();
1067 qCCritical(C_VALIDATOR) <<
"ValidatorEmail: Unknown context";
1071 if (
static_cast<int>(
1072 *std::max_element(returnStatus.constBegin(), returnStatus.constEnd())) >
1079 if (
static_cast<int>(*std::max_element(returnStatus.constBegin(), returnStatus.constEnd())) <
1081 if (context == ContextQuotedString) {
1083 }
else if (context == ContextQuotedPair) {
1085 }
else if (context == ContextComment) {
1087 }
else if (context == ComponentLiteral) {
1089 }
else if (token == QChar(QChar::CarriageReturn)) {
1091 }
else if (parseDomain.isEmpty()) {
1093 }
else if (elementLen == 0) {
1095 }
else if (hypenFlag) {
1097 }
else if (parseDomain.size() > ValidatorEmailPrivate::maxDomainLength) {
1101 }
else if ((parseLocalPart.size() + 1 + parseDomain.size()) >
1102 ValidatorEmailPrivate::maxMailboxLength) {
1122 }
else if (elementLen > ValidatorEmailPrivate::maxDnsLabelLength) {
1128 bool dnsChecked =
false;
1131 (
static_cast<int>(*std::max_element(returnStatus.constBegin(), returnStatus.constEnd())) <
1132 static_cast<int>(threshold))) {
1146 if (elementCount == 0) {
1147 parseDomain += QLatin1Char(
'.');
1150 QDnsLookup mxLookup(QDnsLookup::MX, parseDomain);
1152 QObject::connect(&mxLookup, &QDnsLookup::finished, &mxLoop, &QEventLoop::quit);
1153 QTimer::singleShot(ValidatorEmailPrivate::dnsLookupTimeout, &mxLookup, &QDnsLookup::abort);
1157 if ((mxLookup.error() == QDnsLookup::NoError) && !mxLookup.mailExchangeRecords().empty()) {
1161 QDnsLookup aLookup(QDnsLookup::A, parseDomain);
1163 QObject::connect(&aLookup, &QDnsLookup::finished, &aLoop, &QEventLoop::quit);
1165 ValidatorEmailPrivate::dnsLookupTimeout, &aLookup, &QDnsLookup::abort);
1169 if ((aLookup.error() == QDnsLookup::NoError) && !aLookup.hostAddressRecords().empty()) {
1210 (
static_cast<int>(*std::max_element(returnStatus.constBegin(), returnStatus.constEnd())) <
1212 if (elementCount == 0) {
1216 if (QStringLiteral(
"0123456789").contains(atomListDomain[elementCount][0])) {
1221 if (returnStatus.size() != 1) {
1222 QList<ValidatorEmail::Diagnose> _rs;
1230 std::sort(returnStatus.begin(), returnStatus.end(), std::greater<>());
1235 if (diagnoseStruct) {
1236 diagnoseStruct->finalStatus = finalStatus;
1237 diagnoseStruct->returnStatus = returnStatus;
1238 diagnoseStruct->localpart = parseLocalPart;
1239 diagnoseStruct->domain = parseDomain;
1240 diagnoseStruct->literal = parseLiteral;
1243 return static_cast<int>(finalStatus) <
static_cast<int>(threshold);
1248 if (
label.isEmpty()) {
1254 return c->
qtTrId(
"cutelyst-valemail-diag-valid");
1257 return c->
qtTrId(
"cutelyst-valemail-diag-nomx");
1260 return c->
qtTrId(
"cutelyst-valemail-diag-noarec");
1263 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5321tld");
1266 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5321tldnumeric");
1269 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5321quotedstring");
1272 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5321addressliteral");
1277 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5321ipv6deprecated");
1280 return c->
qtTrId(
"cutelyst-valemail-diag-cfwscomment");
1283 return c->
qtTrId(
"cutelyst-valemail-diag-cfwsfws");
1286 return c->
qtTrId(
"cutelyst-valemail-diag-deprecatedlocalpart");
1289 return c->
qtTrId(
"cutelyst-valemail-diag-deprecatedfws");
1292 return c->
qtTrId(
"cutelyst-valemail-diag-deprecatedqtext");
1295 return c->
qtTrId(
"cutelyst-valemail-diag-deprecatedqp");
1298 return c->
qtTrId(
"cutelyst-valemail-diag-deprecatedcomment");
1301 return c->
qtTrId(
"cutelyst-valemail-diag-deprecatedctext");
1304 return c->
qtTrId(
"cutelyst-valemail-diag-cfwsnearat");
1308 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322domain");
1311 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322toolong")
1312 .arg(c->
locale().toString(ValidatorEmailPrivate::maxMailboxLength));
1316 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322localtoolong")
1317 .arg(c->
locale().toString(ValidatorEmailPrivate::maxLocalPartLength));
1320 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322domaintoolong")
1321 .arg(c->
locale().toString(ValidatorEmailPrivate::maxDomainLength));
1325 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322labeltoolong")
1326 .arg(c->
locale().toString(ValidatorEmailPrivate::maxDnsLabelLength));
1329 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322domainliteral");
1333 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322domlitobsdtext");
1336 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322ipv6groupcount");
1339 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322ipv62x2xcolon");
1342 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322ipv6badchar");
1345 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322ipv6maxgroups");
1348 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322ipv6colonstart");
1351 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322ipv6colonend");
1354 return c->
qtTrId(
"cutelyst-valemail-diag-errexpectingdtext");
1357 return c->
qtTrId(
"cutelyst-valemail-diag-errnolocalpart");
1360 return c->
qtTrId(
"cutelyst-valemail-diag-errnodomain");
1363 return c->
qtTrId(
"cutelyst-valemail-diag-errconsecutivedots");
1366 return c->
qtTrId(
"cutelyst-valemail-diag-erratextaftercfws");
1369 return c->
qtTrId(
"cutelyst-valemail-diag-erratextafterqs");
1372 return c->
qtTrId(
"cutelyst-valemail-diag-erratextafterdomlit");
1375 return c->
qtTrId(
"cutelyst-valemail-diag-errexpectingqpair");
1378 return c->
qtTrId(
"cutelyst-valemail-diag-errexpectingatext");
1381 return c->
qtTrId(
"cutelyst-valemail-diag-errexpectingqtext");
1384 return c->
qtTrId(
"cutelyst-valemail-diag-errexpectingctext");
1387 return c->
qtTrId(
"cutelyst-valemail-diag-errbackslashend");
1390 return c->
qtTrId(
"cutelyst-valemail-diag-errdotstart");
1393 return c->
qtTrId(
"cutelyst-valemail-diag-errdotend");
1396 return c->
qtTrId(
"cutelyst-valemail-diag-errdomainhyphenstart");
1399 return c->
qtTrId(
"cutelyst-valemail-diag-errdomainhyphenend");
1402 return c->
qtTrId(
"cutelyst-valemail-diag-errunclosedquotedstr");
1405 return c->
qtTrId(
"cutelyst-valemail-diag-errunclosedcomment");
1408 return c->
qtTrId(
"cutelyst-valemail-diag-erruncloseddomliteral");
1411 return c->
qtTrId(
"cutelyst-valemail-diag-errfwscrlfx2");
1414 return c->
qtTrId(
"cutelyst-valemail-diag-errfwscrlfend");
1418 return c->
qtTrId(
"cutelyst-valemail-diag-errcrnolf");
1421 return c->
qtTrId(
"cutelyst-valemail-diag-errfatal");
1433 return c->
qtTrId(
"cutelyst-valemail-diag-valid-label").arg(
label);
1437 return c->
qtTrId(
"cutelyst-valemail-diag-nomx-label").arg(
label);
1441 return c->
qtTrId(
"cutelyst-valemail-diag-noarec-label").arg(
label);
1444 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5321tld-label").arg(
label);
1448 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5321tldnumeric-label").arg(
label);
1451 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5321quotedstring-label").arg(
label);
1455 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5321addressliteral-label").arg(
label);
1460 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5321ipv6deprecated-label").arg(
label);
1463 return c->
qtTrId(
"cutelyst-valemail-diag-cfwscomment-label").arg(
label);
1467 return c->
qtTrId(
"cutelyst-valemail-diag-cfwsfws-label").arg(
label);
1470 return c->
qtTrId(
"cutelyst-valemail-diag-deprecatedlocalpart-label").arg(
label);
1474 return c->
qtTrId(
"cutelyst-valemail-diag-deprecatedfws-label").arg(
label);
1478 return c->
qtTrId(
"cutelyst-valemail-diag-deprecatedqtext-label").arg(
label);
1482 return c->
qtTrId(
"cutelyst-valemail-diag-deprecatedqp-label").arg(
label);
1486 return c->
qtTrId(
"cutelyst-valemail-diag-deprecatedcomment-label").arg(
label);
1489 return c->
qtTrId(
"cutelyst-valemail-diag-deprecatedctext-label").arg(
label);
1493 return c->
qtTrId(
"cutelyst-valemail-diag-cfwsnearat-label").arg(
label);
1497 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322domain-label").arg(
label);
1501 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322toolong-label")
1502 .arg(
label, c->
locale().toString(ValidatorEmailPrivate::maxMailboxLength));
1506 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322localtoolong-label")
1507 .arg(
label, c->
locale().toString(ValidatorEmailPrivate::maxLocalPartLength));
1511 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322domaintoolong-label")
1512 .arg(
label, c->
locale().toString(ValidatorEmailPrivate::maxDomainLength));
1516 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322labeltoolong-label")
1517 .arg(
label, c->
locale().toString(ValidatorEmailPrivate::maxDnsLabelLength));
1521 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322domainliteral-label").arg(
label);
1525 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322domlitobsdtext-label").arg(
label);
1529 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322ipv6groupcount-label").arg(
label);
1533 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322ipv62x2xcolon-label").arg(
label);
1537 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322ipv6badchar-label").arg(
label);
1540 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322ipv6maxgroups-label").arg(
label);
1544 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322ipv6colonstart-label").arg(
label);
1548 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322ipv6colonend-label").arg(
label);
1552 return c->
qtTrId(
"cutelyst-valemail-diag-errexpectingdtext-label").arg(
label);
1555 return c->
qtTrId(
"cutelyst-valemail-diag-errnolocalpart-label").arg(
label);
1558 return c->
qtTrId(
"cutelyst-valemail-diag-errnodomain-label").arg(
label);
1561 return c->
qtTrId(
"cutelyst-valemail-diag-errconsecutivedots-label").arg(
label);
1565 return c->
qtTrId(
"cutelyst-valemail-diag-erratextaftercfws-label").arg(
label);
1568 return c->
qtTrId(
"cutelyst-valemail-diag-erratextafterqs-label").arg(
label);
1572 return c->
qtTrId(
"cutelyst-valemail-diag-erratextafterdomlit-label").arg(
label);
1576 return c->
qtTrId(
"cutelyst-valemail-diag-errexpectingqpair-label").arg(
label);
1579 return c->
qtTrId(
"cutelyst-valemail-diag-errexpectingatext-label").arg(
label);
1583 return c->
qtTrId(
"cutelyst-valemail-diag-errexpectingqtext-label").arg(
label);
1587 return c->
qtTrId(
"cutelyst-valemail-diag-errexpectingctext-label").arg(
label);
1590 return c->
qtTrId(
"cutelyst-valemail-diag-errbackslashend-label").arg(
label);
1593 return c->
qtTrId(
"cutelyst-valemail-diag-errdotstart-label").arg(
label);
1596 return c->
qtTrId(
"cutelyst-valemail-diag-errdotend-label").arg(
label);
1600 return c->
qtTrId(
"cutelyst-valemail-diag-errdomainhyphenstart-label").arg(
label);
1604 return c->
qtTrId(
"cutelyst-valemail-diag-errdomainhyphenend-label").arg(
label);
1608 return c->
qtTrId(
"cutelyst-valemail-diag-errunclosedquotedstr-label").arg(
label);
1612 return c->
qtTrId(
"cutelyst-valemail-diag-errunclosedcomment-label").arg(
label);
1616 return c->
qtTrId(
"cutelyst-valemail-diag-erruncloseddomliteral-label").arg(
label);
1620 return c->
qtTrId(
"cutelyst-valemail-diag-errfwscrlfx2-label").arg(
label);
1624 return c->
qtTrId(
"cutelyst-valemail-diag-errfwscrlfend-label").arg(
label);
1628 return c->
qtTrId(
"cutelyst-valemail-diag-errcrnolf-label").arg(
label);
1631 return c->
qtTrId(
"cutelyst-valemail-diag-errfatal-label").arg(
label);
1640 if (
label.isEmpty()) {
1644 return c->
qtTrId(
"cutelyst-valemail-cat-valid");
1647 return c->
qtTrId(
"cutelyst-valemail-cat-dnswarn");
1650 return c->
qtTrId(
"cutelyst-valemail-cat-rfc5321");
1654 return c->
qtTrId(
"cutelyst-valemail-cat-cfws");
1658 return c->
qtTrId(
"cutelyst-valemail-cat-deprecated");
1662 return c->
qtTrId(
"cutelyst-valemail-cat-rfc5322");
1665 return c->
qtTrId(
"cutelyst-valemail-cat-invalid");
1671 return c->
qtTrId(
"cutelyst-valemail-cat-valid-label").arg(
label);
1674 return c->
qtTrId(
"cutelyst-valemail-cat-dnswarn-label").arg(
label);
1677 return c->
qtTrId(
"cutelyst-valemail-cat-rfc5321-label").arg(
label);
1681 return c->
qtTrId(
"cutelyst-valemail-cat-cfws-label").arg(
label);
1685 return c->
qtTrId(
"cutelyst-valemail-cat-deprecated-label").arg(
label);
1689 return c->
qtTrId(
"cutelyst-valemail-cat-rfc5322-label").arg(
label);
1692 return c->
qtTrId(
"cutelyst-valemail-cat-invalid-label").arg(
label);
1701 const auto diag =
static_cast<int>(diagnose);
1703 if (diag <
static_cast<int>(
Valid)) {
1705 }
else if (diag <
static_cast<int>(
DNSWarn)) {
1707 }
else if (diag <
static_cast<int>(
RFC5321)) {
1709 }
else if (diag <
static_cast<int>(
CFWS)) {
1711 }
else if (diag <
static_cast<int>(
Deprecated)) {
1713 }
else if (diag <
static_cast<int>(
RFC5322)) {
1728 QList<Cutelyst::ValidatorEmail::Diagnose> *diagnoses)
1730 ValidatorEmailDiagnoseStruct diag;
1731 bool ret = ValidatorEmailPrivate::checkEmail(email, options, threshold, &diag);
1734 *diagnoses = diag.returnStatus;
1740#include "moc_validatoremail.cpp"
QLocale locale() const noexcept
QString qtTrId(const char *id, int n=-1) const
Checks if the value is a valid email address according to specific RFCs.
static Category category(Diagnose diagnose)
Category
Validation category, used as threshold to define valid addresses.
~ValidatorEmail() override
Diagnose
Single diagnose values that show why an address is not valid.
@ ErrorUnclosedDomLiteral
QString genericValidationError(Context *c, const QVariant &errorData=QVariant()) const override
static QString categoryString(Context *c, Category category, const QString &label={})
static QString diagnoseString(Context *c, Diagnose diagnose, const QString &label={})
ValidatorEmail(const QString &field, Category threshold=RFC5321, Options options=NoOption, const ValidatorMessages &messages=ValidatorMessages(), const QString &defValKey=QString())
Base class for all validator rules.
QString validationError(Context *c, const QVariant &errorData={}) const
QString label(Context *c) const
void defaultValue(Context *c, ValidatorReturnType *result) const
QString value(const ParamsMultiMap ¶ms) const
QMultiMap< QString, QString > ParamsMultiMap
static bool validate(const QString &email, Category threshold=RFC5321, Options options=NoOption, QList< Diagnose > *diagnoses=nullptr)
Returns true if email is a valid address according to the Category given in the threshold.
The Cutelyst namespace holds all public Cutelyst API.
Stores custom error messages and the input field label.
Contains the result of a single input parameter validation.