diff options
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> | 2015-01-14 12:38:46 +0100 |
---|---|---|
committer | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> | 2015-01-14 12:38:46 +0100 |
commit | e4fcbd3030f033c24102db9f6b6abfb540332c9d (patch) | |
tree | c3a491ccab00c1b77c52f138869a636cfe69880d | |
parent | e2e2f3089469e3e2acbdf1ac6902241d994057c6 (diff) | |
download | biboumi-e4fcbd3030f033c24102db9f6b6abfb540332c9d.tar.gz biboumi-e4fcbd3030f033c24102db9f6b6abfb540332c9d.tar.bz2 biboumi-e4fcbd3030f033c24102db9f6b6abfb540332c9d.tar.xz biboumi-e4fcbd3030f033c24102db9f6b6abfb540332c9d.zip |
Add support for password-protected IRC rooms.
-rw-r--r-- | src/bridge/bridge.cpp | 4 | ||||
-rw-r--r-- | src/bridge/bridge.hpp | 2 | ||||
-rw-r--r-- | src/irc/irc_client.cpp | 4 | ||||
-rw-r--r-- | src/irc/irc_client.hpp | 2 | ||||
-rw-r--r-- | src/xmpp/xmpp_component.cpp | 4 |
5 files changed, 9 insertions, 7 deletions
diff --git a/src/bridge/bridge.cpp b/src/bridge/bridge.cpp index c925f9e..5fa96c8 100644 --- a/src/bridge/bridge.cpp +++ b/src/bridge/bridge.cpp @@ -108,7 +108,7 @@ IrcClient* Bridge::get_irc_client(const std::string& hostname) } } -bool Bridge::join_irc_channel(const Iid& iid, const std::string& username) +bool Bridge::join_irc_channel(const Iid& iid, const std::string& username, const std::string& password) { IrcClient* irc = this->get_irc_client(iid.get_server(), username); if (iid.get_local().empty()) @@ -135,7 +135,7 @@ bool Bridge::join_irc_channel(const Iid& iid, const std::string& username) } if (irc->is_channel_joined(iid.get_local()) == false) { - irc->send_join_command(iid.get_local()); + irc->send_join_command(iid.get_local(), password); return true; } return false; diff --git a/src/bridge/bridge.hpp b/src/bridge/bridge.hpp index c20bba2..698a017 100644 --- a/src/bridge/bridge.hpp +++ b/src/bridge/bridge.hpp @@ -58,7 +58,7 @@ public: * Try to join an irc_channel, does nothing and return true if the channel * was already joined. */ - bool join_irc_channel(const Iid& iid, const std::string& username); + bool join_irc_channel(const Iid& iid, const std::string& username, const std::string& password = ""); void send_channel_message(const Iid& iid, const std::string& body); void send_private_message(const Iid& iid, const std::string& body, const std::string& type="PRIVMSG"); void leave_irc_channel(Iid&& iid, std::string&& status_message); diff --git a/src/irc/irc_client.cpp b/src/irc/irc_client.cpp index b892684..a29fb0a 100644 --- a/src/irc/irc_client.cpp +++ b/src/irc/irc_client.cpp @@ -206,12 +206,12 @@ void IrcClient::send_quit_command(const std::string& reason) this->send_message(IrcMessage("QUIT", {reason})); } -void IrcClient::send_join_command(const std::string& chan_name) +void IrcClient::send_join_command(const std::string& chan_name, const std::string& password) { if (this->welcomed == false) this->channels_to_join.push_back(chan_name); else - this->send_message(IrcMessage("JOIN", {chan_name})); + this->send_message(IrcMessage("JOIN", {chan_name, password})); this->start(); } diff --git a/src/irc/irc_client.hpp b/src/irc/irc_client.hpp index 70d7955..29da868 100644 --- a/src/irc/irc_client.hpp +++ b/src/irc/irc_client.hpp @@ -81,7 +81,7 @@ public: /** * Send the JOIN irc command. */ - void send_join_command(const std::string& chan_name); + void send_join_command(const std::string& chan_name, const std::string& password = ""); /** * Send a PRIVMSG command for a channel * Return true if the message was actually sent diff --git a/src/xmpp/xmpp_component.cpp b/src/xmpp/xmpp_component.cpp index a1585d7..825193c 100644 --- a/src/xmpp/xmpp_component.cpp +++ b/src/xmpp/xmpp_component.cpp @@ -338,7 +338,9 @@ void XmppComponent::handle_presence(const Stanza& stanza) const std::string own_nick = bridge->get_own_nick(iid); if (!own_nick.empty() && own_nick != to.resource) bridge->send_irc_nick_change(iid, to.resource); - bridge->join_irc_channel(iid, to.resource); + XmlNode* x = stanza.get_child("x", MUC_NS); + XmlNode* password = x? x->get_child("password", MUC_NS): NULL; + bridge->join_irc_channel(iid, to.resource, password? password->get_inner(): ""); } else if (type == "unavailable") { |