diff options
author | louiz’ <louiz@louiz.org> | 2017-07-20 23:09:37 +0200 |
---|---|---|
committer | louiz’ <louiz@louiz.org> | 2017-07-20 23:09:37 +0200 |
commit | f125de4833d65a83d1f550f4bfbff4d5e4c333b2 (patch) | |
tree | 2b12d105e3925b8dbe4d6d10e20d189ee31c77f0 | |
parent | 407f95a108c275db5e9b07398f553ab573cd46bc (diff) | |
download | biboumi-f125de4833d65a83d1f550f4bfbff4d5e4c333b2.tar.gz biboumi-f125de4833d65a83d1f550f4bfbff4d5e4c333b2.tar.bz2 biboumi-f125de4833d65a83d1f550f4bfbff4d5e4c333b2.tar.xz biboumi-f125de4833d65a83d1f550f4bfbff4d5e4c333b2.zip |
Add the possibility to invite any external JID to a room
fix #3285
-rw-r--r-- | CHANGELOG.rst | 2 | ||||
-rw-r--r-- | doc/biboumi.1.rst | 21 | ||||
-rw-r--r-- | src/xmpp/biboumi_component.cpp | 21 | ||||
-rw-r--r-- | src/xmpp/biboumi_component.hpp | 3 | ||||
-rw-r--r-- | tests/end_to_end/__main__.py | 3 |
5 files changed, 37 insertions, 13 deletions
diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 3f66f55..f327fb1 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -13,6 +13,8 @@ Version 6.0 being shutdown or the connection to the IRC server is cut unexpectedly. - Support for botan version 1.11.x has been dropped, only version 2.x is supported. + - Invitations can now be sent to any JID, not only JIDs served by the biboumi + instance itself. Version 5.0 - 2017-05-24 ======================== diff --git a/doc/biboumi.1.rst b/doc/biboumi.1.rst index 606fe87..3de4160 100644 --- a/doc/biboumi.1.rst +++ b/doc/biboumi.1.rst @@ -455,17 +455,22 @@ be replaced by a space, because the IRC server wouldn’t accept it. Invitations ----------- -Biboumi forwards the mediated invitations to the target nick. If the user -wishes to invite the user “FooBar” into a room, they can invite one of the -following “JIDs” (one of them is not a JID, actually): +If the invited JID is a user JID served by this biboumi instance, it will forward the +invitation to the target nick, over IRC. +Otherwise, the mediated instance will directly be sent to the invited JID, over XMPP. -- foobar%anything@anything -- anything@anything/FooBar +Example: if the user wishes to invite the IRC user “FooBar” into a room, they can +invite one of the following “JIDs” (one of them is not a JID, actually): + +- foobar%anything@biboumi.example.com +- anything@biboumi.example.com/FooBar - FooBar -Note that the “anything” part are simply ignored because they have no -meaning for the IRC server: we already know which IRC server is targeted -using the JID of the target channel. +(Note that the “anything” parts are simply ignored because they carry no +additional meaning for biboumi: we already know which IRC server is targeted +using the JID of the target channel.) + +Otherwise, any valid JID can be used, to invite any XMPP user. Kicks and bans -------------- diff --git a/src/xmpp/biboumi_component.cpp b/src/xmpp/biboumi_component.cpp index 13fabd7..0e1d270 100644 --- a/src/xmpp/biboumi_component.cpp +++ b/src/xmpp/biboumi_component.cpp @@ -310,7 +310,11 @@ void BiboumiComponent::handle_message(const Stanza& stanza) const auto invite_to = invite->get_tag("to"); if (!invite_to.empty()) { - bridge->send_irc_invitation(iid, invite_to); + Jid invited_jid{invite_to}; + if (invited_jid.domain == this->get_served_hostname() || invited_jid.local.empty()) + bridge->send_irc_invitation(iid, invite_to); + else + this->send_invitation_from_fulljid(std::to_string(iid), invite_to, from_str); } } @@ -987,6 +991,16 @@ void BiboumiComponent::send_invitation(const std::string& room_target, const std::string& jid_to, const std::string& author_nick) { + if (author_nick.empty()) + this->send_invitation_from_fulljid(room_target, jid_to, room_target + "@" + this->served_hostname); + else + this->send_invitation_from_fulljid(room_target, jid_to, room_target + "@" + this->served_hostname + "/" + author_nick); +} + +void BiboumiComponent::send_invitation_from_fulljid(const std::string& room_target, + const std::string& jid_to, + const std::string& from) +{ Stanza message("message"); { message["from"] = room_target + "@" + this->served_hostname; @@ -994,10 +1008,7 @@ void BiboumiComponent::send_invitation(const std::string& room_target, XmlSubNode x(message, "x"); x["xmlns"] = MUC_USER_NS; XmlSubNode invite(x, "invite"); - if (author_nick.empty()) - invite["from"] = room_target + "@" + this->served_hostname; - else - invite["from"] = room_target + "@" + this->served_hostname + "/" + author_nick; + invite["from"] = from; } this->send_stanza(message); } diff --git a/src/xmpp/biboumi_component.hpp b/src/xmpp/biboumi_component.hpp index e5547f9..caf990e 100644 --- a/src/xmpp/biboumi_component.hpp +++ b/src/xmpp/biboumi_component.hpp @@ -87,6 +87,9 @@ public: const ChannelList& channel_list, std::vector<ListElement>::const_iterator begin, std::vector<ListElement>::const_iterator end, const ResultSetInfo& rs_info); void send_invitation(const std::string& room_target, const std::string& jid_to, const std::string& author_nick); +private: + void send_invitation_from_fulljid(const std::string& room_target, const std::string& jid_to, const std::string& from); +public: void accept_subscription(const std::string& from, const std::string& to); void ask_subscription(const std::string& from, const std::string& to); void send_presence_to_contact(const std::string& from, const std::string& to, const std::string& type, const std::string& id=""); diff --git a/tests/end_to_end/__main__.py b/tests/end_to_end/__main__.py index ce9add6..8c2d8e9 100644 --- a/tests/end_to_end/__main__.py +++ b/tests/end_to_end/__main__.py @@ -2406,6 +2406,9 @@ if __name__ == '__main__': partial(send_stanza, "<message from='{jid_one}/{resource_one}' to='#foo%{irc_server_one}'><x xmlns='http://jabber.org/protocol/muc#user'><invite to='{nick_two}'/></x></message>"), partial(expect_stanza, "/message/body[text()='{nick_two} has been invited to #foo']"), partial(expect_stanza, "/message[@to='{jid_two}/{resource_two}'][@from='#foo%{irc_server_one}']/muc_user:x/muc_user:invite[@from='#foo%{irc_server_one}/{nick_one}']"), + + partial(send_stanza, "<message from='{jid_one}/{resource_one}' to='#foo%{irc_server_one}'><x xmlns='http://jabber.org/protocol/muc#user'><invite to='bertrand@example.com'/></x></message>"), + partial(expect_stanza, "/message[@to='bertrand@example.com'][@from='#foo%{irc_server_one}']/muc_user:x/muc_user:invite[@from='{jid_one}/{resource_one}']"), ]), Scenario("virtual_channel_multisession", [ |