| 1600 | } |
| 1601 | |
| 1602 | void UniverseServer::acceptConnection(UniverseConnection connection, Maybe<HostAddress> remoteAddress) { |
| 1603 | auto& root = Root::singleton(); |
| 1604 | auto assets = root.assets(); |
| 1605 | auto configuration = root.configuration(); |
| 1606 | auto versioningDatabase = root.versioningDatabase(); |
| 1607 | |
| 1608 | int clientWaitLimit = assets->json("/universe_server.config:clientWaitLimit").toInt(); |
| 1609 | String serverAssetsMismatchMessage = assets->json("/universe_server.config:serverAssetsMismatchMessage").toString(); |
| 1610 | String clientAssetsMismatchMessage = assets->json("/universe_server.config:clientAssetsMismatchMessage").toString(); |
| 1611 | auto connectionSettings = configuration->get("connectionSettings"); |
| 1612 | |
| 1613 | RecursiveMutexLocker mainLocker(m_mainLock, false); |
| 1614 | |
| 1615 | connection.receiveAny(clientWaitLimit); |
| 1616 | auto protocolRequest = as<ProtocolRequestPacket>(connection.pullSingle()); |
| 1617 | if (!protocolRequest) { |
| 1618 | Logger::warn("UniverseServer: client connection aborted, expected ProtocolRequestPacket"); |
| 1619 | return; |
| 1620 | } |
| 1621 | |
| 1622 | bool legacyClient = protocolRequest->compressionMode() != PacketCompressionMode::Enabled; |
| 1623 | if (legacyClient) |
| 1624 | connection.packetSocket().setNetRules(LegacyVersion); |
| 1625 | |
| 1626 | auto protocolResponse = make_shared<ProtocolResponsePacket>(); |
| 1627 | protocolResponse->setCompressionMode(PacketCompressionMode::Enabled); // Signal that we're OpenStarbound |
| 1628 | if (protocolRequest->requestProtocolVersion != StarProtocolVersion) { |
| 1629 | Logger::warn("UniverseServer: client connection aborted, unsupported protocol version {}, supported version {}", |
| 1630 | protocolRequest->requestProtocolVersion, StarProtocolVersion); |
| 1631 | protocolResponse->allowed = false; |
| 1632 | connection.pushSingle(protocolResponse); |
| 1633 | connection.sendAll(clientWaitLimit); |
| 1634 | mainLocker.lock(); |
| 1635 | m_deadConnections.append({std::move(connection), Time::monotonicMilliseconds()}); |
| 1636 | return; |
| 1637 | } |
| 1638 | |
| 1639 | bool useCompressionStream = false; |
| 1640 | protocolResponse->allowed = true; |
| 1641 | if (!legacyClient) { |
| 1642 | auto compressionName = connectionSettings.getString("compression", "None"); |
| 1643 | auto compressionMode = NetCompressionModeNames.maybeLeft(compressionName).value(NetCompressionMode::None); |
| 1644 | useCompressionStream = compressionMode == NetCompressionMode::Zstd; |
| 1645 | protocolResponse->info = JsonObject{ |
| 1646 | {"compression", NetCompressionModeNames.getRight(compressionMode)}, |
| 1647 | {"openProtocolVersion", OpenProtocolVersion} |
| 1648 | }; |
| 1649 | } |
| 1650 | connection.pushSingle(protocolResponse); |
| 1651 | connection.sendAll(clientWaitLimit); |
| 1652 | |
| 1653 | if (auto compressedSocket = as<CompressedPacketSocket>(&connection.packetSocket())) |
| 1654 | compressedSocket->setCompressionStreamEnabled(useCompressionStream); |
| 1655 | |
| 1656 | String remoteAddressString = remoteAddress ? toString(*remoteAddress) : "local"; |
| 1657 | Logger::info("UniverseServer: Awaiting connection info from {} ({} client)", remoteAddressString, legacyClient ? "vanilla" : "custom"); |
| 1658 | |
| 1659 | connection.receiveAny(clientWaitLimit); |
nothing calls this directly
no test coverage detected