-
Notifications
You must be signed in to change notification settings - Fork 28
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
Comments
Hello, I found that issue OpenfireOF-1498 has been closed but the bug it's still present in monitoring plugin version 1.7.0.
Like I wrote in first comment: |
It was closed in Jira because it moved here. It wasn't marked as fixed. Patches welcome. |
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. 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);
}
} |
Can you do a pull request with your proposed changes? |
…gniterealtime#137) With issue igniterealtime#137 fixed, issue igniterealtime#19 can be closed.
...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.
another user responded with
The text was updated successfully, but these errors were encountered: