6#include "validatoremail_p.h"
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};
23const QString ValidatorEmailPrivate::stringSpecials{u
"()<>[]:;@\\,.\""_s};
30 :
ValidatorRule(*new ValidatorEmailPrivate(
field, threshold, options, messages, defValKey))
70 ValidatorEmailDiagnoseStruct diag;
72 if (ValidatorEmailPrivate::checkEmail(v, d->options, d->threshold, &diag)) {
73 if (!diag.literal.isEmpty()) {
101bool ValidatorEmailPrivate::checkEmail(
const QString &address,
102 ValidatorEmail::Options options,
104 ValidatorEmailDiagnoseStruct *diagnoseStruct)
108 EmailPart context = ComponentLocalpart;
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) {
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) {
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;
231 context = ContextQuotedString;
243 if (elementLen == 0) {
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();
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)) {
334 if ((uni < ValidatorEmailPrivate::asciiExclamationMark) ||
335 (uni > ValidatorEmailPrivate::asciiTilde) ||
336 ValidatorEmailPrivate::stringSpecials.contains(token)) {
343 parseLocalPart += token;
344 atomListLocalPart[elementCount] += token;
352 case ComponentDomain:
392 if (token == QLatin1Char(
'(')) {
393 if (elementLen == 0) {
397 returnStatus.
push_back((elementCount == 0)
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(
'[')) {
447 context = ComponentLiteral;
448 parseDomain += token;
449 atomListDomain[elementCount] += token;
450 parseLiteral = QString();
462 if (elementLen == 0) {
463 returnStatus.
push_back((elementCount == 0)
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) {
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>(
618 qsizetype index = -1;
619 QString addressLiteral = parseLiteral;
621 const QRegularExpressionMatch ipv4Match =
622 ValidatorEmailPrivate::ipv4Regex.
match(addressLiteral);
627 addressLiteral.
mid(0, index) +
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) {
671 if ((ipv6.
size() == 1 && ipv6[0] == QLatin1Char(
':')) ||
672 (ipv6[0] == QLatin1Char(
':') && ipv6[1] != QLatin1Char(
':'))) {
676 }
else if (ipv6.
right(2).
at(1) == QLatin1Char(
':') &&
677 ipv6.
right(2).
at(0) != QLatin1Char(
':')) {
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;
705 }
else if (token == QLatin1Char(
'\\')) {
708 context = ContextQuotedPair;
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(
'\\')) {
766 context = ContextQuotedPair;
792 context = ContextFWS;
794 }
else if (token == QLatin1Char(
'"')) {
795 parseLocalPart += token;
796 atomListLocalPart[elementCount] += token;
798 contextPrior = context;
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)) {
826 if ((uni > ValidatorEmailPrivate::asciiEnd) || (uni == 0) ||
827 (uni == ValidatorEmailPrivate::asciiLF)) {
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;
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(
'(')) {
929 context = ContextComment;
930 }
else if (token == QLatin1Char(
')')) {
931 contextPrior = context;
950 }
else if (token == QLatin1Char(
'\\')) {
952 context = ContextQuotedPair;
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)) {
1015 if (crlf_count > 0) {
1016 if (++crlf_count > 1) {
1036 if (crlf_count > 0) {
1040 contextPrior = context;
1067 qCCritical(C_VALIDATOR) <<
"ValidatorEmail: Unknown context";
1071 if (
static_cast<int>(
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) {
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(
'.');
1157 if ((mxLookup.error() ==
QDnsLookup::NoError) && !mxLookup.mailExchangeRecords().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")
1316 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322localtoolong")
1320 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322domaintoolong")
1325 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322labeltoolong")
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")
1506 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322localtoolong-label")
1511 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322domaintoolong-label")
1516 return c->
qtTrId(
"cutelyst-valemail-diag-rfc5322labeltoolong-label")
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);
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)) {
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
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())
QString field() const noexcept
QString validationError(Context *c, const QVariant &errorData={}) const
QString label(Context *c) const
ValidatorRule(const QString &field, const ValidatorMessages &messages={}, const QString &defValKey={}, QByteArrayView validatorName=nullptr)
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.
bool isLetterOrNumber(char32_t ucs4)
int exec(QEventLoop::ProcessEventsFlags flags)
void append(QList< T > &&value)
QList< T >::const_reference at(qsizetype i) const const
QList< T >::iterator begin()
QList< T >::const_iterator constBegin() const const
QList< T >::const_iterator constEnd() const const
bool contains(const AT &value) const const
QList< T >::iterator end()
void push_back(QList< T >::parameter_type value)
qsizetype size() const const
QList< T >::value_type takeLast()
QString toString(QDate date, QLocale::FormatType format) const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QRegularExpressionMatch match(QStringView subjectView, qsizetype offset, QRegularExpression::MatchType matchType, QRegularExpression::MatchOptions matchOptions) const const
QString captured(QAnyStringView name) const const
bool hasMatch() const const
QString arg(Args &&... args) const const
const QChar at(qsizetype position) const const
int compare(QLatin1StringView s1, const QString &s2, Qt::CaseSensitivity cs)
QString fromLatin1(QByteArrayView str)
qsizetype indexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
qsizetype lastIndexOf(QChar ch, Qt::CaseSensitivity cs) const const
QString left(qsizetype n) &&
qsizetype length() const const
QString mid(qsizetype position, qsizetype n) &&
QString right(qsizetype n) &&
qsizetype size() const const
QStringList split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
QByteArray toAce(const QString &domain, QUrl::AceProcessingOptions options)
QVariant fromValue(T &&value)
void setValue(QVariant &&value)
Stores custom error messages and the input field label.
Contains the result of a single input parameter validation.