X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcoreuserinputhandler.cpp;h=cc508cf8c23230458a03be3c64c5d74f21d49ceb;hp=6f721c16518080c7d56e6b3f56884ef449049ed2;hb=0dfaab93892aee333f7b838658ef85b9ff270ba7;hpb=76db8cdfbeffaaba359c8e80cf2146da9e9e7f8a diff --git a/src/core/coreuserinputhandler.cpp b/src/core/coreuserinputhandler.cpp index 6f721c16..cc508cf8 100644 --- a/src/core/coreuserinputhandler.cpp +++ b/src/core/coreuserinputhandler.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2013 by the Quassel Project * + * Copyright (C) 2005-2014 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -169,8 +169,11 @@ void CoreUserInputHandler::handleCtcp(const BufferInfo &bufferInfo, const QStrin QString verboseMessage = tr("sending CTCP-%1 request to %2").arg(ctcpTag).arg(nick); if (ctcpTag == "PING") { - uint now = QDateTime::currentDateTime().toTime_t(); - message = QString::number(now); +#if QT_VERSION >= 0x040700 + message = QString::number(QDateTime::currentMSecsSinceEpoch()); +#else + message = QString::number(QDateTime::currentDateTime().toTime_t()); +#endif } // FIXME make this a proper event @@ -181,20 +184,23 @@ void CoreUserInputHandler::handleCtcp(const BufferInfo &bufferInfo, const QStrin void CoreUserInputHandler::handleDelkey(const BufferInfo &bufferInfo, const QString &msg) { + QString bufname = bufferInfo.bufferName().isNull() ? "" : bufferInfo.bufferName(); #ifdef HAVE_QCA2 if (!bufferInfo.isValid()) return; - if (!Cipher::neededFeaturesAvailable()) + if (!Cipher::neededFeaturesAvailable()) { + emit displayMsg(Message::Error, typeByTarget(bufname), bufname, tr("Error: QCA provider plugin not found. It is usually provided by the qca-ossl plugin.")); return; + } QStringList parms = msg.split(' ', QString::SkipEmptyParts); - if (parms.isEmpty() && !bufferInfo.bufferName().isEmpty()) + if (parms.isEmpty() && !bufferInfo.bufferName().isEmpty() && bufferInfo.acceptsRegularMessages()) parms.prepend(bufferInfo.bufferName()); if (parms.isEmpty()) { - emit displayMsg(Message::Info, bufferInfo.bufferName(), "", + emit displayMsg(Message::Info, typeByTarget(bufname), bufname, tr("[usage] /delkey deletes the encryption key for nick or channel or just /delkey when in a channel or query.")); return; } @@ -202,16 +208,16 @@ void CoreUserInputHandler::handleDelkey(const BufferInfo &bufferInfo, const QStr QString target = parms.at(0); if (network()->cipherKey(target).isEmpty()) { - emit displayMsg(Message::Info, bufferInfo.bufferName(), tr("No key has been set for %1.").arg(target)); + emit displayMsg(Message::Info, typeByTarget(bufname), bufname, tr("No key has been set for %1.").arg(target)); return; } network()->setCipherKey(target, QByteArray()); - emit displayMsg(Message::Info, bufferInfo.bufferName(), tr("The key for %1 has been deleted.").arg(target)); + emit displayMsg(Message::Info, typeByTarget(bufname), bufname, tr("The key for %1 has been deleted.").arg(target)); #else Q_UNUSED(msg) - emit displayMsg(Message::Error, bufferInfo.bufferName(), "", tr("Error: Setting an encryption key requires Quassel to have been built " + emit displayMsg(Message::Error, typeByTarget(bufname), bufname, tr("Error: Setting an encryption key requires Quassel to have been built " "with support for the Qt Cryptographic Architecture (QCA2) library. " "Contact your distributor about a Quassel package with QCA2 " "support, or rebuild Quassel with QCA2 present.")); @@ -224,7 +230,7 @@ void CoreUserInputHandler::doMode(const BufferInfo &bufferInfo, const QChar& add bool isNumber; int maxModes = network()->support("MODES").toInt(&isNumber); if (!isNumber || maxModes == 0) maxModes = 1; - + QStringList nickList; if (nicks == "*") { // All users in channel const QList users = network()->ircChannel(bufferInfo.bufferName())->ircUsers(); @@ -233,12 +239,12 @@ void CoreUserInputHandler::doMode(const BufferInfo &bufferInfo, const QChar& add || (addOrRemove == '-' && network()->ircChannel(bufferInfo.bufferName())->userModes(user).contains(mode))) nickList.append(user->nick()); } - } else { + } else { nickList = nicks.split(' ', QString::SkipEmptyParts); } - + if (nickList.count() == 0) return; - + while (!nickList.isEmpty()) { int amount = qMin(nickList.count(), maxModes); QString m = addOrRemove; for(int i = 0; i < amount; i++) m += mode; @@ -349,41 +355,49 @@ void CoreUserInputHandler::handleJoin(const BufferInfo &bufferInfo, const QStrin void CoreUserInputHandler::handleKeyx(const BufferInfo &bufferInfo, const QString &msg) { + QString bufname = bufferInfo.bufferName().isNull() ? "" : bufferInfo.bufferName(); #ifdef HAVE_QCA2 if (!bufferInfo.isValid()) return; - if (!Cipher::neededFeaturesAvailable()) + if (!Cipher::neededFeaturesAvailable()) { + emit displayMsg(Message::Error, typeByTarget(bufname), bufname, tr("Error: QCA provider plugin not found. It is usually provided by the qca-ossl plugin.")); return; + } QStringList parms = msg.split(' ', QString::SkipEmptyParts); - if (parms.count() == 0 && !bufferInfo.bufferName().isEmpty()) + if (parms.count() == 0 && !bufferInfo.bufferName().isEmpty() && bufferInfo.acceptsRegularMessages()) 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.")); + emit displayMsg(Message::Info, typeByTarget(bufname), bufname, + tr("[usage] /keyx [] Initiates a DH1080 key exchange with the target.")); return; } QString target = parms.at(0); + if (network()->isChannelName(target)) { + emit displayMsg(Message::Info, typeByTarget(bufname), bufname, tr("It is only possible to exchange keys in a query buffer.")); + return; + } + 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)); + emit displayMsg(Message::Error, typeByTarget(bufname), bufname, 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)); + emit displayMsg(Message::Info, typeByTarget(bufname), bufname, 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 " + emit displayMsg(Message::Error, typeByTarget(bufname), bufname, 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.")); @@ -424,7 +438,8 @@ void CoreUserInputHandler::handleList(const BufferInfo &bufferInfo, const QStrin void CoreUserInputHandler::handleMe(const BufferInfo &bufferInfo, const QString &msg) { - if (bufferInfo.bufferName().isEmpty()) return; // server buffer + if (bufferInfo.bufferName().isEmpty() || !bufferInfo.acceptsRegularMessages()) + return; // server buffer // FIXME make this a proper event coreNetwork()->coreSession()->ctcpParser()->query(coreNetwork(), bufferInfo.bufferName(), "ACTION", msg); emit displayMsg(Message::Action, bufferInfo.type(), bufferInfo.bufferName(), msg, network()->myNick(), Message::Self); @@ -487,7 +502,7 @@ void CoreUserInputHandler::handleNotice(const BufferInfo &bufferInfo, const QStr QList params; params << serverEncode(bufferName) << channelEncode(bufferInfo.bufferName(), payload); emit putCmd("NOTICE", params); - emit displayMsg(Message::Notice, bufferName, payload, network()->myNick(), Message::Self); + emit displayMsg(Message::Notice, typeByTarget(bufferName), bufferName, payload, network()->myNick(), Message::Self); } @@ -570,7 +585,7 @@ void CoreUserInputHandler::handleQuote(const BufferInfo &bufferInfo, const QStri void CoreUserInputHandler::handleSay(const BufferInfo &bufferInfo, const QString &msg) { - if (bufferInfo.bufferName().isEmpty()) + if (bufferInfo.bufferName().isEmpty() || !bufferInfo.acceptsRegularMessages()) return; // server buffer QByteArray encMsg = channelEncode(bufferInfo.bufferName(), msg); @@ -585,19 +600,22 @@ void CoreUserInputHandler::handleSay(const BufferInfo &bufferInfo, const QString void CoreUserInputHandler::handleSetkey(const BufferInfo &bufferInfo, const QString &msg) { + QString bufname = bufferInfo.bufferName().isNull() ? "" : bufferInfo.bufferName(); #ifdef HAVE_QCA2 if (!bufferInfo.isValid()) return; - if (!Cipher::neededFeaturesAvailable()) + if (!Cipher::neededFeaturesAvailable()) { + emit displayMsg(Message::Error, typeByTarget(bufname), bufname, tr("Error: QCA provider plugin not found. It is usually provided by the qca-ossl plugin.")); return; + } QStringList parms = msg.split(' ', QString::SkipEmptyParts); - if (parms.count() == 1 && !bufferInfo.bufferName().isEmpty()) + if (parms.count() == 1 && !bufferInfo.bufferName().isEmpty() && bufferInfo.acceptsRegularMessages()) parms.prepend(bufferInfo.bufferName()); else if (parms.count() != 2) { - emit displayMsg(Message::Info, bufferInfo.bufferName(), + emit displayMsg(Message::Info, typeByTarget(bufname), bufname, tr("[usage] /setkey sets the encryption key for nick or channel. " "/setkey when in a channel or query buffer sets the key for it.")); return; @@ -607,10 +625,10 @@ void CoreUserInputHandler::handleSetkey(const BufferInfo &bufferInfo, const QStr QByteArray key = parms.at(1).toLocal8Bit(); network()->setCipherKey(target, key); - emit displayMsg(Message::Info, bufferInfo.bufferName(), tr("The key for %1 has been set.").arg(target)); + emit displayMsg(Message::Info, typeByTarget(bufname), bufname, tr("The key for %1 has been set.").arg(target)); #else Q_UNUSED(msg) - emit displayMsg(Message::Error, bufferInfo.bufferName(), tr("Error: Setting an encryption key requires Quassel to have been built " + emit displayMsg(Message::Error, typeByTarget(bufname), bufname, 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.")); @@ -620,21 +638,23 @@ void CoreUserInputHandler::handleSetkey(const BufferInfo &bufferInfo, const QStr void CoreUserInputHandler::handleShowkey(const BufferInfo &bufferInfo, const QString &msg) { + QString bufname = bufferInfo.bufferName().isNull() ? "" : bufferInfo.bufferName(); #ifdef HAVE_QCA2 if (!bufferInfo.isValid()) return; - if (!Cipher::neededFeaturesAvailable()) + if (!Cipher::neededFeaturesAvailable()) { + emit displayMsg(Message::Error, typeByTarget(bufname), bufname, tr("Error: QCA provider plugin not found. It is usually provided by the qca-ossl plugin.")); return; + } QStringList parms = msg.split(' ', QString::SkipEmptyParts); - if (parms.isEmpty() && !bufferInfo.bufferName().isEmpty()) + if (parms.isEmpty() && !bufferInfo.bufferName().isEmpty() && bufferInfo.acceptsRegularMessages()) parms.prepend(bufferInfo.bufferName()); if (parms.isEmpty()) { - emit displayMsg(Message::Info, bufferInfo.bufferName(), "", - tr("[usage] /showkey shows the encryption key for nick or channel or just /showkey when in a channel or query.")); + emit displayMsg(Message::Info, typeByTarget(bufname), bufname, tr("[usage] /showkey shows the encryption key for nick or channel or just /showkey when in a channel or query.")); return; } @@ -642,15 +662,15 @@ void CoreUserInputHandler::handleShowkey(const BufferInfo &bufferInfo, const QSt QByteArray key = network()->cipherKey(target); if (key.isEmpty()) { - emit displayMsg(Message::Info, bufferInfo.bufferName(), tr("No key has been set for %1.").arg(target)); + emit displayMsg(Message::Info, typeByTarget(bufname), bufname, tr("No key has been set for %1.").arg(target)); return; } - emit displayMsg(Message::Info, bufferInfo.bufferName(), tr("The key for %1 is %2").arg(target).arg(QString(key))); + emit displayMsg(Message::Info, typeByTarget(bufname), bufname, tr("The key for %1 is %2:%3").arg(target, network()->cipherUsesCBC(target) ? "CBC" : "ECB", QString(key))); #else Q_UNUSED(msg) - emit displayMsg(Message::Error, bufferInfo.bufferName(), "", tr("Error: Setting an encryption key requires Quassel to have been built " + emit displayMsg(Message::Error, typeByTarget(bufname), bufname, tr("Error: Setting an encryption key requires Quassel to have been built " "with support for the Qt Cryptographic Architecture (QCA2) library. " "Contact your distributor about a Quassel package with QCA2 " "support, or rebuild Quassel with QCA2 present.")); @@ -660,7 +680,7 @@ void CoreUserInputHandler::handleShowkey(const BufferInfo &bufferInfo, const QSt void CoreUserInputHandler::handleTopic(const BufferInfo &bufferInfo, const QString &msg) { - if (bufferInfo.bufferName().isEmpty()) + if (bufferInfo.bufferName().isEmpty() || !bufferInfo.acceptsRegularMessages()) return; QList params;