summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuel Gil Peyrot <linkmauve@linkmauve.fr>2015-01-14 12:38:46 +0100
committerEmmanuel Gil Peyrot <linkmauve@linkmauve.fr>2015-01-14 12:38:46 +0100
commite4fcbd3030f033c24102db9f6b6abfb540332c9d (patch)
treec3a491ccab00c1b77c52f138869a636cfe69880d
parente2e2f3089469e3e2acbdf1ac6902241d994057c6 (diff)
downloadbiboumi-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.cpp4
-rw-r--r--src/bridge/bridge.hpp2
-rw-r--r--src/irc/irc_client.cpp4
-rw-r--r--src/irc/irc_client.hpp2
-rw-r--r--src/xmpp/xmpp_component.cpp4
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")
{