Add the possibility to invite any external JID to a room

fix #3285
This commit is contained in:
louiz’
2017-07-20 23:09:37 +02:00
parent 407f95a108
commit f125de4833
5 changed files with 37 additions and 13 deletions
+2
View File
@@ -13,6 +13,8 @@ Version 6.0
being shutdown or the connection to the IRC server is cut unexpectedly. 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 - Support for botan version 1.11.x has been dropped, only version 2.x is
supported. supported.
- Invitations can now be sent to any JID, not only JIDs served by the biboumi
instance itself.
Version 5.0 - 2017-05-24 Version 5.0 - 2017-05-24
======================== ========================
+13 -8
View File
@@ -455,17 +455,22 @@ be replaced by a space, because the IRC server wouldn’t accept it.
Invitations Invitations
----------- -----------
Biboumi forwards the mediated invitations to the target nick. If the user If the invited JID is a user JID served by this biboumi instance, it will forward the
wishes to invite the user “FooBar” into a room, they can invite one of the invitation to the target nick, over IRC.
following “JIDs” (one of them is not a JID, actually): Otherwise, the mediated instance will directly be sent to the invited JID, over XMPP.
- foobar%anything@anything Example: if the user wishes to invite the IRC user “FooBar” into a room, they can
- anything@anything/FooBar 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 - FooBar
Note that the “anything” part are simply ignored because they have no (Note that the “anything” parts are simply ignored because they carry no
meaning for the IRC server: we already know which IRC server is targeted additional meaning for biboumi: we already know which IRC server is targeted
using the JID of the target channel. using the JID of the target channel.)
Otherwise, any valid JID can be used, to invite any XMPP user.
Kicks and bans Kicks and bans
-------------- --------------
+16 -5
View File
@@ -310,7 +310,11 @@ void BiboumiComponent::handle_message(const Stanza& stanza)
const auto invite_to = invite->get_tag("to"); const auto invite_to = invite->get_tag("to");
if (!invite_to.empty()) 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, void BiboumiComponent::send_invitation(const std::string& room_target,
const std::string& jid_to, const std::string& jid_to,
const std::string& author_nick) 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"); Stanza message("message");
{ {
@@ -994,10 +1008,7 @@ void BiboumiComponent::send_invitation(const std::string& room_target,
XmlSubNode x(message, "x"); XmlSubNode x(message, "x");
x["xmlns"] = MUC_USER_NS; x["xmlns"] = MUC_USER_NS;
XmlSubNode invite(x, "invite"); XmlSubNode invite(x, "invite");
if (author_nick.empty()) invite["from"] = from;
invite["from"] = room_target + "@" + this->served_hostname;
else
invite["from"] = room_target + "@" + this->served_hostname + "/" + author_nick;
} }
this->send_stanza(message); this->send_stanza(message);
} }
+3
View File
@@ -87,6 +87,9 @@ public:
const ChannelList& channel_list, std::vector<ListElement>::const_iterator begin, const ChannelList& channel_list, std::vector<ListElement>::const_iterator begin,
std::vector<ListElement>::const_iterator end, const ResultSetInfo& rs_info); 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); 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 accept_subscription(const std::string& from, const std::string& to);
void ask_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=""); void send_presence_to_contact(const std::string& from, const std::string& to, const std::string& type, const std::string& id="");
+3
View File
@@ -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(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/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(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", Scenario("virtual_channel_multisession",
[ [