synchronously call OidentdConfigGenerator
[quassel.git] / src / core / corenetwork.cpp
index 76a9d55..02f3842 100644 (file)
 #include "corenetwork.h"
 
 #include "core.h"
-#include "coresession.h"
 #include "coreidentity.h"
 #include "corenetworkconfig.h"
-
-#include "ircserverhandler.h"
+#include "coresession.h"
 #include "coreuserinputhandler.h"
-#include "ctcphandler.h"
+#include "networkevent.h"
 
 INIT_SYNCABLE_OBJECT(CoreNetwork)
 CoreNetwork::CoreNetwork(const NetworkId &networkid, CoreSession *session)
   : Network(networkid, session),
     _coreSession(session),
-    _ircServerHandler(new IrcServerHandler(this)),
     _userInputHandler(new CoreUserInputHandler(this)),
-    _ctcpHandler(new CtcpHandler(this)),
     _autoReconnectCount(0),
     _quitRequested(false),
 
@@ -81,15 +77,19 @@ CoreNetwork::CoreNetwork(const NetworkId &networkid, CoreSession *session)
   connect(&socket, SIGNAL(encrypted()), this, SLOT(socketInitialized()));
   connect(&socket, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(sslErrors(const QList<QSslError> &)));
 #endif
+  connect(this, SIGNAL(newEvent(Event *)), coreSession()->eventManager(), SLOT(postEvent(Event *)));
+
+  if(Quassel::isOptionSet("oidentd")) {
+    connect(this, SIGNAL(socketInitialized(const CoreIdentity*,QHostAddress,quint16,QHostAddress,quint16)), Core::instance()->oidentdConfigGenerator(), SLOT(addSocket(const CoreIdentity*,QHostAddress,quint16,QHostAddress,quint16)), Qt::BlockingQueuedConnection);
+    connect(this, SIGNAL(socketDisconnected(const CoreIdentity*,QHostAddress,quint16,QHostAddress,quint16)), Core::instance()->oidentdConfigGenerator(), SLOT(removeSocket(const CoreIdentity*,QHostAddress,quint16,QHostAddress,quint16)));
+  }
 }
 
 CoreNetwork::~CoreNetwork() {
   if(connectionState() != Disconnected && connectionState() != Network::Reconnecting)
     disconnectFromIrc(false);      // clean up, but this does not count as requested disconnect!
   disconnect(&socket, 0, this, 0); // this keeps the socket from triggering events during clean up
-  delete _ircServerHandler;
   delete _userInputHandler;
-  delete _ctcpHandler;
 }
 
 QString CoreNetwork::channelDecode(const QString &bufferName, const QByteArray &string) const {
@@ -276,6 +276,42 @@ void CoreNetwork::removeChannelKey(const QString &channel) {
   _channelKeys.remove(channel.toLower());
 }
 
+#ifdef HAVE_QCA2
+Cipher *CoreNetwork::cipher(const QString &target) const {
+  if(target.isEmpty())
+    return 0;
+
+  if(!Cipher::neededFeaturesAvailable())
+    return 0;
+
+  QByteArray key = cipherKey(target);
+  if(key.isEmpty())
+    return 0;
+
+  CoreIrcChannel *channel = qobject_cast<CoreIrcChannel *>(ircChannel(target));
+  if(channel) {
+    if(channel->cipher()->setKey(key))
+      return channel->cipher();
+  } else {
+    CoreIrcUser *user = qobject_cast<CoreIrcUser *>(ircUser(target));
+    if(user && user->cipher()->setKey(key))
+      return user->cipher();
+  }
+  return 0;
+}
+
+QByteArray CoreNetwork::cipherKey(const QString &recipient) const {
+  return _cipherKeys.value(recipient.toLower(), QByteArray());
+}
+
+void CoreNetwork::setCipherKey(const QString &recipient, const QByteArray &key) {
+  if(!key.isEmpty())
+    _cipherKeys[recipient.toLower()] = key;
+  else
+    _cipherKeys.remove(recipient.toLower());
+}
+#endif /* HAVE_QCA2 */
+
 bool CoreNetwork::setAutoWhoDone(const QString &channel) {
   QString chan = channel.toLower();
   if(_autoWhoPending.value(chan, 0) <= 0)
@@ -294,7 +330,13 @@ void CoreNetwork::setMyNick(const QString &mynick) {
 void CoreNetwork::socketHasData() {
   while(socket.canReadLine()) {
     QByteArray s = socket.readLine().trimmed();
-    ircServerHandler()->handleServerMsg(s);
+    NetworkDataEvent *event = new NetworkDataEvent(EventManager::NetworkIncoming, this, s);
+#if QT_VERSION >= 0x040700
+    event->setTimestamp(QDateTime::currentDateTimeUtc());
+#else
+    event->setTimestamp(QDateTime::currentDateTime().toUTC());
+#endif
+    emit newEvent(event);
   }
 }
 
@@ -326,6 +368,8 @@ void CoreNetwork::socketInitialized() {
     return;
   }
 
+  emit socketInitialized(identity, localAddress(), localPort(), peerAddress(), peerPort());
+
   // TokenBucket to avoid sending too much at once
   _messageDelay = 2200;    // this seems to be a safe value (2.2 seconds delay)
   _burstSize = 5;
@@ -370,6 +414,7 @@ void CoreNetwork::socketDisconnected() {
 
   setConnected(false);
   emit disconnected(networkId());
+  emit socketDisconnected(identityPtr(), localAddress(), localPort(), peerAddress(), peerPort());
   if(_quitRequested) {
     _quitRequested = false;
     setConnectionState(Network::Disconnected);
@@ -632,7 +677,7 @@ void CoreNetwork::sendPing() {
   uint now = QDateTime::currentDateTime().toTime_t();
   if(_pingCount != 0) {
     qDebug() << "UserId:" << userId() << "Network:" << networkName() << "missed" << _pingCount << "pings."
-            << "BA:" << socket.bytesAvailable() << "BTW:" << socket.bytesToWrite();
+             << "BA:" << socket.bytesAvailable() << "BTW:" << socket.bytesToWrite();
   }
   if((int)_pingCount >= networkConfig()->maxPingCount() && now - _lastPingTime <= (uint)(_pingTimer.interval() / 1000) + 1) {
     // the second check compares the actual elapsed time since the last ping and the pingTimer interval