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};
22 const QRegularExpression ValidatorEmailPrivate::ipv6PartRegex{u
"^[0-9A-Fa-f]{0,4}$"_s};
23 const 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()) {
83 result.
extra = QVariant::fromValue<QList<Diagnose>>(diag.returnStatus);
101 bool ValidatorEmailPrivate::checkEmail(
const QString &address,
102 ValidatorEmail::Options options,
104 ValidatorEmailDiagnoseStruct *diagnoseStruct)
108 EmailPart context = ComponentLocalpart;
110 EmailPart contextPrior = ComponentLocalpart;
120 int elementCount = 0;
122 bool hypenFlag =
false;
123 bool endOrDie =
false;
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:
186 if (elementLen == 0) {
196 contextStack.push_back(context);
197 context = ContextComment;
199 if (elementLen == 0) {
201 returnStatus.push_back((elementCount == 0)
216 parseLocalPart += token;
217 atomListLocalPart[elementCount] =
QString();
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;
243 if (elementLen == 0) {
251 contextStack.push_back(context);
252 context = ContextFWS;
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(
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:
393 if (elementLen == 0) {
397 returnStatus.push_back((elementCount == 0)
406 contextStack.push_back(context);
407 context = ContextComment;
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;
446 contextStack.push_back(context);
447 context = ComponentLiteral;
448 parseDomain += token;
449 atomListDomain[elementCount] += token;
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)) {
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:
561 if (static_cast<int>(
562 *std::max_element(returnStatus.constBegin(), returnStatus.constEnd())) <
618 qsizetype index = -1;
619 QString addressLiteral = parseLiteral;
622 ValidatorEmailPrivate::ipv4Regex.match(addressLiteral);
627 addressLiteral.
mid(0, index) +
637 addressLiteral.
left(5),
645 qsizetype groupCount = matchesIP.
size();
650 if (groupCount != maxGroups) {
657 if ((index == 0) || (index == (ipv6.
length() - 2))) {
661 if (groupCount > maxGroups) {
663 }
else if (groupCount == maxGroups) {
664 returnStatus.push_back(
673 returnStatus.push_back(
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();
707 contextStack.push_back(context);
708 context = ContextQuotedPair;
718 contextStack.push_back(context);
719 context = ContextFWS;
735 const char16_t uni = token.
unicode();
738 if ((uni > ValidatorEmailPrivate::asciiEnd) || (uni == 0) ||
742 }
else if ((uni < ValidatorEmailPrivate::asciiExclamationMark) ||
743 (uni == ValidatorEmailPrivate::asciiEnd)) {
747 parseLiteral += token;
748 parseDomain += token;
749 atomListDomain[elementCount] += token;
756 case ContextQuotedString:
765 contextStack.push_back(context);
766 context = ContextQuotedPair;
791 contextStack.push_back(context);
792 context = ContextFWS;
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)) {
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:
896 parseLocalPart += token;
897 atomListLocalPart[elementCount] +=
QLatin1Char(
'\\');
898 atomListLocalPart[elementCount] += token;
902 case ComponentLiteral:
904 parseDomain += token;
906 atomListDomain[elementCount] += token;
912 qCCritical(C_VALIDATOR)
913 <<
"ValidatorEmail: Quoted pair logic invoked in an invalid context.";
928 contextStack.push_back(context);
929 context = ContextComment;
931 contextPrior = context;
932 context = contextStack.takeLast();
951 contextStack.push_back(context);
952 context = ContextQuotedPair;
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)) {
1015 if (crlf_count > 0) {
1016 if (++crlf_count > 1) {
1017 returnStatus.push_back(
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) {
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) {
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) {
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);
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);
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"
qsizetype indexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
Stores custom error messages and the input field label.
qsizetype size() const const
QString captured(QStringView name) const const
static QString diagnoseString(Context *c, Diagnose diagnose, const QString &label={})
qsizetype size() const const
qsizetype lastIndexOf(QChar ch, Qt::CaseSensitivity cs) const const
QString toString(QDate date, FormatType format) const const
void defaultValue(Context *c, ValidatorReturnType *result) const
int exec(ProcessEventsFlags flags)
QByteArray toAce(const QString &domain, AceProcessingOptions options)
Checks if the value is a valid email address according to specific RFCs.
static QString categoryString(Context *c, Category category, const QString &label={})
bool isEmpty() const const
bool hasMatch() const const
static Category category(Diagnose diagnose)
The Cutelyst namespace holds all public Cutelyst API.
Base class for all validator rules.
QLocale locale() const noexcept
QString label(Context *c) const
ValidatorEmail(const QString &field, Category threshold=RFC5321, Options options=NoOption, const ValidatorMessages &messages=ValidatorMessages(), const QString &defValKey=QString())
QString right(qsizetype n) const const
bool isLetterOrNumber(char32_t ucs4)
bool contains(const AT &value) const const
QString value(const ParamsMultiMap ¶ms) const
const QChar * unicode() const const
QString fromLatin1(QByteArrayView str)
QString validationError(Context *c, const QVariant &errorData={}) const
QString mid(qsizetype position, qsizetype n) const const
QString qtTrId(const char *id, int n=-1) const
QStringList split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
QString genericValidationError(Context *c, const QVariant &errorData=QVariant()) const override
void append(QList< T > &&value)
const QChar at(qsizetype position) const const
Category
Validation category, used as threshold to define valid addresses.
qsizetype length() const const
QString left(qsizetype n) const const
Contains the result of a single input parameter validation.
~ValidatorEmail() override
int compare(QLatin1StringView s1, const QString &s2, Qt::CaseSensitivity cs)
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.
QString arg(Args &&... args) const const
Diagnose
Single diagnose values that show why an address is not valid.
void setValue(QVariant &&value)