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