Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/SpectrumIM/spectrum2.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhimselfv <me@boku.ru>2019-02-06 15:19:22 +0300
committervitalyster <vitalyster@gmail.com>2019-02-07 17:45:45 +0300
commit61a247c5d4a748e43599e1733154bb29296fb21f (patch)
treeef2f9b4f3275f50b18a6b427e44cddbf67149006 /libtransport
parent51901644c3e5c258442c60c890164d59b8bade3a (diff)
Fix: Do not remove existing legacy buddies on formal XMPP <subscribe> rejections.
Diffstat (limited to 'libtransport')
-rw-r--r--libtransport/RosterManager.cpp39
1 files changed, 20 insertions, 19 deletions
diff --git a/libtransport/RosterManager.cpp b/libtransport/RosterManager.cpp
index 481a33a7..52c2f73b 100644
--- a/libtransport/RosterManager.cpp
+++ b/libtransport/RosterManager.cpp
@@ -236,7 +236,7 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) {
else {
switch (presence->getType()) {
case Swift::Presence::Subscribe: // Add a friend on the backend network & send friend request.
- case Swift::Presence::Subscribed: // Confirm incoming friend request / Mark buddy as a friend
+ case Swift::Presence::Subscribed: // Accept friend request / Mark buddy as a friend
//Add buddy as Buddy::Both, confirm friend requests now and henceforth
LOG4CXX_TRACE(logger, "handleSubscription(): Subscribe/Subscribed");
if (newBuddy) {
@@ -250,11 +250,13 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) {
}
onBuddyAdded(buddy); //re-confirm, even if the buddy has already been Buddy::Both - it won't hurt
sendBuddyPresences(buddy, presence->getFrom());
+ //Auto-accept, as far as XMPP is concerned
+ if (presence->getType() == Swift::Presence::Subscribe)
+ response->setType(Swift::Presence::Subscribed);
break;
- case Swift::Presence::Unsubscribe: // Throw away the friend acceptance that the contact has given us.
- case Swift::Presence::Unsubscribed: // Remove existing friend / Reject SUBSCRIBE / Confirm UNSUBSCRIBE
- LOG4CXX_TRACE(logger, "handleSubscription(): Unsubscribe/Unsubscribed");
+ case Swift::Presence::Unsubscribe: // Throw away the friend privileges that the contact has given us.
+ LOG4CXX_TRACE(logger, "handleSubscription(): Unsubscribe");
//Delete buddy and reject any friend requests
//If delete-protection is enabled, only delete from backend if the friend is Buddy::Ask or new.
if (newBuddy || (buddy->getSubscription() == Buddy::Ask) || CONFIG_BOOL(m_component->getConfig(), "service.enable_remove_buddy"))
@@ -263,24 +265,23 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) {
removeBuddy(buddy->getName());
buddy = NULL;
}
- break;
- }
-
- switch (presence->getType()) {
- case Swift::Presence::Subscribed:
- break; //No XMPP response needed
- case Swift::Presence::Subscribe:
- //Auto-accept, as far as XMPP is concerned
- response->setType(Swift::Presence::Subscribed);
- break;
- case Swift::Presence::Unsubscribed:
- //XEP says the buddy should send "unsubscribe" if his attempt to "subscribe" had been rejected
- response->setType(Swift::Presence::Unsubscribe);
- break;
- case Swift::Presence::Unsubscribe:
//XEP says the buddy should send "unsubscribed" to this request
response->setType(Swift::Presence::Unsubscribed);
break;
+
+ case Swift::Presence::Unsubscribed: // Remove contact's friend privileges / Deny friend request / Confirm UNSUBSCRIBE
+ LOG4CXX_TRACE(logger, "handleSubscription(): Unsubscribed");
+ //Only remove-buddy if this is a real friend request rejection
+ //XMPP may send <unsubscribed> in other cases, e.g. when the user refuses the formal <subscribe>
+ //that we've sent to inform them of existing ::Both buddies. We should not delete existing buddies then!
+ if (buddy->getSubscription() == Buddy::Ask) {
+ onBuddyRemoved(buddy);
+ removeBuddy(buddy->getName());
+ buddy = NULL;
+ //XEP says the buddy should send "unsubscribe" if his attempt to "subscribe" had been rejected
+ response->setType(Swift::Presence::Unsubscribe);
+ }
+ break;
}
}