* @brief Accepts new incoming TCP connections. */
| 1240 | * @brief Accepts new incoming TCP connections. |
| 1241 | */ |
| 1242 | void API::Server::acceptConnection() |
| 1243 | { |
| 1244 | Q_ASSERT(m_server.isListening()); |
| 1245 | Q_ASSERT(m_enabled); |
| 1246 | |
| 1247 | auto* socket = m_server.nextPendingConnection(); |
| 1248 | if (!socket) { |
| 1249 | if (enabled()) |
| 1250 | Misc::Utilities::showMessageBox( |
| 1251 | tr("API server"), tr("Invalid pending connection"), QMessageBox::Critical); |
| 1252 | |
| 1253 | return; |
| 1254 | } |
| 1255 | |
| 1256 | if (!enabled()) { |
| 1257 | socket->close(); |
| 1258 | socket->deleteLater(); |
| 1259 | return; |
| 1260 | } |
| 1261 | |
| 1262 | if (m_connections.size() >= kMaxApiClients) { |
| 1263 | qWarning() << "[API] Max clients limit exceeded:" << socket->peerAddress().toString() << ":" |
| 1264 | << socket->peerPort() << "- Current clients:" << m_connections.size() |
| 1265 | << "- Limit:" << kMaxApiClients << "- Rejecting connection"; |
| 1266 | |
| 1267 | socket->abort(); |
| 1268 | socket->deleteLater(); |
| 1269 | return; |
| 1270 | } |
| 1271 | |
| 1272 | connect(socket, &QTcpSocket::errorOccurred, this, &Server::onErrorOccurred); |
| 1273 | |
| 1274 | ConnectionState state; |
| 1275 | state.sessionId = QString::number(s_nextSessionId.fetchAndAddRelaxed(1)); |
| 1276 | state.peerAddress = socket->peerAddress().toString(); |
| 1277 | state.peerPort = socket->peerPort(); |
| 1278 | |
| 1279 | state.authenticated = !(m_externalConnections && !socket->peerAddress().isLoopback()); |
| 1280 | m_connections.insert(socket, state); |
| 1281 | |
| 1282 | qInfo() << "[API] New client connected:" << state.peerAddress << ":" << state.peerPort |
| 1283 | << "- Total clients:" << m_connections.size(); |
| 1284 | |
| 1285 | socket->setParent(nullptr); |
| 1286 | socket->moveToThread(&m_workerThread); |
| 1287 | |
| 1288 | auto* worker = static_cast<ServerWorker*>(m_worker); |
| 1289 | QMetaObject::invokeMethod(worker, "addSocket", Qt::QueuedConnection, Q_ARG(QTcpSocket*, socket)); |
| 1290 | } |
| 1291 | |
| 1292 | /** |
| 1293 | * @brief Handles socket-level errors from connected clients. |