diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index d55da6c848..31f224667c 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -916,6 +916,14 @@ "default": false } ] + }, + { + "name": "multi_kick_logged_in", + "type": "checkbox", + "label": "Multi-Kick for Logged In Users", + "help": "Kick logged in users by machine fingerprint (in addition to the default kick by username)", + "default": false, + "advanced": true } ] }, diff --git a/domain-server/src/DomainGatekeeper.cpp b/domain-server/src/DomainGatekeeper.cpp index 188c420a5d..c6eaa03634 100644 --- a/domain-server/src/DomainGatekeeper.cpp +++ b/domain-server/src/DomainGatekeeper.cpp @@ -183,6 +183,11 @@ NodePermissions DomainGatekeeper::setPermissionsForUser(bool isLocalUser, QStrin #ifdef WANT_DEBUG qDebug() << "| user-permissions: specific MAC matches, so:" << userPerms; +#endif + } else if (_server->_settingsManager.hasPermissionsForMachineFingerprint(machineFingerprint)) { + userPerms = _server->_settingsManager.getPermissionsForMachineFingerprint(machineFingerprint); +#ifdef WANT_DEBUG + qDebug(() << "| user-permissions: specific Machine Fingerprint matches, so: " << userPerms; #endif } else if (_server->_settingsManager.hasPermissionsForIP(senderAddress)) { // this user comes from an IP we have in our permissions table, apply those permissions diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index b12e2d90f0..a4d3e675aa 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -672,7 +672,7 @@ void DomainServerSettingsManager::processNodeKickRequestPacket(QSharedPointerclear(NodePermissions::Permission::canConnectToDomain); - } else { + } + + // if we didn't have a username, or this domain-server uses the "multi-kick" setting to + // kick logged in users via username AND machine fingerprint (or IP as fallback) + // then we remove connect permissions for the machine fingerprint (or IP as fallback) + const QString MULTI_KICK_SETTINGS_KEYPATH = "security.multi_kick_logged_in"; + + if (verifiedUsername.isEmpty() || valueOrDefaultValueForKeyPath(MULTI_KICK_SETTINGS_KEYPATH).toBool()) { // remove connect permissions for the machine fingerprint DomainServerNodeData* nodeData = static_cast(matchingNode->getLinkedData()); if (nodeData) { @@ -719,8 +726,8 @@ void DomainServerSettingsManager::processNodeKickRequestPacket(QSharedPointergetPublicSockAddr().getAddress() || - kickAddress == limitedNodeList->getLocalSockAddr().getAddress() || - kickAddress.isLoopback() ) { + kickAddress == limitedNodeList->getLocalSockAddr().getAddress() || + kickAddress.isLoopback() ) { qWarning() << "attempt to kick node running on same machine as domain server, ignoring KickRequest"; return; } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 63ec460de8..5a72006a8c 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -385,9 +385,9 @@ void NodeList::sendDomainServerCheckIn() { packetStream << hardwareAddress; - // now add the machine fingerprint - a null UUID if logged in, real one if not logged in + // now add the machine fingerprint auto accountManager = DependencyManager::get(); - packetStream << (accountManager->isLoggedIn() ? QUuid() : FingerprintUtils::getMachineFingerprint()); + packetStream << FingerprintUtils::getMachineFingerprint(); } // pack our data to send to the domain-server including diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index c2c1d75726..fa5028e1bb 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -57,7 +57,7 @@ PacketVersion versionForPacketType(PacketType packetType) { return static_cast(DomainConnectionDeniedVersion::IncludesExtraInfo); case PacketType::DomainConnectRequest: - return static_cast(DomainConnectRequestVersion::HasMachineFingerprint); + return static_cast(DomainConnectRequestVersion::AlwaysHasMachineFingerprint); case PacketType::DomainServerAddedNode: return static_cast(DomainServerAddedNodeVersion::PermissionsGrid); diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index c4c1758ed2..e5cb87c379 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -247,7 +247,8 @@ enum class DomainConnectRequestVersion : PacketVersion { HasHostname, HasProtocolVersions, HasMACAddress, - HasMachineFingerprint + HasMachineFingerprint, + AlwaysHasMachineFingerprint }; enum class DomainConnectionDeniedVersion : PacketVersion {