6#include <QtNetwork/private/qtnetworkglobal_p.h>
8#if QT_CONFIG(topleveldomain)
10#include "QtCore/qfile.h"
11#include "QtCore/qloggingcategory.h"
12#include "QtCore/qstandardpaths.h"
13#include "QtCore/qstring.h"
15#if !QT_CONFIG(publicsuffix_qt) && !QT_CONFIG(publicsuffix_system)
16# error Enable at least one feature: publicsuffix-qt, publicsuffix-system
19#if QT_CONFIG(publicsuffix_qt)
20# include "psl_data.cpp"
24extern "C" int LookupStringInFixedSet(
const unsigned char *graph, std::size_t
length,
25 const char *
key, std::size_t key_length);
33static constexpr
int PSL_NOT_FOUND = -1;
34static constexpr
int PSL_FLAG_EXCEPTION = 1 << 0;
35static constexpr
int PSL_FLAG_WILDCARD = 1 << 1;
37class QPublicSuffixDatabase final
40#if QT_CONFIG(publicsuffix_system)
41 QPublicSuffixDatabase();
48#if QT_CONFIG(publicsuffix_qt)
50 kDafsa,
sizeof(kDafsa)
55#if QT_CONFIG(publicsuffix_system)
56 std::unique_ptr<QFile> m_dev;
62int QPublicSuffixDatabase::lookupDomain(
QByteArrayView domain)
const
64 return LookupStringInFixedSet(
reinterpret_cast<const unsigned char *
>(
m_data.constData()),
68#if QT_CONFIG(publicsuffix_system)
73 u
"publicsuffix/public_suffix_list.dafsa"_s);
76QPublicSuffixDatabase::QPublicSuffixDatabase()
78 for (
auto &&
fileName : locatePublicSuffixFiles()) {
83#if QT_CONFIG(publicsuffix_qt)
84 qCDebug(lcTld,
"Using builtin publicsuffix list");
86 qCWarning(lcTld,
"No usable publicsuffix file found");
96 auto systemFile = std::make_unique<QFile>(
fileName);
99 qCDebug(lcTld,
"Failed to open publicsuffix file: %s",
104 auto fileSize = systemFile->size();
106 if (fileSize < DafsaFileHeader.
size() + 2) {
107 qCWarning(lcTld,
"publicsuffix file is too small: %zu", std::size_t(fileSize));
111 auto header = systemFile->read(DafsaFileHeader.
size());
112 if (
header != DafsaFileHeader) {
118 if (!systemFile->seek(fileSize - 1)) {
119 qCWarning(lcTld,
"Failed to seek to the end of file: %s",
125 if (systemFile->read(&version, 1) != 1) {
126 qCWarning(lcTld,
"Failed to read publicsuffix version");
130 if (version != 0x01) {
131 qCWarning(lcTld,
"Unsupported publicsuffix version: %d",
int(version));
135 const auto dataSize = fileSize - DafsaFileHeader.
size() - 1;
137 auto mappedData = systemFile->map(DafsaFileHeader.
size(),
dataSize);
139 qCDebug(lcTld,
"Using mapped system publicsuffix data");
142 m_dev = std::move(systemFile);
146 qCDebug(lcTld,
"Failed to map publicsuffix file: %s",
149 systemFile->seek(DafsaFileHeader.
size());
152 qCWarning(lcTld,
"Failed to read publicsuffix file");
157 qCDebug(lcTld,
"Using system publicsuffix data");
167static const QPublicSuffixDatabase m_publicSuffix;
189#if QT_CONFIG(publicsuffix_system)
190 if (publicSuffix.isDestroyed())
193 auto publicSuffix = &m_publicSuffix;
196 auto ret = publicSuffix->lookupDomain(domainView);
197 if (
ret != PSL_NOT_FOUND) {
198 if (
ret & PSL_FLAG_EXCEPTION)
200 if ((
ret & PSL_FLAG_WILDCARD) == 0)
204 const auto dot = domainView.indexOf(
'.');
206 return ret != PSL_NOT_FOUND;
207 ret = publicSuffix->lookupDomain(domainView.sliced(
dot + 1));
208 if (
ret == PSL_NOT_FOUND)
210 return (
ret & PSL_FLAG_WILDCARD) != 0;
constexpr qsizetype size() const noexcept
constexpr const_pointer data() const noexcept
static QStringList locateAll(StandardLocation type, const QString &fileName, LocateOptions options=LocateFile)
[0]
QByteArray toUtf8() const
Returns a UTF-8 representation of the string view as a QByteArray.
\macro QT_RESTRICTED_CAST_FROM_ASCII
const QChar * constData() const
Returns a pointer to the data stored in the QString.
Combined button and popup list for selecting options.
static QString header(const QString &name)
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
static QGtk3Storage * m_storage
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
static QT_BEGIN_NAMESPACE bool qIsEffectiveTLD(QStringView domain)
GLenum GLuint GLenum GLsizei length
static qreal dot(const QPointF &a, const QPointF &b)
#define qUtf8Printable(string)