From 16b614f2e1ae4ed145f57b256fb27c04ee07e506 Mon Sep 17 00:00:00 2001 From: Ievgenii Meshcheriakov Date: Mon, 21 Feb 2022 18:03:42 +0100 Subject: [PATCH] Network: Use system publicsuffix database copy when available MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ChangeLog][Network][QNetworkCookieJar] It is possible to use system's copy of publicsuffix database when it is available. This behavior is enabled by default on Linux and can be controlled using new command line switches -system-publicsuffix, -qt-publicsuffix, -no-publicsuffix, and -publicsuffix=all. Fixes: QTBUG-95889 Change-Id: I911e1a13c1422cdc35851953309fff064e7c5f26 Reviewed-by: Qt CI Bot Reviewed-by: MÃ¥rten Nordheim --- src/network/configure.cmake | 18 ++ src/network/kernel/qtldurl.cpp | 159 +++++++++++++++++- src/network/kernel/qurltlds_p.h.INFO | 2 + src/network/qt_cmdline.cmake | 1 + .../access/qnetworkcookiejar/CMakeLists.txt | 2 +- .../publicsuffix/public_suffix_list.dafsa | Bin 0 -> 52710 bytes .../tst_qnetworkcookiejar.cpp | 20 +++ 7 files changed, 195 insertions(+), 7 deletions(-) create mode 100644 tests/auto/network/access/qnetworkcookiejar/testdata/publicsuffix/public_suffix_list.dafsa diff --git a/src/network/configure.cmake b/src/network/configure.cmake index e47affb6b59..0de16ae90bd 100644 --- a/src/network/configure.cmake +++ b/src/network/configure.cmake @@ -400,7 +400,22 @@ qt_feature("topleveldomain" PUBLIC SECTION "Networking" LABEL "qTopLevelDomain()" PURPOSE "Provides support for extracting the top level domain from URLs. If enabled, a binary dump of the Public Suffix List (http://www.publicsuffix.org, Mozilla License) is included. The data is then also used in QNetworkCookieJar::validateCookie." + DISABLE INPUT_publicsuffix STREQUAL "no" ) +qt_feature("publicsuffix-qt" PRIVATE + LABEL " Built-in publicsuffix database" + CONDITION QT_FEATURE_topleveldomain + ENABLE INPUT_publicsuffix STREQUAL "qt" OR INPUT_publicsuffix STREQUAL "all" + DISABLE INPUT_publicsuffix STREQUAL "system" +) +qt_feature("publicsuffix-system" PRIVATE + LABEL " System publicsuffix database" + CONDITION QT_FEATURE_topleveldomain + AUTODETECT LINUX + ENABLE INPUT_publicsuffix STREQUAL "system" OR INPUT_publicsuffix STREQUAL "all" + DISABLE INPUT_publicsuffix STREQUAL "qt" +) + qt_configure_add_summary_section(NAME "Qt Network") qt_configure_add_summary_entry(ARGS "getifaddrs") qt_configure_add_summary_entry(ARGS "ipv6ifname") @@ -426,6 +441,9 @@ qt_configure_add_summary_entry(ARGS "sctp") qt_configure_add_summary_entry(ARGS "system-proxies") qt_configure_add_summary_entry(ARGS "gssapi") qt_configure_add_summary_entry(ARGS "brotli") +qt_configure_add_summary_entry(ARGS "topleveldomain") +qt_configure_add_summary_entry(ARGS "publicsuffix-qt") +qt_configure_add_summary_entry(ARGS "publicsuffix-system") qt_configure_end_summary_section() # end of "Qt Network" section # special case begin qt_configure_add_report_entry( diff --git a/src/network/kernel/qtldurl.cpp b/src/network/kernel/qtldurl.cpp index 046a4169141..7d492b23cb8 100644 --- a/src/network/kernel/qtldurl.cpp +++ b/src/network/kernel/qtldurl.cpp @@ -44,10 +44,19 @@ #if QT_CONFIG(topleveldomain) #include "qurl.h" -#include "private/qtldurl_p.h" +#include "QtCore/qfile.h" +#include "QtCore/qfileinfo.h" +#include "QtCore/qloggingcategory.h" +#include "QtCore/qstandardpaths.h" #include "QtCore/qstring.h" -#include "qurltlds_p.h" +#if !QT_CONFIG(publicsuffix_qt) && !QT_CONFIG(publicsuffix_system) +# error Enable at least one feature: publicsuffix-qt, publicsuffix-system +#endif + +#if QT_CONFIG(publicsuffix_qt) +# include "qurltlds_p.h" +#endif // Defined in src/3rdparty/libpsl/src/lookup_string_in_fixed_set.c extern "C" int LookupStringInFixedSet(const unsigned char *graph, std::size_t length, @@ -55,15 +64,146 @@ extern "C" int LookupStringInFixedSet(const unsigned char *graph, std::size_t le QT_BEGIN_NAMESPACE +Q_LOGGING_CATEGORY(lcTld, "qt.network.tld") + static constexpr int PSL_NOT_FOUND = -1; static constexpr int PSL_FLAG_EXCEPTION = 1 << 0; static constexpr int PSL_FLAG_WILDCARD = 1 << 1; -static int lookupDomain(QByteArrayView domain) +class QPublicSuffixDatabase final { - return LookupStringInFixedSet(kDafsa, sizeof(kDafsa), domain.data(), domain.size()); +public: +#if QT_CONFIG(publicsuffix_system) + QPublicSuffixDatabase(); +#endif // QT_CONFIG(publicsuffix_system) + + int lookupDomain(QByteArrayView domain) const; + +private: + QByteArrayView m_data +#if QT_CONFIG(publicsuffix_qt) + { + kDafsa, sizeof(kDafsa) + } +#endif // QT_CONFIG(publicsuffix_qt) + ; + +#if QT_CONFIG(publicsuffix_system) + std::unique_ptr m_dev; + QByteArray m_storage; + bool loadFile(const QString &fileName); +#endif // QT_CONFIG(publicsuffix_system) +}; + +int QPublicSuffixDatabase::lookupDomain(QByteArrayView domain) const +{ + return LookupStringInFixedSet(reinterpret_cast(m_data.constData()), + m_data.size(), domain.data(), domain.size()); } +#if QT_CONFIG(publicsuffix_system) + +static QStringList locatePublicSuffixFiles() +{ + return QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, + u"publicsuffix/public_suffix_list.dafsa"_qs); +} + +QPublicSuffixDatabase::QPublicSuffixDatabase() +{ + for (auto &&fileName : locatePublicSuffixFiles()) { + if (loadFile(fileName)) + return; + } + +#if QT_CONFIG(publicsuffix_qt) + qCDebug(lcTld, "Using builtin publicsuffix list"); +#else + qCWarning(lcTld, "No usable publicsuffix file found"); +#endif +} + +bool QPublicSuffixDatabase::loadFile(const QString &fileName) +{ + static const QByteArrayView DafsaFileHeader = ".DAFSA@PSL_0 \n"; + + qCDebug(lcTld, "Loading publicsuffix file: %s", qUtf8Printable(fileName)); + + auto systemFile = std::make_unique(fileName); + + if (!systemFile->open(QIODevice::ReadOnly)) { + qCDebug(lcTld, "Failed to open publicsuffix file: %s", + qUtf8Printable(systemFile->errorString())); + return false; + } + + auto fileSize = systemFile->size(); + // Check if there is enough data for header, version byte and some data + if (fileSize < DafsaFileHeader.size() + 2) { + qCWarning(lcTld, "publicsuffix file is too small: %zu", std::size_t(fileSize)); + return false; + } + + auto header = systemFile->read(DafsaFileHeader.size()); + if (header != DafsaFileHeader) { + qCWarning(lcTld, "Invalid publicsuffix file header: %s", qUtf8Printable(header.toHex())); + return false; + } + + // Check if the file is UTF-8 compatible + if (!systemFile->seek(fileSize - 1)) { + qCWarning(lcTld, "Failed to seek to the end of file: %s", + qUtf8Printable(systemFile->errorString())); + return false; + } + + char version; + if (systemFile->read(&version, 1) != 1) { + qCWarning(lcTld, "Failed to read publicsuffix version"); + return false; + } + + if (version != 0x01) { + qCWarning(lcTld, "Unsupported publicsuffix version: %d", int(version)); + return false; + } + + const auto dataSize = fileSize - DafsaFileHeader.size() - 1; + // Try to map the file first + auto mappedData = systemFile->map(DafsaFileHeader.size(), dataSize); + if (mappedData) { + qCDebug(lcTld, "Using mapped system publicsuffix data"); + systemFile->close(); + m_data = QByteArrayView(mappedData, dataSize); + m_dev = std::move(systemFile); + return true; + } + + qCDebug(lcTld, "Failed to map publicsuffix file: %s", + qUtf8Printable(systemFile->errorString())); + + systemFile->seek(DafsaFileHeader.size()); + m_storage = systemFile->read(dataSize); + if (m_storage.size() != dataSize) { + qCWarning(lcTld, "Failed to read publicsuffix file"); + m_storage.clear(); + return false; + } + + qCDebug(lcTld, "Using system publicsuffix data"); + m_data = m_storage; + + return true; +} + +Q_GLOBAL_STATIC(QPublicSuffixDatabase, publicSuffix); + +#else + +static const QPublicSuffixDatabase m_publicSuffix; + +#endif // QT_CONFIG(publicsuffix_system) + /*! \internal @@ -82,7 +222,14 @@ Q_NETWORK_EXPORT bool qIsEffectiveTLD(QStringView domain) QByteArray decodedDomain = domain.toUtf8(); QByteArrayView domainView(decodedDomain); - auto ret = lookupDomain(domainView); +#if QT_CONFIG(publicsuffix_system) + if (publicSuffix.isDestroyed()) + return false; +#else + auto publicSuffix = &m_publicSuffix; +#endif // QT_CONFIG(publicsuffix_system) + + auto ret = publicSuffix->lookupDomain(domainView); if (ret != PSL_NOT_FOUND) { if (ret & PSL_FLAG_EXCEPTION) // 1 return false; @@ -93,7 +240,7 @@ Q_NETWORK_EXPORT bool qIsEffectiveTLD(QStringView domain) const auto dot = domainView.indexOf('.'); if (dot < 0) // Actual TLD: may be effective if the subject of a wildcard rule: return ret != PSL_NOT_FOUND; - ret = lookupDomain(domainView.sliced(dot + 1)); // 3 + ret = publicSuffix->lookupDomain(domainView.sliced(dot + 1)); // 3 if (ret == PSL_NOT_FOUND) return false; return (ret & PSL_FLAG_WILDCARD) != 0; diff --git a/src/network/kernel/qurltlds_p.h.INFO b/src/network/kernel/qurltlds_p.h.INFO index 02a367a97eb..d6162a2a0d6 100644 --- a/src/network/kernel/qurltlds_p.h.INFO +++ b/src/network/kernel/qurltlds_p.h.INFO @@ -5,6 +5,8 @@ qtbase/src/3rdparty/libpsl/src/psl-make-dafsa in the Qt source tree. To regenerate the file, run the following command from qtbase tree: src/3rdparty/libpsl/src/psl-make-dafsa public_suffix_list.dat src/network/kernel/qurltlds_p.h + src/3rdparty/libpsl/src/psl-make-dafsa --output-format=binary public_suffix_list.dat \ + tests/auto/network/access/qnetworkcookiejar/testdata/publicsuffix/public_suffix_list.dafsa Those arrays in qurltlds_p.h are derived from the Public Suffix List ([2]), which was originally provided by diff --git a/src/network/qt_cmdline.cmake b/src/network/qt_cmdline.cmake index 5bd73f6ed8a..148f3e0a2ac 100644 --- a/src/network/qt_cmdline.cmake +++ b/src/network/qt_cmdline.cmake @@ -9,3 +9,4 @@ qt_commandline_option(securetransport TYPE boolean) qt_commandline_option(schannel TYPE boolean) qt_commandline_option(ssl TYPE boolean) qt_commandline_option(system-proxies TYPE boolean) +qt_commandline_option(publicsuffix TYPE optionalString VALUES system qt no all) diff --git a/tests/auto/network/access/qnetworkcookiejar/CMakeLists.txt b/tests/auto/network/access/qnetworkcookiejar/CMakeLists.txt index 55f30633eea..2f3b6f2c8de 100644 --- a/tests/auto/network/access/qnetworkcookiejar/CMakeLists.txt +++ b/tests/auto/network/access/qnetworkcookiejar/CMakeLists.txt @@ -5,7 +5,7 @@ ##################################################################### # Collect test data -list(APPEND test_data "parser.json") +list(APPEND test_data "parser.json" "testdata/publicsuffix/public_suffix_list.dafsa") qt_internal_add_test(tst_qnetworkcookiejar SOURCES diff --git a/tests/auto/network/access/qnetworkcookiejar/testdata/publicsuffix/public_suffix_list.dafsa b/tests/auto/network/access/qnetworkcookiejar/testdata/publicsuffix/public_suffix_list.dafsa new file mode 100644 index 0000000000000000000000000000000000000000..346a783cc6b9a57b26e9edc5af5b7e2e7e3f4514 GIT binary patch literal 52710 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 literal 0 HcmV?d00001 diff --git a/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp b/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp index 2b50e14e2d5..f7f149956c8 100644 --- a/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp +++ b/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp @@ -44,6 +44,8 @@ class tst_QNetworkCookieJar: public QObject Q_OBJECT private slots: + void initTestCase(); + void getterSetter(); void setCookiesFromUrl_data(); void setCookiesFromUrl(); @@ -55,6 +57,8 @@ private slots: #endif void rfc6265_data(); void rfc6265(); +private: + QSharedPointer m_dataDir; }; class MyCookieJar: public QNetworkCookieJar @@ -82,6 +86,22 @@ void tst_QNetworkCookieJar::getterSetter() QCOMPARE(jar.allCookies(), list); } +void tst_QNetworkCookieJar::initTestCase() +{ +#if QT_CONFIG(topleveldomain) && QT_CONFIG(publicsuffix_system) + QString testDataDir; +#ifdef BUILTIN_TESTDATA + m_dataDir = QEXTRACTTESTDATA("/testdata"); + QVERIFY(m_dataDir); + testDataDir = m_dataDir->path() + "/testdata"; +#else + testDataDir = QFINDTESTDATA("testdata"); +#endif + qDebug() << "Test data dir:" << testDataDir; + qputenv("XDG_DATA_DIRS", QFile::encodeName(testDataDir)); +#endif +} + void tst_QNetworkCookieJar::setCookiesFromUrl_data() { QTest::addColumn >("preset");