diff options
| author | Linus Jahn <lnj@kaidan.im> | 2020-10-02 22:56:58 +0200 |
|---|---|---|
| committer | LNJ <lnj@kaidan.im> | 2020-10-10 22:33:41 +0200 |
| commit | aaa64971fcf3d72d8b66ebf37b8c1005017a5ea4 (patch) | |
| tree | b2c8f44029b8d1eee0f1382569ca7655d156d3f3 /src | |
| parent | f28225a6b3413b8e8decac40bfd0ee394e6dee01 (diff) | |
| download | qxmpp-aaa64971fcf3d72d8b66ebf37b8c1005017a5ea4.tar.gz | |
Port remaining Qt-6-removed APIs
Diffstat (limited to 'src')
| -rw-r--r-- | src/base/QXmppSasl.cpp | 5 | ||||
| -rw-r--r-- | src/base/QXmppStun.cpp | 1 | ||||
| -rw-r--r-- | src/base/QXmppUtils.cpp | 54 | ||||
| -rw-r--r-- | src/base/QXmppUtils.h | 1 | ||||
| -rw-r--r-- | src/client/QXmppClientExtension.h | 1 | ||||
| -rw-r--r-- | src/client/QXmppInvokable.cpp | 4 | ||||
| -rw-r--r-- | src/client/QXmppOutgoingClient.cpp | 62 | ||||
| -rw-r--r-- | src/client/QXmppOutgoingClient.h | 3 | ||||
| -rw-r--r-- | src/server/QXmppServer.cpp | 6 | ||||
| -rw-r--r-- | src/server/QXmppServerExtension.h | 1 |
10 files changed, 70 insertions, 68 deletions
diff --git a/src/base/QXmppSasl.cpp b/src/base/QXmppSasl.cpp index b045c864..372f4d28 100644 --- a/src/base/QXmppSasl.cpp +++ b/src/base/QXmppSasl.cpp @@ -927,9 +927,10 @@ QByteArray QXmppSaslDigestMd5::serializeMessage(const QMap<QByteArray, QByteArra if (quote) { value.replace(QByteArrayLiteral("\\"), QByteArrayLiteral("\\\\")); value.replace(QByteArrayLiteral("\""), QByteArrayLiteral("\\\"")); - ba.append(QByteArrayLiteral("\"") + value + QByteArrayLiteral("\"")); - } else + ba.append('"' + value + '"'); + } else { ba.append(value); + } } return ba; } diff --git a/src/base/QXmppStun.cpp b/src/base/QXmppStun.cpp index f109d5c6..af36a085 100644 --- a/src/base/QXmppStun.cpp +++ b/src/base/QXmppStun.cpp @@ -32,6 +32,7 @@ #include <QNetworkInterface> #include <QTimer> #include <QUdpSocket> +#include <QVariant> #define STUN_ID_SIZE 12 #define STUN_RTO_INTERVAL 500 diff --git a/src/base/QXmppUtils.cpp b/src/base/QXmppUtils.cpp index 1c0c1906..238aca70 100644 --- a/src/base/QXmppUtils.cpp +++ b/src/base/QXmppUtils.cpp @@ -35,7 +35,7 @@ #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) #include <QRandomGenerator> #endif -#include <QRegExp> +#include <QRegularExpression> #include <QString> #include <QStringList> #include <QUuid> @@ -116,30 +116,8 @@ static quint32 crctable[256] = { /// QDateTime QXmppUtils::datetimeFromString(const QString &str) { - QRegExp tzRe(QStringLiteral("(Z|([+-])([0-9]{2}):([0-9]{2}))")); - int tzPos = tzRe.indexIn(str, 19); - if (str.size() < 20 || tzPos < 0) - return QDateTime(); - - // process date and time - QDateTime dt = QDateTime::fromString(str.left(19), QStringLiteral("yyyy-MM-ddThh:mm:ss")); - dt.setTimeSpec(Qt::UTC); - - // process milliseconds - if (tzPos > 20 && str.at(19) == '.') { - QString millis = (str.mid(20, tzPos - 20) + QStringLiteral("000")).left(3); - dt = dt.addMSecs(millis.toInt()); - } - - // process time zone - if (tzRe.cap(1) != QStringLiteral("Z")) { - int offset = tzRe.cap(3).toInt() * 3600 + tzRe.cap(4).toInt() * 60; - if (tzRe.cap(2) == QStringLiteral("+")) - dt = dt.addSecs(-offset); - else - dt = dt.addSecs(offset); - } - return dt; + // Qt::ISODate parses milliseconds, but doesn't output them + return QDateTime::fromString(str, Qt::ISODate).toUTC(); } /// @@ -148,11 +126,9 @@ QDateTime QXmppUtils::datetimeFromString(const QString &str) /// QString QXmppUtils::datetimeToString(const QDateTime &dt) { - QDateTime utc = dt.toUTC(); - if (utc.time().msec()) - return utc.toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzzZ")); - else - return utc.toString(QStringLiteral("yyyy-MM-ddThh:mm:ssZ")); + if (dt.time().msec()) + return dt.toUTC().toString(Qt::ISODateWithMs); + return dt.toUTC().toString(Qt::ISODate); } /// @@ -161,21 +137,23 @@ QString QXmppUtils::datetimeToString(const QDateTime &dt) /// int QXmppUtils::timezoneOffsetFromString(const QString &str) { - QRegExp tzRe(QStringLiteral("(Z|([+-])([0-9]{2}):([0-9]{2}))")); - if (!tzRe.exactMatch(str)) + static const QRegularExpression timezoneRegex(QStringLiteral("(Z|([+-])([0-9]{2}):([0-9]{2}))")); + + const auto match = timezoneRegex.match(str); + if (!match.hasMatch()) return 0; // No offset from UTC - if (tzRe.cap(1) == QStringLiteral("Z")) + if (match.captured(1) == u'Z') return 0; // Calculate offset - const int offset = tzRe.cap(3).toInt() * 3600 + - tzRe.cap(4).toInt() * 60; - if (tzRe.cap(2) == QStringLiteral("-")) + const int offset = match.captured(3).toInt() * 3600 + + match.captured(4).toInt() * 60; + + if (match.captured(2) == u'-') return -offset; - else - return offset; + return offset; } /// diff --git a/src/base/QXmppUtils.h b/src/base/QXmppUtils.h index 88d7123b..5a465819 100644 --- a/src/base/QXmppUtils.h +++ b/src/base/QXmppUtils.h @@ -37,7 +37,6 @@ class QByteArray; class QDateTime; class QDomElement; class QString; -class QStringList; /// \brief The QXmppUtils class contains static utility functions. /// diff --git a/src/client/QXmppClientExtension.h b/src/client/QXmppClientExtension.h index 8c115319..5f5c56e5 100644 --- a/src/client/QXmppClientExtension.h +++ b/src/client/QXmppClientExtension.h @@ -28,7 +28,6 @@ #include "QXmppLogger.h" class QDomElement; -class QStringList; class QXmppClient; class QXmppClientExtensionPrivate; diff --git a/src/client/QXmppInvokable.cpp b/src/client/QXmppInvokable.cpp index c3aaa4b9..ccbfb470 100644 --- a/src/client/QXmppInvokable.cpp +++ b/src/client/QXmppInvokable.cpp @@ -80,7 +80,11 @@ QVariant QXmppInvokable::dispatch(const QByteArray &method, const QList<QVariant genericArgs.value(7, QGenericArgument()), genericArgs.value(8, QGenericArgument()), genericArgs.value(9, QGenericArgument()))) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + QVariant returnValue(QMetaType(resultType), result); +#else QVariant returnValue(resultType, result); +#endif QMetaType::destroy(resultType, result); return returnValue; } else { diff --git a/src/client/QXmppOutgoingClient.cpp b/src/client/QXmppOutgoingClient.cpp index ed3cafb8..9f3e5e58 100644 --- a/src/client/QXmppOutgoingClient.cpp +++ b/src/client/QXmppOutgoingClient.cpp @@ -52,7 +52,7 @@ #include <QCoreApplication> #include <QDomDocument> #include <QHostAddress> -#include <QRegExp> +#include <QRegularExpression> #include <QStringList> #include <QTimer> #include <QXmlStreamWriter> @@ -492,13 +492,8 @@ void QXmppOutgoingClient::handleStanza(const QDomElement &nodeRecv) emit connected(); } else if (ns == ns_stream && nodeRecv.tagName() == "error") { // handle redirects - QRegExp redirectRegex("([^:]+)(:[0-9]+)?"); - if (redirectRegex.exactMatch(nodeRecv.firstChildElement("see-other-host").text())) { - d->redirectHost = redirectRegex.cap(0); - if (!redirectRegex.cap(2).isEmpty()) - d->redirectPort = redirectRegex.cap(2).mid(1).toUShort(); - else - d->redirectPort = 5222; + const auto otherHost = nodeRecv.firstChildElement("see-other-host"); + if (!otherHost.isNull() && setResumeAddress(otherHost.text())) { QXmppStream::disconnectFromHost(); return; } @@ -573,11 +568,12 @@ void QXmppOutgoingClient::handleStanza(const QDomElement &nodeRecv) // bind result if (bind.type() == QXmppIq::Result) { if (!bind.jid().isEmpty()) { - QRegExp jidRegex("^([^@/]+)@([^@/]+)/(.+)$"); - if (jidRegex.exactMatch(bind.jid())) { - configuration().setUser(jidRegex.cap(1)); - configuration().setDomain(jidRegex.cap(2)); - configuration().setResource(jidRegex.cap(3)); + static const QRegularExpression jidRegex("^([^@/]+)@([^@/]+)/(.+)$"); + + if (const auto match = jidRegex.match(bind.jid()); match.hasMatch()) { + configuration().setUser(match.captured(1)); + configuration().setDomain(match.captured(2)); + configuration().setResource(match.captured(3)); } else { warning("Bind IQ received with invalid JID: " + bind.jid()); } @@ -683,17 +679,7 @@ void QXmppOutgoingClient::handleStanza(const QDomElement &nodeRecv) d->smId = streamManagementEnabled.id(); d->canResume = streamManagementEnabled.resume(); if (streamManagementEnabled.resume() && !streamManagementEnabled.location().isEmpty()) { - QRegExp locationRegex("([^:]+)(:[0-9]+)?"); - if (locationRegex.exactMatch(streamManagementEnabled.location())) { - d->resumeHost = locationRegex.cap(0); - if (!locationRegex.cap(2).isEmpty()) - d->resumePort = locationRegex.cap(2).mid(1).toUShort(); - else - d->resumePort = 5222; - } else { - d->resumeHost = QString(); - d->resumePort = 0; - } + setResumeAddress(streamManagementEnabled.location()); } enableStreamManagement(true); @@ -776,6 +762,34 @@ void QXmppOutgoingClient::pingTimeout() emit error(QXmppClient::KeepAliveError); } +bool QXmppOutgoingClient::setResumeAddress(const QString &address) +{ + if (const auto location = parseHostAddress(address); + !location.first.isEmpty()) { + d->resumeHost = location.first; + + if (location.second > 0) { + d->resumePort = location.second; + } else { + d->resumePort = 5222; + } + return true; + } + + d->resumeHost.clear(); + d->resumePort = 0; + return false; +} + +std::pair<QString, int> QXmppOutgoingClient::parseHostAddress(const QString &address) +{ + QUrl url("//" + address); + if (url.isValid() && !url.host().isEmpty()) { + return { url.host(), url.port() }; + } + return { {}, -1 }; +} + void QXmppOutgoingClientPrivate::sendNonSASLAuth(bool plainText) { QXmppNonSASLAuthIq authQuery; diff --git a/src/client/QXmppOutgoingClient.h b/src/client/QXmppOutgoingClient.h index abb044f3..8693c877 100644 --- a/src/client/QXmppOutgoingClient.h +++ b/src/client/QXmppOutgoingClient.h @@ -104,6 +104,9 @@ private Q_SLOTS: void pingTimeout(); private: + bool setResumeAddress(const QString &address); + static std::pair<QString, int> parseHostAddress(const QString &address); + friend class QXmppOutgoingClientPrivate; QXmppOutgoingClientPrivate *const d; }; diff --git a/src/server/QXmppServer.cpp b/src/server/QXmppServer.cpp index 4591fc3e..ee146b62 100644 --- a/src/server/QXmppServer.cpp +++ b/src/server/QXmppServer.cpp @@ -39,6 +39,7 @@ #include <QFileInfo> #include <QPluginLoader> #include <QSslCertificate> +#include <QSslConfiguration> #include <QSslKey> #include <QSslSocket> @@ -886,8 +887,11 @@ void QXmppSslServer::incomingConnection(qintptr socketDescriptor) } if (!d->localCertificate.isNull() && !d->privateKey.isNull()) { + auto sslConfig = socket->sslConfiguration(); + sslConfig.setCaCertificates(sslConfig.caCertificates() + d->caCertificates); + socket->setSslConfiguration(sslConfig); + socket->setProtocol(QSsl::AnyProtocol); - socket->addCaCertificates(d->caCertificates); socket->setLocalCertificate(d->localCertificate); socket->setPrivateKey(d->privateKey); } diff --git a/src/server/QXmppServerExtension.h b/src/server/QXmppServerExtension.h index af736225..946079e8 100644 --- a/src/server/QXmppServerExtension.h +++ b/src/server/QXmppServerExtension.h @@ -29,7 +29,6 @@ #include <QVariant> class QDomElement; -class QStringList; class QXmppServer; class QXmppServerExtensionPrivate; |
