X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcoreuserinputhandler.cpp;h=95605bdb31d443f56fcfcb9131bd29eca19ed3c7;hp=ccba8b8a261ec293b647c3e5de59c25696f43724;hb=82a12eca7978598dafc059df6a2156e8899ef942;hpb=63bc3c3a34a0df70cad72b1f36d4fb7b8245d79c diff --git a/src/core/coreuserinputhandler.cpp b/src/core/coreuserinputhandler.cpp index ccba8b8a..95605bdb 100644 --- a/src/core/coreuserinputhandler.cpp +++ b/src/core/coreuserinputhandler.cpp @@ -28,6 +28,10 @@ #include #include +#ifdef HAVE_QCA2 +#include "cipher.h" +#endif + CoreUserInputHandler::CoreUserInputHandler(CoreNetwork *parent) : CoreBasicHandler(parent) { @@ -157,6 +161,60 @@ void CoreUserInputHandler::handleCtcp(const BufferInfo &bufferInfo, const QStrin emit displayMsg(Message::Action, BufferInfo::StatusBuffer, "", verboseMessage, network()->myNick()); } +void CoreUserInputHandler::handleDelkey(const BufferInfo &bufferInfo, const QString &msg) { + #ifdef HAVE_QCA2 + if (!bufferInfo.isValid()) + return; + + QStringList parms = msg.split(' ', QString::SkipEmptyParts); + + if(parms.isEmpty() && !bufferInfo.bufferName().isEmpty()) + parms.prepend(bufferInfo.bufferName()); + + if(parms.isEmpty()) { + QString message = tr("[usage] /delkey deletes the encryption key for nick or channel or just /delkey when in a channel or query."); + + if(bufferInfo.bufferName().isEmpty()) + emit displayMsg(Message::Info, BufferInfo::StatusBuffer, "", message); + else + emit displayMsg(Message::Info, bufferInfo.bufferName(), message); + return; + } + + if(network()->bufferKey(parms[0]).isEmpty()) { + QString message = tr("No key has been set for %1.").arg(parms[0]); + + if(bufferInfo.bufferName().isEmpty()) + emit displayMsg(Message::Info, BufferInfo::StatusBuffer, "", message); + else + emit displayMsg(Message::Info, bufferInfo.bufferName(), message); + return; + } + + network()->setBufferKey(parms[0], ""); + + if(network()->isChannelName(parms[0]) && network()->channels().contains(parms[0])) { + network()->ircChannel(parms[0])->setEncrypted(false); + } + else if(network()->nicks().contains(parms[0])) { + network()->ircUser(parms[0])->setEncrypted(false); + } + + QString message = tr("The key for %1 has been deleted.").arg(parms[0]); + + if(bufferInfo.bufferName().isEmpty()) + emit displayMsg(Message::Info, BufferInfo::StatusBuffer, "", message); + else + emit displayMsg(Message::Info, bufferInfo.bufferName(), message); + + #else + emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Error: Setting an encryption key requires Quassel to have been built " + "with support for the Qt Cryptographic Architecture (QCA) library. " + "Contact your distributor about a Quassel package with QCA " + "support, or rebuild Quassel with QCA present.")); + #endif +} + void CoreUserInputHandler::handleDeop(const BufferInfo &bufferInfo, const QString &msg) { QStringList nicks = msg.split(' ', QString::SkipEmptyParts); QString m = "-"; for(int i = 0; i < nicks.count(); i++) m += 'o'; @@ -297,7 +355,7 @@ void CoreUserInputHandler::handleMsg(const BufferInfo &bufferInfo, const QString return; QByteArray target = serverEncode(msg.section(' ', 0, 0)); - putPrivmsg(target, userEncode(target, msg.section(' ', 1))); + putPrivmsg(target, userEncode(target, msg.section(' ', 1)), false); } void CoreUserInputHandler::handleNick(const BufferInfo &bufferInfo, const QString &msg) { @@ -387,16 +445,62 @@ void CoreUserInputHandler::handleQuote(const BufferInfo &bufferInfo, const QStri void CoreUserInputHandler::handleSay(const BufferInfo &bufferInfo, const QString &msg) { if(bufferInfo.bufferName().isEmpty()) return; // server buffer - putPrivmsg(serverEncode(bufferInfo.bufferName()), channelEncode(bufferInfo.bufferName(), msg)); + putPrivmsg(serverEncode(bufferInfo.bufferName()), channelEncode(bufferInfo.bufferName(), msg), false); emit displayMsg(Message::Plain, bufferInfo.type(), bufferInfo.bufferName(), msg, network()->myNick(), Message::Self); } +void CoreUserInputHandler::handleSetkey(const BufferInfo &bufferInfo, const QString &msg) { + #ifdef HAVE_QCA2 + if(!bufferInfo.isValid()) + return; + + QStringList parms = msg.split(' ', QString::SkipEmptyParts); + + if(parms.count() == 1 && !bufferInfo.bufferName().isEmpty()) + parms.prepend(bufferInfo.bufferName()); + else if(parms.count() != 2) { + QString message =tr("[usage] /setkey sets the encryption key for nick or channel. /setkey when in a channel or query buffer sets the key for it."); + + if(bufferInfo.bufferName().isEmpty()) + emit displayMsg(Message::Info, BufferInfo::StatusBuffer, "", message); + else + emit displayMsg(Message::Info, bufferInfo.bufferName(), message); + return; + } + network()->setBufferKey(parms[0], parms[1].toLocal8Bit()); + + if(network()->isChannelName(parms[0]) && network()->channels().contains(parms[0])) + network()->ircChannel(parms[0])->setEncrypted(true); + else if(network()->nicks().contains(parms[0])) + network()->ircUser(parms[0])->setEncrypted(true); + + QString message = tr("The key for %1 has been set.").arg(parms[0]); + if (bufferInfo.bufferName().isEmpty()) + emit displayMsg(Message::Info, BufferInfo::StatusBuffer, "", message); + else + emit displayMsg(Message::Info, bufferInfo.bufferName(), message); + #else + emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Error: Setting an encryption key requires Quassel to have been built " + "with support for the Qt Cryptographic Architecture (QCA) library. " + "Contact your distributor about a Quassel package with QCA " + "support, or rebuild Quassel with QCA present.")); + #endif +} + void CoreUserInputHandler::handleTopic(const BufferInfo &bufferInfo, const QString &msg) { if(bufferInfo.bufferName().isEmpty()) return; QList params; params << serverEncode(bufferInfo.bufferName()); - if(!msg.isEmpty()) + if(!msg.isEmpty()) { + #ifdef HAVE_QCA2 + const QByteArray bufferName = bufferInfo.bufferName().toAscii(); + QByteArray message = channelEncode(bufferInfo.bufferName(), msg); + params << encrypt(bufferName, message); + #else params << channelEncode(bufferInfo.bufferName(), msg); + #endif + } + emit putCmd("TOPIC", params); } @@ -447,24 +551,34 @@ void CoreUserInputHandler::defaultHandler(QString cmd, const BufferInfo &bufferI emit putCmd(serverEncode(cmd.toUpper()), serverEncode(msg.split(" "))); } -void CoreUserInputHandler::putPrivmsg(const QByteArray &target, const QByteArray &message) { +void CoreUserInputHandler::putPrivmsg(const QByteArray &target, const QByteArray &message, bool encrypted) { + + QByteArray temp = message; + + #ifdef HAVE_QCA2 + if(!encrypted) { + temp = encrypt(target, temp); + encrypted = true; + } + #endif + static const char *cmd = "PRIVMSG"; - int overrun = lastParamOverrun(cmd, QList() << target << message); + int overrun = lastParamOverrun(cmd, QList() << target << temp); if(overrun) { static const char *splitter = " .,-"; - int maxSplitPos = message.count() - overrun; + int maxSplitPos = temp.count() - overrun; int splitPos = -1; for(const char *splitChar = splitter; *splitChar != 0; splitChar++) { - splitPos = qMax(splitPos, message.lastIndexOf(*splitChar, maxSplitPos)); + splitPos = qMax(splitPos, temp.lastIndexOf(*splitChar, maxSplitPos)); } if(splitPos <= 0) { splitPos = maxSplitPos; } - putCmd(cmd, QList() << target << message.left(splitPos)); - putPrivmsg(target, message.mid(splitPos)); + putCmd(cmd, QList() << target << temp.left(splitPos)); + putPrivmsg(target, temp.mid(splitPos), encrypted); return; } else { - putCmd(cmd, QList() << target << message); + putCmd(cmd, QList() << target << temp); } } @@ -497,6 +611,30 @@ int CoreUserInputHandler::lastParamOverrun(const QString &cmd, const QListbufferKey(target); + if(key.isEmpty()) + return message; + + IrcChannel *channel = network()->ircChannel(target); + IrcUser *user = network()->ircUser(target); + + if(channel && channel->cipher()->setKey(key)) + channel->cipher()->encrypt(message); + else if(user && user->cipher()->setKey(key)) + user->cipher()->encrypt(message); + + return message; +} +#endif + void CoreUserInputHandler::timerEvent(QTimerEvent *event) { if(!_delayedCommands.contains(event->timerId())) { QObject::timerEvent(event);