mirror of
https://github.com/lubosz/overte.git
synced 2025-05-28 12:36:23 +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){
|
limitedNodeList->eachNodeBreakable([nodeConnection, username, &existingNodeID](const SharedNodePointer& node){
|
||||||
|
|
||||||
if (node->getPublicSocket() == nodeConnection.publicSockAddr && node->getLocalSocket() == nodeConnection.localSockAddr) {
|
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
|
// we have a node that already has these exact sockets
|
||||||
// is failing to connect to the domain
|
// this can occur if a node is failing to connect to the domain
|
||||||
|
|
||||||
// we'll re-use the existing node ID
|
// remove the old node before adding the new node
|
||||||
// as long as the user hasn't changed their username (by logging in or logging out)
|
qDebug() << "Deleting existing connection from same sockaddr: " << node->getUUID();
|
||||||
auto existingNodeData = static_cast<DomainServerNodeData*>(node->getLinkedData());
|
existingNodeID = node->getUUID();
|
||||||
|
return false;
|
||||||
if (existingNodeData->getUsername() == username) {
|
|
||||||
qDebug() << "Deleting existing connection from same sockaddr: " << node->getUUID();
|
|
||||||
existingNodeID = node->getUUID();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -273,6 +273,7 @@ void NodeList::reset(bool skipDomainHandlerReset) {
|
||||||
|
|
||||||
// refresh the owner UUID to the NULL UUID
|
// refresh the owner UUID to the NULL UUID
|
||||||
setSessionUUID(QUuid());
|
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 we setup the DTLS socket, also disconnect from the DTLS socket readyRead() so it can handle handshaking
|
||||||
if (_dtlsSocket) {
|
if (_dtlsSocket) {
|
||||||
|
@ -647,6 +648,23 @@ void NodeList::processDomainServerList(QSharedPointer<ReceivedMessage> message)
|
||||||
Node::LocalID newLocalID;
|
Node::LocalID newLocalID;
|
||||||
packetStream >> newUUID;
|
packetStream >> newUUID;
|
||||||
packetStream >> newLocalID;
|
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);
|
setSessionLocalID(newLocalID);
|
||||||
setSessionUUID(newUUID);
|
setSessionUUID(newUUID);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue