mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-08 07:22:25 +02:00
Merge pull request #13871 from birarda/bug/double-domain-connect
force NodeList reset if DS changes session or local ID
This commit is contained in:
commit
7ddd70a84a
2 changed files with 26 additions and 12 deletions
|
@ -463,19 +463,15 @@ SharedNodePointer DomainGatekeeper::processAgentConnectRequest(const NodeConnect
|
|||
limitedNodeList->eachNodeBreakable([nodeConnection, username, &existingNodeID](const SharedNodePointer& node){
|
||||
|
||||
if (node->getPublicSocket() == nodeConnection.publicSockAddr && node->getLocalSocket() == nodeConnection.localSockAddr) {
|
||||
// we have a node that already has these exact sockets - this can occur if a node
|
||||
// is failing to connect to the domain
|
||||
|
||||
// we'll re-use the existing node ID
|
||||
// as long as the user hasn't changed their username (by logging in or logging out)
|
||||
auto existingNodeData = static_cast<DomainServerNodeData*>(node->getLinkedData());
|
||||
|
||||
if (existingNodeData->getUsername() == username) {
|
||||
qDebug() << "Deleting existing connection from same sockaddr: " << node->getUUID();
|
||||
existingNodeID = node->getUUID();
|
||||
return false;
|
||||
}
|
||||
// we have a node that already has these exact sockets
|
||||
// this can occur if a node is failing to connect to the domain
|
||||
|
||||
// remove the old node before adding the new node
|
||||
qDebug() << "Deleting existing connection from same sockaddr: " << node->getUUID();
|
||||
existingNodeID = node->getUUID();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
|
|
|
@ -273,6 +273,7 @@ void NodeList::reset(bool skipDomainHandlerReset) {
|
|||
|
||||
// refresh the owner UUID to the NULL UUID
|
||||
setSessionUUID(QUuid());
|
||||
setSessionLocalID(Node::NULL_LOCAL_ID);
|
||||
|
||||
// if we setup the DTLS socket, also disconnect from the DTLS socket readyRead() so it can handle handshaking
|
||||
if (_dtlsSocket) {
|
||||
|
@ -647,6 +648,23 @@ void NodeList::processDomainServerList(QSharedPointer<ReceivedMessage> message)
|
|||
Node::LocalID newLocalID;
|
||||
packetStream >> newUUID;
|
||||
packetStream >> newLocalID;
|
||||
|
||||
// when connected, if the session ID or local ID were not null and changed, we should reset
|
||||
auto currentLocalID = getSessionLocalID();
|
||||
auto currentSessionID = getSessionUUID();
|
||||
if (_domainHandler.isConnected() &&
|
||||
((currentLocalID != Node::NULL_LOCAL_ID && newLocalID != currentLocalID) ||
|
||||
(!currentSessionID.isNull() && newUUID != currentSessionID))) {
|
||||
qCDebug(networking) << "Local ID or Session ID changed while connected to domain - forcing NodeList reset";
|
||||
|
||||
// reset the nodelist, but don't do a domain handler reset since we're about to process a good domain list
|
||||
reset(true);
|
||||
|
||||
// tell the domain handler that we're no longer connected so that below
|
||||
// it can re-perform actions as if we just connected
|
||||
_domainHandler.setIsConnected(false);
|
||||
}
|
||||
|
||||
setSessionLocalID(newLocalID);
|
||||
setSessionUUID(newUUID);
|
||||
|
||||
|
|
Loading…
Reference in a new issue