| 269 | //----------------------------------------------------------------------------- |
| 270 | |
| 271 | void NetInterface::handleConnectRequest(const NetAddress *address, BitStream *stream) |
| 272 | { |
| 273 | if(!mAllowConnections) |
| 274 | return; |
| 275 | Con::printf("Got Connect Request"); |
| 276 | U32 connectSequence; |
| 277 | stream->read(&connectSequence); |
| 278 | |
| 279 | // see if the connection is in the main connection table: |
| 280 | |
| 281 | NetConnection *connect = NetConnection::lookup(address); |
| 282 | if(connect && connect->getSequence() == connectSequence) |
| 283 | { |
| 284 | sendConnectAccept(connect); |
| 285 | return; |
| 286 | } |
| 287 | U32 addressDigest[4]; |
| 288 | U32 computedAddressDigest[4]; |
| 289 | |
| 290 | stream->read(&addressDigest[0]); |
| 291 | stream->read(&addressDigest[1]); |
| 292 | stream->read(&addressDigest[2]); |
| 293 | stream->read(&addressDigest[3]); |
| 294 | |
| 295 | computeNetMD5(address, connectSequence, computedAddressDigest); |
| 296 | if(addressDigest[0] != computedAddressDigest[0] || |
| 297 | addressDigest[1] != computedAddressDigest[1] || |
| 298 | addressDigest[2] != computedAddressDigest[2] || |
| 299 | addressDigest[3] != computedAddressDigest[3]) |
| 300 | return; // bogus connection attempt |
| 301 | |
| 302 | if(connect) |
| 303 | { |
| 304 | if(connect->getSequence() > connectSequence) |
| 305 | return; // the existing connection should be kept - the incoming request is stale. |
| 306 | else |
| 307 | connect->deleteObject(); // disconnect this one, and allow the new one to be created. |
| 308 | } |
| 309 | |
| 310 | char connectionClass[255]; |
| 311 | stream->readString(connectionClass); |
| 312 | |
| 313 | ConsoleObject *co = ConsoleObject::create(connectionClass); |
| 314 | NetConnection *conn = dynamic_cast<NetConnection *>(co); |
| 315 | if(!conn || !conn->canRemoteCreate()) |
| 316 | { |
| 317 | delete co; |
| 318 | return; |
| 319 | } |
| 320 | conn->registerObject(); |
| 321 | conn->setNetAddress(address); |
| 322 | conn->setNetworkConnection(true); |
| 323 | conn->setSequence(connectSequence); |
| 324 | |
| 325 | const char *errorString = NULL; |
| 326 | if(!conn->readConnectRequest(stream, &errorString)) |
| 327 | { |
| 328 | sendConnectReject(conn, errorString); |
nothing calls this directly
no test coverage detected