X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcoreuserinputhandler.cpp;h=6f721c16518080c7d56e6b3f56884ef449049ed2;hp=e80751bb83ead8d9bea206d5ea6baa1704ff850f;hb=76db8cdfbeffaaba359c8e80cf2146da9e9e7f8a;hpb=51ede5bd8acf7cf0aa152d16a17221e0b9604f7a diff --git a/src/core/coreuserinputhandler.cpp b/src/core/coreuserinputhandler.cpp index e80751bb..6f721c16 100644 --- a/src/core/coreuserinputhandler.cpp +++ b/src/core/coreuserinputhandler.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2012 by the Quassel Project * + * Copyright (C) 2005-2013 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -207,14 +207,6 @@ void CoreUserInputHandler::handleDelkey(const BufferInfo &bufferInfo, const QStr } network()->setCipherKey(target, QByteArray()); - - if (network()->isChannelName(target) && network()->channels().contains(target)) { - qobject_cast(network()->ircChannel(target))->setEncrypted(false); - } - else if (network()->nicks().contains(target)) { - qobject_cast(network()->ircUser(target))->setEncrypted(false); - } - emit displayMsg(Message::Info, bufferInfo.bufferName(), tr("The key for %1 has been deleted.").arg(target)); #else @@ -355,6 +347,50 @@ void CoreUserInputHandler::handleJoin(const BufferInfo &bufferInfo, const QStrin } +void CoreUserInputHandler::handleKeyx(const BufferInfo &bufferInfo, const QString &msg) +{ +#ifdef HAVE_QCA2 + if (!bufferInfo.isValid()) + return; + + if (!Cipher::neededFeaturesAvailable()) + return; + + QStringList parms = msg.split(' ', QString::SkipEmptyParts); + + if (parms.count() == 0 && !bufferInfo.bufferName().isEmpty()) + parms.prepend(bufferInfo.bufferName()); + else if (parms.count() != 1) { + emit displayMsg(Message::Info, bufferInfo.bufferName(), + tr("[usage] /keyx [] Initiates a DH1080 key exchange with the target.")); + return; + } + + QString target = parms.at(0); + + Cipher *cipher = network()->cipher(target); + if (!cipher) // happens when there is no CoreIrcChannel for the target + return; + + QByteArray pubKey = cipher->initKeyExchange(); + if (pubKey.isEmpty()) + emit displayMsg(Message::Error, bufferInfo.bufferName(), tr("Failed to initiate key exchange with %1.").arg(target)); + else { + QList params; + params << serverEncode(target) << serverEncode("DH1080_INIT ") + pubKey; + emit putCmd("NOTICE", params); + emit displayMsg(Message::Info, bufferInfo.bufferName(), tr("Initiated key exchange with %1.").arg(target)); + } +#else + Q_UNUSED(msg) + emit displayMsg(Message::Error, bufferInfo.bufferName(), 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::handleKick(const BufferInfo &bufferInfo, const QString &msg) { QString nick = msg.section(' ', 0, 0, QString::SectionSkipEmpty); @@ -569,14 +605,8 @@ void CoreUserInputHandler::handleSetkey(const BufferInfo &bufferInfo, const QStr QString target = parms.at(0); QByteArray key = parms.at(1).toLocal8Bit(); - network()->setCipherKey(target, key); - if (network()->isChannelName(target) && network()->channels().contains(target)) - qobject_cast(network()->ircChannel(target))->setEncrypted(true); - else if (network()->nicks().contains(target)) - qobject_cast(network()->ircUser(target))->setEncrypted(true); - emit displayMsg(Message::Info, bufferInfo.bufferName(), tr("The key for %1 has been set.").arg(target)); #else Q_UNUSED(msg) @@ -725,7 +755,7 @@ void CoreUserInputHandler::putPrivmsg(const QByteArray &target, const QByteArray QByteArray crypted = message.left(splitPos); bool isEncrypted = false; #ifdef HAVE_QCA2 - if (cipher && !message.isEmpty()) { + if (cipher && !cipher->key().isEmpty() && !message.isEmpty()) { isEncrypted = cipher->encrypt(crypted); } #endif @@ -806,7 +836,7 @@ QByteArray CoreUserInputHandler::encrypt(const QString &target, const QByteArray return message_; Cipher *cipher = network()->cipher(target); - if (!cipher) + if (!cipher || cipher->key().isEmpty()) return message_; QByteArray message = message_;