Send an error presence whenever a user tries to join an invalid room
This commit is contained in:
@@ -231,7 +231,7 @@ void XmppComponent::handle_presence(const Stanza& stanza)
|
|||||||
}
|
}
|
||||||
catch (const AttributeNotFound&) {}
|
catch (const AttributeNotFound&) {}
|
||||||
|
|
||||||
if (!iid.chan.empty() && !iid.chan.empty())
|
if (!iid.chan.empty() && !iid.server.empty())
|
||||||
{ // presence toward a MUC that corresponds to an irc channel
|
{ // presence toward a MUC that corresponds to an irc channel
|
||||||
if (type.empty())
|
if (type.empty())
|
||||||
{
|
{
|
||||||
@@ -246,6 +246,12 @@ void XmppComponent::handle_presence(const Stanza& stanza)
|
|||||||
bridge->leave_irc_channel(std::move(iid), status ? std::move(status->get_inner()) : "");
|
bridge->leave_irc_channel(std::move(iid), status ? std::move(status->get_inner()) : "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// An user wants to join an invalid IRC channel, return a presence error to him
|
||||||
|
if (type.empty())
|
||||||
|
this->send_invalid_room_error(to.local, to.resource, stanza["from"]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void XmppComponent::handle_message(const Stanza& stanza)
|
void XmppComponent::handle_message(const Stanza& stanza)
|
||||||
@@ -392,6 +398,39 @@ void XmppComponent::send_user_join(const std::string& from,
|
|||||||
this->send_stanza(node);
|
this->send_stanza(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void XmppComponent::send_invalid_room_error(const std::string& muc_name,
|
||||||
|
const std::string& nick,
|
||||||
|
const std::string& to)
|
||||||
|
{
|
||||||
|
Stanza presence("presence");
|
||||||
|
presence["from"] = muc_name + "@" + this->served_hostname + "/" + nick;
|
||||||
|
presence["to"] = to;
|
||||||
|
presence["type"] = "error";
|
||||||
|
XmlNode x("x");
|
||||||
|
x["xmlns"] = MUC_NS;
|
||||||
|
x.close();
|
||||||
|
presence.add_child(std::move(x));
|
||||||
|
XmlNode error("error");
|
||||||
|
error["by"] = muc_name + "@" + this->served_hostname;
|
||||||
|
error["type"] = "wait";
|
||||||
|
XmlNode service_unavailable("service-unavailable");
|
||||||
|
service_unavailable["xmlns"] = STANZA_NS;
|
||||||
|
service_unavailable.close();
|
||||||
|
error.add_child(std::move(service_unavailable));
|
||||||
|
XmlNode text("text");
|
||||||
|
text["xmlns"] = STANZA_NS;
|
||||||
|
text["xml:lang"] = "en";
|
||||||
|
text.set_inner(muc_name +
|
||||||
|
" is not a valid IRC channel name. A correct room jid is of the form: #<chan>%<server>@" +
|
||||||
|
this->served_hostname);
|
||||||
|
text.close();
|
||||||
|
error.add_child(std::move(text));
|
||||||
|
error.close();
|
||||||
|
presence.add_child(std::move(error));
|
||||||
|
presence.close();
|
||||||
|
this->send_stanza(presence);
|
||||||
|
}
|
||||||
|
|
||||||
void XmppComponent::send_topic(const std::string& from, Xmpp::body&& topic, const std::string& to)
|
void XmppComponent::send_topic(const std::string& from, Xmpp::body&& topic, const std::string& to)
|
||||||
{
|
{
|
||||||
XmlNode message("message");
|
XmlNode message("message");
|
||||||
|
|||||||
@@ -86,6 +86,12 @@ public:
|
|||||||
const std::string& role,
|
const std::string& role,
|
||||||
const std::string& to,
|
const std::string& to,
|
||||||
const bool self);
|
const bool self);
|
||||||
|
/**
|
||||||
|
* Send an error to indicate that the user tried to join an invalid room
|
||||||
|
*/
|
||||||
|
void send_invalid_room_error(const std::string& muc_jid,
|
||||||
|
const std::string& nick,
|
||||||
|
const std::string& to);
|
||||||
/**
|
/**
|
||||||
* Send the MUC topic to the user
|
* Send the MUC topic to the user
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user