diff --git a/source/glest_game/menu/menu_state_custom_game.cpp b/source/glest_game/menu/menu_state_custom_game.cpp index a9782532..ba9344ea 100644 --- a/source/glest_game/menu/menu_state_custom_game.cpp +++ b/source/glest_game/menu/menu_state_custom_game.cpp @@ -128,6 +128,9 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu, b buttonReturn.registerGraphicComponent(containerName,"buttonReturn"); buttonReturn.init(250, 180, 125); + buttonClearBlockedPlayers.registerGraphicComponent(containerName,"buttonClearBlockedPlayers"); + buttonClearBlockedPlayers.init(427, 590, 125); + buttonRestoreLastSettings.registerGraphicComponent(containerName,"buttonRestoreLastSettings"); buttonRestoreLastSettings.init(250+130, 180, 200); @@ -366,7 +369,6 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu, b listBoxNetworkPauseGameForLaggedClients.pushBackItem(lang.get("Yes")); listBoxNetworkPauseGameForLaggedClients.setSelectedItem(lang.get("Yes")); - // Enable Server Controlled AI //labelEnableServerControlledAI.registerGraphicComponent(containerName,"labelEnableServerControlledAI"); //labelEnableServerControlledAI.init(xoffset+550, networkHeadPos, 80); @@ -395,6 +397,10 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu, b listBoxControls[i].registerGraphicComponent(containerName,"listBoxControls" + intToStr(i)); listBoxControls[i].init(xoffset+210, setupPos-30-i*rowHeight); + buttonBlockPlayers[i].registerGraphicComponent(containerName,"buttonBlockPlayers" + intToStr(i)); + buttonBlockPlayers[i].init(xoffset+355, setupPos-30-i*rowHeight, 70); + buttonBlockPlayers[i].setText(lang.get("BlockPlayer")); + listBoxRMultiplier[i].registerGraphicComponent(containerName,"listBoxRMultiplier" + intToStr(i)); listBoxRMultiplier[i].init(xoffset+350, setupPos-30-i*rowHeight,70); @@ -430,6 +436,7 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu, b labelTeam.setFont(CoreData::getInstance().getMenuFontBig()); //texts + buttonClearBlockedPlayers.setText(lang.get("BlockPlayerClear")); buttonReturn.setText(lang.get("Return")); buttonPlayNow.setText(lang.get("PlayNow")); buttonRestoreLastSettings.setText(lang.get("ReloadLastGameSettings")); @@ -898,6 +905,44 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){ } updateResourceMultiplier(i); } + else if(buttonClearBlockedPlayers.mouseClick(x, y)) { + ServerInterface* serverInterface= NetworkManager::getInstance().getServerInterface(); + if(serverInterface != NULL) { + ServerSocket *serverSocket = serverInterface->getServerSocket(); + if(serverSocket != NULL) { + serverSocket->clearBlockedIPAddress(); + } + } + } + else if(buttonBlockPlayers[i].mouseClick(x, y)) { + ServerInterface* serverInterface= NetworkManager::getInstance().getServerInterface(); + if(serverInterface != NULL) { + if(serverInterface->getSlot(i) != NULL && + serverInterface->getSlot(i)->isConnected()) { + + ServerSocket *serverSocket = serverInterface->getServerSocket(); + if(serverSocket != NULL) { + serverSocket->addIPAddressToBlockedList(serverInterface->getSlot(i)->getIpAddress()); + + Lang &lang= Lang::getInstance(); + const vector languageList = serverInterface->getGameSettings()->getUniqueNetworkPlayerLanguages(); + for(unsigned int j = 0; j < languageList.size(); ++j) { + char szMsg[1024]=""; + if(lang.hasString("BlockPlayerServerMsg",languageList[j]) == true) { + sprintf(szMsg,lang.get("BlockPlayerServerMsg",languageList[j]).c_str(),serverInterface->getSlot(i)->getIpAddress().c_str()); + } + else { + sprintf(szMsg,"The server has temporarily blocked IP Address [%s] from this game.",serverInterface->getSlot(i)->getIpAddress().c_str()); + } + + serverInterface->sendTextMessage(szMsg,-1, true,languageList[j]); + } + sleep(1); + serverInterface->getSlot(i)->close(); + } + } + } + } else if(listBoxFactions[i].mouseClick(x, y)) { // Disallow CPU players to be observers if(factionFiles[listBoxFactions[i].getSelectedItemIndex()] == formatString(GameConstants::OBSERVER_SLOTNAME) && @@ -1211,11 +1256,13 @@ void MenuStateCustomGame::mouseMove(int x, int y, const MouseState *ms){ buttonReturn.mouseMove(x, y); buttonPlayNow.mouseMove(x, y); buttonRestoreLastSettings.mouseMove(x, y); + buttonClearBlockedPlayers.mouseMove(x, y); bool editingPlayerName = false; for(int i = 0; i < GameConstants::maxPlayers; ++i) { listBoxRMultiplier[i].mouseMove(x, y); listBoxControls[i].mouseMove(x, y); + buttonBlockPlayers[i].mouseMove(x, y); listBoxFactions[i].mouseMove(x, y); listBoxTeams[i].mouseMove(x, y); @@ -1296,10 +1343,25 @@ void MenuStateCustomGame::render() { renderer.renderListBox(&listBoxPlayerStatus); } + ServerInterface* serverInterface= NetworkManager::getInstance().getServerInterface(); + if( serverInterface != NULL && + serverInterface->getServerSocket() != NULL && + serverInterface->getServerSocket()->hasBlockedIPAddresses() == true) { + renderer.renderButton(&buttonClearBlockedPlayers); + } for(int i = 0; i < GameConstants::maxPlayers; ++i) { if( hasNetworkGameSettings() == true && listBoxControls[i].getSelectedItemIndex() != ctClosed) { renderer.renderLabel(&labelPlayerStatus[i]); + + if(listBoxControls[i].getSelectedItemIndex() == ctNetwork) { + ServerInterface* serverInterface= NetworkManager::getInstance().getServerInterface(); + if( serverInterface != NULL && + serverInterface->getSlot(i) != NULL && + serverInterface->getSlot(i)->isConnected()) { + renderer.renderButton(&buttonBlockPlayers[i]); + } + } } if(crcPlayerTextureCache[i] != NULL) { diff --git a/source/glest_game/menu/menu_state_custom_game.h b/source/glest_game/menu/menu_state_custom_game.h index 04cc48b3..7c2b53f9 100644 --- a/source/glest_game/menu/menu_state_custom_game.h +++ b/source/glest_game/menu/menu_state_custom_game.h @@ -61,12 +61,15 @@ private: GraphicLabel labelPlayers[GameConstants::maxPlayers]; GraphicLabel labelPlayerNames[GameConstants::maxPlayers]; GraphicListBox listBoxControls[GameConstants::maxPlayers]; + GraphicButton buttonBlockPlayers[GameConstants::maxPlayers]; GraphicListBox listBoxRMultiplier[GameConstants::maxPlayers]; GraphicListBox listBoxFactions[GameConstants::maxPlayers]; GraphicListBox listBoxTeams[GameConstants::maxPlayers]; GraphicLabel labelNetStatus[GameConstants::maxPlayers]; MapInfo mapInfo; + GraphicButton buttonClearBlockedPlayers; + GraphicLabel labelPublishServer; GraphicListBox listBoxPublishServer; diff --git a/source/glest_game/network/server_interface.h b/source/glest_game/network/server_interface.h index ae3bbd8c..c1809b67 100644 --- a/source/glest_game/network/server_interface.h +++ b/source/glest_game/network/server_interface.h @@ -83,8 +83,7 @@ public: virtual Socket* getSocket() {return &serverSocket;} - const virtual Socket *getSocket() const - { + const virtual Socket *getSocket() const { return &serverSocket; } diff --git a/source/shared_lib/include/platform/posix/socket.h b/source/shared_lib/include/platform/posix/socket.h index 2adb96e5..70d25a9c 100644 --- a/source/shared_lib/include/platform/posix/socket.h +++ b/source/shared_lib/include/platform/posix/socket.h @@ -230,6 +230,7 @@ protected: BroadCastSocketThread *broadCastThread; void startBroadCastThread(); bool isBroadCastThreadRunning(); + vector blockIPList; public: ServerSocket(); @@ -239,6 +240,12 @@ public: Socket *accept(); void stopBroadCastThread(); + void addIPAddressToBlockedList(string value); + bool isIPAddressBlocked(string value) const; + void removeBlockedIPAddress(string value); + void clearBlockedIPAddress(); + bool hasBlockedIPAddresses() const; + void setBindPort(int port) { boundPort = port; } int getBindPort() const { return boundPort; } bool isPortBound() const { return portBound; } diff --git a/source/shared_lib/sources/platform/posix/socket.cpp b/source/shared_lib/sources/platform/posix/socket.cpp index a56353c4..d637ec71 100644 --- a/source/shared_lib/sources/platform/posix/socket.cpp +++ b/source/shared_lib/sources/platform/posix/socket.cpp @@ -1949,7 +1949,6 @@ void ServerSocket::listen(int connectionQueueSize) { } Socket *ServerSocket::accept() { - if(isSocketValid() == false) { throwException("socket is invalid!"); } @@ -1977,6 +1976,13 @@ Socket *ServerSocket::accept() { sprintf(client_host, "%s",inet_ntoa(cli_addr.sin_addr)); if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] got connection, newSock = %d client_host [%s]\n",__FILE__,__FUNCTION__,__LINE__,newSock,client_host); } + if(isIPAddressBlocked(client_host) == true) { + if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] BLOCKING connection, newSock = %d client_host [%s]\n",__FILE__,__FUNCTION__,__LINE__,newSock,client_host); + + close(newSock); + return NULL; + } + Socket *result = new Socket(newSock); result->setIpAddress(client_host); return result; @@ -2454,4 +2460,29 @@ std::string Socket::getIpAddress() { return ipAddress; } +void ServerSocket::addIPAddressToBlockedList(string value) { + if(isIPAddressBlocked(value) == false) { + blockIPList.push_back(value); + } +} +bool ServerSocket::isIPAddressBlocked(string value) const { + bool result = (std::find(blockIPList.begin(),blockIPList.end(),value) != blockIPList.end()); + return result; +} + +void ServerSocket::removeBlockedIPAddress(string value) { + vector::iterator iterFind = std::find(blockIPList.begin(),blockIPList.end(),value); + if(iterFind != blockIPList.end()) { + blockIPList.erase(iterFind); + } +} + +void ServerSocket::clearBlockedIPAddress() { + blockIPList.clear(); +} + +bool ServerSocket::hasBlockedIPAddresses() const { + return(blockIPList.size() > 0); +} + }}//end namespace