29 QString *extractedValue)
33 const bool hasRootDot =
value.endsWith(u
'.');
34 const QString withoutRootDot = hasRootDot ?
value.chopped(1) :
value;
37 const QString ace = QString::fromLatin1(QUrl::toAce(withoutRootDot)).toLower();
40 const QStringList nonAceParts = withoutRootDot.split(QLatin1Char(
'.'));
41 if (!nonAceParts.empty()) {
42 const QString tld = nonAceParts.last();
48 for (
const QChar &ch : tld) {
49 const char16_t uc = ch.unicode();
50 if (((uc >= ValidatorRulePrivate::ascii_0) &&
51 (uc <= ValidatorRulePrivate::ascii_9)) ||
52 (uc == ValidatorRulePrivate::ascii_dash)) {
61 if (ace.length() <= ValidatorDomainPrivate::maxDnsNameWithLastDot) {
62 const QStringList parts = ace.split(QLatin1Char(
'.'), Qt::KeepEmptyParts);
64 if (parts.size() > 1) {
66 if (parts.last().length() > 1) {
67 for (
int i = 0; i < parts.size(); ++i) {
73 const QString &part = parts.at(i);
81 if (part.length() > ValidatorDomainPrivate::maxDnsLabelLength) {
86 const bool isTld = (i == (parts.size() - 1));
87 const bool isPunyCode = part.startsWith(u
"xn--");
88 const qsizetype partEnd = part.size() - 1;
90 for (
int j = 0; j < part.size(); ++j) {
91 const char16_t uc = part.at(j).unicode();
93 ((uc >= ValidatorRulePrivate::ascii_0) &&
94 (uc <= ValidatorRulePrivate::ascii_9));
96 (uc == ValidatorRulePrivate::ascii_dash);
99 if (j == 0 && (isDash || isDigit)) {
104 if (j == partEnd && isDash) {
109 ((uc >= ValidatorRulePrivate::ascii_a) &&
110 (uc <= ValidatorRulePrivate::ascii_z));
114 if (!(isDigit || isDash || isChar)) {
120 if (!(isDigit || isDash || isChar)) {
157 if (diag ==
Valid && extractedValue) {
159 *extractedValue = ace + QLatin1Char(
'.');
161 *extractedValue = ace;
165 return diag ==
Valid;
169 const QString &value,
171 std::function<
void(
Diagnose diagnose,
const QString &extractedValue)> cb)
182 if (!options.testAnyFlag(
CheckDNS)) {
189 auto dns =
new QDnsLookup{QDnsLookup::A, extracted};
190 QObject::connect(dns, &QDnsLookup::finished, [dns, options, cb, extracted] {
191 if (dns->error() == QDnsLookup::NoError) {
192 if (dns->hostAddressRecords().empty()) {
193 cb(MissingDNS, extracted);
195 if (!options.testFlag(CheckAAAARecord)) {
196 cb(Valid, extracted);
199 auto dns2 = new QDnsLookup{QDnsLookup::AAAA, extracted};
201 dns2, &QDnsLookup::finished, [dns2, options, cb, extracted] {
202 if (dns2->error() == QDnsLookup::NoError) {
203 if (dns2->hostAddressRecords().empty()) {
204 cb(MissingDNS, extracted);
206 cb(Valid, extracted);
208 }
else if (dns2->error() == QDnsLookup::OperationCancelledError) {
209 cb(DNSTimeout, extracted);
211 cb(DNSError, extracted);
216 ValidatorDomainPrivate::dnsLookupTimeout, dns2, &QDnsLookup::abort);
220 }
else if (dns->error() == QDnsLookup::OperationCancelledError) {
221 cb(DNSTimeout, extracted);
223 cb(DNSError, extracted);
227 QTimer::singleShot(ValidatorDomainPrivate::dnsLookupTimeout, dns, &QDnsLookup::abort);
230 }
else if (options.testFlag(CheckAAAARecord)) {
232 auto dns2 =
new QDnsLookup{QDnsLookup::AAAA, extracted};
233 QObject::connect(dns2, &QDnsLookup::finished, [dns2, options, cb, extracted] {
234 if (dns2->error() == QDnsLookup::NoError) {
235 if (dns2->hostAddressRecords().empty()) {
236 cb(MissingDNS, extracted);
238 cb(Valid, extracted);
240 }
else if (dns2->error() == QDnsLookup::OperationCancelledError) {
241 cb(DNSTimeout, extracted);
243 cb(DNSError, extracted);
247 QTimer::singleShot(ValidatorDomainPrivate::dnsLookupTimeout, dns2, &QDnsLookup::abort);
QString qtTrId(const char *id, int n=-1) const
Checks if the value of the input field contains a FQDN according to RFC 1035.
QString genericValidationError(Context *c, const QVariant &errorData=QVariant()) const override
Returns a generic error message if validation failed.
static QString diagnoseString(Context *c, Diagnose diagnose, const QString &label={})
ValidatorDomain(const QString &field, Options options=NoOption, const ValidatorMessages &messages={}, const QString &defValKey={})
Constructs a new ValidatorDomain object with the given parameters.
~ValidatorDomain() override
Diagnose
Possible diagnose information for the checked domain.
static void validateCb(const QString &value, Options options, std::function< void(Diagnose diagnose, const QString &extractedValue)> cb)
Checks if value is a vaid fully qualified domain name and writes the result to the callback cb.