diff --git a/faf-java-server-app/src/main/java/com/faforever/server/config/security/UserCreatingAuthenticationProvider.java b/faf-java-server-app/src/main/java/com/faforever/server/config/security/UserCreatingAuthenticationProvider.java index 3259439..b1f5bc2 100644 --- a/faf-java-server-app/src/main/java/com/faforever/server/config/security/UserCreatingAuthenticationProvider.java +++ b/faf-java-server-app/src/main/java/com/faforever/server/config/security/UserCreatingAuthenticationProvider.java @@ -29,6 +29,8 @@ class UserCreatingAuthenticationProvider extends AbstractUserDetailsAuthenticati private User updatePassword(User user, String password) { user.setPassword(password); + // TODO:find better fix + user.getPlayer().setPassword(password); return userRepository.save(user); } diff --git a/faf-java-server-app/src/main/java/com/faforever/server/game/GameService.java b/faf-java-server-app/src/main/java/com/faforever/server/game/GameService.java index 8ccb369..b9696cf 100644 --- a/faf-java-server-app/src/main/java/com/faforever/server/game/GameService.java +++ b/faf-java-server-app/src/main/java/com/faforever/server/game/GameService.java @@ -238,7 +238,7 @@ public CompletableFuture createGame(String title, String featuredModName, is to let the game time out, but as usual, that's not a good solution since no matter what timeout one chooses, there is always some drawback. Therefore, we don't timeout games but reset a player's game state when he tries to create a new game. Or when he logs out. */ - removePlayer(currentGame, player); + removePlayer(currentGame, player, false); } Requests.verify(currentGame == null, ErrorCode.ALREADY_IN_GAME); @@ -581,8 +581,14 @@ public void onPlayerOfflineEvent(PlayerOfflineEvent event) { playerGameStateCounters.get(event.getPlayer().getGameState()).decrementAndGet(); } + /** + * Removes player from his current game. It removes player completely by default, if running it does leave the + * possibility to reconnect. + * + * @param player the player to remove from his game + */ public void removePlayer(Player player) { - Optional.ofNullable(player.getCurrentGame()).ifPresent(game -> removePlayer(game, player)); + Optional.ofNullable(player.getCurrentGame()).ifPresent(game -> removePlayer(game, player, game.getState() == GameState.PLAYING)); } /** @@ -710,7 +716,7 @@ private void addPlayer(Game game, Player player) { markDirty(game, DEFAULT_MIN_DELAY, DEFAULT_MAX_DELAY); } - private void removePlayer(Game game, Player player) { + private void removePlayer(Game game, Player player, boolean reconnectPossible) { log.debug("Removing player '{}' from game '{}'", player, game); int playerId = player.getId(); @@ -721,12 +727,15 @@ private void removePlayer(Game game, Player player) { Map connectedPlayers = game.getConnectedPlayers(); connectedPlayers.remove(playerId); - clientService.disconnectPlayerFromGame(player.getId(), connectedPlayers.values()); + if (!reconnectPossible) { + //Doing this makes all players drop the connection to the player which makes reconnects impossible + clientService.disconnectPlayerFromGame(player.getId(), connectedPlayers.values()); + } // Checking for GameState.INITIALIZING isn't necessary since in this case, connectedPlayers will already be empty if (game.getState() == GameState.OPEN && game.getHost().equals(player)) { // A copy of the connected players is required as otherwise we run into a ConcurrentModificationException - new ArrayList<>(connectedPlayers.values()).forEach(connectedPlayer -> removePlayer(game, connectedPlayer)); + new ArrayList<>(connectedPlayers.values()).forEach(connectedPlayer -> removePlayer(game, connectedPlayer, false)); } if (connectedPlayers.isEmpty()) { @@ -757,7 +766,7 @@ private void onPlayerGameEnded(Player player, Game game) { private void onPlayerGameClosed(Player player, Game game) { log.debug("Player '{}' closed game: {}", player, game); - removePlayer(game, player); + removePlayer(game, player, false); } private void onGameCancelled(Game game) {