aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2020-10-02 22:56:58 +0200
committerLNJ <lnj@kaidan.im>2020-10-10 22:33:41 +0200
commitaaa64971fcf3d72d8b66ebf37b8c1005017a5ea4 (patch)
treeb2c8f44029b8d1eee0f1382569ca7655d156d3f3 /src
parentf28225a6b3413b8e8decac40bfd0ee394e6dee01 (diff)
downloadqxmpp-aaa64971fcf3d72d8b66ebf37b8c1005017a5ea4.tar.gz
Port remaining Qt-6-removed APIs
Diffstat (limited to 'src')
-rw-r--r--src/base/QXmppSasl.cpp5
-rw-r--r--src/base/QXmppStun.cpp1
-rw-r--r--src/base/QXmppUtils.cpp54
-rw-r--r--src/base/QXmppUtils.h1
-rw-r--r--src/client/QXmppClientExtension.h1
-rw-r--r--src/client/QXmppInvokable.cpp4
-rw-r--r--src/client/QXmppOutgoingClient.cpp62
-rw-r--r--src/client/QXmppOutgoingClient.h3
-rw-r--r--src/server/QXmppServer.cpp6
-rw-r--r--src/server/QXmppServerExtension.h1
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;