summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFlorent Le Coz <louiz@louiz.org>2014-03-24 21:08:09 +0100
committerFlorent Le Coz <louiz@louiz.org>2014-03-24 21:08:09 +0100
commite47b164a43e0c4f411869fbbefe875fd70df8506 (patch)
treec2873fd778d8577403524923894ce326a058f79b /src
parentcdc3183d9eb234feb2e8ca3d3019b78cce73bcf6 (diff)
downloadbiboumi-e47b164a43e0c4f411869fbbefe875fd70df8506.tar.gz
biboumi-e47b164a43e0c4f411869fbbefe875fd70df8506.tar.bz2
biboumi-e47b164a43e0c4f411869fbbefe875fd70df8506.tar.xz
biboumi-e47b164a43e0c4f411869fbbefe875fd70df8506.zip
Send an error presence whenever a user tries to join an invalid room
Diffstat (limited to 'src')
-rw-r--r--src/xmpp/xmpp_component.cpp41
-rw-r--r--src/xmpp/xmpp_component.hpp6
2 files changed, 46 insertions, 1 deletions
diff --git a/src/xmpp/xmpp_component.cpp b/src/xmpp/xmpp_component.cpp
index d083190..a2c6c2b 100644
--- a/src/xmpp/xmpp_component.cpp
+++ b/src/xmpp/xmpp_component.cpp
@@ -231,7 +231,7 @@ void XmppComponent::handle_presence(const Stanza& stanza)
}
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
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()) : "");
}
}
+ 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)
@@ -392,6 +398,39 @@ void XmppComponent::send_user_join(const std::string& from,
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)
{
XmlNode message("message");
diff --git a/src/xmpp/xmpp_component.hpp b/src/xmpp/xmpp_component.hpp
index 373104c..d4853c8 100644
--- a/src/xmpp/xmpp_component.hpp
+++ b/src/xmpp/xmpp_component.hpp
@@ -87,6 +87,12 @@ public:
const std::string& to,
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
*/
void send_topic(const std::string& from, Xmpp::body&& xmpp_topic, const std::string& to);