Merge branch 'fix/143-block-username-during-active-game' into 'main'
fix: block username changes during active games See merge request cs108-fs26/Gruppe-13!174
This commit was merged in pull request #330.
This commit is contained in:
+51
-16
@@ -1,5 +1,6 @@
|
|||||||
package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.change_username;
|
package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.change_username;
|
||||||
|
|
||||||
|
import ch.unibas.dmi.dbis.cs108.casono.server.domain.game.state.GamePhase;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.LobbyManager;
|
import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.LobbyManager;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.User;
|
import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.User;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.UserRegistry;
|
import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.UserRegistry;
|
||||||
@@ -42,33 +43,31 @@ public class ChangeUsernameHandler extends CommandHandler<ChangeUsernameRequest>
|
|||||||
public void execute(ChangeUsernameRequest request) {
|
public void execute(ChangeUsernameRequest request) {
|
||||||
Optional<User> user = userRegistry.getBySessionId(request.getSessionId());
|
Optional<User> user = userRegistry.getBySessionId(request.getSessionId());
|
||||||
if (user.isEmpty()) {
|
if (user.isEmpty()) {
|
||||||
responseDispatcher.dispatch(
|
dispatchError(
|
||||||
new ErrorResponse(
|
|
||||||
request.getContext(),
|
request.getContext(),
|
||||||
"USER_NOT_LOGGED_IN",
|
"USER_NOT_LOGGED_IN",
|
||||||
"This session is not associated with an active user."));
|
"This session is not associated with an active user.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String newUsername = request.getUsername() == null ? "" : request.getUsername().trim();
|
String newUsername = validateUsername(request);
|
||||||
if (newUsername.isEmpty() || !VALID_USERNAME.matcher(newUsername).matches()) {
|
if (newUsername == null) {
|
||||||
responseDispatcher.dispatch(
|
|
||||||
new ErrorResponse(
|
|
||||||
request.getContext(),
|
|
||||||
"INVALID_USERNAME",
|
|
||||||
"Only letters, numbers, '_' and '-' are allowed."));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
User currentUser = user.get();
|
User currentUser = user.get();
|
||||||
String oldUsername = currentUser.getName();
|
String oldUsername = currentUser.getName();
|
||||||
|
|
||||||
|
if (isUsernameChangeBlocked(request.getContext(), oldUsername)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
boolean changed = userRegistry.changeUsername(currentUser.getId(), newUsername);
|
boolean changed = userRegistry.changeUsername(currentUser.getId(), newUsername);
|
||||||
if (!changed) {
|
if (!changed) {
|
||||||
responseDispatcher.dispatch(
|
dispatchError(
|
||||||
new ErrorResponse(
|
|
||||||
request.getContext(),
|
request.getContext(),
|
||||||
"USERNAME_TAKEN",
|
"USERNAME_TAKEN",
|
||||||
"The requested username is already taken."));
|
"The requested username is already taken.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,11 +75,10 @@ public class ChangeUsernameHandler extends CommandHandler<ChangeUsernameRequest>
|
|||||||
lobbyManager == null || lobbyManager.renamePlayer(oldUsername, newUsername);
|
lobbyManager == null || lobbyManager.renamePlayer(oldUsername, newUsername);
|
||||||
if (!lobbySynced) {
|
if (!lobbySynced) {
|
||||||
userRegistry.changeUsername(currentUser.getId(), oldUsername);
|
userRegistry.changeUsername(currentUser.getId(), oldUsername);
|
||||||
responseDispatcher.dispatch(
|
dispatchError(
|
||||||
new ErrorResponse(
|
|
||||||
request.getContext(),
|
request.getContext(),
|
||||||
"RENAME_CONFLICT",
|
"RENAME_CONFLICT",
|
||||||
"Could not update username in current lobby/game state."));
|
"Could not update username in current lobby/game state.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,4 +107,41 @@ public class ChangeUsernameHandler extends CommandHandler<ChangeUsernameRequest>
|
|||||||
responseDispatcher.dispatch(ev);
|
responseDispatcher.dispatch(ev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String validateUsername(ChangeUsernameRequest request) {
|
||||||
|
String newUsername = request.getUsername() == null ? "" : request.getUsername().trim();
|
||||||
|
if (newUsername.isEmpty() || !VALID_USERNAME.matcher(newUsername).matches()) {
|
||||||
|
dispatchError(
|
||||||
|
request.getContext(),
|
||||||
|
"INVALID_USERNAME",
|
||||||
|
"Only letters, numbers, '_' and '-' are allowed.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return newUsername;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isUsernameChangeBlocked(RequestContext context, String oldUsername) {
|
||||||
|
if (lobbyManager == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var lobby = lobbyManager.getLobbyByUsername(oldUsername);
|
||||||
|
boolean gameRunning =
|
||||||
|
lobby != null
|
||||||
|
&& lobby.getGameController() != null
|
||||||
|
&& lobby.getGameController().getState().getPhase() != GamePhase.FINISHED;
|
||||||
|
if (gameRunning && lobby.isPlayerActive(oldUsername)) {
|
||||||
|
dispatchError(
|
||||||
|
context,
|
||||||
|
"CANNOT_CHANGE_USERNAME_DURING_LOBBY",
|
||||||
|
"Cannot change username while actively playing in a lobby. "
|
||||||
|
+ "Wait until the game ends.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void dispatchError(RequestContext context, String code, String message) {
|
||||||
|
responseDispatcher.dispatch(new ErrorResponse(context, code, message));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user