aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java14
-rw-r--r--juick-server/src/test/java/com/juick/server/tests/ServerTests.java21
2 files changed, 31 insertions, 4 deletions
diff --git a/juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java b/juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java
index 35e48383..d68ef8dd 100644
--- a/juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java
+++ b/juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java
@@ -837,7 +837,13 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
@Override
public List<Message> getReplies(final User user, final int mid) {
List<Message> replies = getNamedParameterJdbcTemplate().query(
- "SELECT replies.message_id as mid, replies.reply_id, replies.replyto, " +
+ "WITH RECURSIVE banned(reply_id, user_id) AS (" +
+ "SELECT reply_id, user_id FROM replies " +
+ "WHERE replies.message_id = :mid " +
+ "AND EXISTS (SELECT 1 FROM bl_users b WHERE b.user_id = :uid AND b.bl_user_id = replies.user_id) " +
+ "UNION ALL SELECT replies.reply_id, replies.user_id FROM replies " +
+ "INNER JOIN banned ON banned.reply_id = replies.replyto ) " +
+ "SELECT replies.message_id as mid, replies.reply_id, replies.replyto, " +
"replies.user_id, users.nick, users.banned, " +
"replies.ts, " +
"0 as readonly, 0 as privacy, 0 as replies, " +
@@ -853,8 +859,10 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
"LEFT JOIN messages m on replies.message_id = m.message_id " +
"LEFT JOIN users qu ON qw.user_id=qu.id " +
"LEFT JOIN users mu ON m.user_id=mu.id " +
- "WHERE replies.message_id = :mid ORDER BY replies.reply_id ASC",
- new MapSqlParameterSource("mid", mid),
+ "WHERE replies.message_id = :mid " +
+ "AND NOT EXISTS (SELECT 1 FROM banned WHERE banned.reply_id = replies.reply_id) " +
+ "ORDER BY replies.reply_id ASC",
+ new MapSqlParameterSource("mid", mid).addValue("uid", user.getUid()),
new MessageMapper());
if (replies.size() > 0) {
setLastReadComment(user, mid, replies.stream().map(Message::getRid).max(Comparator.naturalOrder()).get());
diff --git a/juick-server/src/test/java/com/juick/server/tests/ServerTests.java b/juick-server/src/test/java/com/juick/server/tests/ServerTests.java
index c43ed9bd..af5b20ec 100644
--- a/juick-server/src/test/java/com/juick/server/tests/ServerTests.java
+++ b/juick-server/src/test/java/com/juick/server/tests/ServerTests.java
@@ -670,7 +670,6 @@ public class ServerTests {
@Test
public void protocolTests() throws Exception {
- URI emptyUri = URI.create(StringUtils.EMPTY);
int uid = userService.createUser("me", "secret");
User user = userService.getUserByUID(uid).orElse(AnonymousUser.INSTANCE);
Tag yo = tagService.getTag("yo", true);
@@ -1047,4 +1046,24 @@ public class ServerTests {
.with(httpBasic(ugnichName, ugnichPassword)))
.andExpect(jsonPath("$.hash", is(hash)));
}
+ @Test
+ public void feedsShouldNotContainBannedUsers() throws Exception {
+ commandsManager.processCommand(ugnich, "BL @freefd", emptyUri);
+ CommandResult result = commandsManager.processCommand(ugnich, "freefd - dick", emptyUri);
+ int mid = result.getNewMessage().get().getMid();
+ commandsManager.processCommand(freefd, String.format("#%d ugnich - dick too", mid), emptyUri);
+ commandsManager.processCommand(juick, String.format("#%d/1 ban for a hour!", mid), emptyUri);
+ commandsManager.processCommand(juick, String.format("#%d freefd is here but it is hidden from you", mid), emptyUri);
+ assertThat(messagesService.getMessage(mid).getReplies(), is(3));
+ List<Message> replies = messagesService.getReplies(ugnich, mid);
+ assertThat(replies.size(), is(1));
+ commandsManager.processCommand(freefd, String.format("#%d/3 hahaha!", mid), emptyUri);
+ assertThat(messagesService.getMessage(mid).getReplies(), is(4));
+ replies = messagesService.getReplies(ugnich, mid);
+ assertThat(replies.size(), is(1));
+ commandsManager.processCommand(juick, String.format("#%d/4 mmm?!", mid), emptyUri);
+ assertThat(messagesService.getMessage(mid).getReplies(), is(5));
+ replies = messagesService.getReplies(ugnich, mid);
+ assertThat(replies.size(), is(1));
+ }
}