From 348a1f480ffc26da3087c2c64dc040e61819fe43 Mon Sep 17 00:00:00 2001 From: Julian Hochstetter <julian.hochstetter@mni.thm.de> Date: Thu, 13 Sep 2012 10:26:18 +0200 Subject: [PATCH] Restrict updateFeedback to users, which are in the current session --- .../thm/arsnova/services/ISessionService.java | 3 +++ .../thm/arsnova/services/SessionService.java | 14 +++++++++++++- .../arsnova/socket/ARSnovaSocketIOServer.java | 19 ++++++++++++++++++- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java index 9dc98f08..6efdcfc9 100644 --- a/src/main/java/de/thm/arsnova/services/ISessionService.java +++ b/src/main/java/de/thm/arsnova/services/ISessionService.java @@ -18,6 +18,8 @@ */ package de.thm.arsnova.services; +import java.util.List; + import de.thm.arsnova.entities.Feedback; import de.thm.arsnova.entities.Session; import de.thm.arsnova.entities.User; @@ -33,4 +35,5 @@ public interface ISessionService { public String generateKeyword(); public void addUserToSessionMap(String username, String keyword); public boolean isUserInSession(User user, String keyword); + public List<String> getUsersInSession(String keyword); } \ No newline at end of file diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java index 29abd915..d113764f 100644 --- a/src/main/java/de/thm/arsnova/services/SessionService.java +++ b/src/main/java/de/thm/arsnova/services/SessionService.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; +import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import net.sf.json.JSONObject; @@ -223,10 +224,21 @@ public class SessionService implements ISessionService { return keyword.equals(session); } + @Override + public List<String> getUsersInSession(String keyword) { + List<String> result = new ArrayList<String>(); + for(Entry<String, String> e : user2session.entrySet()) { + if(e.getValue().equals(keyword)) { + result.add(e.getKey()); + } + } + return result; + } + @Override @Transactional(isolation=Isolation.READ_COMMITTED) public void addUserToSessionMap(String username, String keyword) { - user2session.putIfAbsent(username, keyword); + user2session.put(username, keyword); } private String getSessionId(String keyword) { diff --git a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java index 541f0b66..93e061ee 100644 --- a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java +++ b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java @@ -3,6 +3,7 @@ package de.thm.arsnova.socket; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -66,13 +67,29 @@ public class ARSnovaSocketIOServer { new DataListener<Feedback>() { @Override public void onData(SocketIOClient client, Feedback data) { + /** + * do a check if user is in the session, for which he would give a feedback + */ User u = session2user.get(client.getSessionId().toString()); if(u == null || sessionService.isUserInSession(u, data.getSessionkey()) == false) { return; } sessionService.postFeedback(data.getSessionkey(), data.getValue(), u); + + /** + * collect a list of users which are in the current session + * iterate over all connected clients and if send feedback, + * if user is in current session + */ + List<String> users = sessionService.getUsersInSession(data.getSessionkey()); de.thm.arsnova.entities.Feedback fb = sessionService.getFeedback(data.getSessionkey()); - server.getBroadcastOperations().sendEvent("updateFeedback", fb.getValues()); + + for(SocketIOClient c : server.getAllClients()) { + u = session2user.get(c.getSessionId().toString()); + if(u != null && users.contains(u.getUsername())) { + c.sendEvent("updateFeedback", fb.getValues()); + } + } } }); -- GitLab