Hi,
as I've already posted a few weeks ago in the Openfire Support forum, Openfire has a bug, when it comes to deleting roster items.
Currently Openfire behaves like this: If User A deletes Contact B on his roster, then User A is also deleted on Contact B's roster.
This is due to this logic in IQRosterHandler.java:
roster.deleteRosterItem(item.getJID(), true);
// Forward set packet to the subscriber
if (localServer.isLocal(recipient)) { // Recipient is local so let's handle it here
try {
Roster recipientRoster = userManager.getUser(recipient.getNode()).getRoster();
recipientRoster.deleteRosterItem(sender, true);
}
catch (UserNotFoundException e) {
// Do nothing
}
}
The correct way, however is to NOT delete User A on Contact B's roster, but instead send presence stanzas of type "unsubscribe" or "unsubscribed":
See http://xmpp.org/rfcs/rfc6121.html#roster-delete-success
I've fixed that behavior in org.jivesoftware.openfire.handler.IQRosterHandler:
// Instead of deleting the sender in the recipient's roster, update it.
//recipientRoster.deleteRosterItem(sender, true);
RosterItem rosterItem = recipientRoster.getRosterItem(sender);
// If the receiver doesn't have subscribed yet, delete the sender from the receiver's roster, too.
if (rosterItem.getRecvStatus().equals(RosterItem.RECV_SUBSCRIBE)) {
recipientRoster.deleteRosterItem(sender, true);
}
// Otherwise only update it, so that the sender is not deleted from the receivers roster.
else {
rosterItem.setAskStatus(RosterItem.ASK_NONE);
rosterItem.setRecvStatus(RosterItem.RECV_NONE);
rosterItem.setSubStatus(RosterItem.SUB_NONE);
recipientRoster.updateRosterItem(rosterItem);
}
calling the updateRosterItem also automatically sends the "unsubscribe" and/or "unsubscribed" presences.
If the contact has not yet received the subscription, but the contact is deleted prior to receiving the subscription, just silently delete the item on the contact's roster (since subscription requests are reflected in the roster).
I've also created a patch and tested it. Could someone with SVN access please apply it? Thanks!