Skip to content

Monitoring / Archive plugin fails to reconstruct archived stanza #19

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
akrherz opened this issue Jan 7, 2019 · 4 comments
Closed

Monitoring / Archive plugin fails to reconstruct archived stanza #19

akrherz opened this issue Jan 7, 2019 · 4 comments

Comments

@akrherz
Copy link
Member

akrherz commented Jan 7, 2019

...Migrated from Ignite Jira OF-1498...

When an archived message does not contain a stanza, but does contain body data, the monitoring plugin attempts to reconstruct the stanza. A string formatter is used here, but uses invalid parameters. This results in a stanza that contains placeholders, rather than actual data.

@guusdk wrote

Fixed in monitoring plugin version 1.6.0.

another user responded with

The bug is still present in case of cluster configuration.

When a junior member submits a message to the senior member, as event of type "chatMessageReceived", the ConversationEvent run method passes an empty string to the conversationManager.processMessage method.

 public void run(ConversationManager conversationManager) {
        if (Type.chatMessageReceived == type) {
            conversationManager.processMessage(sender, receiver, body, "", date);
        }
        else if (Type.roomDestroyed == type) {
            conversationManager.roomConversationEnded(roomJID, date);
        }
        else if (Type.occupantJoined == type) {
            conversationManager.joinedGroupConversation(roomJID, user, nickname, date);
        }
        else if (Type.occupantLeft == type) {
            conversationManager.leftGroupConversation(roomJID, user, date);
            // If there are no more occupants then consider the group conversarion over
            MUCRoom mucRoom = XMPPServer.getInstance().getMultiUserChatManager().getMultiUserChatService(roomJID).getChatRoom(roomJID.getNode());
            if (mucRoom != null &&  mucRoom.getOccupantsCount() == 0) {
                conversationManager.roomConversationEnded(roomJID, date);
            }
        }
        else if (Type.nicknameChanged == type) {
            conversationManager.leftGroupConversation(roomJID, user, date);
            conversationManager.joinedGroupConversation(roomJID, user, nickname, new Date(date.getTime() + 1));
        }
        else if (Type.roomMessageReceived == type) {
            conversationManager.processRoomMessage(roomJID, user, nickname, body, stanza, date);
        }
    }

another user responded with

Regarding Momone's comment about the bug in a cluster, I found this code in ArchiveInterceptor.java: if the message comes from a senior member it gets processed and stored correctly, but if it is a junior member it gets sent to a queue with no stanza and hence is not saved correctly.

Maybe this is the cause?

```java
// Process this event in the senior cluster member or local JVM when not in a cluster
if (ClusterManager.isSeniorClusterMember()) {
	conversationManager.processMessage(message.getFrom(), message.getTo(), message.getBody(), message.toXML(), new Date());
}
else {
	JID sender = message.getFrom();
	JID receiver = message.getTo();
	ConversationEventsQueue eventsQueue = conversationManager.getConversationEventsQueue();
	eventsQueue.addChatEvent(conversationManager.getConversationKey(sender, receiver),
			ConversationEvent.chatMessageReceived(sender, receiver,
					conversationManager.isMessageArchivingEnabled() ? message.getBody() : null,
					new Date()));
}
@momone83
Copy link

momone83 commented Mar 18, 2019

Hello, I found that issue OpenfireOF-1498 has been closed but the bug it's still present in monitoring plugin version 1.7.0.
Can you explain me why stanza argument is set as empty string in ConversationEvent class run(ConversationManager conversationManager) method for Type.chatMessageReceived ?

if (Type.chatMessageReceived == type) { conversationManager.processMessage(sender, receiver, body, "", date); }

Like I wrote in first comment:
"When a junior member submits a message to the senior member, as event of type "chatMessageReceived", the ConversationEvent run method passes an empty string to the conversationManager.processMessage method."

@wrooot
Copy link
Contributor

wrooot commented Mar 18, 2019

It was closed in Jira because it moved here. It wasn't marked as fixed. Patches welcome.

@momone83
Copy link

momone83 commented Mar 18, 2019

In ArchiveInterceptor.java at line 78 (for junior cluster member) an event of type Type.chatMessagereceived is created.

public void interceptPacket(Packet packet, Session session, boolean incoming, boolean processed)
            throws PacketRejectedException
    {
        // Ignore any packets that haven't already been processed by interceptors.
        if (!processed) {
            return;
        }
        if (packet instanceof Message) {
            // Ignore any outgoing messages (we'll catch them when they're incoming).
            if (!incoming) {
                return;
            }
            Message message = (Message) packet;
            // Ignore any messages that don't have a body so that we skip events.
            // Note: XHTML messages should always include a body so we should be ok. It's
            // possible that we may need special XHTML filtering in the future, however.
            if (message.getBody() != null) {
                // Only process messages that are between two users, group chat rooms, or gateways.
                if (conversationManager.isConversation(message)) {
                    // Process this event in the senior cluster member or local JVM when not in a cluster
                    if (ClusterManager.isSeniorClusterMember()) {
                        conversationManager.processMessage(message.getFrom(), message.getTo(), message.getBody(), message.toXML(), new Date());
                    }
                    else {
                        JID sender = message.getFrom();
                        JID receiver = message.getTo();
                        ConversationEventsQueue eventsQueue = conversationManager.getConversationEventsQueue();
                        eventsQueue.addChatEvent(conversationManager.getConversationKey(sender, receiver),
                                ConversationEvent.chatMessageReceived(sender, receiver,
                                        conversationManager.isMessageArchivingEnabled() ? message.getBody() : null,
                                        new Date()));
                    }
                }
            }
        }
    }

Look at

ConversationEvent.chatMessageReceived(sender, receiver,
                                        conversationManager.isMessageArchivingEnabled() ? message.getBody() : null,
                                        new Date()));

I think there's a problem here.
The chatMessageReceived method in ConversationEvent doesn't accept a stanza argument as opposed to roomMessageReceived method of the same class.
I don't understand why.

I suggest to add stanza field for Type.chatMessageReceived

public static ConversationEvent chatMessageReceived(JID sender, JID receiver, String body, String stanza, Date date) {
        ConversationEvent event = new ConversationEvent();
        event.type = Type.chatMessageReceived;
        event.sender = sender;
        event.receiver = receiver;
        event.body = body;
        event.stanza = stanza;
        event.date = date;
        return event;
    }

//instead of

public static ConversationEvent chatMessageReceived(JID sender, JID receiver, String body, Date date) {
        ConversationEvent event = new ConversationEvent();
        event.type = Type.chatMessageReceived;
        event.sender = sender;
        event.receiver = receiver;
        event.body = body;
        event.date = date;
        return event;
    }

and pass it to conversationManager.processMessage method (in run method) as well as for roomMessageReceived method.

public void run(ConversationManager conversationManager) {
        if (Type.chatMessageReceived == type) {
//THIS
            conversationManager.processMessage(sender, receiver, body, stanza, date);
//INSTEAD OF
            conversationManager.processMessage(sender, receiver, body, "", date);
        }
        else if (Type.roomDestroyed == type) {
            conversationManager.roomConversationEnded(roomJID, date);
        }
        else if (Type.occupantJoined == type) {
            conversationManager.joinedGroupConversation(roomJID, user, nickname, date);
        }
        else if (Type.occupantLeft == type) {
            conversationManager.leftGroupConversation(roomJID, user, date);
            // If there are no more occupants then consider the group conversarion over
            MUCRoom mucRoom = XMPPServer.getInstance().getMultiUserChatManager().getMultiUserChatService(roomJID).getChatRoom(roomJID.getNode());
            if (mucRoom != null &&  mucRoom.getOccupantsCount() == 0) {
                conversationManager.roomConversationEnded(roomJID, date);
            }
        }
        else if (Type.nicknameChanged == type) {
            conversationManager.leftGroupConversation(roomJID, user, date);
            conversationManager.joinedGroupConversation(roomJID, user, nickname, new Date(date.getTime() + 1));
        }
        else if (Type.roomMessageReceived == type) {
            conversationManager.processRoomMessage(roomJID, user, nickname, body, stanza, date);
        }
    }

@wrooot
Copy link
Contributor

wrooot commented Mar 18, 2019

Can you do a pull request with your proposed changes?

momone83 pushed a commit to momone83/openfire-monitoring-plugin that referenced this issue Mar 19, 2019
@guusdk guusdk mentioned this issue Mar 23, 2019
akrherz pushed a commit to akrherz/openfire-monitoring-plugin that referenced this issue Oct 30, 2020
akrherz pushed a commit to akrherz/openfire-monitoring-plugin that referenced this issue Oct 30, 2020
akrherz pushed a commit to akrherz/openfire-monitoring-plugin that referenced this issue Dec 1, 2020
guusdk added a commit to guusdk/openfire-monitoring-plugin that referenced this issue Dec 4, 2020
@guusdk guusdk closed this as completed in 81deeeb Dec 8, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants