summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/src/main/java/org/luxons/sevenwonders/config/TopicSubscriptionInterceptor.java15
-rw-r--r--backend/src/test/java/org/luxons/sevenwonders/SevenWondersTest.java41
-rw-r--r--backend/src/test/java/org/luxons/sevenwonders/test/api/SevenWondersSession.java9
3 files changed, 49 insertions, 16 deletions
diff --git a/backend/src/main/java/org/luxons/sevenwonders/config/TopicSubscriptionInterceptor.java b/backend/src/main/java/org/luxons/sevenwonders/config/TopicSubscriptionInterceptor.java
index 27f3bd24..855b7800 100644
--- a/backend/src/main/java/org/luxons/sevenwonders/config/TopicSubscriptionInterceptor.java
+++ b/backend/src/main/java/org/luxons/sevenwonders/config/TopicSubscriptionInterceptor.java
@@ -1,7 +1,8 @@
package org.luxons.sevenwonders.config;
-import org.luxons.sevenwonders.errors.ApiMisuseException;
import org.luxons.sevenwonders.validation.DestinationAccessValidator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
@@ -13,6 +14,8 @@ import org.springframework.stereotype.Component;
@Component
public class TopicSubscriptionInterceptor extends ChannelInterceptorAdapter {
+ private static final Logger logger = LoggerFactory.getLogger(TopicSubscriptionInterceptor.class);
+
private final DestinationAccessValidator destinationAccessValidator;
@Autowired
@@ -27,16 +30,14 @@ public class TopicSubscriptionInterceptor extends ChannelInterceptorAdapter {
String username = headerAccessor.getUser().getName();
String destination = headerAccessor.getDestination();
if (!destinationAccessValidator.hasAccess(username, destination)) {
- throw new ForbiddenSubscriptionException(username, destination);
+ sendForbiddenSubscriptionError(username, destination);
+ return null;
}
}
return message;
}
- private static class ForbiddenSubscriptionException extends ApiMisuseException {
-
- ForbiddenSubscriptionException(String username, String destination) {
- super(String.format("Player '%s' is not allowed to access %s", username, destination));
- }
+ private void sendForbiddenSubscriptionError(String username, String destination) {
+ logger.error(String.format("Player '%s' is not allowed to access %s", username, destination));
}
}
diff --git a/backend/src/test/java/org/luxons/sevenwonders/SevenWondersTest.java b/backend/src/test/java/org/luxons/sevenwonders/SevenWondersTest.java
index d6415376..fe0c4d83 100644
--- a/backend/src/test/java/org/luxons/sevenwonders/SevenWondersTest.java
+++ b/backend/src/test/java/org/luxons/sevenwonders/SevenWondersTest.java
@@ -1,6 +1,7 @@
package org.luxons.sevenwonders;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.junit.After;
@@ -14,6 +15,7 @@ import org.luxons.sevenwonders.test.api.ApiPlayerTurnInfo;
import org.luxons.sevenwonders.test.api.SevenWondersClient;
import org.luxons.sevenwonders.test.api.SevenWondersSession;
import org.luxons.sevenwonders.test.client.Channel;
+import org.luxons.sevenwonders.test.client.JackstompSession;
import org.springframework.boot.context.embedded.LocalServerPort;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
@@ -21,6 +23,7 @@ import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@@ -61,10 +64,37 @@ public class SevenWondersTest {
session.disconnect();
}
+ private SevenWondersSession newPlayer(String name) throws InterruptedException, TimeoutException,
+ ExecutionException {
+ SevenWondersSession otherSession = client.connect(serverUrl);
+ otherSession.chooseName(name);
+ return otherSession;
+ }
+
+ @Test
+ public void lobbySubscription_ignoredForOutsiders() throws InterruptedException, ExecutionException,
+ TimeoutException {
+ SevenWondersSession ownerSession = newPlayer("GameOwner");
+ SevenWondersSession session1 = newPlayer("Player1");
+ SevenWondersSession session2 = newPlayer( "Player2");
+ String gameName = "Test Game";
+ ApiLobby lobby = ownerSession.createGame(gameName);
+ session1.joinGame(lobby.getId());
+ session2.joinGame(lobby.getId());
+
+ SevenWondersSession outsiderSession = newPlayer("Outsider");
+ JackstompSession session = outsiderSession.getJackstompSession();
+ Channel<Object> started = session.subscribeEmptyMsgs("/topic/lobby/" + lobby.getId() + "/started");
+
+ ownerSession.startGame(lobby.getId());
+ Object nothing = started.next(1, TimeUnit.SECONDS);
+ assertNull(nothing);
+ disconnect(ownerSession, session1, session2, outsiderSession);
+ }
+
@Test
public void createGame_success() throws InterruptedException, ExecutionException, TimeoutException {
- SevenWondersSession ownerSession = client.connect(serverUrl);
- ownerSession.chooseName("GameOwner");
+ SevenWondersSession ownerSession = newPlayer("GameOwner");
String gameName = "Test Game";
ApiLobby lobby = ownerSession.createGame(gameName);
@@ -74,13 +104,6 @@ public class SevenWondersTest {
disconnect(ownerSession);
}
- private SevenWondersSession newPlayer(String name) throws InterruptedException, TimeoutException,
- ExecutionException {
- SevenWondersSession otherSession = client.connect(serverUrl);
- otherSession.chooseName(name);
- return otherSession;
- }
-
@Test
public void createGame_seenByConnectedPlayers() throws InterruptedException, ExecutionException, TimeoutException {
SevenWondersSession otherSession = newPlayer("OtherPlayer");
diff --git a/backend/src/test/java/org/luxons/sevenwonders/test/api/SevenWondersSession.java b/backend/src/test/java/org/luxons/sevenwonders/test/api/SevenWondersSession.java
index 093d391a..3f76a54b 100644
--- a/backend/src/test/java/org/luxons/sevenwonders/test/api/SevenWondersSession.java
+++ b/backend/src/test/java/org/luxons/sevenwonders/test/api/SevenWondersSession.java
@@ -3,6 +3,7 @@ package org.luxons.sevenwonders.test.api;
import org.luxons.sevenwonders.actions.ChooseNameAction;
import org.luxons.sevenwonders.actions.CreateGameAction;
import org.luxons.sevenwonders.actions.JoinGameAction;
+import org.luxons.sevenwonders.errors.UIError;
import org.luxons.sevenwonders.test.client.Channel;
import org.luxons.sevenwonders.test.client.JackstompSession;
@@ -18,10 +19,18 @@ public class SevenWondersSession {
this.session = session;
}
+ public JackstompSession getJackstompSession() {
+ return session;
+ }
+
public void disconnect() {
session.disconnect();
}
+ public Channel<UIError> watchErrors() {
+ return session.subscribe("/user/queue/errors", UIError.class);
+ }
+
public ApiPlayer chooseName(String displayName) throws InterruptedException {
ChooseNameAction action = new ChooseNameAction();
action.setPlayerName(displayName);
bgstack15