ssl: Use QSslSocket directly to avoid redundant qobject_casts
[quassel.git] / src / common / authhandler.cpp
index 9877145..9e7b5e7 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2013 by the Quassel Project                        *
+ *   Copyright (C) 2005-2020 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
 
 #include "authhandler.h"
 
-AuthHandler::AuthHandler(QObject *parent)
-    : QObject(parent),
-    _state(UnconnectedState),
-    _socket(0)
-{
+#include <QHostAddress>
 
-}
+#include "util.h"
 
+AuthHandler::AuthHandler(QObject* parent)
+    : QObject(parent)
+{}
 
-AuthHandler::State AuthHandler::state() const
+QSslSocket* AuthHandler::socket() const
 {
-    return _state;
+    return _socket;
 }
 
-
-void AuthHandler::setState(AuthHandler::State state)
+void AuthHandler::setSocket(QSslSocket* socket)
 {
-    if (_state != state) {
-        _state = state;
-        emit stateChanged(state);
-    }
+    _socket = socket;
+    connect(socket, selectOverload<QAbstractSocket::SocketError>(&QTcpSocket::error), this, &AuthHandler::onSocketError);
+    connect(socket, &QAbstractSocket::disconnected, this, &AuthHandler::onSocketDisconnected);
 }
 
-
-QTcpSocket *AuthHandler::socket() const
+bool AuthHandler::isLocal() const
 {
-    return _socket;
+    if (socket()) {
+        if (socket()->peerAddress() == QHostAddress::LocalHost || socket()->peerAddress() == QHostAddress::LocalHostIPv6)
+            return true;
+    }
+    return false;
 }
 
-
-void AuthHandler::setSocket(QTcpSocket *socket)
+// Some errors (e.g. connection refused) don't trigger a disconnected() from the socket, so send this explicitly
+// (but make sure it's only sent once!)
+void AuthHandler::onSocketError(QAbstractSocket::SocketError error)
 {
-    _socket = socket;
-    connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), SIGNAL(socketStateChanged(QAbstractSocket::SocketState)));
-    connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(socketError(QAbstractSocket::SocketError)));
-    connect(socket, SIGNAL(disconnected()), SIGNAL(disconnected()));
-}
+    emit socketError(error, _socket->errorString());
 
+    if (!socket()->isOpen() || !socket()->isValid()) {
+        if (!_disconnectedSent) {
+            _disconnectedSent = true;
+            emit disconnected();
+        }
+    }
+}
 
-void AuthHandler::socketError(QAbstractSocket::SocketError error)
+void AuthHandler::onSocketDisconnected()
 {
-    emit socketError(error, _socket->errorString());
+    if (!_disconnectedSent) {
+        _disconnectedSent = true;
+        emit disconnected();
+    }
 }
 
-
 void AuthHandler::invalidMessage()
 {
     qWarning() << Q_FUNC_INFO << "No handler for message!";
 }
 
-
 void AuthHandler::close()
 {
     if (_socket && _socket->isOpen())