From c9dc91900fb5c1eb8f1b10235560de8464be14cb Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 15 Dec 2016 16:31:44 -0800 Subject: [PATCH 1/8] Checkpoint --- domain-server/src/DomainServer.cpp | 1 + .../src/DomainServerSettingsManager.cpp | 51 +++++++++++++++++++ .../src/DomainServerSettingsManager.h | 1 + interface/resources/qml/hifi/Pal.qml | 5 ++ libraries/networking/src/NodeList.cpp | 37 ++++++++++++++ libraries/networking/src/NodeList.h | 3 ++ .../networking/src/udt/PacketHeaders.cpp | 4 +- libraries/networking/src/udt/PacketHeaders.h | 3 +- .../src/UsersScriptingInterface.cpp | 6 +++ .../src/UsersScriptingInterface.h | 13 +++++ scripts/system/pal.js | 12 ++++- 11 files changed, 132 insertions(+), 4 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 3dd75a19b2..0f7923519b 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -532,6 +532,7 @@ void DomainServer::setupNodeListAndAssignments() { // NodeList won't be available to the settings manager when it is created, so call registerListener here packetReceiver.registerListener(PacketType::DomainSettingsRequest, &_settingsManager, "processSettingsRequestPacket"); packetReceiver.registerListener(PacketType::NodeKickRequest, &_settingsManager, "processNodeKickRequestPacket"); + packetReceiver.registerListener(PacketType::UsernameFromIDRequest, &_settingsManager, "processUsernameFromIDRequestPacket"); // register the gatekeeper for the packets it needs to receive packetReceiver.registerListener(PacketType::DomainConnectRequest, &_gatekeeper, "processConnectRequestPacket"); diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index 18a46e0658..d586c6318f 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -748,6 +748,57 @@ void DomainServerSettingsManager::processNodeKickRequestPacket(QSharedPointer message, SharedNodePointer sendingNode) { + // before we do any processing on this packet make sure it comes from a node that is allowed to kick + if (sendingNode->getCanKick()) { + // pull the UUID being kicked from the packet + QUuid nodeUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); + + if (!nodeUUID.isNull() && nodeUUID != sendingNode->getUUID()) { + // make sure we actually have a node with this UUID + auto limitedNodeList = DependencyManager::get(); + + auto matchingNode = limitedNodeList->nodeWithUUID(nodeUUID); + + if (matchingNode) { + // we have a matching node, time to decide how to store updated permissions for this node + + NodePermissionsPointer destinationPermissions; + + QString verifiedUsername = matchingNode->getPermissions().getVerifiedUserName(); + + bool newPermissions = false; + + if (!verifiedUsername.isEmpty()) { + QByteArray printableVerifiedUsername = qPrintable(verifiedUsername); + // setup the packet + auto usernameFromIDRequestPacket = NLPacket::create(PacketType::UsernameFromIDRequest, NUM_BYTES_RFC4122_UUID + printableVerifiedUsername.length(), true); + + // write the node ID to the packet + usernameFromIDRequestPacket->write(nodeUUID.toRfc4122()); + // write the username to the packet + usernameFromIDRequestPacket->write(printableVerifiedUsername); + + auto nodeList = DependencyManager::get(); + nodeList->sendPacket(std::move(usernameFromIDRequestPacket), message->getSenderSockAddr()); + } + } + else { + qWarning() << "Node username request received for unknown node. Refusing to process."; + } + } + else { + // this isn't a UUID we can use + qWarning() << "Node username request received for invalid node ID. Refusing to process."; + } + + } + else { + qWarning() << "Refusing to process a username request packet from node" << uuidStringWithoutCurlyBraces(sendingNode->getUUID()) + << "that does not have kick permissions."; + } +} + QStringList DomainServerSettingsManager::getAllNames() const { QStringList result; foreach (auto key, _agentPermissions.keys()) { diff --git a/domain-server/src/DomainServerSettingsManager.h b/domain-server/src/DomainServerSettingsManager.h index 06ad7decd1..8c6155b3c0 100644 --- a/domain-server/src/DomainServerSettingsManager.h +++ b/domain-server/src/DomainServerSettingsManager.h @@ -113,6 +113,7 @@ public slots: private slots: void processSettingsRequestPacket(QSharedPointer message); void processNodeKickRequestPacket(QSharedPointer message, SharedNodePointer sendingNode); + void processUsernameFromIDRequestPacket(QSharedPointer message, SharedNodePointer sendingNode); private: QStringList _argumentList; diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 382b8fc962..a96353d7f0 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -72,6 +72,11 @@ Rectangle { table.selection.deselect(userIndex); } break; + case 'updateUsername': + var userId = message.params[0]; + var userName = message.params[1]; + var userIndex = findSessionIndex(userId); + table.get(userIndex).itemCell.nameCard.userName = userName; default: console.log('Unrecognized message:', JSON.stringify(message)); } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 29b7ea0385..57c5063604 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -127,6 +127,7 @@ NodeList::NodeList(char newOwnerType, int socketListenPort, int dtlsListenPort) packetReceiver.registerListener(PacketType::ICEPingReply, &_domainHandler, "processICEPingReplyPacket"); packetReceiver.registerListener(PacketType::DomainServerPathResponse, this, "processDomainServerPathResponse"); packetReceiver.registerListener(PacketType::DomainServerRemovedNode, this, "processDomainServerRemovedNode"); + packetReceiver.registerListener(PacketType::UsernameFromIDRequest, this, "processUsernameFromIDRequestPacket"); } qint64 NodeList::sendStats(QJsonObject statsObject, HifiSockAddr destination) { @@ -889,3 +890,39 @@ void NodeList::muteNodeBySessionID(const QUuid& nodeID) { } } + +void NodeList::requestUsernameFromSessionID(const QUuid& nodeID) { + // send a request to domain-server to get the username associated with the given session ID + + if (!nodeID.isNull()) { + if (getThisNodeCanKick()) { + // setup the packet + auto usernameFromIDRequestPacket = NLPacket::create(PacketType::UsernameFromIDRequest, NUM_BYTES_RFC4122_UUID, true); + + // write the node ID to the packet + usernameFromIDRequestPacket->write(nodeID.toRfc4122()); + + qDebug() << "Sending packet to get username of node" << uuidStringWithoutCurlyBraces(nodeID); + + sendPacket(std::move(usernameFromIDRequestPacket), _domainHandler.getSockAddr()); + } + else { + qWarning() << "You do not have permissions to kick in this domain." + << "Request to get the username of node" << uuidStringWithoutCurlyBraces(nodeID) << "will not be sent"; + } + } + else { + qWarning() << "NodeList::requestUsernameFromSessionID called with an invalid ID."; + + } +} + +void NodeList::processUsernameFromIDRequestPacket(QSharedPointer message) { + // read the UUID from the packet + // read the UUID from the packet, remove it if it exists + QUuid nodeUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); + // read the username from the packet + QString username = message->readString(); + + emit usernameFromID(nodeUUID, username); +} diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 9a9b85b851..8f69f9dc7f 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -81,6 +81,8 @@ public: void kickNodeBySessionID(const QUuid& nodeID); void muteNodeBySessionID(const QUuid& nodeID); + void requestUsernameFromSessionID(const QUuid& nodeID); + void processUsernameFromIDRequestPacket(QSharedPointer message); public slots: void reset(); @@ -108,6 +110,7 @@ signals: void receivedDomainServerList(); void ignoredNode(const QUuid& nodeID); void ignoreRadiusEnabledChanged(bool isIgnored); + void usernameFromID(QUuid& nodeID, QString& username); private slots: void stopKeepalivePingTimer(); diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 34a70f8da6..ec904f9ba8 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -26,8 +26,8 @@ const QSet NON_VERIFIED_PACKETS = QSet() << PacketType::NodeJsonStats << PacketType::EntityQuery << PacketType::OctreeDataNack << PacketType::EntityEditNack << PacketType::DomainListRequest << PacketType::StopNode - << PacketType::DomainDisconnectRequest << PacketType::NodeKickRequest - << PacketType::NodeMuteRequest; + << PacketType::DomainDisconnectRequest << PacketType::UsernameFromIDRequest + << PacketType::NodeKickRequest << PacketType::NodeMuteRequest; const QSet NON_SOURCED_PACKETS = QSet() << PacketType::StunResponse << PacketType::CreateAssignment << PacketType::RequestAssignment diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index dbeb1e63b0..513b0c3b8c 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -101,7 +101,8 @@ public: NodeKickRequest, NodeMuteRequest, RadiusIgnoreRequest, - LAST_PACKET_TYPE = RadiusIgnoreRequest + UsernameFromIDRequest, + LAST_PACKET_TYPE = UsernameFromIDRequest }; }; diff --git a/libraries/script-engine/src/UsersScriptingInterface.cpp b/libraries/script-engine/src/UsersScriptingInterface.cpp index 83181f7509..d774733cea 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.cpp +++ b/libraries/script-engine/src/UsersScriptingInterface.cpp @@ -18,6 +18,7 @@ UsersScriptingInterface::UsersScriptingInterface() { auto nodeList = DependencyManager::get(); connect(nodeList.data(), &LimitedNodeList::canKickChanged, this, &UsersScriptingInterface::canKickChanged); connect(nodeList.data(), &NodeList::ignoreRadiusEnabledChanged, this, &UsersScriptingInterface::ignoreRadiusEnabledChanged); + connect(nodeList.data(), &NodeList::usernameFromID, this, &UsersScriptingInterface::usernameFromID); } void UsersScriptingInterface::ignore(const QUuid& nodeID) { @@ -35,6 +36,11 @@ void UsersScriptingInterface::mute(const QUuid& nodeID) { DependencyManager::get()->muteNodeBySessionID(nodeID); } +void UsersScriptingInterface::requestUsernameFromID(const QUuid& nodeID) { + // ask the Domain Server via the NodeList for the username associated with the given session ID + DependencyManager::get()->requestUsernameFromSessionID(nodeID); +} + bool UsersScriptingInterface::getCanKick() { // ask the NodeList to return our ability to kick return DependencyManager::get()->getThisNodeCanKick(); diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h index 87e8c7e0d8..a1d41c5fac 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.h +++ b/libraries/script-engine/src/UsersScriptingInterface.h @@ -51,6 +51,13 @@ public slots: */ void mute(const QUuid& nodeID); + /**jsdoc + * Returns a string containing the username associated with the given Avatar UUID + * @function Users.getUsernameFromID + * @param {nodeID} nodeID The node or session ID of the user whose username you want. + */ + void requestUsernameFromID(const QUuid& nodeID); + /**jsdoc * Returns `true` if the DomainServer will allow this Node/Avatar to make kick * @function Users.getCanKick @@ -92,6 +99,12 @@ signals: * @function Users.enteredIgnoreRadius */ void enteredIgnoreRadius(); + + /**jsdoc + * Notifies scripts of the username associated with a UUID. + * @function Users.enteredIgnoreRadius + */ + void usernameFromID(QUuid& nodeID, QString& username); }; diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 175418cd2e..cdfc9bb15c 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -118,9 +118,12 @@ function populateUserList() { var avatar = AvatarList.getAvatar(id); var avatarPalDatum = { displayName: avatar.displayName || ('anonymous ' + counter++), - userName: "fakeAcct" + (id || "Me"), + userName: Users.canKick ? 'Obtaining username...' : '', sessionId: id || '' }; + if (Users.canKick) { + Users.getUsernameFromID(id); + } data.push(avatarPalDatum); if (id) { // No overlay for ourself. addAvatarNode(id); @@ -129,6 +132,13 @@ function populateUserList() { }); pal.sendToQml({method: 'users', params: data}); } + +function usernameFromID(id, username) { + var data = { id: id, username: username }; + print('Username Data:', JSON.stringify(data)); + pal.sendToQml({ method: 'updateUsername', params: data }); +} + var pingPong = true; function updateOverlays() { var eye = Camera.position; From 802e2835080448b7f4d07c02a7d5b496409e0f55 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 15 Dec 2016 18:16:45 -0800 Subject: [PATCH 2/8] Another checkpoint, getting closer --- .../src/DomainServerSettingsManager.cpp | 27 +++++++++++-------- libraries/networking/src/NodeList.cpp | 7 ++--- libraries/networking/src/NodeList.h | 2 +- .../networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 4 ++- scripts/system/pal.js | 8 +++--- 6 files changed, 29 insertions(+), 21 deletions(-) diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index d586c6318f..8a8b3002d1 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -769,19 +769,24 @@ void DomainServerSettingsManager::processUsernameFromIDRequestPacket(QSharedPoin bool newPermissions = false; + QByteArray printableVerifiedUsername; + if (!verifiedUsername.isEmpty()) { - QByteArray printableVerifiedUsername = qPrintable(verifiedUsername); - // setup the packet - auto usernameFromIDRequestPacket = NLPacket::create(PacketType::UsernameFromIDRequest, NUM_BYTES_RFC4122_UUID + printableVerifiedUsername.length(), true); - - // write the node ID to the packet - usernameFromIDRequestPacket->write(nodeUUID.toRfc4122()); - // write the username to the packet - usernameFromIDRequestPacket->write(printableVerifiedUsername); - - auto nodeList = DependencyManager::get(); - nodeList->sendPacket(std::move(usernameFromIDRequestPacket), message->getSenderSockAddr()); + printableVerifiedUsername = qPrintable(verifiedUsername); + } else { + printableVerifiedUsername = qPrintable(""); } + // setup the packet + auto usernameFromIDReplyPacket = NLPacket::create(PacketType::UsernameFromIDReply, NUM_BYTES_RFC4122_UUID + printableVerifiedUsername.length(), true); + + // write the node ID to the packet + usernameFromIDReplyPacket->write(nodeUUID.toRfc4122()); + // write the username to the packet + usernameFromIDReplyPacket->write(printableVerifiedUsername); + + auto nodeList = DependencyManager::get(); + nodeList->sendPacket(std::move(usernameFromIDReplyPacket), message->getSenderSockAddr()); + qDebug() << "SENDING PACKET."; } else { qWarning() << "Node username request received for unknown node. Refusing to process."; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 57c5063604..69c6924df2 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -127,7 +127,7 @@ NodeList::NodeList(char newOwnerType, int socketListenPort, int dtlsListenPort) packetReceiver.registerListener(PacketType::ICEPingReply, &_domainHandler, "processICEPingReplyPacket"); packetReceiver.registerListener(PacketType::DomainServerPathResponse, this, "processDomainServerPathResponse"); packetReceiver.registerListener(PacketType::DomainServerRemovedNode, this, "processDomainServerRemovedNode"); - packetReceiver.registerListener(PacketType::UsernameFromIDRequest, this, "processUsernameFromIDRequestPacket"); + packetReceiver.registerListener(PacketType::UsernameFromIDReply, this, "processUsernameFromIDReply"); } qint64 NodeList::sendStats(QJsonObject statsObject, HifiSockAddr destination) { @@ -917,12 +917,13 @@ void NodeList::requestUsernameFromSessionID(const QUuid& nodeID) { } } -void NodeList::processUsernameFromIDRequestPacket(QSharedPointer message) { +void NodeList::processUsernameFromIDReply(QSharedPointer message) { // read the UUID from the packet - // read the UUID from the packet, remove it if it exists QUuid nodeUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); // read the username from the packet QString username = message->readString(); + qDebug() << "Got username" << username << "for node" << uuidStringWithoutCurlyBraces(nodeUUID); + emit usernameFromID(nodeUUID, username); } diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 8f69f9dc7f..25091e8e3c 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -82,7 +82,7 @@ public: void kickNodeBySessionID(const QUuid& nodeID); void muteNodeBySessionID(const QUuid& nodeID); void requestUsernameFromSessionID(const QUuid& nodeID); - void processUsernameFromIDRequestPacket(QSharedPointer message); + void processUsernameFromIDReply(QSharedPointer message); public slots: void reset(); diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index ec904f9ba8..9143ffc0b9 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -39,7 +39,7 @@ const QSet NON_SOURCED_PACKETS = QSet() << PacketType::ICEServerPeerInformation << PacketType::ICEServerQuery << PacketType::ICEServerHeartbeat << PacketType::ICEServerHeartbeatACK << PacketType::ICEPing << PacketType::ICEPingReply << PacketType::ICEServerHeartbeatDenied << PacketType::AssignmentClientStatus << PacketType::StopNode - << PacketType::DomainServerRemovedNode; + << PacketType::DomainServerRemovedNode << PacketType::UsernameFromIDReply; PacketVersion versionForPacketType(PacketType packetType) { switch (packetType) { diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 513b0c3b8c..c9fad0c1f6 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -102,7 +102,9 @@ public: NodeMuteRequest, RadiusIgnoreRequest, UsernameFromIDRequest, - LAST_PACKET_TYPE = UsernameFromIDRequest + UsernameFromIDReply, + LAST_PACKET_TYPE = RadiusIgnoreRequest + //LAST_PACKET_TYPE = UsernameFromIDRequest }; }; diff --git a/scripts/system/pal.js b/scripts/system/pal.js index cdfc9bb15c..8f499d5e2f 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -118,11 +118,11 @@ function populateUserList() { var avatar = AvatarList.getAvatar(id); var avatarPalDatum = { displayName: avatar.displayName || ('anonymous ' + counter++), - userName: Users.canKick ? 'Obtaining username...' : '', + userName: (Users.canKick && id) ? 'Obtaining username...' : '', sessionId: id || '' }; - if (Users.canKick) { - Users.getUsernameFromID(id); + if (Users.canKick && id) { + Users.requestUsernameFromID(id); } data.push(avatarPalDatum); if (id) { // No overlay for ourself. @@ -134,7 +134,7 @@ function populateUserList() { } function usernameFromID(id, username) { - var data = { id: id, username: username }; + var data = { id: id, username: username + '\\' + id }; print('Username Data:', JSON.stringify(data)); pal.sendToQml({ method: 'updateUsername', params: data }); } From 2c5db54b0835bc09be3f33e7922e54e3b4692c16 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 16 Dec 2016 14:01:21 -0800 Subject: [PATCH 3/8] Super close --- .../src/DomainServerSettingsManager.cpp | 27 +++++--------- interface/resources/qml/hifi/Pal.qml | 5 ++- libraries/networking/src/NodeList.cpp | 36 +++++++++---------- libraries/networking/src/NodeList.h | 5 +-- libraries/networking/src/udt/PacketHeaders.h | 3 +- .../src/UsersScriptingInterface.h | 2 +- scripts/system/pal.js | 8 +++-- 7 files changed, 39 insertions(+), 47 deletions(-) diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index 8a8b3002d1..a8eaaa3dcf 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -751,42 +751,31 @@ void DomainServerSettingsManager::processNodeKickRequestPacket(QSharedPointer message, SharedNodePointer sendingNode) { // before we do any processing on this packet make sure it comes from a node that is allowed to kick if (sendingNode->getCanKick()) { - // pull the UUID being kicked from the packet + // From the packet, pull the UUID we're identifying QUuid nodeUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); - if (!nodeUUID.isNull() && nodeUUID != sendingNode->getUUID()) { + if (!nodeUUID.isNull()) { // make sure we actually have a node with this UUID auto limitedNodeList = DependencyManager::get(); auto matchingNode = limitedNodeList->nodeWithUUID(nodeUUID); if (matchingNode) { - // we have a matching node, time to decide how to store updated permissions for this node - - NodePermissionsPointer destinationPermissions; - + // we have a matching node, time to figure out the username QString verifiedUsername = matchingNode->getPermissions().getVerifiedUserName(); - bool newPermissions = false; - - QByteArray printableVerifiedUsername; - - if (!verifiedUsername.isEmpty()) { - printableVerifiedUsername = qPrintable(verifiedUsername); - } else { - printableVerifiedUsername = qPrintable(""); + if (verifiedUsername.isEmpty()) { + verifiedUsername = ""; } // setup the packet - auto usernameFromIDReplyPacket = NLPacket::create(PacketType::UsernameFromIDReply, NUM_BYTES_RFC4122_UUID + printableVerifiedUsername.length(), true); + auto usernameFromIDReplyPacket = NLPacket::create(PacketType::UsernameFromIDReply, NUM_BYTES_RFC4122_UUID + sizeof(verifiedUsername), true); // write the node ID to the packet usernameFromIDReplyPacket->write(nodeUUID.toRfc4122()); // write the username to the packet - usernameFromIDReplyPacket->write(printableVerifiedUsername); + usernameFromIDReplyPacket->writeString(verifiedUsername); - auto nodeList = DependencyManager::get(); - nodeList->sendPacket(std::move(usernameFromIDReplyPacket), message->getSenderSockAddr()); - qDebug() << "SENDING PACKET."; + limitedNodeList->sendPacket(std::move(usernameFromIDReplyPacket), *sendingNode); } else { qWarning() << "Node username request received for unknown node. Refusing to process."; diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index a96353d7f0..85b1c83ad3 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -76,7 +76,10 @@ Rectangle { var userId = message.params[0]; var userName = message.params[1]; var userIndex = findSessionIndex(userId); - table.get(userIndex).itemCell.nameCard.userName = userName; + console.log('computed userIndex:', userIndex); + userModel.get(userIndex).userName = userName; + userData[userIndex].userName = userName; + break; default: console.log('Unrecognized message:', JSON.stringify(message)); } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 69c6924df2..1b039ffda9 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -893,37 +893,35 @@ void NodeList::muteNodeBySessionID(const QUuid& nodeID) { void NodeList::requestUsernameFromSessionID(const QUuid& nodeID) { // send a request to domain-server to get the username associated with the given session ID + if (getThisNodeCanKick()) { + // setup the packet + auto usernameFromIDRequestPacket = NLPacket::create(PacketType::UsernameFromIDRequest, NUM_BYTES_RFC4122_UUID, true); - if (!nodeID.isNull()) { - if (getThisNodeCanKick()) { - // setup the packet - auto usernameFromIDRequestPacket = NLPacket::create(PacketType::UsernameFromIDRequest, NUM_BYTES_RFC4122_UUID, true); - - // write the node ID to the packet + // write the node ID to the packet + if (nodeID.isNull()) { + usernameFromIDRequestPacket->write(getSessionUUID().toRfc4122()); + } else { usernameFromIDRequestPacket->write(nodeID.toRfc4122()); - - qDebug() << "Sending packet to get username of node" << uuidStringWithoutCurlyBraces(nodeID); - - sendPacket(std::move(usernameFromIDRequestPacket), _domainHandler.getSockAddr()); - } - else { - qWarning() << "You do not have permissions to kick in this domain." - << "Request to get the username of node" << uuidStringWithoutCurlyBraces(nodeID) << "will not be sent"; } + + + qDebug() << "Sending packet to get username of node" << uuidStringWithoutCurlyBraces(nodeID); + + sendPacket(std::move(usernameFromIDRequestPacket), _domainHandler.getSockAddr()); } else { - qWarning() << "NodeList::requestUsernameFromSessionID called with an invalid ID."; - + qWarning() << "You do not have permissions to kick in this domain." + << "Request to get the username of node" << uuidStringWithoutCurlyBraces(nodeID) << "will not be sent"; } } void NodeList::processUsernameFromIDReply(QSharedPointer message) { // read the UUID from the packet - QUuid nodeUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); + QString nodeUUIDString = (QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID))).toString(); // read the username from the packet QString username = message->readString(); - qDebug() << "Got username" << username << "for node" << uuidStringWithoutCurlyBraces(nodeUUID); + qDebug() << "Got username" << username << "for node" << nodeUUIDString; - emit usernameFromID(nodeUUID, username); + emit usernameFromID(nodeUUIDString, username); } diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 25091e8e3c..70b9ec5c27 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -82,7 +82,6 @@ public: void kickNodeBySessionID(const QUuid& nodeID); void muteNodeBySessionID(const QUuid& nodeID); void requestUsernameFromSessionID(const QUuid& nodeID); - void processUsernameFromIDReply(QSharedPointer message); public slots: void reset(); @@ -101,6 +100,8 @@ public slots: void processICEPingPacket(QSharedPointer message); + void processUsernameFromIDReply(QSharedPointer message); + #if (PR_BUILD || DEV_BUILD) void toggleSendNewerDSConnectVersion(bool shouldSendNewerVersion) { _shouldSendNewerVersion = shouldSendNewerVersion; } #endif @@ -110,7 +111,7 @@ signals: void receivedDomainServerList(); void ignoredNode(const QUuid& nodeID); void ignoreRadiusEnabledChanged(bool isIgnored); - void usernameFromID(QUuid& nodeID, QString& username); + void usernameFromID(const QString& nodeID, const QString& username); private slots: void stopKeepalivePingTimer(); diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index c9fad0c1f6..6662b3abba 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -103,8 +103,7 @@ public: RadiusIgnoreRequest, UsernameFromIDRequest, UsernameFromIDReply, - LAST_PACKET_TYPE = RadiusIgnoreRequest - //LAST_PACKET_TYPE = UsernameFromIDRequest + LAST_PACKET_TYPE = UsernameFromIDReply }; }; diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h index a1d41c5fac..05d8c01b96 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.h +++ b/libraries/script-engine/src/UsersScriptingInterface.h @@ -104,7 +104,7 @@ signals: * Notifies scripts of the username associated with a UUID. * @function Users.enteredIgnoreRadius */ - void usernameFromID(QUuid& nodeID, QString& username); + void usernameFromID(const QString& nodeID, const QString& username); }; diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 8f499d5e2f..1b04f75836 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -118,10 +118,10 @@ function populateUserList() { var avatar = AvatarList.getAvatar(id); var avatarPalDatum = { displayName: avatar.displayName || ('anonymous ' + counter++), - userName: (Users.canKick && id) ? 'Obtaining username...' : '', + userName: '', sessionId: id || '' }; - if (Users.canKick && id) { + if (Users.canKick) { Users.requestUsernameFromID(id); } data.push(avatarPalDatum); @@ -134,7 +134,7 @@ function populateUserList() { } function usernameFromID(id, username) { - var data = { id: id, username: username + '\\' + id }; + var data = [id, username + '/' + id ]; print('Username Data:', JSON.stringify(data)); pal.sendToQml({ method: 'updateUsername', params: data }); } @@ -259,6 +259,7 @@ function onVisibileChanged() { button.clicked.connect(onClicked); pal.visibleChanged.connect(onVisibileChanged); pal.closed.connect(off); +Users.usernameFromID.connect(usernameFromID); // // Cleanup. @@ -268,6 +269,7 @@ Script.scriptEnding.connect(function () { toolBar.removeButton(buttonName); pal.visibleChanged.disconnect(onVisibileChanged); pal.closed.disconnect(off); + Users.usernameFromID.disconnect(usernameFromID); off(); }); From aa837d8858641452c6a27c8466531ff1c3e71c3f Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 16 Dec 2016 14:18:28 -0800 Subject: [PATCH 4/8] It's working! Untested on human avatars. --- interface/resources/qml/hifi/Pal.qml | 15 +++++++++++---- scripts/system/pal.js | 7 ++++++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 85b1c83ad3..b1b3a00c27 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -75,10 +75,17 @@ Rectangle { case 'updateUsername': var userId = message.params[0]; var userName = message.params[1]; - var userIndex = findSessionIndex(userId); - console.log('computed userIndex:', userIndex); - userModel.get(userIndex).userName = userName; - userData[userIndex].userName = userName; + console.log('passed userId:', userId); + console.log('passed userName:', userName); + if (!userId) { + myData.userName = userName; + myCard.userName = userName; + } else { + var userIndex = findSessionIndex(userId); + console.log('computed userIndex:', userIndex); + userModel.get(userIndex).userName = userName; + userData[userIndex].userName = userName; + } break; default: console.log('Unrecognized message:', JSON.stringify(message)); diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 1b04f75836..0575a02abe 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -134,7 +134,12 @@ function populateUserList() { } function usernameFromID(id, username) { - var data = [id, username + '/' + id ]; + var data; + if (AvatarList.getAvatar('').sessionUUID === id) { + data = ['', username + ' (hidden)'] + } else { + data = [id, username + '/' + id]; + } print('Username Data:', JSON.stringify(data)); pal.sendToQml({ method: 'updateUsername', params: data }); } From e940daf5b4aed8f89109ae1d033b6ff42f35fa6e Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 16 Dec 2016 14:38:39 -0800 Subject: [PATCH 5/8] Comments and clarity --- .../src/DomainServerSettingsManager.cpp | 17 +++++++++++------ interface/resources/qml/hifi/Pal.qml | 9 ++++++--- libraries/networking/src/NodeList.cpp | 5 ++--- libraries/networking/src/NodeList.h | 2 +- .../src/UsersScriptingInterface.cpp | 2 +- .../script-engine/src/UsersScriptingInterface.h | 2 +- scripts/system/pal.js | 16 ++++++++++++---- 7 files changed, 34 insertions(+), 19 deletions(-) diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index a8eaaa3dcf..4fffefa20a 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -748,26 +748,30 @@ void DomainServerSettingsManager::processNodeKickRequestPacket(QSharedPointer message, SharedNodePointer sendingNode) { - // before we do any processing on this packet make sure it comes from a node that is allowed to kick + // Before we do any processing on this packet, make sure it comes from a node that is allowed to kick (is an admin) if (sendingNode->getCanKick()) { // From the packet, pull the UUID we're identifying QUuid nodeUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); + // If the UUID isn't NULL... if (!nodeUUID.isNull()) { - // make sure we actually have a node with this UUID + // First, make sure we actually have a node with this UUID auto limitedNodeList = DependencyManager::get(); - auto matchingNode = limitedNodeList->nodeWithUUID(nodeUUID); + // If we do have a matching node... if (matchingNode) { - // we have a matching node, time to figure out the username + // It's time to figure out the username QString verifiedUsername = matchingNode->getPermissions().getVerifiedUserName(); + // If the verified username is Empty... if (verifiedUsername.isEmpty()) { + // Make sure we're using an empty string as the Verified Username verifiedUsername = ""; } - // setup the packet + // Setup the packet auto usernameFromIDReplyPacket = NLPacket::create(PacketType::UsernameFromIDReply, NUM_BYTES_RFC4122_UUID + sizeof(verifiedUsername), true); // write the node ID to the packet @@ -775,6 +779,7 @@ void DomainServerSettingsManager::processUsernameFromIDRequestPacket(QSharedPoin // write the username to the packet usernameFromIDReplyPacket->writeString(verifiedUsername); + // Ship it! limitedNodeList->sendPacket(std::move(usernameFromIDReplyPacket), *sendingNode); } else { @@ -782,7 +787,7 @@ void DomainServerSettingsManager::processUsernameFromIDRequestPacket(QSharedPoin } } else { - // this isn't a UUID we can use + // This isn't a UUID we can use qWarning() << "Node username request received for invalid node ID. Refusing to process."; } diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index b1b3a00c27..62e7ba1571 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -72,17 +72,20 @@ Rectangle { table.selection.deselect(userIndex); } break; + // Received an "updateUsername()" request from the JS case 'updateUsername': + // The User ID (UUID) is the first parameter in the message. var userId = message.params[0]; + // The Username String (name + UUID) is the second parameter in the message. var userName = message.params[1]; - console.log('passed userId:', userId); - console.log('passed userName:', userName); + // If the userId is empty, we're updating "myData". if (!userId) { myData.userName = userName; myCard.userName = userName; } else { + // Get the index in userModel and userData associated with the passed UUID var userIndex = findSessionIndex(userId); - console.log('computed userIndex:', userIndex); + // Set the userName appropriately userModel.get(userIndex).userName = userName; userData[userIndex].userName = userName; } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 1b039ffda9..c14643ca70 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -893,7 +893,7 @@ void NodeList::muteNodeBySessionID(const QUuid& nodeID) { void NodeList::requestUsernameFromSessionID(const QUuid& nodeID) { // send a request to domain-server to get the username associated with the given session ID - if (getThisNodeCanKick()) { + if (getThisNodeCanKick() || nodeID.isNull()) { // setup the packet auto usernameFromIDRequestPacket = NLPacket::create(PacketType::UsernameFromIDRequest, NUM_BYTES_RFC4122_UUID, true); @@ -904,7 +904,6 @@ void NodeList::requestUsernameFromSessionID(const QUuid& nodeID) { usernameFromIDRequestPacket->write(nodeID.toRfc4122()); } - qDebug() << "Sending packet to get username of node" << uuidStringWithoutCurlyBraces(nodeID); sendPacket(std::move(usernameFromIDRequestPacket), _domainHandler.getSockAddr()); @@ -923,5 +922,5 @@ void NodeList::processUsernameFromIDReply(QSharedPointer messag qDebug() << "Got username" << username << "for node" << nodeUUIDString; - emit usernameFromID(nodeUUIDString, username); + emit usernameFromIDReply(nodeUUIDString, username); } diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 70b9ec5c27..d10c790f45 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -111,7 +111,7 @@ signals: void receivedDomainServerList(); void ignoredNode(const QUuid& nodeID); void ignoreRadiusEnabledChanged(bool isIgnored); - void usernameFromID(const QString& nodeID, const QString& username); + void usernameFromIDReply(const QString& nodeID, const QString& username); private slots: void stopKeepalivePingTimer(); diff --git a/libraries/script-engine/src/UsersScriptingInterface.cpp b/libraries/script-engine/src/UsersScriptingInterface.cpp index d774733cea..191952e354 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.cpp +++ b/libraries/script-engine/src/UsersScriptingInterface.cpp @@ -18,7 +18,7 @@ UsersScriptingInterface::UsersScriptingInterface() { auto nodeList = DependencyManager::get(); connect(nodeList.data(), &LimitedNodeList::canKickChanged, this, &UsersScriptingInterface::canKickChanged); connect(nodeList.data(), &NodeList::ignoreRadiusEnabledChanged, this, &UsersScriptingInterface::ignoreRadiusEnabledChanged); - connect(nodeList.data(), &NodeList::usernameFromID, this, &UsersScriptingInterface::usernameFromID); + connect(nodeList.data(), &NodeList::usernameFromIDReply, this, &UsersScriptingInterface::usernameFromIDReply); } void UsersScriptingInterface::ignore(const QUuid& nodeID) { diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h index 05d8c01b96..1936a2e914 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.h +++ b/libraries/script-engine/src/UsersScriptingInterface.h @@ -104,7 +104,7 @@ signals: * Notifies scripts of the username associated with a UUID. * @function Users.enteredIgnoreRadius */ - void usernameFromID(const QString& nodeID, const QString& username); + void usernameFromIDReply(const QString& nodeID, const QString& username); }; diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 0575a02abe..20f4167281 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -121,7 +121,10 @@ function populateUserList() { userName: '', sessionId: id || '' }; - if (Users.canKick) { + // If the current user is an admin OR + // they're requesting their own username ("id" is blank)... + if (Users.canKick || !id) { + // Request the username from the given UUID Users.requestUsernameFromID(id); } data.push(avatarPalDatum); @@ -133,14 +136,19 @@ function populateUserList() { pal.sendToQml({method: 'users', params: data}); } -function usernameFromID(id, username) { +// The function that handles the reply from the server +function usernameFromIDReply(id, username) { var data; + // If the ID we've received is our ID... if (AvatarList.getAvatar('').sessionUUID === id) { + // Set the data to contain specific strings. data = ['', username + ' (hidden)'] } else { + // Set the data to contain the ID and the username+ID concat string. data = [id, username + '/' + id]; } print('Username Data:', JSON.stringify(data)); + // Ship the data off to QML pal.sendToQml({ method: 'updateUsername', params: data }); } @@ -264,7 +272,7 @@ function onVisibileChanged() { button.clicked.connect(onClicked); pal.visibleChanged.connect(onVisibileChanged); pal.closed.connect(off); -Users.usernameFromID.connect(usernameFromID); +Users.usernameFromIDReply.connect(usernameFromIDReply); // // Cleanup. @@ -274,7 +282,7 @@ Script.scriptEnding.connect(function () { toolBar.removeButton(buttonName); pal.visibleChanged.disconnect(onVisibileChanged); pal.closed.disconnect(off); - Users.usernameFromID.disconnect(usernameFromID); + Users.usernameFromIDReply.disconnect(usernameFromIDReply); off(); }); From a912fec496ebf065fdd5f833f669b205fb5aae5c Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 16 Dec 2016 16:32:07 -0800 Subject: [PATCH 6/8] PR comments; need particular fix on Master for full QA --- domain-server/src/DomainServerSettingsManager.cpp | 15 +++------------ interface/resources/qml/hifi/Pal.qml | 6 +++--- libraries/networking/src/NodeList.cpp | 3 +-- libraries/networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 3 ++- 5 files changed, 10 insertions(+), 19 deletions(-) diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index 4fffefa20a..1eb04da87a 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -755,7 +755,6 @@ void DomainServerSettingsManager::processUsernameFromIDRequestPacket(QSharedPoin // From the packet, pull the UUID we're identifying QUuid nodeUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); - // If the UUID isn't NULL... if (!nodeUUID.isNull()) { // First, make sure we actually have a node with this UUID auto limitedNodeList = DependencyManager::get(); @@ -766,33 +765,25 @@ void DomainServerSettingsManager::processUsernameFromIDRequestPacket(QSharedPoin // It's time to figure out the username QString verifiedUsername = matchingNode->getPermissions().getVerifiedUserName(); - // If the verified username is Empty... if (verifiedUsername.isEmpty()) { // Make sure we're using an empty string as the Verified Username verifiedUsername = ""; } // Setup the packet auto usernameFromIDReplyPacket = NLPacket::create(PacketType::UsernameFromIDReply, NUM_BYTES_RFC4122_UUID + sizeof(verifiedUsername), true); - - // write the node ID to the packet usernameFromIDReplyPacket->write(nodeUUID.toRfc4122()); - // write the username to the packet usernameFromIDReplyPacket->writeString(verifiedUsername); // Ship it! limitedNodeList->sendPacket(std::move(usernameFromIDReplyPacket), *sendingNode); - } - else { + } else { qWarning() << "Node username request received for unknown node. Refusing to process."; } - } - else { - // This isn't a UUID we can use + } else { qWarning() << "Node username request received for invalid node ID. Refusing to process."; } - } - else { + } else { qWarning() << "Refusing to process a username request packet from node" << uuidStringWithoutCurlyBraces(sendingNode->getUUID()) << "that does not have kick permissions."; } diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 62e7ba1571..7a8dc4722e 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -76,18 +76,18 @@ Rectangle { case 'updateUsername': // The User ID (UUID) is the first parameter in the message. var userId = message.params[0]; - // The Username String (name + UUID) is the second parameter in the message. + // The text that goes in the userName field is the second parameter in the message. var userName = message.params[1]; // If the userId is empty, we're updating "myData". if (!userId) { myData.userName = userName; - myCard.userName = userName; + myCard.userName = userName; // Defensive programming } else { // Get the index in userModel and userData associated with the passed UUID var userIndex = findSessionIndex(userId); // Set the userName appropriately userModel.get(userIndex).userName = userName; - userData[userIndex].userName = userName; + userData[userIndex].userName = userName; // Defensive programming } break; default: diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index c14643ca70..b464b14224 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -907,8 +907,7 @@ void NodeList::requestUsernameFromSessionID(const QUuid& nodeID) { qDebug() << "Sending packet to get username of node" << uuidStringWithoutCurlyBraces(nodeID); sendPacket(std::move(usernameFromIDRequestPacket), _domainHandler.getSockAddr()); - } - else { + } else { qWarning() << "You do not have permissions to kick in this domain." << "Request to get the username of node" << uuidStringWithoutCurlyBraces(nodeID) << "will not be sent"; } diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 9143ffc0b9..98be26a5f6 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -44,7 +44,7 @@ const QSet NON_SOURCED_PACKETS = QSet() PacketVersion versionForPacketType(PacketType packetType) { switch (packetType) { case PacketType::DomainList: - return static_cast(DomainListVersion::PermissionsGrid); + return static_cast(DomainListVersion::GetUsernameFromUUIDSupport); case PacketType::EntityAdd: case PacketType::EntityEdit: case PacketType::EntityData: diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 6662b3abba..73a5b885f0 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -228,7 +228,8 @@ enum class DomainServerAddedNodeVersion : PacketVersion { enum class DomainListVersion : PacketVersion { PrePermissionsGrid = 18, - PermissionsGrid + PermissionsGrid, + GetUsernameFromUUIDSupport }; enum class AudioVersion : PacketVersion { From ee2f600d2ea4121931527649d56e0282c60a0545 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 16 Dec 2016 17:44:11 -0800 Subject: [PATCH 7/8] Fix username display bug --- domain-server/src/DomainServerSettingsManager.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index 1eb04da87a..a2f6e086cf 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -770,10 +770,12 @@ void DomainServerSettingsManager::processUsernameFromIDRequestPacket(QSharedPoin verifiedUsername = ""; } // Setup the packet - auto usernameFromIDReplyPacket = NLPacket::create(PacketType::UsernameFromIDReply, NUM_BYTES_RFC4122_UUID + sizeof(verifiedUsername), true); + auto usernameFromIDReplyPacket = NLPacket::create(PacketType::UsernameFromIDReply); usernameFromIDReplyPacket->write(nodeUUID.toRfc4122()); usernameFromIDReplyPacket->writeString(verifiedUsername); + qDebug() << "Sending username" << verifiedUsername << "associated with node" << nodeUUID; + // Ship it! limitedNodeList->sendPacket(std::move(usernameFromIDReplyPacket), *sendingNode); } else { From 4bfc04a6eca846bcc2888aba565d08f8b31e2fb9 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 19 Dec 2016 10:41:18 -0800 Subject: [PATCH 8/8] Small CR changes --- domain-server/src/DomainServerSettingsManager.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index a2f6e086cf..ebcffc262f 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -765,10 +765,6 @@ void DomainServerSettingsManager::processUsernameFromIDRequestPacket(QSharedPoin // It's time to figure out the username QString verifiedUsername = matchingNode->getPermissions().getVerifiedUserName(); - if (verifiedUsername.isEmpty()) { - // Make sure we're using an empty string as the Verified Username - verifiedUsername = ""; - } // Setup the packet auto usernameFromIDReplyPacket = NLPacket::create(PacketType::UsernameFromIDReply); usernameFromIDReplyPacket->write(nodeUUID.toRfc4122());