Commit f125de48 authored by louiz’'s avatar louiz’

Add the possibility to invite any external JID to a room

fix #3285
parent 407f95a1
Pipeline #833 passed with stages
in 15 minutes and 4 seconds
......@@ -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
========================
......
......@@ -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
--------------
......
......@@ -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);
}
}
......@@ -986,6 +990,16 @@ void BiboumiComponent::send_iq_room_list_result(const std::string& id, const std
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");
{
......@@ -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);
}
......
......@@ -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="");
......
......@@ -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",
[
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment