Skip to content

Commit

Permalink
Refuse login if user name is already taken
Browse files Browse the repository at this point in the history
The server doesn't handle failed logins correctly yet, see #347.

Resolves #345
  • Loading branch information
jacwah committed Aug 9, 2015
1 parent 3f2eb72 commit c92a2ac
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,10 @@ public String getStatus() {
return isLoggedIn() ? "online" : "offline";
}

public void setName(String name) {
public synchronized void setName(String name) throws UserNameAlreadyInUseException {
if (server.getClientNames().contains(name)) {
throw new UserNameAlreadyInUseException("A client with name \"" + name + "\" is already logged in");
}
this.name = name;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.cardshifter.api.messages.Message;

import java.util.Collection;

public interface ClientServerInterface {

void handleMessage(ClientIO clientIO, String message);
Expand All @@ -14,4 +16,6 @@ public interface ClientServerInterface {

LogInterface getLogger();

Collection getClientNames();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.cardshifter.api;


public class UserNameAlreadyInUseException extends Exception {

public UserNameAlreadyInUseException() {
}

public UserNameAlreadyInUseException(String message) {
super(message);
}

public UserNameAlreadyInUseException(String message, Throwable cause) {
super(message, cause);
}

public UserNameAlreadyInUseException(Throwable cause) {
super(cause);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ public class WelcomeMessage extends Message {
private String message;

public WelcomeMessage() {
this(-42, true);
this(-42, true, "");
}
public WelcomeMessage(int id, boolean success) {
public WelcomeMessage(int id, boolean success, String message) {
super("loginresponse");
this.status = success ? STATUS_OK : 404;
this.message = success ? "OK" : "Wrong username or password";
this.message = message;
this.userId = id;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
package com.cardshifter.client;

import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
import java.util.Map.Entry;
import java.util.ResourceBundle;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.prefs.Preferences;
Expand Down Expand Up @@ -179,6 +176,11 @@ public void handleMessage(ClientIO clientIO, String message) {
public LogInterface getLogger() {
return new Log4jAdapter();
}

@Override
public Collection getClientNames() {
throw new UnsupportedOperationException();
}
};

try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;

import com.cardshifter.api.UserNameAlreadyInUseException;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

Expand Down Expand Up @@ -65,13 +66,22 @@ public void query(ServerQueryMessage message, ClientIO client) {

public void loginMessage(LoginMessage message, ClientIO client) {
logger.info("Login request: " + message.getUsername() + " for client " + client);

if (message.getUsername().startsWith("x")) {
client.sendToClient(new WelcomeMessage(0, false));
client.sendToClient(new WelcomeMessage(0, false, "User name can't start with \"x\""));
return;
}

try {
client.setName(message.getUsername());
}
catch (UserNameAlreadyInUseException e){
client.sendToClient(new WelcomeMessage(0, false, "A user with that name is already logged in"));
return;
}

logger.info("Client is welcome!");
client.setName(message.getUsername());
client.sendToClient(new WelcomeMessage(client.getId(), true));
client.sendToClient(new WelcomeMessage(client.getId(), true, "OK"));
UserStatusMessage statusMessage = new UserStatusMessage(client.getId(), client.getName(), Status.ONLINE);
server.getClients().values().stream()
.filter(cl -> cl != client)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
package com.cardshifter.server.model;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
Expand Down Expand Up @@ -119,6 +113,17 @@ public ChatArea newChatRoom(String name) {
public Map<Integer, ClientIO> getClients() {
return Collections.unmodifiableMap(clients);
}

/**
* @return Collection of client user names
*/
@Override
public Collection getClientNames() {
List<String> names = new ArrayList<String>();

clients.forEach((id, client) -> names.add(client.getName()));
return names;
}

/**
*
Expand Down

0 comments on commit c92a2ac

Please sign in to comment.