summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.rst2
-rw-r--r--doc/biboumi.1.rst21
-rw-r--r--src/xmpp/biboumi_component.cpp21
-rw-r--r--src/xmpp/biboumi_component.hpp3
-rw-r--r--tests/end_to_end/__main__.py3
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",
[