X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fircserverhandler.cpp;h=32a40f0d99183569df50c21c4bcb005dfbb974a2;hp=655f68a8c7b654d1f85fed9110f22cf65a0a0e36;hb=f0013829ab979864e1cbf23c0195485c5d7ccb72;hpb=428ac8d41b1bd6cefea861a2dacc58b2badd4ca4 diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 655f68a8..32a40f0d 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -33,7 +33,7 @@ #include #ifdef HAVE_QCA2 -#include "cipher.h" +# include "cipher.h" #endif IrcServerHandler::IrcServerHandler(CoreNetwork *parent) @@ -197,6 +197,21 @@ void IrcServerHandler::defaultHandler(QString cmd, const QString &prefix, const //******************************/ // IRC SERVER HANDLER //******************************/ +void IrcServerHandler::handleInvite(const QString &prefix, const QList ¶ms) { + if(!checkParamCount("IrcServerHandler::handleInvite()", params, 2)) + return; +// qDebug() << "IrcServerHandler::handleInvite()" << prefix << params; + + IrcUser *ircuser = network()->updateNickFromMask(prefix); + if(!ircuser) { + return; + } + + QString channel = serverDecode(params[1]); + + emit displayMsg(Message::Invite, BufferInfo::StatusBuffer, "", tr("%1 invited you to channel %2").arg(ircuser->nick()).arg(channel)); +} + void IrcServerHandler::handleJoin(const QString &prefix, const QList ¶ms) { if(!checkParamCount("IrcServerHandler::handleJoin()", params, 1)) return; @@ -498,9 +513,9 @@ void IrcServerHandler::handlePrivmsg(const QString &prefix, const QList we let the ctcpHandler do the work network()->ctcpHandler()->parse(Message::Plain, prefix, target, msg); @@ -557,12 +572,13 @@ void IrcServerHandler::handleTopic(const QString &prefix, const QList 1) { - topic = params[1]; - #ifdef HAVE_QCA2 - topic = decryptTopic(channel->name(), topic); - #endif + QByteArray rawTopic = params[1]; +#ifdef HAVE_QCA2 + rawTopic = decrypt(channel->name(), rawTopic, true); +#endif + topic = channelDecode(channel->name(), rawTopic); } - + channel->setTopic(topic); emit displayMsg(Message::Topic, BufferInfo::ChannelBuffer, channel->name(), tr("%1 has changed topic for %2 to: \"%3\"").arg(ircuser->nick()).arg(channel->name()).arg(topic)); @@ -634,6 +650,9 @@ void IrcServerHandler::handle005(const QString &prefix, const QList QString value = rawSupport.section("=", 1); network()->addSupport(key, value); } + + /* determine our prefixes here to get an accurate result */ + network()->determinePrefixes(); } /* RPL_UMODEIS - " []" */ @@ -782,7 +801,8 @@ void IrcServerHandler::handle311(const QString &prefix, const QList ircuser->setRealName(serverDecode(params.last())); emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1 is %2 (%3)") .arg(ircuser->nick()).arg(ircuser->hostmask()).arg(ircuser->realName())); } else { - emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1 is %2 (%3)") .arg(serverDecode(params[1])).arg(serverDecode(params[2])).arg(serverDecode(params.last()))); + QString host = QString("%1!%2@%3").arg(serverDecode(params[0])).arg(serverDecode(params[1])).arg(serverDecode(params[2])); + emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1 is %2 (%3)") .arg(serverDecode(params[0])).arg(host).arg(serverDecode(params.last()))); } } @@ -999,12 +1019,12 @@ void IrcServerHandler::handle332(const QString &prefix, const QList return; QString channel = serverDecode(params[0]); - QString topic = channelDecode(channel, params[1]); - - #ifdef HAVE_QCA2 - topic = decryptTopic(channel, topic); - #endif - + 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); @@ -1023,6 +1043,23 @@ void IrcServerHandler::handle333(const QString &prefix, const QList tr("Topic set by %1 on %2") .arg(serverDecode(params[1]), QDateTime::fromTime_t(channelDecode(channel, params[2]).toUInt()).toString())); } +/* RPL_INVITING - " */ +void IrcServerHandler::handle341(const QString &prefix, const QList ¶ms) { + Q_UNUSED(prefix); + if(!checkParamCount("IrcServerHandler::handle341()", params, 2)) + return; + + QString nick = serverDecode(params[0]); + + IrcChannel *channel = network()->ircChannel(serverDecode(params[1])); + if(!channel) { + qWarning() << "IrcServerHandler::handle341(): unknown channel:" << params[1]; + return; + } + + emit displayMsg(Message::Server, BufferInfo::ChannelBuffer, channel->name(), tr("%1 has been invited to %2").arg(nick).arg(channel->name())); +} + /* RPL_WHOREPLY: " ( "H" / "G" > ["*"] [ ( "@" / "+" ) ] : " */ void IrcServerHandler::handle352(const QString &prefix, const QList ¶ms) { @@ -1247,71 +1284,16 @@ void IrcServerHandler::destroyNetsplits() { } #ifdef HAVE_QCA2 -QByteArray IrcServerHandler::decrypt(const QString &bufferName, QByteArray &message) { - if(bufferName.isEmpty()) - return message; - - if(message.isEmpty()) - return message; +QByteArray IrcServerHandler::decrypt(const QString &bufferName, const QByteArray &message_, bool isTopic) { + if(message_.isEmpty()) + return message_; - const QByteArray key = network()->bufferKey(bufferName); - if(key.isEmpty()) - return message; + Cipher *cipher = network()->cipher(bufferName); + if(!cipher) + return message_; - IrcChannel *channel = network()->ircChannel(bufferName); - IrcUser *user = network()->ircUser(bufferName); - - //only send encrypted text to decrypter - int index = message.indexOf(":",message.indexOf(":")+1); - - /* if(this->identifyMsgEnabled()) // Workaround braindead Freenode prefixing messages with + - ++index;*/ - - QByteArray backup = message.mid(0,index+1); - - if (channel && channel->cipher()->setKey(key)) - message = channel->cipher()->decrypt(message.mid(index+1)); - else if (user && user->cipher()->setKey(key)) - message = user->cipher()->decrypt(message.mid(index+1)); - - message.prepend(backup); - - message = channelDecode(bufferName, message).toAscii(); - + QByteArray message = message_; + message = isTopic? cipher->decryptTopic(message) : cipher->decrypt(message); return message; } - -QString IrcServerHandler::decryptTopic(const QString &bufferName, QString &topic) { - if(bufferName.isEmpty()) - return topic; - - if(topic.isEmpty()) - return topic; - - const QByteArray key = network()->bufferKey(bufferName); - if(key.isEmpty()) - return topic; - - IrcChannel *channel = network()->ircChannel(bufferName); - IrcUser *user = network()->ircUser(bufferName); - - //only send encrypted text to decrypter - int index = topic.indexOf(":",topic.indexOf(":")+1); - - QString backup = topic.mid(0,index+1); - - if (channel && channel->cipher()->setKey(key)) - topic = channel->cipher()->decryptTopic(topic.mid(index+1).toAscii()); - else if (user && user->cipher()->setKey(key)) - topic = user->cipher()->decryptTopic(topic.mid(index+1).toAscii()); - - topic.prepend(backup); - topic = channelDecode(bufferName, topic.toAscii()); - - return topic; -} #endif - -/***********************************************************************************/ - -