diff options
author | louiz’ <louiz@louiz.org> | 2017-07-14 15:15:53 +0200 |
---|---|---|
committer | louiz’ <louiz@louiz.org> | 2017-07-16 00:16:43 +0200 |
commit | 729ea131c9857ecb2e9579359e174483c73194d0 (patch) | |
tree | bacf7549ae68185ab3b49e2a1d9b0f7269eba307 /src | |
parent | 50a2bd736ef76f7ebb7067372d5f89b59a337bec (diff) | |
download | biboumi-729ea131c9857ecb2e9579359e174483c73194d0.tar.gz biboumi-729ea131c9857ecb2e9579359e174483c73194d0.tar.bz2 biboumi-729ea131c9857ecb2e9579359e174483c73194d0.tar.xz biboumi-729ea131c9857ecb2e9579359e174483c73194d0.zip |
Send an unsubscribed presence on a probe if we don’t have a roster entry
Diffstat (limited to 'src')
-rw-r--r-- | src/xmpp/biboumi_component.cpp | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/xmpp/biboumi_component.cpp b/src/xmpp/biboumi_component.cpp index ab66519..d1c75d0 100644 --- a/src/xmpp/biboumi_component.cpp +++ b/src/xmpp/biboumi_component.cpp @@ -190,9 +190,18 @@ void BiboumiComponent::handle_presence(const Stanza& stanza) } else if (type == "probe") { - if ((iid.type == Iid::Type::Server && bridge->find_irc_client(iid.get_server())) || - iid.type == Iid::Type::None) - this->send_presence_to_contact(to_str, from.bare(), ""); + if ((iid.type == Iid::Type::Server && bridge->find_irc_client(iid.get_server())) + || iid.type == Iid::Type::None) + { +#ifdef USE_DATABASE + if (Database::has_roster_item(to_str, from.bare())) +#endif + this->send_presence_to_contact(to_str, from.bare(), ""); +#ifdef USE_DATABASE + else // rfc 6121 4.3.2.1 + this->send_presence_to_contact(to_str, from.bare(), "unsubscribed"); +#endif + } } else if (type.empty()) { // We just receive a presence from someone (as the result of a probe, @@ -1057,6 +1066,12 @@ void BiboumiComponent::after_handshake() for (const Database::RosterItem& roster_item: contacts) { const auto remote_jid = roster_item.col<Database::RemoteJid>(); + // In response, we will receive a presence indicating the + // contact is online, to which we will respond with our own + // presence. + // If the contact removed us from their roster while we were + // offline, we will receive an unsubscribed presence, letting us + // stay in sync. this->send_presence_to_contact(this->get_served_hostname(), remote_jid, "probe"); } #endif |