#include <QDebug>
+#ifdef HAVE_QCA2
+# include "cipher.h"
+#endif
+
IrcServerHandler::IrcServerHandler(CoreNetwork *parent)
: CoreBasicHandler(parent),
_whois(false)
? *targetIter
: senderNick;
+#ifdef HAVE_QCA2
+ msg = decrypt(target, msg);
+#endif
// it's possible to pack multiple privmsgs into one param using ctcp
// - > we let the ctcpHandler do the work
network()->ctcpHandler()->parse(Message::Plain, prefix, target, msg);
return;
QString topic;
- if(params.count() > 1)
- topic = channelDecode(channel->name(), params[1]);
+ if(params.count() > 1) {
+ QByteArray rawTopic = params[1];
+#ifdef HAVE_QCA2
+ rawTopic = decrypt(channel->name(), rawTopic, true);
+#endif
+ topic = channelDecode(channel->name(), rawTopic);
+ }
channel->setTopic(topic);
return;
QString channel = serverDecode(params[0]);
- QString topic = channelDecode(channel, params[1]);
+ QByteArray rawTopic = params[1];
+#ifdef HAVE_QCA2
+ rawTopic = decrypt(channel, rawTopic, true);
+#endif
+ QString topic = channelDecode(channel, rawTopic);
+
IrcChannel *chan = network()->ircChannel(channel);
if(chan)
chan->setTopic(topic);
_netsplits.clear();
}
-/***********************************************************************************/
+#ifdef HAVE_QCA2
+QByteArray IrcServerHandler::decrypt(const QString &bufferName, const QByteArray &message_, bool isTopic) {
+ if(bufferName.isEmpty() || message_.isEmpty())
+ return message_;
+
+ const QByteArray key = network()->cipherKey(bufferName);
+ if(key.isEmpty())
+ return message_;
+ QByteArray message = message_;
+ CoreIrcChannel *channel = qobject_cast<CoreIrcChannel *>(network()->ircChannel(bufferName));
+ if(channel) {
+ if(channel->cipher()->setKey(key))
+ message = isTopic? channel->cipher()->decryptTopic(message) : channel->cipher()->decrypt(message);
+ } else {
+ CoreIrcUser *user = qobject_cast<CoreIrcUser *>(network()->ircUser(bufferName));
+ if(user && user->cipher()->setKey(key))
+ message = user->cipher()->decrypt(message);
+ }
+
+ return message;
+}
+#endif