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