From 330eff72cee5dbe34f6ffbdcee0808f16a805051 Mon Sep 17 00:00:00 2001
From: Stephen Birarda <commit@birarda.com>
Date: Mon, 2 Dec 2013 17:18:07 -0800
Subject: [PATCH] repair usage of DS as STUN server

---
 assignment-client/src/AssignmentClient.cpp |  2 +-
 assignment-client/src/audio/AudioMixer.cpp |  2 +-
 assignment-client/src/audio/AudioMixer.h   |  4 ++--
 domain-server/src/DomainServer.cpp         |  6 +++---
 interface/src/PairingHandler.cpp           |  2 +-
 libraries/shared/src/HifiSockAddr.cpp      | 17 +++++++++--------
 libraries/shared/src/HifiSockAddr.h        |  2 +-
 libraries/shared/src/Node.cpp              |  2 +-
 libraries/shared/src/NodeList.cpp          |  7 +++++--
 9 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp
index d882afdcae..6b2b27730d 100644
--- a/assignment-client/src/AssignmentClient.cpp
+++ b/assignment-client/src/AssignmentClient.cpp
@@ -95,7 +95,7 @@ void AssignmentClient::readPendingDatagrams() {
                         // start the deployed assignment
                         QThread *workerThread = new QThread(this);
                         
-                        connect(workerThread, SIGNAL(started()), _currentAssignment, SLOT(run()));
+                        connect(workerThread, SIGNAL(started()), _currentAssignment, SLOT(setup()));
                         
                         connect(_currentAssignment, SIGNAL(finished()), this, SLOT(assignmentCompleted()));
                         connect(_currentAssignment, SIGNAL(finished()), workerThread, SLOT(quit()));
diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp
index 451904bb48..94bd787140 100644
--- a/assignment-client/src/audio/AudioMixer.cpp
+++ b/assignment-client/src/audio/AudioMixer.cpp
@@ -293,7 +293,7 @@ void AudioMixer::sendClientMixes() {
 }
 
 
-void AudioMixer::run() {
+void AudioMixer::setup() {
     // change the logging target name while this is running
     Logging::setTargetName(AUDIO_MIXER_LOGGING_TARGET_NAME);
     
diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h
index d9764170bc..f2fbd04373 100644
--- a/assignment-client/src/audio/AudioMixer.h
+++ b/assignment-client/src/audio/AudioMixer.h
@@ -22,8 +22,8 @@ class AudioMixer : public Assignment {
 public:
     AudioMixer(const unsigned char* dataBuffer, int numBytes);
 public slots:
-    /// runs the audio mixer
-    void run();
+    /// performs setup for the audio mixer
+    void setup();
     
     void processDatagram(const QByteArray& dataByteArray, const HifiSockAddr& senderSockAddr);
 signals:
diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp
index 175118ef7d..b10006e6cc 100644
--- a/domain-server/src/DomainServer.cpp
+++ b/domain-server/src/DomainServer.cpp
@@ -628,16 +628,16 @@ int DomainServer::run() {
                 int numBytesPrivateSocket = HifiSockAddr::unpackSockAddr(packetData + packetIndex, nodePublicAddress);
                 packetIndex += numBytesPrivateSocket;
                 
-                if (nodePublicAddress.getAddress().isNull() == 0) {
+                if (nodePublicAddress.getAddress().isNull()) {
                     // this node wants to use us its STUN server
                     // so set the node public address to whatever we perceive the public address to be
                     
-                    nodePublicAddress.setAddress(senderAddress);
-                    
                     // if the sender is on our box then leave its public address to 0 so that
                     // other users attempt to reach it on the same address they have for the domain-server
                     if (senderAddress.isLoopback()) {
                         nodePublicAddress.setAddress(QHostAddress());
+                    } else {
+                        nodePublicAddress.setAddress(senderAddress);
                     }
                 }
                 
diff --git a/interface/src/PairingHandler.cpp b/interface/src/PairingHandler.cpp
index 56d7642640..718a8c7dc8 100644
--- a/interface/src/PairingHandler.cpp
+++ b/interface/src/PairingHandler.cpp
@@ -37,7 +37,7 @@ void PairingHandler::sendPairRequest() {
     NodeList* nodeList = NodeList::getInstance();
     
     // use the getLocalAddress helper to get this client's listening address
-    quint32 localAddress = getLocalAddress();
+    quint32 localAddress = htonl(getHostOrderLocalAddress());
     
     char pairPacket[24] = {};
     sprintf(pairPacket, "Find %d.%d.%d.%d:%hu",
diff --git a/libraries/shared/src/HifiSockAddr.cpp b/libraries/shared/src/HifiSockAddr.cpp
index 66ae200026..0fdc8919ed 100644
--- a/libraries/shared/src/HifiSockAddr.cpp
+++ b/libraries/shared/src/HifiSockAddr.cpp
@@ -12,7 +12,7 @@
 #include <QtNetwork/QNetworkInterface>
 
 HifiSockAddr::HifiSockAddr() :
-    _address(QHostAddress::Null),
+    _address(),
     _port(0)
 {
     
@@ -55,15 +55,16 @@ void HifiSockAddr::swap(HifiSockAddr& otherSockAddr) {
 }
 
 int HifiSockAddr::packSockAddr(unsigned char* packetData, const HifiSockAddr& packSockAddr) {
-    unsigned int addressToPack = packSockAddr._address.toIPv4Address();
-    memcpy(packetData, &addressToPack, sizeof(packSockAddr._address.toIPv4Address()));
-    memcpy(packetData, &packSockAddr._port, sizeof(packSockAddr._port));
+    quint32 addressToPack = packSockAddr._address.isNull() ? 0 : packSockAddr._address.toIPv4Address();
+    memcpy(packetData, &addressToPack, sizeof(addressToPack));
+    memcpy(packetData + sizeof(addressToPack), &packSockAddr._port, sizeof(packSockAddr._port));
     
     return sizeof(addressToPack) + sizeof(packSockAddr._port);
 }
 
 int HifiSockAddr::unpackSockAddr(const unsigned char* packetData, HifiSockAddr& unpackDestSockAddr) {
-    unpackDestSockAddr._address = QHostAddress(*((quint32*) packetData));
+    quint32* address = (quint32*) packetData;
+    unpackDestSockAddr._address = *address == 0 ? QHostAddress() : QHostAddress(*address);
     unpackDestSockAddr._port = *((quint16*) (packetData + sizeof(quint32)));
     
     return sizeof(quint32) + sizeof(quint16);
@@ -74,11 +75,11 @@ bool HifiSockAddr::operator==(const HifiSockAddr &rhsSockAddr) const {
 }
 
 QDebug operator<<(QDebug debug, const HifiSockAddr &hifiSockAddr) {
-    debug.nospace() << hifiSockAddr._address.toString() << ":" << hifiSockAddr._port;
+    debug.nospace() << hifiSockAddr._address.toString().toLocal8Bit().constData() << ":" << hifiSockAddr._port;
     return debug;
 }
 
-quint32 getLocalAddress() {
+quint32 getHostOrderLocalAddress() {
     
     static int localAddress = 0;
     
@@ -95,7 +96,7 @@ quint32 getLocalAddress() {
                         qDebug("Node's local address is %s\n", entry.ip().toString().toLocal8Bit().constData());
                         
                         // set our localAddress and break out
-                        localAddress = htonl(entry.ip().toIPv4Address());
+                        localAddress = entry.ip().toIPv4Address();
                         break;
                     }
                 }
diff --git a/libraries/shared/src/HifiSockAddr.h b/libraries/shared/src/HifiSockAddr.h
index 6428453849..f11492805f 100644
--- a/libraries/shared/src/HifiSockAddr.h
+++ b/libraries/shared/src/HifiSockAddr.h
@@ -43,7 +43,7 @@ private:
     quint16 _port;
 };
 
-quint32 getLocalAddress();
+quint32 getHostOrderLocalAddress();
 
 Q_DECLARE_METATYPE(HifiSockAddr)
 
diff --git a/libraries/shared/src/Node.cpp b/libraries/shared/src/Node.cpp
index cc82677f9a..bcaf64f9c6 100644
--- a/libraries/shared/src/Node.cpp
+++ b/libraries/shared/src/Node.cpp
@@ -136,6 +136,6 @@ float Node::getAverageKilobitsPerSecond() {
 QDebug operator<<(QDebug debug, const Node &node) {
     debug.nospace() << node.getTypeName() << " (" << node.getType() << ")";
     debug << " " << node.getUUID().toString().toLocal8Bit().constData() << " ";
-    debug.nospace() << node.getLocalSocket() << "/" << node.getPublicSocket();
+    debug.nospace() << node.getPublicSocket() << "/" << node.getLocalSocket();
     return debug.nospace();
 }
diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp
index b1dfa2ab38..16b55bd1db 100644
--- a/libraries/shared/src/NodeList.cpp
+++ b/libraries/shared/src/NodeList.cpp
@@ -76,6 +76,7 @@ NodeList::NodeList(char newOwnerType, unsigned short int newSocketListenPort) :
     _stunRequestsSinceSuccess(0)
 {
     _nodeSocket.bind(QHostAddress::AnyIPv4, newSocketListenPort);
+    qDebug() << "NodeList socket is listening on" << _nodeSocket.localPort() << "\n";
 }
 
 NodeList::~NodeList() {
@@ -361,7 +362,8 @@ void NodeList::sendSTUNRequest() {
         }
         
         // reset the public address and port
-        _publicSockAddr = HifiSockAddr();
+        // use 0 so the DS knows to act as out STUN server
+        _publicSockAddr = HifiSockAddr(QHostAddress(), _nodeSocket.localPort());
     }
 }
 
@@ -539,7 +541,8 @@ void NodeList::sendDomainServerCheckIn() {
         
         // pack our local address to send to domain-server
         packetPosition += HifiSockAddr::packSockAddr(checkInPacket + (packetPosition - checkInPacket),
-                                                     HifiSockAddr(_nodeSocket.localAddress(), _nodeSocket.localPort()));
+                                                     HifiSockAddr(QHostAddress(getHostOrderLocalAddress()),
+                                                                  _nodeSocket.localPort()));
         
         // add the number of bytes for node types of interest
         *(packetPosition++) = numBytesNodesOfInterest;