aboutsummaryrefslogtreecommitdiff
path: root/src/base/QXmppStun.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2015-08-24 20:55:09 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2015-08-24 20:55:09 +0200
commitb55574a3103a0bf5b823b5b30a97f2c5c0f2b46b (patch)
tree2d2082837be28ce9fbeabf9d89c6e8949c6a50e7 /src/base/QXmppStun.cpp
parent5901b49b3f6b8d6f7d09678e34226a7f06311482 (diff)
downloadqxmpp-b55574a3103a0bf5b823b5b30a97f2c5c0f2b46b.tar.gz
set candidate foundations to a sane value
Diffstat (limited to 'src/base/QXmppStun.cpp')
-rw-r--r--src/base/QXmppStun.cpp25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/base/QXmppStun.cpp b/src/base/QXmppStun.cpp
index cd51b46f..77c3ac9d 100644
--- a/src/base/QXmppStun.cpp
+++ b/src/base/QXmppStun.cpp
@@ -103,6 +103,13 @@ static quint32 candidatePriority(const QXmppJingleCandidate &candidate, int loca
(256 - candidate.component());
}
+static QString computeFoundation(QXmppJingleCandidate::Type type, const QString &protocol, const QHostAddress &baseAddress)
+{
+ QCryptographicHash hash(QCryptographicHash::Md5);
+ hash.addData((QString::number(type) + protocol + baseAddress.toString()).toUtf8());
+ return hash.result().toHex();
+}
+
static bool isIPv6LinkLocalAddress(const QHostAddress &addr)
{
if (addr.protocol() != QAbstractSocket::IPv6Protocol)
@@ -1938,13 +1945,13 @@ CandidatePair *QXmppIceComponent::addRemoteCandidate(QUdpSocket *socket, const Q
// 7.2.1.3. Learning Peer Reflexive Candidates
QXmppJingleCandidate candidate;
candidate.setComponent(d->component);
- //candidate.setFoundation(..);
candidate.setHost(host);
candidate.setId(QXmppUtils::generateStanzaHash(10));
candidate.setPort(port);
candidate.setPriority(priority);
candidate.setProtocol("udp");
candidate.setType(QXmppJingleCandidate::PeerReflexiveType);
+ candidate.setFoundation(QXmppUtils::generateStanzaHash(32));
CandidatePair *pair = new CandidatePair(d->component, d->iceControlling, this);
pair->remote = candidate;
@@ -1991,14 +1998,12 @@ void QXmppIceComponent::setSockets(QList<QUdpSocket*> sockets)
d->sockets.clear();
// store candidates
- int foundation = 0;
foreach (QUdpSocket *socket, sockets) {
socket->setParent(this);
connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
QXmppJingleCandidate candidate;
candidate.setComponent(d->component);
- candidate.setFoundation(QString::number(foundation++));
// remove scope ID from IPv6 non-link local addresses
QHostAddress addr(socket->localAddress());
if (addr.protocol() == QAbstractSocket::IPv6Protocol &&
@@ -2011,6 +2016,10 @@ void QXmppIceComponent::setSockets(QList<QUdpSocket*> sockets)
candidate.setProtocol("udp");
candidate.setType(QXmppJingleCandidate::HostType);
candidate.setPriority(candidatePriority(candidate));
+ candidate.setFoundation(computeFoundation(
+ candidate.type(),
+ candidate.protocol(),
+ candidate.host()));
d->sockets << socket;
d->localCandidates << candidate;
@@ -2173,6 +2182,11 @@ void QXmppIceComponent::handleDatagram(const QByteArray &buffer, const QHostAddr
candidate.setProtocol("udp");
candidate.setType(QXmppJingleCandidate::ServerReflexiveType);
candidate.setPriority(candidatePriority(candidate));
+ candidate.setFoundation(computeFoundation(
+ candidate.type(),
+ candidate.protocol(),
+ socket->localAddress()));
+
d->localCandidates << candidate;
emit localCandidatesChanged();
@@ -2298,6 +2312,11 @@ void QXmppIceComponent::turnConnected()
candidate.setProtocol("udp");
candidate.setType(QXmppJingleCandidate::RelayedType);
candidate.setPriority(candidatePriority(candidate));
+ candidate.setFoundation(computeFoundation(
+ candidate.type(),
+ candidate.protocol(),
+ candidate.host()));
+
d->localCandidates << candidate;
emit localCandidatesChanged();