This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new 56649d4ce [OPENMEETINGS-2828] private chat messages are properly 
filtered during download/delete
56649d4ce is described below

commit 56649d4cea1a5ce75a03f5aface479f713af988f
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Wed Aug 26 16:38:51 2026 +0700

    [OPENMEETINGS-2828] private chat messages are properly filtered during 
download/delete
---
 .../apache/openmeetings/db/dao/basic/ChatDao.java  | 10 +++--
 .../openmeetings/db/entity/basic/ChatMessage.java  | 51 +++++++++++++++++-----
 .../openmeetings/web/user/chat/ChatForm.java       |  1 +
 .../openmeetings/web/user/chat/ChatToolbar.java    |  4 +-
 4 files changed, 49 insertions(+), 17 deletions(-)

diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
index e8a6f2c17..53bad8d0e 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
@@ -61,8 +61,9 @@ public class ChatDao {
                                , start, count).getResultList();
        }
 
-       public List<ChatMessage> getUser(long userId, long start, long count) {
+       public List<ChatMessage> getUser(long selfId, long userId, long start, 
long count) {
                return setLimits(em.createNamedQuery("getChatMessagesByUser", 
ChatMessage.class)
+                                       .setParameter("selfId", selfId)
                                        .setParameter(PARAM_USER_ID, userId)
                                , start, count).getResultList();
        }
@@ -110,7 +111,10 @@ public class ChatDao {
                em.createNamedQuery("deleteChatRoom").setParameter("roomId", 
roomId).executeUpdate();
        }
 
-       public void deleteUser(Long userId) {
-               
em.createNamedQuery("deleteChatUser").setParameter(PARAM_USER_ID, 
userId).executeUpdate();
+       public void deleteUser(long selfId, Long userId) {
+               em.createNamedQuery("deleteChatUser")
+                       .setParameter("selfId", selfId)
+                       .setParameter(PARAM_USER_ID, userId)
+                       .executeUpdate();
        }
 }
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
index 6d14f6eb0..9f7c6a1b5 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
@@ -54,20 +54,47 @@ import org.apache.openmeetings.db.entity.user.User;
 @NamedQuery(name = "getChatMessageById", query = "SELECT c FROM ChatMessage c 
WHERE c.id = :id")
 @NamedQuery(name = "getChatMessages", query = "SELECT c FROM ChatMessage c 
ORDER BY c.id")
 @NamedQuery(name = "getGlobalChatMessages", query = "SELECT c FROM ChatMessage 
c WHERE c.toUser IS NULL AND c.toRoom IS NULL ORDER BY c.sent DESC")
-@NamedQuery(name = "getChatMessagesByRoom", query = "SELECT c FROM ChatMessage 
c WHERE c.toUser IS NULL AND c.toRoom.id = :roomId"
-               + " AND (true = :all OR (false = :all AND c.needModeration = 
false)) ORDER BY c.sent DESC")
-@NamedQuery(name = "getChatMessagesByUser", query = "SELECT c FROM ChatMessage 
c WHERE "
-               + "c.toUser IS NOT NULL AND c.toRoom IS NULL AND "
-               + "(c.fromUser.id = :userId OR c.toUser.id = :userId) ORDER BY 
c.sent DESC")
-@NamedQuery(name = "getChatMessagesByUserTime", query = "SELECT c FROM 
ChatMessage c WHERE "
-               + "c.toUser IS NOT NULL AND c.toRoom IS NULL AND c.status <> 
:status AND "
-               + "(c.fromUser.id = :userId OR c.toUser.id = :userId) AND 
c.sent > :date ORDER BY c.sent DESC")
-@NamedQuery(name = "chatCloseMessagesByUser", query = "UPDATE ChatMessage c 
SET c.status = :status WHERE "
-               + "c.toUser IS NOT NULL AND c.toRoom IS NULL AND c.status <> 
:status AND "
-               + "(c.fromUser.id = :userId OR c.toUser.id = :userId)")
+@NamedQuery(name = "getChatMessagesByRoom", query = """
+       SELECT c
+       FROM ChatMessage c
+       WHERE c.toUser IS NULL
+               AND c.toRoom.id = :roomId
+               AND (true = :all OR (false = :all AND c.needModeration = false))
+       ORDER BY c.sent DESC""")
+@NamedQuery(name = "getChatMessagesByUser", query = """
+       SELECT c
+       FROM ChatMessage c
+       WHERE c.toUser IS NOT NULL
+               AND c.fromUser IS NOT NULL
+               AND c.toRoom IS NULL
+               AND ((c.fromUser.id = :userId AND c.toUser.id = :selfId) OR 
(c.fromUser.id = :selfId AND c.toUser.id = :userId))
+       ORDER BY c.sent DESC""")
+@NamedQuery(name = "getChatMessagesByUserTime", query = """
+       SELECT c
+       FROM ChatMessage c
+       WHERE c.toUser IS NOT NULL
+               AND c.fromUser IS NOT NULL
+               AND c.toRoom IS NULL
+               AND c.status <> :status
+               AND (c.fromUser.id = :userId OR c.toUser.id = :userId)
+               AND c.sent > :date
+       ORDER BY c.sent DESC""")
+@NamedQuery(name = "chatCloseMessagesByUser", query = """
+       UPDATE ChatMessage c
+       SET c.status = :status
+       WHERE c.toUser IS NOT NULL
+               AND c.toRoom IS NULL
+               AND c.status <> :status
+               AND (c.fromUser.id = :userId OR c.toUser.id = :userId)""")
 @NamedQuery(name = "deleteChatGlobal", query = "DELETE FROM ChatMessage c 
WHERE c.toUser IS NULL AND c.toRoom IS NULL")
 @NamedQuery(name = "deleteChatRoom", query = "DELETE FROM ChatMessage c WHERE 
c.toUser IS NULL AND c.toRoom.id = :roomId")
-@NamedQuery(name = "deleteChatUser", query = "DELETE FROM ChatMessage c WHERE 
c.toRoom IS NULL AND c.toUser.id = :userId")
+@NamedQuery(name = "deleteChatUser", query = """
+       DELETE
+       FROM ChatMessage c
+       WHERE c.toUser IS NOT NULL
+               AND c.fromUser IS NOT NULL
+               AND c.toRoom IS NULL
+               AND ((c.fromUser.id = :userId AND c.toUser.id = :selfId) OR 
(c.fromUser.id = :selfId AND c.toUser.id = :userId))""")
 @NamedQuery(name = "purgeChatUserName", query = "UPDATE ChatMessage c SET 
c.fromName = :purged WHERE c.fromUser.id = :userId")
 @Table(name = "chat")
 @XmlRootElement(name = CHAT_NODE)
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
index 7d15c7aff..6f858f330 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
@@ -128,6 +128,7 @@ public class ChatForm extends Form<Void> {
                                                                return true;
                                                        }, u -> {
                                                                m.setToUser(u);
+                                                               
m.setStatus(ChatMessage.Status.OPEN);
                                                                return true;
                                                        }))
                                        {
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
index 9e043082b..ec7853f5b 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
@@ -133,7 +133,7 @@ public class ChatToolbar extends Panel implements 
IWysiwygToolbar {
                                                return true;
                                        }, u -> {
                                                
setFileName(String.format(CHAT_FNAME_TMPL, "user_" + u.getId()));
-                                               
export(chatDao.getUser(u.getId(), 0, Integer.MAX_VALUE), sb);
+                                               
export(chatDao.getUser(getUserId(), u.getId(), 0, Integer.MAX_VALUE), sb);
                                                return true;
                                        });
                        StringResourceStream srs = new StringResourceStream(sb, 
"text/csv");
@@ -206,7 +206,7 @@ public class ChatToolbar extends Panel implements 
IWysiwygToolbar {
                                                }
                                                return true;
                                        }, u -> {
-                                               chatDao.deleteUser(u.getId());
+                                               chatDao.deleteUser(getUserId(), 
u.getId());
                                                
WebSocketHelper.sendUser(u.getId(), cleanMsg(scope));
                                                return true;
                                        });

Reply via email to